Mysql
准备
create table a
(
m varchar(10) not null
primary key,
n varchar(10) null,
k varchar(10) null
);
create table b
(
k varchar(10) not null
primary key,
l varchar(10) null
);
create table c
(
o varchar(10) not null
primary key,
p varchar(10) null
);
create table d
(
k varchar(10) not null
primary key,
l varchar(10) null
);
insert into a (m, n, k) values ('m1','n1','k1'), ('m2', 'n2', 'k2'), ('m3', 'n0', 'k0'), ('m4', null, 'k4');
insert into b (k, l) values ('k1','l1'), ('k2', 'l2'), ('k3', 'l0'), ('k4', null);
insert into c (o, p) values ('o1','p1'), ('o2', 'p2'), ('o3', 'p3');
insert into d (k, l) values ('k1','l1'), ('k2', 'l2'), ('k3', 'l9');
结果:
a
m | n | k |
---|---|---|
m1 | n1 | k1 |
m2 | n2 | k2 |
m3 | n0 | k0 |
m4 | null | k4 |
b
k | l |
---|---|
k1 | l1 |
k2 | l2 |
k3 | l0 |
k4 | null |
c
o | p |
---|---|
o1 | p1 |
o2 | p2 |
o3 | p3 |
d
k | l |
---|---|
k1 | l1 |
k2 | l2 |
k3 | l9 |
交叉连接
交叉连接 即 笛卡儿积
select * from a,b;
含义:将a表中的每一行与b表中的每一行进行组合,即 m * n 的形式
外连接
外连接分为左连接和右连接;
左外连接与左连接(右外连接与右连接)区别在于sql语句的where查询条件。
左连接 select * from a left join b on a.k = b.k;
左外连接 select * from a left join b on a.k = b.k where b.k is null;
右连接 select * from a right join b on a.k = b.k;
右外连接 select * from a right join b on a.k = b.k where a.k is null;
连接 | 说明 |
---|---|
左连接 | 在a表中匹配,即使b表中不存在也可以匹配 |
左外连接 | 在a表中匹配且在b表中不存在时匹配 |
右连接 | 在b表中匹配,即使a表中不存在也可以匹配 |
右外连接 | 在b表中匹配且在a表中不存在时匹配 |
内连接
内连接
- 等值连接
- 不等值连接
- 自连接
等值连接 select * from a inner join b on a.k = b.k;
不等值连接 select * from a inner join b on a.k > b.k;
自连接 select * from a inner join a as c on a.k = c.k;
联合查询
联合查询分为union 与 union all
union | union all |
---|---|
以前表为基准,将结果集合并,并去除重复记录 | 以前表为基准,将结果集合并,但不去除重复记录 |
使用union(union all)的两个表必须拥有相同数量的列
b表和c表 select * from b union select * from c;
b表和c表 select * from b union all select * from c;
b表和d表 select * from b union select * from d;
b表和d表 select * from b union all select * from d;
结果
注意后两个表的区别
全连接
mysql对全连接(全外连接)没有直接支持,但可以通过union来间接实现。
全连接 = 左连接 union 右连接
全外连接 = 左外连接 union 右外连接
select * from a left join b on a.k = b.k
union
select * from a right join b on a.k = b.k;
结果:
select * from a left join b on a.k = b.k
union
select * from a right join b on a.k = b.k;
select * from a left join b on a.k = b.k where b.k is null
union
select * from a right join b on a.k = b.k where a.k is null;
结果:
自然连接
自然连接 是一种特殊的等值连接,与等值连接的区别在于去除重复的列,而等值连接不会去除。
select * from a inner join b on a.k = b.k;
select * from a natural join b;
结果:
当两张表没有相同属性列时使用自然连接会怎么样呢?
此时自然连接的效果与交叉连接,即笛卡尔积结果相同。
因此,可以认为自然连接是 在两张表的笛卡尔积中选取属性列相等的数据行,然后去除重复的列。
select * from a,b;
select * from a natural join b;
结果:
END