SQL多表查詢總結

2021-08-20 22:59:24 字數 4673 閱讀 5117

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

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

一、union

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

union 運算子通過組合其他兩個結果表(例如 table1 和 table2)並消去表中任何重複行而派生出乙個結果表。

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

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

學生表資訊(students):

idname

agecity

majorid

1jack

12beijing102

lucy

13shanghai

11教師表資訊(teachers):

idname

1jack

2mrs lee

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

select id,name from students

union

select id,name from teachers

查詢結果:

idname

1jack

2lucy

2mrs lee

(2)查詢教師學生全部姓名

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

select name from students

union all

select name from teachers

查詢結果:

idname

1jack

2lucy

1jack

2mrs lee

二、inner join(內連線)

inner join(內連線),也成為自然連線

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

注意⚠️: 內連線是從結果中刪除其他被連線表中沒有匹配行的所有行,所以內連線可能會丟失資訊。

重點:內連線,只查匹配行。

語法:(inner可省略) 

select fieldlist

from table1 [inner] join table2

on table1.column=table2.column

學生表資訊(students):

idname

agecity

majorid

1jack

12beijing102

lucy

13shanghai

11專業資訊表(majors):

idname

10english

15computer

例項:查詢學生資訊,包括id,姓名、專業名稱

select students.id,students.name,majors.name as majorname

from students inner join majors

on students.majorid = majors.id

查詢結果:

idname

majorname

1jack

english

根據結果可以清晰看到,確實只有匹配的行。學生lucy的資訊丟失了。

三、外連線

與內連線相比,即使沒有匹配行,也會返回乙個表的全集。

外連線分為三種:左外連線,右外連線,全外連線。

對應sql:left/right/full outer join。

通常我們省略outer 這個關鍵字。寫成:left/right/full join。

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

1、left join (左連線)

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

依然沿用內鏈結的例子:

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

select students.id,students.name,majors.name as majorname

from students left join majors

on students.majorid = majors.id

查詢結果:

idname

majorname

1jack

english

2lucy

null

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

2、right join (右連線)

右外連線保留了第二個表的所有行,但只包含第乙個表與第二個表匹配的行。第乙個表相應空行被入null值。

右連線與左連線思想類似。只是第二張保留全集,如果第一張表中沒有匹配項,用null代替

依然沿用內鏈結的例子,只是改為右連線

(2)使用右連線查詢學生的資訊,其中包括學生id,學生姓名和專業名稱

select students.id,students.name,majors.name as majorname

from students right join majors

on students.majorid = majors.id

查詢結果:

idname

majorname

1jack

english

null

null

computer

通過結果可以看到,包含了第二張表majors的全集,computer在students表中沒有匹配項,就用null代替。

3、full join (全連線)

會把兩個表所有的行都顯示在結果表中

(3)使用全連線查詢學生的資訊,其中包括學生id,學生姓名和專業名稱。

select students.id,students.name,majors.name as majorname

from students full join majors

on students.majorid = majors.id

查詢結果:

idname

majorname

1jack

english

2lucy

null

null

null

computer

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

4、cross join(交叉連線)

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

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

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

(4)交叉連線查詢學生的資訊,其中包括學生id,學生姓名和專業名稱。

select students.id,students.name,majors.name as majorname

from students cross join majors

查詢結果:

idname

majorname

1jack

english

2lucy

english

1jack

computer

2lucy

computer

(5)查詢多表,其實也是笛卡兒積,與cross join等價,以下查詢同上述結果一樣。

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

select students.id,students.name,majors.name as majorname

from students,majors

查詢結果:

idname

majorname

1jack

english

2lucy

english

1jack

computer

2lucy

computer

(6)增加查詢條件

注意:在使用cross join關鍵字交叉連線表時,因為生成的是兩個表的笛卡爾積,因而不能使用on關鍵字,只能在where子句中定義搜尋條件。

select students.id,students.name,majors.name as majorname

from students cross join majors

where students.majorid = majors.id

查詢結果:

idname

majorname

1jack

english

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

SQL多表查詢總結

連線查詢包括合併 內連線 外連線和交叉連線,如果涉及多表查詢,了解這些連線的特點很重要。只有真正了解它們之間的區別,才能正確使用。一 union union 操作符用於合併兩個或多個 select 語句的結果集。union 運算子通過組合其他兩個結果表 例如 table1 和 table2 並消去表...

SQL 多表查詢

不同的 sql join inner join 內連線 如果表中至少有乙個匹配,也從左表返回所有的行 left join 左連線 即使右表中沒有匹配,也從右表返回所有的行 right join 右連線 即使左表中沒有匹配,也從右表返回所有的行 full join 全連線 只有其中乙個表中存在匹配也從...

SQL 多表查詢

join操作符 1.笛卡爾積,rxs 可直接轉換為sql語句 2.等值連線,記作 可直接轉換為sql語句 3.自然連線,記作 可轉換為sql語句 4.左外連線和右外連線的表示方法及轉換為sql 注意若多個關係有同名屬性,則用 關係名.屬性名 指出重名屬性 連線也可以與投影,選擇等結合使用。1.查詢選...