多表查询

左连接和右连接的区别

  • 左连接(LEFT JOIN):保留左表全部行,如果右表没有匹配,就补 NULL。

  • 右连接(RIGHT JOIN):保留右表全部行,如果左表没有匹配,就补 NULL。

  • 内连接(INNER JOIN):只保留两边都能匹配上的行。

  • 所以本质区别就在于:有没有保留没匹配上的记录

  • 一对多

a50e1c0ed8dafb602f6265641ac555d6fe098578

  • 多对多: 利用中间表来维护两表之间的关系

43032d11ab9ee434111d2c1f8b7e984d53a90aeb

例子
4ddd02133e92800d39b66130462b654b576607aa

-
1e9e3209c6d33b2b696a9eec0aa8876313789728

e54e35f4688b199aa43f7dabab22dcf54d8ddaf5
如果直接select * from emp , dept ; —->会将他们所有可能情况进行组合

所以要加约束条件 select * from emp , dept where emp.dept = dept.id;

多表查询的分类
6b4ca70661783d863aa1fd2a3340780d13af997b

  • 内连接 (集合的交集部分)

cb1c268f9fdde92325d6f89a9816f6e4ccd296ad

演示
baf61fd8f9ff1dd818cc29da653bf9c5819eed93

  • 外连接 (两集合的相异部分)

左外连接 : 展示时会完全包含左表的所有数据
dba0cac518f4c6a7837049e48dc7e13d67da28f1

右外连接 : 展示时会完全包含右表的所有数据
95ff25442ea180e6d4c8e000649990244ec254fe

  • 自连接 可内可外
    b3697f068f338a76f402b590102b8fc75bc9848d

一个公司 , 就总体而言都是员工 , 但是细分到部门 , 就有领导之分并且可能各有不同
因此就有自连接的存在. 统一看成 员工表和领导表 即可
需要注意的是自连接一定要注意from时要启用别名, 不然混乱

4e5282d58bbbd10d1553d60d57e359ab2ffe28fc

联合查询
14f027e7eda3464f44f3cd746cdb842220c7a76d
union会进行去重!!!

子查询 说白了就是嵌套查询, 前者的输出是后者的输入
9840f5a2cf4b5357fbaa52bd4146c44e9c3adcd7

  • 标量子查询 —>返回单行单列的结果
    789fa68c989eda9298ba044ed967d34af8f82fb1

  • 列子查询 —>返回一列的结果
    989d1777cd25cdc36da86ec5a1134e308206a727

66da6bdc3b7b0fa6f8eb7c6976796505b74479b5

  • 行子查询
    4b4bd0ba77001f338ad6ac137a623a3cd95a21bb

573417ab05032c007c2c13353743e8be8d53675a

  • 表子查询 —>多行多列
    4bb488ae35c52f06a867a2d4b9e281381a350002

多表查询的练习
内连接就是两个表交集的部分,
外连接就是一个表是全部信息(即使有的字段值为空,也会显示出来)和这两张表的交集部分.

2394a9515006de52f4e92aa7708c28449cceb26c

ef5eccd517c79b205521720f4ee58e2f76f574e0

9e78efd1e73eebbbd8cbc2e85d105b602f32b617

多表查询的总结
7a5b4d89d0df61810fe068aa707e26d33764abeb