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