个人网站建设方案书使用几号纸,东营企业网站seo,桂林市临桂区,贵阳银行手机银行下载官方网站一.写在前面的话 好多天没有记录sql学习笔记了#xff0c;要坚持下去#xff0c;坚信每一点的进步都是为在积蓄力量。今天看到一幅图#xff0c;特此分享出来。 通过这幅图#xff0c;我看到的是每人站在自己的角度看问题#xff0c;感受是不一样的#xff0c;就如同学习… 一.写在前面的话 好多天没有记录sql学习笔记了要坚持下去坚信每一点的进步都是为在积蓄力量。今天看到一幅图特此分享出来。 通过这幅图我看到的是每人站在自己的角度看问题感受是不一样的就如同学习知识一样总觉得自己的理解才是最独特的有时候适当把东西分享出 去听听别人的见解或许会让我们理解的更加深刻。换位思考冷静处理沉着淡定不骄不躁bug只不过生活的一部分正因为有了bug才会让我们进 步让我们去学习去追寻问题的答案一起努力做一个快乐的程序猿。这个世界唯一不变的就是变化学习才会让我们适应这个变化。Keep study keep moving进入今天的sql学习正题。 二.sqlserver连接 1交叉连接cross join即我们所说的笛卡尔积。查询出满足两张表所有的记录数A3条记录B9条记录A*B27条记录。 比如雇员表HR.employees和货运公司(Sales.shippers)表做一个交叉连接。 1 select * from hr.employees;
2 select * from sales.shippers; 进行交叉连接以后则找到27条记录。 1 select a.empid,b.shipperid
2 from hr.employees a cross join sales.shippers b; 2内连接inner join即必须满足某一条件的组合。 例如我们要查询产品类别表下每种产品属于哪一分类就需要关联产品分类表production.categories和产品明细表做一个inner join。 1 select a.categoryid,a.categoryname,b.productid,b.productname
2 from production.categories a inner join production.products b
3 on a.categoryidb.categoryid; 结果如图所示 我们可以看到产品1、都属于产品分类1.以此类推.........,这样就可以找出类别1下有哪些产品以及产品分别属于哪一分类。 在这里我们拓展一下假若我们要查询有哪些顾客下单了找出下订单的顾客信息和订单信息那么就需要关联顾客表sales.customers和订单表 sales.orders。 通过查看两张表的字段我们可以看到两张表可以用custid顾客的ID进行连接。找出相关的顾客信息和订单信息。 1 select a.custid,a.contactname,b.custid,b.orderid
2 from sales.customers a join sales.orders b
3 on a.custidb.custid 通过内连接inner join可以得出一些基本信息 但是这里我们发现一些顾客下过很多订单加入我们要找出该顾客下过的订单数并且只显示该顾客的一条记录那么我们就需要用到之前学到过的 count.....over用法返回记录数。如要显示不重复的记录那么我们就可以用关键字distinct进行过滤。 1 select distinct a.custid,a.contactname,
2 count(*) over(partition by a.custid) as N顾客订单数量
3 from sales.customers a inner join sales.orders b
4 on a.custidb.custid 就这样我们可以得出每个顾客的订单数量。其实这里我们还有不用over开窗函数也能实现同样的统计信息那就是根据custid进行分组 1 select a.custid,a.contactname,
2 count(*) as Ngroup-by顾客订单数量
3 from sales.customers a inner join sales.orders b
4 on a.custidb.custid
5 group by a.custid ,a.contactname order by a.custid; 结果如图 这里我们得出的结果跟上面用count.....over()结果一样。所以在这里选择哪种方式可以根据需要视情况而定。 但是这里我们注意一点我们查询一下顾客表sales.customers看看里面的信息。 1 select * from sales.customers 我们可以看到共有91条记录即有91为顾客光顾过相关订单根据上面顾客下单信息的89条记录可以知道有两位顾客光顾过订单但却未下单可以理解不买看看总行吧 但是我们却没有看到那两位观望着顾客的信息怎样才能将那两位观望着找出来咱们送给他两礼品感谢他们的支持了这就需要用到接下来说的连接left join。 3left......join ,左连接即保证左侧条件全部有右侧没有条件不足则用null补齐。 继续上述未完成的任务即找出没有下订单顾客的信息也就是订单数量为0的顾客信息在这里就必须保证所有的顾客信息存在即用到左连接 (left....join)。 1 select a.custid,b.custid,a.contactname,a.fax,
2 count(b.orderid) as Ngroup-by顾客订单数量
3 from sales.customers a left join sales.orders b
4 on a.custidb.custid
5 group by a.custid ,a.fax,a.contactname,b.custid
6 order by count(b.custid); 结果如图所示 (4)右连接right .....join,其实右连接跟左连接相反以右侧表为基准保证右侧表满足所有记录左侧表不足用null补齐。如果交换两个表位置则就很好 的理解左右连接。 例如将上述查询用用连接则查询出来的是下过订单的所有顾客信息。 1 select a.custid,b.custid,a.contactname,a.fax,
2 count(b.orderid) as N顾客订单数量
3 from sales.customers a right join sales.orders b
4 on a.custidb.custid
5 group by a.custid ,a.fax,a.contactname,b.custid
6 order by count(b.custid); 根据上述信息我们知道下过订单的顾客确实有89人有两人没有下过订单但是在这里我们也可以通过右连接找出所有顾客的信息。 1 select a.custid,b.custid,a.contactname,a.fax,
2 count(b.orderid) as N顾客订单数量
3 from sales.orders b right join sales.customers a
4 on a.custidb.custid
5 group by a.custid ,a.fax,a.contactname,b.custid
6 order by count(b.custid); 可以看到找出了所有顾客信息包括未下订单的顾客信息。其实在这里只是交换了两张表的位置而已。 所以说对于左右连接来说左连接就以左侧表为基准 右连接就以右表为基准。 转载于:https://www.cnblogs.com/Mining-LiTeng/p/4566694.html