一、内外连接
- 内连接: 只连接匹配的行
- 左外连接: 包含左边表的全部行(不管右边的表中是否存在与它们匹配的行),以及右边表中全部匹配的行
- 右外连接: 包含右边表的全部行(不管左边的表中是否存在与它们匹配的行),以及左边表中全部匹配的行
- 全外连接: 包含左、右两个表的全部行,不管另外一边的表中是否存在与它们匹配的行。
- 交叉连接: 生成笛卡尔积-它不使用任何匹配或者选取条件,而是直接将一个数据源中的每个行与另一个数据源的每个行都一一匹配
drop table users;
drop table address;
create table users(
id int primary key auto_increment,
`name` varchar(30)
);
create table address(
id int primary key auto_increment,
uid int,
city varchar(30)
# foreign key(uid) references users(id)
);
insert into users (`name`) values("张三");
insert into users (`name`) values("李四");
insert into users (`name`) values("王五");
insert into address (`uid`,`city`) values(1,"上海");
insert into address (`uid`,`city`) values(2,"北京");
insert into address (`uid`,`city`) values(5,"武汉");
select `name`,city from users inner join address on users.id=address.uid;#内连接
select `name`,city from users left join address on users.id=address.uid;#左外连接
select `name`,city from users right join address on users.id=address.uid;#右外连接
select `name`,city from users full join address;#全连接
select `name`,city from users cross join address;#交叉连接,类似于笛卡儿积
1.内连接(inner join)——左右两边都匹配才连接
select `name`,city from users inner join address on users.id=address.uid;
2.左外连接(left join)——左边的表全部都保存下来,右边可以为空
select `name`,city from users left join address on users.id=address.uid;
3.右外连接(right join)——右边的表全部都保存下来,左边可以为空
select `name`,city from users right join address on users.id=address.uid;