写点什么

【Java 从 0 到架构师】SQL 多表查询

  • 2022 年 4 月 23 日
  • 本文字数:1016 字

    阅读完需:约 3 分钟

LEFT JOIN 对应的 ON 条件其实就是两个表共同的部分





[](()多表查询 SQL 示例


==============================================================================


目前有两张表:


  • customer:顾客信息表



  • company:公司信息表



有顾客的公司信息(附带顾客信息) = 有公司的顾客信息(附带公司信息)


[](()INNER JOIN




内连接:查询出所有有公司信息的顾客信息(附带公司信息)


  • 等价于 所有有顾客信息的公司信息(附带顾客信息)


l ∩ r

SELECT * FROM


customer l


INNER JOIN


company r


ON


l.company_id = r.id;


下面的写法等价于上面的内连接:


SELECT * FROM


customer l, company r


WHERE l.company_id 《一线大厂 Java 面试题解析+后端开发学习笔记+最新架构讲解视频+实战项目源码讲义》无偿开源 威信搜索公众号【编程进阶路】 = r.id;


[](()LEFT JOIN




左外连接:查询出所有有公司和没有公司的顾客信息(附带公司信息)


l ∪ (l ∩ r)

SELECT * FROM


customer l


LEFT JOIN


company r


ON


l.company_id = r.id;


[](()LEFT JOIN EXCLUDING INNER JOIN




有 WHERE 的左外连接:查询出所有没有公司的顾客信息(附带公司信息)


  • 排除了有公司的顾客信息(附带公司信息)


l - (l ∩ r)

SELECT * FROM


customer l


LEFT JOIN


company r


ON


l.company_id = r.id


WHERE


r.id IS NULL;


[](()RIGHT JOIN




右外连接:查询出所有有顾客和没有顾客的公司信息(附带顾客信息)


r ∪ (l ∩ r)

SELECT * FROM


customer l


RIGHT JOIN


company r


ON


l.company_id = r.id;


[](()RIGHT JOIN EXCLUDING INNER JOIN




带 WHERE 的右外连接:查询出所有没有顾客的公司信息(附带顾客信息)


  • 排除了有顾客的公司信息(附带顾客信息)


r - (l ∩ r)

SELECT * FROM


customer l


RIGHT JOIN


company r


ON


l.company_id = r.id


WHERE


l.company_id IS NULL;


SQL 规范中定义了 FULL OUTER JOIN(全外连接),MySQL 中实现需要依靠 UNION


[](()FULL OUTER JOIN




全外连接:查询出所有:


  • 有顾客的公司信息(附带顾客信息)


等价于 有公司的顾客信息(附带公司信息)


  • 没有顾客的公司信息(附带顾客信息)

  • 没有公司的顾客信息(附带公司信息)


l ∪ r

(


SELECT * FROM


customer l


LEFT JOIN


company r


ON


l.company_id = r.id


)


UNION


(


SELECT * FROM


customer l


RIGHT JOIN


company r


ON


l.company_id = r.id


);


[](()FULL OUTER JOIN EXCLUDING INNER JOIN




排除内连接的全连接,查询出所有:


  • 没有顾客的公司信息(附带顾客信息)

  • 没有公司的顾客信息(附带公司信息)


(l ∪ r) - (l ∩ r)

(


SELECT * FROM


customer l


LEFT JOIN


company r

用户头像

还未添加个人签名 2022.04.13 加入

还未添加个人简介

评论

发布
暂无评论
【Java从0到架构师】SQL 多表查询_Java_爱好编程进阶_InfoQ写作社区