SQL 多表查詢詳細講解

2021-10-25 22:28:42 字數 4995 閱讀 7195

多表查詢,也稱為多表連線查詢;作為關係型資料庫最主要的查詢方式,在日常工作中被廣泛使用

常見的多表查詢操作包含:子查詢、內連線、左外連線、右外連線、完全連線、交叉連線

本篇文章將利用乙個例項逐一介紹這些操作

以 mysql 資料庫為例,建立兩張資料表:

其中,學生表 id 字段對應選課記錄表中的 student_id 字段

sql 如下:

# 學生表:student

create table student

(    id   int          not null

primary key,

name varchar(255) null,

age  int          null

)    comment '學生表';

# 選課記錄表:record

create table record

(    id         int          not null

primary key,

name       varchar(255) not null,

student_id int          not null,

time       datetime     null

)    comment '選課記錄';

然後,向 2 張表中插入一些資料

# 學生表資料

1,張三,18

2,李四,23

3,王五,30

4,馬六,35

5,孫七,40

6,朱八,19

7,黃九,53

# 記錄表資料

2021001,語文,1,2021-01-18 15:32:47

2021002,數學,2,2021-01-18 15:33:41

2021003,英語,3,2021-01-18 15:34:01

2021004,物理,4,2021-01-18 15:34:33

2021005,體育,5,2021-01-18 15:34:47

2021006,化學,8,2021-01-18 15:35:12

2021007,生物,9,2021-01-18 15:35:39

2021008,**,10,2021-01-18 15:36:00

子查詢,又稱之為內查詢,是一種巢狀在其他 sql 查詢的 where 子句中的查詢

一般用於對查詢結果的進一步限制,返回所需要的資料;子查詢可以用在 select、insert、update 和 delete 語句中

這裡以 select 語句為例,在兩張表中使用子查詢,篩選出滿足條件的記錄

# 子查詢

select * from student where id in (select student_id from record where student_id<=3)

查詢結果如下:

# 子查詢的結果

1,張三,18

2,李四,23

3,王五,30)

需要注意的是,子查詢必須包含在圓括號內,並且不能使用 order by 進行排序

內連線是通過關鍵字 inner join 連線兩張表,只返回滿足 on 條件的,兩張表的交集資料

# 內連線

select * from student s inner join record r on s.id=r.student_id;

查詢結果如下:

# 內連線查詢結果

1,張三,18,2021001,語文,1,2021-01-18 15:32:47

2,李四,23,2021002,數學,2,2021-01-18 15:33:41

3,王五,30,2021003,英語,3,2021-01-18 15:34:01

4,馬六,35,2021004,物理,4,2021-01-18 15:34:33

5,孫七,40,2021005,體育,5,2021-01-18 15:34:47

需要注意的是,如果內連線沒有通過 on 關鍵字指定條件的話,查詢結果和交叉連線查詢結果一樣,只是執行效率高於交叉連線

外連線包含:

其中,左外連線:使用關鍵字 left join,以左表為準,返回左表的所有資料,右表滿足 on 條件的資料會全部顯示,否則用 null 值去填充

右外連線:和左外連線相反。使用關鍵 right join,以右表為準,返回右表的所有資料,左表滿足 on 條件的資料會全部顯示,否則用 null 值去填充

首先,我們來看左連線的例項

# 左外連線

select * from student s left join record r on s.id=r.student_id;

返回結果如下:

# 左外連線結果

1,張三,18,2021001,語文,1,2021-01-18 15:32:47

2,李四,23,2021002,數學,2,2021-01-18 15:33:41

3,王五,30,2021003,英語,3,2021-01-18 15:34:01

4,馬六,35,2021004,物理,4,2021-01-18 15:34:33

5,孫七,40,2021005,體育,5,2021-01-18 15:34:47

6,朱八,19,null,null,null,null

7,黃九,53,null,null,null,null

然後,我們再來看看右連線

# 右外連線

select * from student s right join record r on s.id=r.student_id;

返回結果如下:

# 右外連線結果

1,張三,18,2021001,語文,1,2021-01-18 15:32:47

