詳解MySQL的多表連線查詢
阿新 • • 發佈:2018-11-08
前期準備工作
在這裡我準備了一個簡單的省市縣的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;
結果