【SQL Server】鏈接查詢

前言:

       之前學過數據庫原理,在做題的時候感覺還是挺簡單的,但是真正用到實際中,就感覺虛了好多,所以今天在把數據庫中的知識拾起來,看看在實際過程中是如何應用的。

   連接查詢包括合併、內連接、外連接和交叉連接,如果涉及多表查詢

   首先設計測試的兩張表,表的名字分別爲T_Student和T_Course

  

  


1.Union

UNION 操作符用於合併兩個或多個 SELECT 語句的結果集。

UNION 運算符通過組合其他兩個結果表(例如 TABLE1 和 TABLE2)並消去表中任何重複行而派生出一個結果表。

當 ALL 隨 UNION 一起使用時(即 UNION ALL),不消除重複行。兩種情況下,派生表的每一行不是來自 TABLE1 就是來自 TABLE2。

注意:使用UNION時,必須在其目標列表中有相同數目的表達式,也就是上面的表選擇兩個列,下面的表也必須選擇兩個列

  

<span style="font-family:KaiTi_GB2312;font-size:18px;">select id,name from T_Student 
Union
select courseid,coursename from T_Course</span>


結果:




這是一種比較少用的鏈接方式,Oracle、MySQL均不支持,作用是:找出全外連接和內連接之間差異的所有行。這在數據分析中排錯中比較常用。也可以利用數據庫的集合操作來實現此功能。


2、INNER JOIN(內連接)

內連接也叫連接,是最早的一種連接。還可以被稱爲普通連接或者自然連接,內連接是從結果表中刪除與其他被連接表中沒有匹配行的所有行,所以內連接可能會丟失信息。

 NNER JOIN(內連接),也成爲自然連接

作用:根據兩個或多個表中的列之間的關係,從這些表中查詢數據。

注意: 內連接是從結果中刪除其他被連接表中沒有匹配行的所有行,所以內連接可能會丟失信息。

實例:查詢學生信息,包括id,姓名,專業名稱

<span style="font-family:KaiTi_GB2312;font-size:18px;">select T_Student.id,T_Student.name,T_Course.CourseName 
from T_Student join T_Course
on T_Student.courseid=T_Course.Courseid</span>

查詢結果:


3 外連接

外連接分爲三種:左外連接,右外連接,全外連接。對應SQL:LEFT/RIGHT/FULL OUTER JOIN。通常我們省略outer 這個關鍵字。寫成:LEFT/RIGHT/FULL JOIN。

重點:至少有一方保留全集,沒有匹配行用NULL代替。

(1)LEFT OUTER JOIN,簡稱LEFT JOIN,左外連接(左連接)

結果集保留左表的所有行,但只包含第二個表與第一表匹配的行。第二個表相應的空行被放入NULL值。

實例:用左鏈接查詢學生的的id,姓名,專業名稱

<span style="font-family:KaiTi_GB2312;font-size:18px;">select T_Student.id,T_Student.name,T_Course.CourseName 
from T_Student left join T_Course
on T_Student.courseid=T_Course.Courseid</span>


結果:


通過結果我們可以看出,left join是以表1的記錄爲基礎,即左表的記錄全部顯示出來,而表2只顯示符合搜索條件的記錄顯示出來,即右表根據條件顯示,那這裏的條件就是a.ID=b.ID,記錄不足的會以NULL填充顯示


(2)右外鏈接

實例:用左鏈接查詢學生的的id,姓名,專業名稱

<span style="font-family:KaiTi_GB2312;font-size:18px;">select T_Student.id,T_Student.name,T_Course.CourseName 
from T_Student right join T_Course
on T_Student.courseid=T_Course.Courseid</span>


結果:



我們會發現,right join執行的效果剛好和left join執行的效果相反,即以右表的數據爲基礎,顯示右表全部數據,而只顯示左表符合搜索條件的數據。


4、CROSS JOIN(交叉連接)

交叉連接。交叉連接返回左表中的所有行,左表中的每一行與右表中的所有行組合。交叉連接也稱作笛卡爾積。 
簡單查詢兩張表組合,這是求笛卡兒積,效率最低。


笛卡兒積:笛卡爾乘積,也叫直積。假設集合A={a,b},集合B={0,1,2},則兩個集合的笛卡爾積爲{(a,0),(a,1),(a,2),(b,0),(b,1), (b,2)}。可以擴展到多個集合的情況。類似的例子有,如果A表示某學校學生的集合,B表示該學校所有課程的集合,則A與B的笛卡爾積表示所有可能的選課情況。

<span style="font-family:KaiTi_GB2312;font-size:18px;">select T_Student.id,T_Student.name,T_Course.CourseName 
from T_Student cross join T_Course</span>

結果:


圖沒有截完。 可以看出是查詢所有的信息。


總結:

1、 查兩表關聯列相等的數據用內連接。
2、 Col_L是Col_R的子集時用右外連接。
3、 Col_R是Col_L的子集時用左外連接。
4、 Col_R和Col_L彼此有交集但彼此互不爲子集時候用全外。
5、 求差操作的時候用聯合查詢。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章