2,李四,23,2021002,數學,2,2021-01-18 15:33:41

3,王五,30,2021003,英語,3,2021-01-18 15:34:01

4,馬六,35,2021004,物理,4,2021-01-18 15:34:33

5,孫七,40,2021005,體育,5,2021-01-18 15:34:47

null,null,null,2021006,化學,8,2021-01-18 15:35:12

null,null,null,2021007,生物,9,2021-01-18 15:35:39

null,null,null,2021008,**,10,2021-01-18 15:36:00

完全連線,是通過關鍵字 full join 連線兩張表,返回左表和右表的所有資料,並使用 null 值填充缺失的資料

# 完全連線

select * from student s full join record r on s.id = r.student_id;

需要注意的是,mysql 並不支援完全連線,我們可以使用左連線 + union + 右連線的方式去模擬完全連線

select * from student left join record on student.id = record.student_id

union

select * from student right join record on student.id = record.student_id;

查詢結果如下:

# 完全連線結果

1,張三,18,2021001,語文,1,2021-01-18 15:32:47

2,李四,23,2021002,數學,2,2021-01-18 15:33:41

3,王五,30,2021003,英語,3,2021-01-18 15:34:01

4,馬六,35,2021004,物理,4,2021-01-18 15:34:33

5,孫七,40,2021005,體育,5,2021-01-18 15:34:47

6,朱八,19,null,null,null,null

7,黃九,53,null,null,null,null

null,null,null,2021006,化學,8,2021-01-18 15:35:12

null,null,null,2021007,生物,9,2021-01-18 15:35:39

null,null,null,2021008,**,10,2021-01-18 15:36:00

交叉連線,又稱之為笛卡爾積,使用關鍵字 cross join 連線兩張表進行查詢

如果不使用 where 加入限制條件,則返回兩張錶行數的乘積;如果加入限制條件,則返回滿足條件表示式的資料並合成一行

以加入限制條件的交叉連線查詢為例

# 交叉連線

select * from xag.student as s cross join xag.record as r where s.id=r.student_id;

查詢結果如下:

# 交叉連線結果

1,張三,18,2021001,語文,1,2021-01-18 15:32:47

2,李四,23,2021002,數學,2,2021-01-18 15:33:41

3,王五,30,2021003,英語,3,2021-01-18 15:34:01

4,馬六,35,2021004,物理,4,2021-01-18 15:34:33

5,孫七,40,2021005,體育,5,2021-01-18 15:34:47

需要注意的是,交叉連線查詢如果帶有限制條件,它會先生成兩張錶行數成績生成查詢結果集,然後再通過限制條件去過濾;因此,在資料量大的時候,查詢速度會很慢

相比單錶查詢,多表查詢可以覆蓋更多業務場景,大大提公升我們的工作效率!實際工作當中,可以根據需要選擇性的去使用!

SQL多表連線查詢(詳細例項)

本文主要列舉兩張和三張表來講述多表連線查詢。新建兩張表 表1 student 截圖如下 表2 course 截圖如下 此時這樣建表只是為了演示連線sql語句,當然實際開發中我們不會這樣建表,實際開發中這兩個表會有自己不同的主鍵。一 外連線 外連線可分為 左連線 右連線 完全外連線。1 左連線 lef...

SQL多表連線查詢(詳細例項)

本文主要列舉兩張和三張表來講述多表連線查詢。新建兩張表 表1 student 截圖如下 表2 course 截圖如下 此時這樣建表只是為了演示連線sql語句,當然實際開發中我們不會這樣建表,實際開發中這兩個表會有自己不同的主鍵。一 外連線 外連線可分為 本文主要列舉兩張和三張表來講述多表連線查詢。新...

SQL多表連線查詢(詳細例項)

本文主要列舉兩張和三張表來講述多表連線查詢。新建兩張表 表1 student 截圖如下 表2 course 截圖如下 此時這樣建表只是為了演示連線sql語句,當然實際開發中我們不會這樣建表,實際開發中這兩個表會有自己不同的主鍵。一 外連線 外連線可分為 本文主要舉兩張和三張表來講述多表連線查詢。新建...