好多天沒有記錄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);
能夠看到找出了全部顧客信息,包括未下訂單的顧客信息。其實在這裏只是交換了兩張表的位置而已。
因此說對於左右鏈接來講,左鏈接就以左側表爲基準,
右鏈接就以右表爲基準。
但願各位大牛給出指導,不當之處虛心接受學習!謝謝!