对于SQL的Join,在学习起来可能是比较乱的。我们知道,SQL的Join语法有很多inner的,有outer的,有left的,有时候,对 于Select出来的结果集是什么样子有点不是很清楚。Coding Horror上有一篇文章,通过韦恩图(Venn diagram,可用来表示多个集合之间的逻辑关系)。解释了SQL的Join。我觉得清楚易懂,转过来。
假设我们有两张表。Table A 是左边的表。Table B 是右边的表。其各有四条记录,其中有两条记录name是相同的,如下所示:让我们看看不同JOIN的不同
A表 | |
id | name |
1 | Pirate |
2 | Monkey |
3 | Ninja |
4 | Spaghetti |
B表 | |
id | name |
1 | Rutabaga |
2 | Pirate |
3 | Darth Vade |
4 | Ninja |
1.INNER JOIN
SELECT * FROM TableA INNER JOIN TableB ON TableA.name = TableB.name
结果集 | |||
(TableA.) | (TableB.) | ||
id | name | id | name |
1 | Pirate | 2 | Pirate |
3 | Ninja | 4 | Ninja |
Inner join 产生的结果集中,是A和B的交集。
![Mysql: 图解 inner join、left join、right join、full outer join、union、union all的区别 Mysql: 图解 inner join、left join、right join、full outer join、union、union all的区别](https://i-blog.csdnimg.cn/blog_migrate/43bfffb69833d9afaa09549537b7be52.png)
结果集 | |||
(TableA.) | (TableB.) | ||
id | name | id | name |
1 | Pirate | 2 | Pirate |
2 | Monkey | null | null |
3 | Ninja | 4 | Ninja |
4 | Spaghetti | null | null |
null | null | 1 | Rutabaga |
null | null | 3 | Darth Vade |
![Mysql: 图解 inner join、left join、right join、full outer join、union、union all的区别 Mysql: 图解 inner join、left join、right join、full outer join、union、union all的区别](https://i-blog.csdnimg.cn/blog_migrate/312e7dd6320d81c1d1c3967e5d6c5873.png)
WHERE TableA.id IS null OR TableB.id IS null
结果集 | |||
(TableA.) | (TableB.) | ||
id | name | id | name |
2 | Monkey | null | null |
4 | Spaghetti | null | null |
null | null | 1 | Rutabaga |
null | null | 3 | Darth Vade |
![Mysql: 图解 inner join、left join、right join、full outer join、union、union all的区别 Mysql: 图解 inner join、left join、right join、full outer join、union、union all的区别](https://i-blog.csdnimg.cn/blog_migrate/1086bb33af11b79f824cb083b4ee2369.png)
结果集 | |||
(TableA.) | (TableB.) | ||
id | name | id | name |
1 | Pirate | 2 | Pirate |
2 | Monkey | null | null |
3 | Ninja | 4 | Ninja |
4 | Spaghetti | null | null |
![Mysql: 图解 inner join、left join、right join、full outer join、union、union all的区别 Mysql: 图解 inner join、left join、right join、full outer join、union、union all的区别](https://i-blog.csdnimg.cn/blog_migrate/254cf5a9a0b1470c423765b2de9bd1d9.png)
结果集 | |||
(TableA.) | (TableB.) | ||
id | name | id | name |
2 | Monkey | null | null |
4 | Spaghetti | null | null |
产生在A表中有而在B表中没有的集合。
![Mysql: 图解 inner join、left join、right join、full outer join、union、union all的区别 Mysql: 图解 inner join、left join、right join、full outer join、union、union all的区别](https://i-blog.csdnimg.cn/blog_migrate/3ba6ed1d096e264dbd0bbc76c4b990d0.png)
请注意,UNION 内部的 SELECT 语句必须拥有相同数量的列。列也必须拥有相似的数据类型。同时,每条 SELECT 语句中的列的顺序必须相同。UNION 只选取记录,而UNION ALL会列出所有记录。
新结果集 |
name |
Pirate |
Monkey |
Ninja |
Spaghetti |
Rutabaga |
Darth Vade |
新结果集 |
name |
Pirate |
Monkey |
Ninja |
Spaghetti |
Rutabaga |
Pirate |
Darth Vade |
Ninja |
全部列出来
(3)注意:
新结果集 | |
id | name |
1 | Pirate |
2 | Monkey |
3 | Ninja |
4 | Spaghetti |
1 | Rutabaga |
2 | Pirate |
3 | Darth Vade |
4 | Ninja |
如果有where的时候,可以使用:
SELECT column_list
FROM t1
INNER JOIN t2 ON join_condition1
INNER JOIN t3 ON join_condition2
...
WHERE where_conditions;
更多参考:
PHP5: mysqli 插入, 查询, 更新和删除 Insert Update Delete Using mysqli (CRUD)
MySQL: 获取表结构 Get a MySQL table structure with DESCRIBE
本文转自: Mysql: 图解 inner join、left join、right join、full outer join、union、union all的区别