標籤:
一.寫在前面的話
好多天沒有記錄sql學習筆記了,要堅持下去,堅信每一點的進步都是為在積蓄力量。今天看到一幅圖,特此分享出來。
通過這幅圖,我看到的是每人站在自己的角度看問題,感受是不一樣的,就如同學習知識一樣,總覺得自己的理解才是最獨特的,有時候適當把東西分享出
去,聽聽別人的見解,或許會讓我們理解的更加深刻。換位思考,冷靜處理,沉著淡定,不驕不躁,bug只不過生活的一部分,正因為有了bug才會讓我們進
步,讓我們去學習,去追尋問題的答案,一起努力,做一個快樂的程式猿。這個世界唯一不變的就是變化,學習才會讓我們適應這個變化。Keep study,
keep moving!進入今天的sql學習正題。
二.sqlserver串連
(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.shipperid2 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.productname2 from production.categories a inner join production.products b3 on a.categoryid=b.categoryid;
結果:
我們可以看到產品1、都屬於產品分類1.以此類推.........,這樣就可以找出類別1下有哪些產品,以及產品分別屬於哪一分類。
在這裡我們拓展一下:假若我們要查詢有哪些顧客下單了,找出下訂單的顧客資訊和訂單資訊,那麼就需要關聯顧客表(sales.customers)和訂單表
(sales.orders)。
通過查看兩張表的欄位,我們可以看到兩張表可以用custid顧客的ID進行串連。找出相關的顧客資訊和訂單資訊。
1 select a.custid,a.contactname,b.custid,b.orderid2 from sales.customers a join sales.orders b3 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 b4 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 b4 on a.custid=b.custid5 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 b4 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 b4 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);
可以看到找出了所有顧客資訊,包括未下訂單的顧客資訊。其實在這裡只是交換了兩張表的位置而已。
所以說對於左右串連來說,左串連就以左側表為基準,
右串連就以右表為基準。
SQLServer學習筆記系列4