SQL總結 連表查詢

 

鏈接查詢包括合併、內鏈接、外鏈接和交叉鏈接,若是涉及多表查詢,瞭解這些鏈接的特色很重要。spa

只有真正瞭解它們之間的區別,才能正確使用。code

一、Union

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

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

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

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

學生表信息(Students):table

ID Name Age City MajorID
101 Tom 20 BeiJing 10
102 Lucy 18 ShangHai 11

 

 

 

教師表信息(Teachers):class

 ID  Name
 101  Mrs Lee
 102  Lucy

 

 

 

預置腳本:效率

INSERT INTO Students(ID,Name,Age,City,MajorID) VALUES(101,'Tom',20,'BeiJing',10)
INSERT INTO Students(ID,Name,Age,City,MajorID) VALUES(102,'Lucy',18,'ShangHai',11)

INSERT INTO Teachers(ID,Name) VALUES(101,'Mrs Lee')
INSERT INTO Teachers(ID,Name) VALUES(102,'Lucy')

 

1)基本UNION查詢,查詢學校教師、學生的總的信息表,包括ID和姓名原理

SELECT ID,Name FROM Students
UNION
SELECT ID,Name FROM Teachers

查詢結果:

 ID  Name
101 Mrs Lee
101 Tom
102  Lucy

 

 

 

 

2)帶條件的UNION查詢,也能夠查詢同一張表,查詢年齡爲18,23歲的學生信息

SELECT ID,Name FROM Student WHERE Age=18
UNION
SELECT ID,Name FROM Student WHERE Age=23

固然,這可使用IN或者OR很容易實現,這裏只是點到,之後遇到複雜查詢,相信你會用到。

3)查詢教師學生所有姓名

 由於UNION只會選擇不一樣的值,若是學生中和教師中有重名的狀況,這就須要UNION ALL

SELECT Name FROM Students
UNION ALL
SELECT Name FROM Teachers

查詢結果:

 ID  Name
101 Tom
102 Lucy
101 Mrs Lee
102  Lucy

 

 

 

  

 

二、INNER JOIN(內鏈接)

INNER JOIN(內鏈接),也成爲天然鏈接

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

注意: 內鏈接是從結果中刪除其餘被鏈接表中沒有匹配行的全部行,因此內鏈接可能會丟失信息。

重點:內鏈接,只查匹配行。

語法:(INNER可省略)

SELECT fieldlist
FROM table1 [INNER] join table2
ON table1.column=table2.column

學生表信息(Students):

ID Name Age City MajorID
101 Tom 20 BeiJing 10
102 Lucy 18 ShangHai 11

 

 

 

專業信息表(Majors): 

ID  Name
10 English
12 Computer

 

 

 

 預置腳本:

複製代碼
DELETE FROM Students
INSERT INTO Students(ID,Name,Age,City,MajorID) VALUES(101,'Tom',20,'BeiJing',10)
INSERT INTO Students(ID,Name,Age,City,MajorID) VALUES(102,'Lucy',18,'ShangHai',11)

DELETE FROM Majors
INSERT INTO Majors(ID,Name) VALUES(10,'English')
INSERT INTO Majors(ID,Name) VALUES(12,'Computer')
複製代碼

 

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

SELECT Students.ID,Students.Name,Majors.Name AS MajorName
FROM Students INNER JOIN Majors
ON Students.MajorID = Majors.ID

 查詢結果:

ID Name MajorName
101 Tom English

 

 

根據結果能夠清晰看到,確實只有匹配的行。學生Lucy的信息丟失了。

 

可是,inner join也會產生重複數據。若是將Majors表的主鍵約束去掉,能夠插入重複的ID,如:

DELETE FROM Majors
INSERT INTO Majors(ID,Name) VALUES(10,'English')
INSERT INTO Majors(ID,Name) VALUES(10,'Computer')

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

ID Name MajorName
101 Tom English
101 Tom Computer

 

 

 

若是是LEFT JOIN也會有重複記錄,其結果爲:

ID Name MajorName
101 Tom English
101 Tom Computer
102 Lucy 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,學生姓名和專業名稱。

SELECT Students.ID,Students.Name,Majors.Name AS MajorName
FROM Students LEFT JOIN Majors
ON Students.MajorID = Majors.ID

 

結果:

ID

Name

MajorName

101

Tom

English

102

Lucy

NULL

 

 

 

 

 

 結論:

經過結果,咱們能夠看到左鏈接包含了第一張表的全部信息,在第二張表中若是沒有匹配項,則用NULL代替。 

 

2)RIGHT JOIN(right outer join)右外鏈接(右鏈接)

右外鏈接保留了第二個表的全部行,但只包含第一個表與第二個表匹配的行。第一個表相應空行被入NULL值。

右鏈接與左鏈接思想相似。只是第二張保留全集,若是第一張表中沒有匹配項,用NULL代替

依然沿用內連接的例子,只是改成右鏈接

(1)使用右鏈接查詢學生的信息,其中包括學生ID,學生姓名和專業名稱。

SELECT Students.ID,Students.Name,Majors.Name AS MajorName
FROM Students RIGHT JOIN Majors
ON Students.MajorID = Majors.ID

查詢結果:

ID

Name

MajorName

101

Tom

English

NULL

NULL

Computer

 

 

 

 

 

 

經過結果能夠看到,包含了第二張表Majors的全集,Computer在Students表中沒有匹配項,就用NULL代替。 


3)FULL JOIN (FULL OUTER JOIN,全外鏈接)

全外鏈接,簡稱:全鏈接。會把兩個表全部的行都顯示在結果表中

1)使用全鏈接查詢學生的信息,其中包括學生ID,學生姓名和專業名稱。

SELECT Students.ID,Students.Name,Majors.Name AS MajorName
FROM Students FULL JOIN Majors
ON Students.MajorID = Majors.ID

查詢結果: 

ID

Name

MajorName

101

Tom

English

102

Lucy

NULL

NULL

NULL

Computer

 

 

 

 

 

 

 

 

包含了兩張表的全部記錄,沒有記錄丟失,沒有匹配的行用NULL代替。

四、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的笛卡爾積表示全部可能的選課狀況。

1)交叉鏈接查詢學生的信息,其中包括學生ID,學生姓名和專業名稱。

SELECT Students.ID,Students.Name,Majors.Name AS MajorName
FROM Students CROSS JOIN Majors

查詢結果:

ID

Name

MajorName

101

Tom

English

102

Lucy

English

101

Tom

Computer

102

Lucy

Computer

 

 

 

 

 

 

 

 

 

 

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

這個可能很常見,可是你們必定要注意了,這樣就查詢了兩張表中全部組合的全集。

SELECT Students.ID,Students.Name,Majors.Name AS MajorName
FROM Students,Majors

3)加了查詢條件

注意:在使用CROSS JOIN關鍵字交叉鏈接表時,由於生成的是兩個表的笛卡爾積,於是不能使用ON關鍵字,只能在WHERE子句中定義搜索條件。

SELECT Students.ID,Students.Name,Majors.Name AS MajorName
FROM Students CROSS JOIN Majors
WHERE Students.MajorID = Majors.ID

查詢結果:

ID

Name

MajorName

101

Tom

English

 

 

 

 

查詢結果與INNER JOIN同樣,可是其效率就慢不少了。

相關文章
相關標籤/搜索