第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

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ù)如下:

圖片描述

兩張表數(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é)果如下圖:

圖片描述

內(nèi)連接結(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é)果

執(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é)果

執(zhí)行結(jié)果解釋:右連接(right join)是右外連接(right outer join)的簡寫,右連接會將右表(test_b)的所有記錄都展示出來,而左表(test_a)只展示符合后置條件(on condition)的記錄展示,其他記錄以 NULL 作為補全。

即展示兩個集合的交集以及右邊集合的剩余部分:

圖片描述

集合右交集

3. 小結(jié)

SQL 查詢可以拆分為兩種情況,一種是單表查詢,即根據(jù) where 條件語句查詢得到中間表,然后執(zhí)行 select 語句選擇需要的列返回給控制臺。另一種是多表查詢,對多張表求笛卡爾積,使用 on 語句作為連接條件得到中間表,之后還是通過 where 語句過濾中間表的記錄,選擇需要的列返回給控制臺,本章節(jié)介紹的就是第二種查詢方式。