日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

SQLServer学习笔记系列4

發布時間:2023/12/10 数据库 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 SQLServer学习笔记系列4 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

?

一.寫在前面的話


好多天沒有記錄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.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);

可以看到找出了所有顧客信息,包括未下訂單的顧客信息。其實在這里只是交換了兩張表的位置而已。

所以說對于左右連接來說,左連接就以左側表為基準,

右連接就以右表為基準。

轉載于:https://www.cnblogs.com/Mining-LiTeng/p/4566694.html

創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎

總結

以上是生活随笔為你收集整理的SQLServer学习笔记系列4的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。