前期准备工作
在这里我准备了一个简单的省市县的mysql数据库,进行简单的案例分析
create table province(
pro_id int primary key,
pro_name varchar(10)
);
insert into province values(1,'广东省'),(2,'广西省'),(3,'河南省'),(4,'河北省');
create table city(
city_id int primary key,
pro_id int references province(pro_id),
city_name varchar(10)
);
insert into city values(1,1,'珠海市'),(2,1,'广州市'),
(3,3,'郑州市'),(4,3,'洛阳市');
create table district(
dis_id int primary key,
city_id int references city(city_id),
dis_name varchar(10)
);
insert into district values(1,1,'斗门区'),(2,1,'金湾区'),(3,1,'香洲区'),
(4,3,'二七区'),(5,3,'中原区'),(6,3,'新郑区'),(7,3,'巩义区'),
(8,5,'天河区'),(9,5,'白云区');
一、内连接
SQL中的join用于把来自两个或多个表的行结合起来,基于这些表之间的共同字段。inner join是从多个表中返回满足join条件的所有行,返回连接的表中字段匹配的相关记录。inner join可以把inner省略掉,只使用join的效果是一样的。
select p.pro_name,c.city_name,d.dis_name from province p
inner join city c on p.pro_id = c.pro_id
inner join district d on d.city_id = c.city_id;
结果:
二、外连接
1. left join(左连接):获取左表所有记录,即使右表没有对应匹配的记录。如果右表没有对应匹配的记录则返回null。
select p.pro_name,c.city_name,d.dis_name from province p
left join city c on p.pro_id = c.pro_id
left join district d on d.city_id = c.city_id;
结果
2. right join(右连接):用于获取右表所有记录,即使左表没有对应匹配的记录。如果左表没有对应匹配的记录则返回null。
select p.pro_name,c.city_name,d.dis_name from province p
right join city c on p.pro_id = c.pro_id
right join district d on d.city_id = c.city_id;
结果
ps:MySQL不支持全连接(full join)和交叉连接(across join)
三、UNION的使用
1. union用于连接两个以上的 SELECT 语句的结果组合到一个结果集合中,将不同表中相同列中查询的数据展示出来;(不包括重复数据)
select p.pro_name,c.city_name,d.dis_name from province p
inner join city c on p.pro_id = c.pro_id
inner join district d on d.city_id = c.city_id
union
select p.pro_name,c.city_name,null from province p
inner join city c on p.pro_id = c.pro_id;
结果
2. union all 用于将不同表中相同列中查询的数据展示出来;(包括重复数据)
select p.pro_name,c.city_name,d.dis_name from province p
inner join city c on p.pro_id = c.pro_id
inner join district d on d.city_id = c.city_id
union all
select p.pro_name,c.city_name,d.dis_name from province p
inner join city c on p.pro_id = c.pro_id
inner join district d on d.city_id = c.city_id;
结果