SQL中的Join用法
#1 環境
MySQL5.7
Mac
#2 創建表及插入數據
新建兩個表tableA及tableB
mysql> create table tableA ( id int(10), name varchar(100) );
mysql> create table tableB ( id int(10), name varchar(100) );
插入數據
tableA:
mysql> insert into tableA values(1,'布魯日');
mysql> insert into tableA values(2,'巴黎');
mysql> insert into tableA values(3,'倫敦');
mysql> insert into tableA values(4,'柏林');
mysql> insert into tableA values(5,'耶路撒冷');
tableB:
mysql> insert into tableB values(1,'多哈');
mysql> insert into tableB values(2,'耶路撒冷');
mysql> insert into tableB values(3,'新德里');
mysql> insert into tableB values(4,'馬尼拉');
mysql> insert into tableB values(5,'吉隆坡');
#3 開始
#3.1 inner join
產生的結果是A和B的交集, inner join也可以簡寫成join
select * from tableA join tableB ON tableA.name=tableB.name;
輸出結果:
+------+--------------+------+--------------+
| id | name | id | name |
+------+--------------+------+--------------+
| 5 | 耶路撒冷 | 2 | 耶路撒冷 |
+------+--------------+------+--------------+
#3.2 left join
產生表A的完全集,而B表中匹配的則有值(沒有匹配的則以null值取代)。left join返回左表的全部行和右表滿足ON條件的行,如果左表的行在右表中沒有匹配,那麼這一行右表中對應數據用NULL代替。
select * from tableA left join tableB ON tableA.name=tableB.name;
輸出結果:
+------+--------------+------+--------------+
| id | name | id | name |
+------+--------------+------+--------------+
| 5 | 耶路撒冷 | 2 | 耶路撒冷 |
| 1 | 布魯日 | NULL | NULL |
| 2 | 巴黎 | NULL | NULL |
| 3 | 倫敦 | NULL | NULL |
| 4 | 柏林 | NULL | NULL |
+------+--------------+------+--------------+
左表獨有:
select * from tableA left join tableB ON tableA.name=tableB.name where tableB.name is null;
輸出結果:
+------+-----------+------+------+
| id | name | id | name |
+------+-----------+------+------+
| 1 | 布魯日 | NULL | NULL |
| 2 | 巴黎 | NULL | NULL |
| 3 | 倫敦 | NULL | NULL |
| 4 | 柏林 | NULL | NULL |
+------+-----------+------+------+
#3.3 right join
與left join相反,產生表B的完全集,而A表中匹配的則有值(沒有匹配的則以null值取代)。left join返回左表的全部行和右表滿足ON條件的行,如果左表的行在右表中沒有匹配,那麼這一行右表中對應數據用NULL代替。
select * from tableA right join tableB ON tableA.name=tableB.name;
輸出結果:
+------+--------------+------+--------------+
| id | name | id | name |
+------+--------------+------+--------------+
| 5 | 耶路撒冷 | 2 | 耶路撒冷 |
| NULL | NULL | 1 | 多哈 |
| NULL | NULL | 3 | 新德里 |
| NULL | NULL | 4 | 馬尼拉 |
| NULL | NULL | 5 | 吉隆坡 |
+------+--------------+------+--------------+
右表獨有:
select * from tableA right join tableB ON tableA.name=tableB.name where tableA.name is null;
輸出結果:
+------+------+------+-----------+
| id | name | id | name |
+------+------+------+-----------+
| NULL | NULL | 1 | 多哈 |
| NULL | NULL | 3 | 新德里 |
| NULL | NULL | 4 | 馬尼拉 |
| NULL | NULL | 5 | 吉隆坡 |
+------+------+------+-----------+
#3.4 full join
A和B的並集,oracle裏面有full join,但是在mysql中沒有full join 。我們可以使用union來達到目的。
select * from tableA left join tableB ON tableA.name=tableB.name
union
select * from tableA right join tableB ON tableA.name=tableB.name;
輸出結果:
+------+--------------+------+--------------+
| id | name | id | name |
+------+--------------+------+--------------+
| 5 | 耶路撒冷 | 2 | 耶路撒冷 |
| 1 | 布魯日 | NULL | NULL |
| 2 | 巴黎 | NULL | NULL |
| 3 | 倫敦 | NULL | NULL |
| 4 | 柏林 | NULL | NULL |
| NULL | NULL | 1 | 多哈 |
| NULL | NULL | 3 | 新德里 |
| NULL | NULL | 4 | 馬尼拉 |
| NULL | NULL | 5 | 吉隆坡 |
+------+--------------+------+--------------+