进阶8 子查询-----经典案例讲解

(1)查询工资最低的员工信息:last_name,salary

step1:查询最低的工资

SELECT MIN(salary)
FROM employees;

step2:查询last_name,salary,要求salary=❶

SELECT last_name, salary
FROM employees
WHERE salary = (
SELECT MIN(salary)
FROM employees
);

(2)查询平均工资最低的部门信息

方法1 ------- 简单(如果是多个相同的最低工资但是不同部门,用limit则可能出现问题)(limit只限制取第一个部门信息)

step1:平均工资最低的department_id

SELECT AVG(salary), department_id
FROM employees
GROUP BY department_id
ORDER BY AVG(salary) ASC
LIMIT 0,1;

step2:查询部门信息

SELECT d.*
FROM departments d
WHERE department_id = (
SELECT department_id
FROM employees
GROUP BY department_id
ORDER BY AVG(salary) ASC
LIMIT 0,1 # 从第0个索引开始,只取一行
);

方法2 ------- 复杂

step1

SELECT department_id, AVG(salary)
FROM employees
GROUP BY department_id;

step2 【表子查询】

【注意:不能直接查询“ select min(ag),department_id”】【结果:ag是最小值,但是department_id默认取第一个】

SELECT d.*, ag
FROM (
SELECT department_id, AVG(salary) ag
FROM employees
GROUP BY department_id
) tab
INNER JOIN departments d
ON d.department_id = tab.department_id
WHERE ag = (
SELECT MIN(ag)
FROM (
SELECT department_id, AVG(salary) ag
FROM employees
GROUP BY department_id
) tab2
);

方法3-------复杂

step1

SELECT department_id, AVG(salary)
FROM employees
GROUP BY department_id
HAVING AVG(salary) = (
SELECT MIN(ag)
FROM (
SELECT AVG(salary) ag, department_id
FROM employees
GROUP BY department_id
) tab
);

step 2

SELECT d.*
FROM departments d
WHERE d.department_id = (
SELECT department_id
FROM employees
GROUP BY department_id
HAVING AVG(salary) = (
SELECT MIN(ag)
FROM (
SELECT AVG(salary) ag, department_id
FROM employees
GROUP BY department_id
) tab
)
);

(3)查询平均工资最低的部门信息和该部门的平均工资

方法1-------简单(如果是多个相同的最低工资但是不同部门,用limit则可能出现问题)(limit只限制取第一个部门信息)

atep1:平均工资最低的department_id

SELECT AVG(salary) ag, department_id
FROM employees
GROUP BY department_id
ORDER BY AVG(salary) ASC
LIMIT 0,1;

step2

SELECT d.*, ag
FROM (
SELECT AVG(salary) ag, department_id
FROM employees
GROUP BY department_id
ORDER BY AVG(salary) ASC
LIMIT 0,1
) tab
INNER JOIN departments d
ON d.department_id = tab.department_id;

方法2-----复杂

step1

SELECT AVG(salary), department_id
FROM employees
GROUP BY department_id
ORDER BY AVG(salary) ASC
LIMIT 0,1;

step2

SELECT d.*, (
SELECT AVG(salary)
FROM employees
WHERE department_id = (
SELECT department_id
FROM employees
GROUP BY department_id
ORDER BY AVG(salary) ASC
LIMIT 0,1
)
GROUP BY department_id
) 平均工资
FROM departments d
WHERE d.department_id = (
SELECT department_id
FROM employees
GROUP BY department_id
ORDER BY AVG(salary) ASC
LIMIT 0,1
);

方法3 ------- 复杂

SELECT d.*, (
SELECT AVG(salary)
FROM employees
WHERE department_id = (
SELECT department_id
FROM employees
GROUP BY department_id
ORDER BY AVG(salary) ASC
LIMIT 0,1
)
GROUP BY department_id
)
FROM (
SELECT department_id
FROM employees
GROUP BY department_id
ORDER BY AVG(salary) ASC
LIMIT 0,1
) tab
INNER JOIN departments d
WHERE d.department_id = tab.department_id;

(4)查询平均工资最高的 job 信息

step1:平均工资最高的job_id

SELECT AVG(salary), job_id
FROM employees
GROUP BY job_id
ORDER BY AVG(salary) DESC
LIMIT 0,1;

step2

SELECT *
FROM jobs
WHERE job_id = (
SELECT job_id
FROM employees
GROUP BY job_id
ORDER BY AVG(salary) DESC
LIMIT 0,1
);

(5)查询平均工资高于公司平均工资的部门有哪些

step1:查询平均工资【标量子查询】

SELECT AVG(salary)
FROM employees;

step2:查询每个部门的平均工资

SELECT AVG(salary), department_id
FROM employees
GROUP BY department_id;

step3

SELECT AVG(salary), department_id
FROM employees
GROUP BY department_id
HAVING AVG(salary) > (
SELECT AVG(salary)
FROM employees
);

(6)查询出公司中所有 manager 的详细信息

step1:查询所有manager的员工编号

SELECT DISTINCT manager_id
FROM employees;

step2:查询所有信息,满足employee_id=❶

SELECT *
FROM employees
WHERE employee_id IN(
SELECT DISTINCT manager_id
FROM employees
);

(7)各个部门中,最高工资中最低的那个部门的 最低工资是多少

step1: 最高工资中最低的部门

SELECT department_id, MAX(salary)
FROM employees
GROUP BY department_id ASC
ORDER BY MAX(salary)
LIMIT 0,1;

step2: 最低工资的部门

SELECT MIN(salary), department_id
FROM employees
GROUP BY department_id;

step3:

SELECT MIN(salary), department_id
FROM employees
WHERE department_id = (
SELECT department_id
FROM employees
GROUP BY department_id ASC
ORDER BY MAX(salary)
LIMIT 0,1
)
GROUP BY department_id;

(8)查询平均工资最高的部门的 manager 的详细信息:last_name,department_id,email,salary

step1:查询平均工资最高的部门

SELECT AVG(salary), department_id
FROM employees
GROUP BY department_id
ORDER BY AVG(salary) DESC
LIMIT 0,1;

step2【题目说的是:部门的领导,不是员工的领导】【连接条件:部门与manager_id是一一对应的,一个部门就一个领导】

SELECT last_name, d.department_id, email, salary
FROM employees e
INNER JOIN departments d
ON d.manager_id = e.employee_id
WHERE d.department_id = (
SELECT department_id
FROM employees
GROUP BY department_id
ORDER BY AVG(salary) DESC
LIMIT 0,1
);

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值