天天看點

【資料庫】sql連表查詢SQL總結 連表查詢

連接配接查詢包括合并、内連接配接、外連接配接和交叉連接配接,如果涉及多表查詢,了解這些連接配接的特點很重要。

隻有真正了解它們之間的差別,才能正确使用。

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

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

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

注意:使用UNION時,兩張表查詢的結果有相同數量的列、列類型相似。

學生表資訊(Students):

ID

Name

Age

City

MajorID

101

Tom

20

BeiJing

10

102

Lucy

18

ShangHai

11

教師表資訊(Teachers):

 ID

 Name

 101

 Mrs Lee

 102

 Lucy

預置腳本:

1)基本UNION查詢,查詢學校教師、學生的總的資訊表,包括ID和姓名

查詢結果:

Mrs Lee

102 

2)帶條件的UNION查詢,也可以查詢同一張表,查詢年齡為18,23歲的學生資訊

當然,這可以使用IN或者OR很容易實作,這裡隻是點到,以後遇到複雜查詢,相信你會用到。

3)查詢教師學生全部姓名

 因為UNION隻會選擇不同的值,如果學生中和教師中有重名的情況,這就需要UNION ALL

INNER JOIN(内連接配接),也成為自然連接配接

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

注意: 内連接配接是從結果中删除其他被連接配接表中沒有比對行的所有行,是以内連接配接可能會丢失資訊。

重點:内連接配接,隻查比對行。

文法:(INNER可省略)

專業資訊表(Majors): 

English

12

Computer

 預置腳本:

【資料庫】sql連表查詢SQL總結 連表查詢
【資料庫】sql連表查詢SQL總結 連表查詢

執行個體:查詢學生資訊,包括ID,姓名、專業名稱

 查詢結果:

MajorName

根據結果可以清晰看到,确實隻有比對的行。學生Lucy的資訊丢失了。

但是,inner join也會産生重複資料。如果将Majors表的主鍵限制去掉,可以插入重複的ID,如:

繼續執行上面的關聯語句,結果為:

如果是LEFT JOIN也會有重複記錄,其結果為:

NULL

RIGHT JOIN 結果與INNER JOIN一樣。

後續我們會深入研究JOIN的具體原理。

與内連接配接相比,即使沒有比對行,也會傳回一個表的全集。

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

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

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

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

依然沿用内連結的例子

(1)使用左連接配接查詢學生的資訊,其中包括學生ID,學生姓名和專業名稱。

結果:

 結論:

通過結果,我們可以看到左連接配接包含了第一張表的所有資訊,在第二張表中如果沒有比對項,則用NULL代替。 

2)RIGHT JOIN(right outer join)右外連接配接(右連接配接)

右外連接配接保留了第二個表的所有行,但隻包含第一個表與第二個表比對的行。第一個表相應空行被入NULL值。

右連接配接與左連接配接思想類似。隻是第二張保留全集,如果第一張表中沒有比對項,用NULL代替

依然沿用内連結的例子,隻是改為右連接配接

(1)使用右連接配接查詢學生的資訊,其中包括學生ID,學生姓名和專業名稱。

通過結果可以看到,包含了第二張表Majors的全集,Computer在Students表中沒有比對項,就用NULL代替。 

3)FULL JOIN (FULL OUTER JOIN,全外連接配接)

全外連接配接,簡稱:全連接配接。會把兩個表所有的行都顯示在結果表中

1)使用全連接配接查詢學生的資訊,其中包括學生ID,學生姓名和專業名稱。

查詢結果: 

包含了兩張表的所有記錄,沒有記錄丢失,沒有比對的行用NULL代替。

交叉連接配接。交叉連接配接傳回左表中的所有行,左表中的每一行與右表中的所有行組合。交叉連接配接也稱作笛卡爾積。 

簡單查詢兩張表組合,這是求笛卡兒積,效率最低。

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

1)交叉連接配接查詢學生的資訊,其中包括學生ID,學生姓名和專業名稱。

2)查詢多表,其實也是笛卡兒積,與CROSS JOIN等價,以下查詢同上述結果一樣。

這個可能很常見,但是大家一定要注意了,這樣就查詢了兩張表中所有組合的全集。

3)加了查詢條件

注意:在使用CROSS JOIN關鍵字交叉連接配接表時,因為生成的是兩個表的笛卡爾積,因而不能使用ON關鍵字,隻能在WHERE子句中定義搜尋條件。

查詢結果與INNER JOIN一樣,但是其效率就慢很多了。

【資料庫】sql連表查詢SQL總結 連表查詢
【資料庫】sql連表查詢SQL總結 連表查詢
【資料庫】sql連表查詢SQL總結 連表查詢