1. 程式人生 > >詳解MySQL的多表連線查詢

詳解MySQL的多表連線查詢

前期準備工作

在這裡我準備了一個簡單的省市縣的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;

結果