MySQL学习日志--多表查询篇
内连接
图示
内连接就表示相交的部分,可以用显式内连接,隐式内连接
直接看案例
案例
A 查询每一个员工的姓名,及关联的部门的名称(隐式内连接实现)
表结构:emp,dept
连接条件:emp.dept_id= dept.id
隐式内连接
select e.name,d.name from emp e,dept d where e.dept_id=d.id;
显式内连接
select e.name,d.name from emp e join dept d on e.dept_id=d.id;
注意:
一旦为表起了别名,就不能再使用表名来指定对应的字段了,此时只能够使用别名来指定字段。
外连接
图示
外连接分为两种,分别是:左外连接 和 右外连接。
左外连接相当于查询表1(左表)的所有数据,当然也包含表1和表2交集部分的数据。
右外连接相当于查询表2(右表)的所有数据,当然也包含表1和表2交集部分的数据。
但右外连接可以转为左外连接
案例
A 查询emp表的所有数据,和对应的部门信息
由于需求中提到,要查询emp的所有数据,所以是不能内连接查询的,需要考虑使用外连接查询。
表结构:emp,dept
连接条件:emp.dept_id=dept.id
左外连接
select e.*,d.name from emp e left join dept d on e.dept_id=d.id;
B. 查询dept表的所有数据, 和对应的员工信息(右外连接)
右外连接
select d.*,e.* from emp e right join dept d on e.dept_id=d.id;
一般掌握左外连接即可,毕竟左右外连接可以相互转换。
自连接
自连接查询
自连接查询,顾名思义,就是自己连接自己,也就是把一张表连接查询多次。
而对于自连接查询,可以是内连接查询,也可以是外连接查询。
思想:将一张表看成两张表
案例
A. 查询员工 及其 所属领导的名字
表结构: emp
基础查询:
select a.name,b.name from emp a,emp b where a.managerid=b.id;
B. 查询所有员工 emp 及其领导的名字 emp , 如果员工没有领导, 也需要查询出来
也就是说要查询所有的员工,此时可以用到左连接
select a.name '员工',b.name '领导' from emp a left join emp b on a.managerid=b.id;
在自连接查询中,必须要为表起别名,要不然我们不清楚所指定的条件、返回的字段,到底是哪一张表的字段。
联合查询
对于union查询,就是把多次查询的结果合并起来,形成一个新的查询结果集。
对于联合查询的多张表的列数必须保持一致,字段类型也需要保持一致。
union all 会将全部的数据直接合并在一起,union 会对合并之后的数据去重。
案例
A. 将薪资低于 5000 的员工 , 和 年龄大于 50 岁的员工全部查询出来.
select * from emp where salary<500 union all select * from emp where age>50;
子查询
SQL语句中嵌套SELECT语句,称为嵌套查询,又称子查询。
格式:
SELECT * FROM t1 WHERE column1 = ( SELECT column1 FROM t2 );
子查询外部的语句可以是INSERT / UPDATE / DELETE / SELECT 的任何一个。
标量子查询
案例
A. 查询 "销售部" 的所有员工信息
完成这个需求时,我们可以将需求分解为两步:
①先查询销售部的id
②根据销售部id查询员工
select * from emp where dept_id=(select id from dept where name='销售部');
B. 查询在 "方东白" 入职之后的员工信息
①查询方东白的入职日期
②查询在该日期入职之后的员工
select * from emp where entrydate>(select entrydate from emp where name='方东白');
列子查询
子查询返回的结果是一列(可以是多行),这种子查询称为列子查询。