一.寫在前面的話 好多天沒有記錄sql學習筆記了,要堅持下去,堅信每一點的進步都是為在積蓄力量。今天看到一幅圖,特此分享出來。 通過這幅圖,我看到的是每人站在自己的角度看問題,感受是不一樣的,就如同學習知識一樣,總覺得自己的理解才是最獨特的,有
好多天沒有記錄sql學習筆記了,要堅持下去,堅信每一點的進步都是為在積蓄力量。今天看到一幅圖,特此分享出來。
通過這幅圖,我看到的是每人站在自己的角度看問題,感受是不一樣的,就如同學習知識一樣,總覺得自己的理解才是最獨特的,有時候適當把東西分享出
去,聽聽別人的見解,或許會讓我們理解的更加深刻。換位思考,冷靜處理,沉著淡定,不驕不躁,bug只不過生活的一部分,正因為有了bug才會讓我們進
步,讓我們去學習,去追尋問題的答案,一起努力,做一個快樂的程序猿。這個世界唯一不變的就是變化,學習才會讓我們適應這個變化。Keep study,
keep moving!進入今天的sql學習正題。
(1)交叉連接(cross join)即我們所說的笛卡爾積。查詢出滿足兩張表所有的記錄數,A(3條記錄),B(9條記錄),A*B(27條記錄)。
比如:雇員表(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.categoryid=b.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.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);
可以看到找出了所有顧客信息,包括未下訂單的顧客信息。其實在這里只是交換了兩張表的位置而已。
所以說對于左右連接來說,左連接就以左側表為基準,
右連接就以右表為基準。
希望各位大牛給出指導,不當之處虛心接受學習!謝謝!
聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com