多表查詢,也稱為多表連線查詢;作為關係型資料庫最主要的查詢方式,在日常工作中被廣泛使用
常見的多表查詢操作包含:子查詢、內連線、左外連線、右外連線、完全連線、交叉連線
本篇文章將利用乙個例項逐一介紹這些操作
以 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語句,當然實際開發中我們不會這樣建表,實際開發中這兩個表會有自己不同的主鍵。一 外連線 外連線可分為 本文主要舉兩張和三張表來講述多表連線查詢。新建...