MySQL 中的七种 JOIN

七种 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

猜你喜欢

转载自blog.csdn.net/qq_66862911/article/details/130836848
今日推荐