JavaWeb之MySQL(2.2):MySQL子查询代码演示(MySQL的重难点)

不想看SQL语句演示?请直接看知识点图解,传送门:https://blog.csdn.net/qq_43265673/article/details/98248684
JavaWeb之MySQL(1.2):MySQL数据处理之查询代码演示

子查询

#谁的工资比 Abel 高?
#方式一:
SELECT salary
FROM employees
WHERE last_name = ‘Abel’;
在这里插入图片描述
SELECT last_name,salary
FROM employees
WHERE salary > 11000;
在这里插入图片描述
#方式二:自连接
SELECT e2.last_name,e2.salary
FROM employees e1,employees e2
WHERE e1.last_name = ‘Abel’
AND e1.salary < e2.salary;
在这里插入图片描述
#方式三:子查询

#外查询
SELECT last_name,salary
FROM employees
WHERE salary > (
#子查询(内查询)
SELECT salary
FROM employees
WHERE last_name = ‘Abel’
);
在这里插入图片描述

子查询的分类:单行子查询 ; 多行子查询

#题目:返回job_id与141号员工相同,salary比143号员工多的员工姓名,job_id 和工资
SELECT last_name,job_id,salary
FROM employees
WHERE job_id = (
SELECT job_id
FROM employees
WHERE employee_id = 141
)
AND salary > (
SELECT salary
FROM employees
WHERE employee_id = 143
);
在这里插入图片描述
#题目:返回公司工资最少的员工的last_name,job_id和salary

SELECT last_name,job_id,salary
FROM employees
WHERE salary = (
SELECT MIN(salary)
FROM employees
);
在这里插入图片描述

#题目:查询最低工资大于60号部门最低工资的部门id和其最低工资

SELECT department_id,MIN(salary)
FROM employees
GROUP BY department_id
HAVING MIN(salary) > (
SELECT MIN(salary)
FROM employees
WHERE department_id = 60
);
在这里插入图片描述

关于查询的空值问题,不是错误

SELECT last_name, job_id
FROM employees
WHERE job_id =
(SELECT job_id
FROM employees
WHERE last_name = ‘Haas’);
在这里插入图片描述
#非法使用子查询
#Subquery returns more than 1 row
SELECT employee_id, last_name
FROM employees
WHERE salary =
(SELECT MIN(salary)
FROM employees
GROUP BY department_id);
在这里插入图片描述

多行子查询

SELECT employee_id, last_name
FROM employees
WHERE salary IN
(SELECT MIN(salary)
FROM employees
GROUP BY department_id);
在这里插入图片描述

#题目:返回其它部门中比job_id为‘IT_PROG’部门任一工资低的员工的
#员工号、姓名、job_id 以及salary

SELECT employee_id,last_name,job_id,salary
FROM employees
WHERE salary < ANY(
SELECT salary
FROM employees
WHERE job_id = ‘IT_PROG’
)
AND job_id != ‘IT_PROG’;
在这里插入图片描述
#题目:返回其它部门中比job_id为‘IT_PROG’部门所有工资都低的员工
#的员工号、姓名、job_id 以及salary
SELECT employee_id,last_name,job_id,salary
FROM employees
WHERE salary < ALL(
SELECT salary
FROM employees
WHERE job_id = ‘IT_PROG’
)
AND job_id != ‘IT_PROG’;
在这里插入图片描述

总结:

SELECT …,…,…,…(包含组函数)
FROM …,…,…
WHERE 连接条件
AND 过滤条件(不包含组函数的)
GROUP BY …,…,…(查询中非组函数的列)
HAVING 过滤条件(包含组函数的)
ORDER BY … ASC/DESC , … ASC/DESC,…
LIMIT …

SELECT …,…,…,…(包含组函数)
FROM … JOIN …
ON …
JOIN …
ON …
WHERE 过滤条件(不包含组函数的)
GROUP BY …,…,…(查询中非组函数的列)
HAVING 过滤条件(包含组函数的)
ORDER BY … ASC/DESC , … ASC/DESC,…
LIMIT …

子查询的练习

1.查询和Zlotkey相同部门的员工姓名和工资

SELECT last_name,salary
FROM employees
WHERE department_id = (
SELECT department_id
FROM employees
WHERE last_name = ‘Zlotkey’
);
在这里插入图片描述

2.查询工资比公司平均工资高的员工的员工号,姓名和工资。

SELECT employee_id,last_name,salary
FROM employees
WHERE salary > (
SELECT AVG(salary)
FROM employees
);
在这里插入图片描述

#3*.查询各部门中工资比本部门平均工资高的员工的员工号, 姓名和工资
#方式一:相关子查询

SELECT employee_id,last_name,salary
FROM employees e1
WHERE salary > (
# 查询某员工所在部门的平均
SELECT AVG(salary)
FROM employees e2
WHERE e2.department_id = e1.department_id
);
在这里插入图片描述

#方式二:
SELECT employee_id,last_name,salary
FROM employees e1,
(SELECT department_id,AVG(salary) avg_sal
FROM employees e2 GROUP BY department_id
) dept_avg_sal
WHERE e1.department_id = dept_avg_sal.department_id
AND e1.salary > dept_avg_sal.avg_sal;
在这里插入图片描述

