亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

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 語句過濾中間表的記錄,選擇需要的列返回給控制臺,本章節介紹的就是第二種查詢方式。