好多天没有记录sql学习笔记了,要坚持下去,坚信每一点的进步都是为在积蓄力量。今天看到一幅图,特此分享出来。sql
经过这幅图,我看到的是每人站在本身的角度看问题,感觉是不同的,就如同窗习知识同样,总以为本身的理解才是最独特的,有时候适当把东西分享出函数
去,听听别人的看法,或许会让咱们理解的更加深入。换位思考,冷静处理,沉着淡定,不骄不躁,bug只不过生活的一部分,正由于有了bug才会让咱们进sqlserver
步,让咱们去学习,去追寻问题的答案,一块儿努力,作一个快乐的程序猿。这个世界惟一不变的就是变化,学习才会让咱们适应这个变化。Keep study,学习
keep moving!进入今天的sql学习正题。spa
(1)交叉链接(cross join)即咱们所说的笛卡尔积。查询出知足两张表全部的记录数,A(3条记录),B(9条记录),A*B(27条记录)。code
好比:雇员表(HR.employees)和货运公司(Sales.shippers)表作一个交叉链接。server
1 select * from hr.employees; 2 select * from sales.shippers;
进行交叉链接之后,则找到27条记录。blog
1 select a.empid,b.shipperid 2 from hr.employees a cross join sales.shippers b;
(2)内链接(inner join),即必须知足某一条件的组合。ip
例如咱们要查询产品类别表下,每种产品属于哪一分类,就须要关联产品分类表(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.categoryid=b.categoryid;
结果如图所示:
咱们能够看到产品一、都属于产品分类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.custid=b.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.custid=b.custid
就这样咱们能够得出每一个顾客的订单数量。其实这里咱们还有不用over开窗函数,也能实现一样的统计信息,那就是根据custid进行分组:
1 select a.custid,a.contactname, 2 count(*) as N'group-by顾客订单数量' 3 from sales.customers a inner join sales.orders b 4 on a.custid=b.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。
(3)left......join ,左链接,即保证左侧条件所有有,右侧没有条件不足,则用null补齐。
继续上述未完成的任务,即找出没有下订单顾客的信息,也就是订单数量为0的顾客信息,在这里就必须保证全部的顾客信息存在,即用到左链接
(left....join)。
1 select a.custid,b.custid,a.contactname,a.fax, 2 count(b.orderid) as N'group-by顾客订单数量' 3 from sales.customers a left join sales.orders b 4 on a.custid=b.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.custid=b.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.custid=b.custid 5 group by a.custid ,a.fax,a.contactname,b.custid 6 order by count(b.custid);
能够看到找出了全部顾客信息,包括未下订单的顾客信息。其实在这里只是交换了两张表的位置而已。
因此说对于左右链接来讲,左链接就以左侧表为基准,
右链接就以右表为基准。
但愿各位大牛给出指导,不当之处虚心接受学习!谢谢!