MySQL中的Join用法

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,'吉隆坡');

20200112132138-image.png

#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 | 耶路撒冷     |
+------+--------------+------+--------------+

20200112151317-image.png

#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         |
+------+--------------+------+--------------+

20200112151410-image.png

左表獨有:

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 |
+------+-----------+------+------+

20200112152142-image.png

#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 | 吉隆坡       |
+------+--------------+------+--------------+

20200112151501-image.png

右表獨有:

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 | 吉隆坡    |
+------+------+------+-----------+

20200112152345-image.png

#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 | 吉隆坡       |
+------+--------------+------+--------------+

20200112151827-image.png

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章