#4.查询和姓名中包含字母u的员工在相同部门的员工的员工号和姓名

写子查询的技巧:① 简单子查询:从外向里写 ② 复杂子查询:从里向外写

SELECT employee_id,last_name
FROM employees
WHERE department_id IN (
SELECT DISTINCT department_id
FROM employees
WHERE last_name LIKE ‘%u%’
);
在这里插入图片描述

5.查询在部门的location_id为1700的部门工作的员工的员工号

SELECT employee_id
FROM employees
WHERE department_id IN (
SELECT department_id
FROM departments
WHERE location_id = 1700
);
在这里插入图片描述

6.查询管理者是King的员工姓名和工资

SELECT employee_id,salary,manager_id
FROM employees
WHERE manager_id IN (
SELECT employee_id
FROM employees
WHERE last_name = ‘King’
);
在这里插入图片描述

#7. 查询工资最低的员工信息: last_name, salary
SELECT last_name, salary
FROM employees
WHERE salary = (
SELECT MIN(salary)
FROM employees
);
在这里插入图片描述

#8. 查询平均工资最低的部门信息
SELECT *
FROM departments
WHERE department_id = (
SELECT department_id
FROM employees
GROUP BY department_id
HAVING AVG(salary) <= ALL(
SELECT AVG(salary) avg_sal
FROM employees
GROUP BY department_id
)
);
在这里插入图片描述

#9*.查询平均工资最低的部门信息和该部门的平均工资
SELECT d.*,(SELECT AVG(salary) FROM employees WHERE department_id = d.department_id)
FROM departments d
WHERE department_id = (
SELECT department_id
FROM employees
GROUP BY department_id
HAVING AVG(salary) <= ALL(
SELECT AVG(salary) avg_sal
FROM employees
GROUP BY department_id
)
);
在这里插入图片描述

#10. 查询平均工资最高的 job 信息
SELECT *
FROM jobs
WHERE job_id = (
SELECT job_id
FROM employees
GROUP BY job_id
HAVING AVG(salary) = (
SELECT MAX(avg_sal)
FROM (
SELECT AVG(salary) avg_sal
FROM employees
GROUP BY job_id) job_avg_sal
)
);
在这里插入图片描述

#11. 查询平均工资高于公司平均工资的部门有哪些,没有部门的员工不计算在内?
SELECT department_id
FROM employees
WHERE department_id IS NOT NULL
GROUP BY department_id
HAVING AVG(salary) > (
SELECT AVG(salary)
FROM employees
);
在这里插入图片描述

#12. 查询出公司中所有 manager 的详细信息.

SELECT *
FROM employees
WHERE employee_id IN (
SELECT DISTINCT manager_id
FROM employees
);
在这里插入图片描述

#13. 各个部门中 最高工资中最低的那个部门的 最低工资是多少?
#方式一
SELECT MIN(salary)
FROM employees
WHERE department_id = (
SELECT department_id
FROM employees
GROUP BY department_id
HAVING MAX(salary) = (
SELECT MIN(max_sal)
FROM (
SELECT MAX(salary) max_sal
FROM employees
GROUP BY department_id) dept_max_sal
)
);
在这里插入图片描述

SELECT *
FROM employees
WHERE department_id = 10;
在这里插入图片描述
#方式二
SELECT MIN(salary)
FROM employees
WHERE department_id = (
SELECT department_id
FROM employees
GROUP BY department_id
HAVING MAX(salary) <= ALL(
SELECT MAX(salary) max_sal
FROM employees
GROUP BY department_id
)
);
在这里插入图片描述

#14. 查询平均工资最高的部门的 manager 的详细信息: last_name, department_id, email, salary
#方式一
SELECT last_name, department_id, email, salary
FROM employees
WHERE employee_id IN (
SELECT DISTINCT manager_id
FROM employees
WHERE department_id = (
SELECT department_id
FROM employees
GROUP BY department_id
HAVING AVG(salary) = (
SELECT MAX(avg_sal)
FROM (
SELECT AVG(salary) avg_sal
FROM employees
GROUP BY department_id
) dept_avg_sal
)
)

		);

在这里插入图片描述
#方式二:
SELECT last_name, department_id, email, salary
FROM employees
WHERE employee_id IN (
SELECT DISTINCT manager_id
FROM employees
WHERE department_id = (
SELECT department_id
FROM employees
GROUP BY department_id
HAVING AVG(salary) >= ALL(

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

在这里插入图片描述
#15. 查询员工的id,salary,按照department_name 排序
SELECT employee_id,salary
FROM employees e
ORDER BY (
SELECT department_name
FROM departments d
WHERE e.department_id = d.department_id
);

在这里插入图片描述

总结:

#分类:相关子查询 (第3题) vs 非相关子查询
#格式上:子查询比较灵活。可以出现在where、from、select、order by …
#书写技巧上: ①从外向里写 ②从里向外写

不想看SQL语句演示?请直接看知识点图解,传送门:https://blog.csdn.net/qq_43265673/article/details/98248684
JavaWeb之MySQL(1.2):MySQL数据处理之查询代码演示

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值