七种 JOIN 图解:
相关代码实现:
现有两张表,第一张表为 employees,第二张表为 departments,接下来拿这两张表做案例
表 employees:
表 departments:
中图(两张表取并集):
#中图:内连接 A∩B
SELECT employee_id,last_name,department_name
FROM employees e JOIN departments d
ON e.`department_id` = d.`department_id`;
左上图(两表取交集并以第一张表为主):
#左上图:左外连接
SELECT employee_id,last_name,department_name
FROM employees e LEFT JOIN departments d
ON e.`department_id` = d.`department_id`;
右上图(两张表取交集并以第二张表为主):
#右上图:右外连接
SELECT employee_id,last_name,department_name
FROM employees e RIGHT JOIN departments d
ON e.`department_id` = d.`department_id`;
左中图(只取属于第一张表的):
由于这里只需要第一张表有的,而交集内容是两张表共有的,也就是说都存在的,不为 NULL 的值;所以这里给出 WHERE 条件进行过滤,只取第二张表中的 NULL 值,这样就将交集给去掉了
#左中图:A - A∩B
SELECT employee_id,last_name,department_name
FROM employees e LEFT JOIN departments d
ON e.`department_id` = d.`department_id`
WHERE d.`department_id` IS NULL
右中图(取只属于第二张表的):
与左中图同理,由于这里只需要第二张表有的,而交集内容是两张表共有的,也就是说都存在的,不为 NULL 的值;所以这里给出 WHERE 条件进行过滤,只取第一张表中的 NULL 值,这样就将交集给去掉了
#右中图:B-A∩B
SELECT employee_id,last_name,department_name
FROM employees e RIGHT JOIN departments d
ON e.`department_id` = d.`department_id`
WHERE e.`department_id` IS NULL
左下图(左中图 + 右上图):
这里,不用 UNION 进行两表查询条件连接,而是用 UNION ALL ,是因为 UNION 进行连接时 ,需要进行去重操作,从而会影响效率;而 UNION ALL 在连接查询语句时,不需要去重,从而不需要考虑影响效率问题
SELECT employee_id,last_name,department_name
FROM employees e LEFT JOIN departments d
ON e.`department_id` = d.`department_id`
WHERE d.`department_id` IS NULL
UNION ALL #没有去重操作,效率高
SELECT employee_id,last_name,department_name
FROM employees e RIGHT JOIN departments d
ON e.`department_id` = d.`department_id`;
右下图(左中图 + 右中图):
这里同样使用 UNION ALL 进行拼接
#右下图
#左中图 + 右中图 A ∪B- A∩B 或者 (A - A∩B) ∪ (B - A∩B)
SELECT employee_id,last_name,department_name
FROM employees e LEFT JOIN departments d
ON e.`department_id` = d.`department_id`
WHERE d.`department_id` IS NULL
UNION ALL
SELECT employee_id,last_name,department_name
FROM employees e RIGHT JOIN departments d
ON e.`department_id` = d.`department_id`
WHERE e.`department_id` IS NUL