MySQL 子查询、多表查询
列出与lisi从事相同职位的所有员工,显示姓名、职位、部门编号:
mysql
select ename, epost, deptno
from emp
where epost = (
select epost from emp where ename = 'lisi'
);
1
2
3
4
5
2
3
4
5
列出薪资比部门编号为30(销售部)的所有员工薪资都高的员工信息,显示员工姓名、薪资和部门名称:
mysql
-- 外连接查询:查询所有员工、员工薪资和员工对应的部门名称
select emp.ename, salary, dept.dname
from emp
left join dept on emp.deptno = dept.deptno;
-- 假设销售部门的最高薪资为 3000,列出薪资比 3000 高的员工信息
select emp.ename, salary, dept.dname
from emp
left join dept on emp.deptno = dept.deptno
where salary > 3000;
-- 求出销售部门的最高薪资
select max(salary) from emp where deptno = 30;
-- 合并两条查询 SQL
select emp.ename, salary, dept.dname
from emp
left join dept
on emp.deptno = dept.deptno
where salary > (
select max(salary) from emp where deptno = 30
);
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
列出最低薪资大于6500的各种职位,显示职位和该职位的最低薪资:
mysql
select epost, min(salary)
from emp
group by epost
having min(salary) > 6500;
1
2
3
4
2
3
4
having
子句
需要注意的是,在 group by
子句之后使用 having
子句可以对分组后的结果进行条件过滤,而在 where
子句中则不能使用聚合函数(如 min
函数)。
列出在每个部门就职的员工数量、平均薪资,显示部门编号、员工数量、平均薪资:
mysql
select deptno, count(*), AVG(salary)
from emp
group by deptno;
1
2
3
2
3
列出每个部门薪资最高的员工信息,显示部门编号、员工姓名、薪资:
mysql
-- 查询 `emp` 表中所有员工的部门编号、姓名、薪资
select deptno, ename, salary from emp;
-- 查询 `emp` 表中每个部门的最高薪资,显示部门编号、最高薪资
select deptno, max(salary) from emp group by deptno;
-- 第二次查询的结果作为一张临时表和第一次查询进行关联查询
select emp.deptno, emp.ename, emp.salary
from emp,
(
select deptno, max(salary) maxsal
from emp
group by deptno
) t1
where t1.deptno = emp.deptno and emp.salary = t1.maxsal;
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
2
3
4
5
6
7
8
9
10
11
12
13
14
15