#第三大部分
-- 多表查询练习
create table salgrade(grade int,losal int,hisal int);
insert into salgrade values(1,700,1200),
(2,1201,1400),
(3,1401,2000),
(4,2001,3000),
(5,3001,9999);
use test2;
select * from salgrade;-- 5
select * from emp;-- 14
select * from dept;-- 4
-- 26查询每位员工的ename,dname,sal
#1, 左连接
select *
from emp e left join dept d on e.deptno=d.deptno;
#2,用想要的字段放在原来的星号处
select ename 员工姓名,dname 部门名称,sal 工资
from emp e left join dept d on e.deptno=d.deptno;
-- 27 查询各地区的员工数(统计每个地区,没有员工计为0)
#1 确定来自那俩个表, from emp e left join dept d
#2 要的字段 地区 ,员工数 count(empno)
#3 各地区要group by分组
select loc 地区, count(ename) from emp
left join dept on emp.deptno=dept.deptno
group by loc ;
-- 28 查询manager的姓名、所属部门名称和入职日期:ename,dname,job,hiredate(内连接/笛卡尔积连接)
#内连接
select ename 姓名,job 职位, dname 部门名称 ,hiredate 入职日期
from emp e inner join dept d on e.deptno=d.deptno
where job="manager";
-- 29 查询所有员工姓名及其直属领导姓名(自连接:通过别名,将同一张表视为多张表)
select * from emp;
#来自那两张表的连接结果集,emp表连接emp表
#自连接 (同一性质的字段就可以连接)
select * from emp as emp1 left join emp as emp2 on emp1.mgr=emp2.empno;
#取出我们要的字段
select emp1.ename 员工姓名 , emp2.ename 领导姓名 from emp as emp1 left join emp as emp2 on emp1.mgr=emp2.empno;
-- 30 查询入职日期早于其直属领导的员工姓名及其所属部门名称:empno,ename,dname (两张以上的多表连接)
#1,先解决 查询入职日期早于其直属领导的员工姓名,涉及emp1和emp2
select emp1.ename 员工姓名, emp2.ename 领导姓名
from emp as emp1
left join emp as emp2 on emp1.mgr=emp2.empno
where emp1.hiredate < emp2.hiredate;
#2,再解决 及其所属部门名称 ,涉及到dept表
select emp1.ename 员工姓名, emp2.ename 领导姓名, dept.dname 部门名称
from emp as emp1
left join emp as emp2 on emp1.mgr=emp2.empno
left join dept on emp1.deptno=dept.deptno;








暂无数据