1. 前言
在之前的章節談到了數據庫設計范式,遵循范式之后,數據會被組織成不同的結構分散存儲在不同的表內,例如所有學生會被存儲在一張學生表,所有學生的成績會被存儲在一張成績表,如果我們同時需要兩張表的數據,就需要計算兩張表間數據的映射關系,MySQL 數據庫中最常用的方法就是連接。
2. 左連接、右連接、全連接
面試官: 請闡述下 MySQL 中左連接、右連接、全連接的定義和區別?
題目解析:
① 定義:MySQL 的連接表示多表(一般就是兩張表)之間聯合查詢的操作。
② 分類:根據操作性質的不同,分為內連接和外連接,外連接又可以細分為左外連接和右外連接。除此之外,還有一種全連接操作,不過 MySQL 數據庫并不支持。
定義解釋比較抽象,下面我們通過實戰來講解這幾種連接的區別,首先進入 MySQL 終端,首先創建一個測試數據庫:
CREATE DATABASE mooc_demo;
創建一張測試表 test_a
:
DROP TABLE IF EXISTS `test_a`;
CREATE TABLE `test_a` (
`id` int(11) NOT NULL PRIMARY KEY AUTO_INCREMENT COMMENT '數據庫主鍵',
`name` varchar(32) DEFAULT NULL COMMENT '姓名',
`part` varchar(32) DEFAULT NULL COMMENT '部門'
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
然后插入一些測試數據:
insert into test_a (`name`, `part`) values ('小明','文藝部');
insert into test_a (`name`, `part`) values ('小紅','學習部');
insert into test_a (`name`, `part`) values ('小王','體育部');
繼續創建另外一張測試表 test_b
:
DROP TABLE IF EXISTS `test_b`;
CREATE TABLE `test_b` (
`id` int(11) NOT NULL PRIMARY KEY AUTO_INCREMENT COMMENT '數據庫主鍵',
`name` varchar(32) DEFAULT NULL COMMENT '姓名',
`group` varchar(32) DEFAULT NULL COMMENT '小組'
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
插入一些測試數據:
insert into test_b (`name`, `group`) values ('小明', '1號小組');
insert into test_b (`name`, `group`) values ('小紅', '2號小組');
insert into test_b (`name`, `group`) values ('小李', '3號小組');
執行完成之后,兩張表的數據如下:
2.1 內連接
SQL 語法:
inner join table_name on table_name
構建一條測試 SQL:select * from test_a a inner join test_b b on a.name = b.name;
,執行結果如下圖:
執行結果解釋:組裝兩張表滿足 a.name = b.name
的查詢結果。
我們以數據中的集合類比,表 test_a
和表 test_b
是兩個數據集合,內連接則表示查詢兩個表都符合條件的數據,即集合的交集操作。
2.2 左連接
SQL 語法:
...left join table_name on table_name
構建一條測試 SQL:select * from test_a a left join test_b b on a.name = b.name;
,執行結果如下圖:
執行結果解釋:左連接(left join)是左外連接(left outer join)的簡寫,左連接會將左表(test_a
)的所有記錄都展示出來,而右表(test_b
)只會展示符合搜索條件(上圖中的 on condition
)的搜索記錄,其他記錄以 NULL
作為補全。
即展示兩個集合的交集以及左邊集合的剩余部分數據:
2.3 右連接
SQL 語法:
right join table_name on table_name
構建一條測試 SQL:select * from test_a a right join test_b b on a.name = b.name;
,執行結果如下圖:
執行結果解釋:右連接(right join)是右外連接(right outer join)的簡寫,右連接會將右表(test_b
)的所有記錄都展示出來,而左表(test_a
)只展示符合后置條件(on condition
)的記錄展示,其他記錄以 NULL
作為補全。
即展示兩個集合的交集以及右邊集合的剩余部分:
3. 小結
SQL 查詢可以拆分為兩種情況,一種是單表查詢,即根據 where 條件語句查詢得到中間表,然后執行 select 語句選擇需要的列返回給控制臺。另一種是多表查詢,對多張表求笛卡爾積,使用 on 語句作為連接條件得到中間表,之后還是通過 where 語句過濾中間表的記錄,選擇需要的列返回給控制臺,本章節介紹的就是第二種查詢方式。