连接一般定义为
R
∞
S
A
θ
B
\underset{A \theta B}{R \infty S}
AθBR∞S,其中
∞
\infty
∞ 表示连接运算符,
θ
\theta
θ 为比较运算符,
A
θ
B
A\theta B
AθB 是条件表达式。含义是从
R
R
R 和
S
S
S 的笛卡尔积
R
×
S
R \times S
R×S 中选取
R
R
R 关系在
A
A
A 属性组上的值与
S
S
S 关系在
B
B
B 属性组上的值满足比较关系
θ
θ
θ 的元组。
-- 创建省份表DROPTABLEIFEXISTS provinces;CREATETABLE provinces
(
province_name VARCHAR(255),
country_name VARCHAR(255),
capital_name VARCHAR(255));-- 插入省份数据INSERTINTO provinces (province_name, country_name, capital_name)VALUES('Guangdong','China','Guangzhou'),('Sichuan','China','Chengdu'),('Jiangsu','China','Nanjing'),('California','USA','Sacramento'),('Hawaii','USA','Honolulu'),('Texas','USA','Houston');
province_name
country_name
capital_name
Guangdong
China
Guangzhou
Sichuan
China
Chengdu
Jiangsu
China
Nanjing
California
USA
Sacramento
Hawaii
USA
Honolulu
Texas
USA
Houston
-- 创建省会表DROPTABLEIFEXISTS capital;CREATETABLE capital
(
capital_name VARCHAR(255),
population INT);-- 插入省会数据INSERTINTO capital (capital_name, population)VALUES('Guangzhou',15000000),('Nanjing',8000000),('Sacramento',500000),('Honolulu',380000),('Tokyo',14000000),('London',9000000);
capital_name
population
Guangzhou
15000000
Nanjing
8000000
Sacramento
500000
Honolulu
380000
Tokyo
14000000
London
9000000
2.1 等值连接
SELECT*FROM provinces
JOIN capital ON provinces.capital_name = capital.capital_name;
province_name
country_name
provinces.capital_name
capital.capital_name
population
Guangdong
China
Guangzhou
Guangzhou
15000000
Jiangsu
China
Nanjing
Nanjing
8000000
California
USA
Sacramento
Sacramento
500000
Hawaii
USA
Honolulu
Honolulu
380000
2.2 自然连接
SELECT*FROM provinces
NATURALJOIN capital;
capital_name
province_name
country_name
population
Guangzhou
Guangdong
China
15000000
Nanjing
Jiangsu
China
8000000
Sacramento
California
USA
500000
Honolulu
Hawaii
USA
380000
2.3 左外连接
SELECT*FROM provinces
LEFTJOIN capital ON provinces.capital_name = capital.capital_name;
province_name
country_name
capital_name
capital_name
population
Guangdong
China
Guangzhou
Guangzhou
15000000
Sichuan
China
Chengdu
null
null
Jiangsu
China
Nanjing
Nanjing
8000000
California
USA
Sacramento
Sacramento
500000
Hawaii
USA
Honolulu
Honolulu
380000
Texas
USA
Houston
null
null
2.4 右外连接
SELECT*FROM provinces
RIGHTJOIN capital ON provinces.capital_name = capital.capital_name;
province_name
country_name
capital_name
capital_name
population
Guangdong
China
Guangzhou
Guangzhou
15000000
Jiangsu
China
Nanjing
Nanjing
8000000
California
USA
Sacramento
Sacramento
500000
Hawaii
USA
Honolulu
Honolulu
380000
null
null
null
Tokyo
14000000
null
null
null
London
9000000
2.5 全外连接
MySQL 不支持全外连接,这里只对相应结果进行展示。
province_name
country_name
capital_name
capital_name
population
Guangdong
China
Guangzhou
Guangzhou
15000000
Sichuan
China
Chengdu
null
null
Jiangsu
China
Nanjing
Nanjing
8000000
California
USA
Sacramento
Sacramento
500000
Hawaii
USA
Honolulu
Honolulu
380000
Texas
USA
Houston
null
null
null
null
null
Tokyo
14000000
null
null
null
London
9000000
2.6 交叉连接
交叉连接得到的是两张表数据的乘积,所以以下两种写法是等价的:
SELECT*FROM provinces
CROSSJOIN capital;SELECT*FROM provinces, capital;