Skip to content

MySQL多表查询

alt text 部门表 alt text 员工表 alt text dep_id 就是员工所在部门id

1.交叉连接:笛卡尔积

交叉连接,每1条数据都变成4条,把表合并,没有任何条件 select * from emp_new,dep alt text

2.内连接 inner join

select e.name, e.sex, e.age, d.name 部门名称 from emp_new as e inner join dep d on e.dep_id = id.id // 部门名称 是dep表name列的别名, 注意:shengteng dep_id =204,dep表没有相等的id,所以没查出来 alt text

左连接 left join

select e.name, e.sex, e.age, d.name 部门名称 from emp_new as e left join dep d on e.dep_id = id.id 以 left join左边的员工表emp_new为准,去匹配右边的部门表dep,匹配不上,就为空, 所以 员工表 emp_new shengteng 查出来了, dep_id匹配不上,所以部门名称为Null 比right join更常用 alt text

右连接 right join select e.name, e.sex, e.age, d.name 部门名称 from emp_new as e right join dep d on e.dep_id = id.id 以 right join右边的表为准,去匹配左边的表,匹配不上,就为空 部门表 运营部门 id 203,在左边的表里没匹配上,所以出现 Null ......运营 alt text

全外连接 union/union all

union all

alt textalt text 2个表共有数据重复了一份,独有数据只有1份,不重复

union

alt text

alt text 左连接SQL语句 union 右连接SQL语句, 注意左、右连接SQL语句中的 select fields 字段要一 一对应,个数也一致,左SQL name 对应 右SQL name 查询结果:1处是左表独有的,2处是右表独有的,其他是2个表共有数据,只有1份; 相比 union all,union把 2个表共有数据 去重了

子查询

1.子查询是将一个查询语句嵌套在另一个查询语句中 2.内层查询语句的查询结果,可以为外层查询语句提供查询条件 3.子查询中可以包含:in not in exists not exists 等关键字 4.还可以包含比较运算符 = != > < 等 因为要读取2次数据,查询效率要比联表查询略低一点 alt text 子查询,查询满足条件的部门id alt textalt textalt text 子查询 alt textalt text 或用联表查询 alt text

alt text 反向子查询: alt textalt text

alt textalt textalt textalt text 子查询,没有210这个部门,查询结果为空 如果子查询查到结果,整体才查结果;如果子查询查到空;整体查到空