数据库MySQL 聚合函数、子查询知识点总结P39-P48

目录

聚合函数

常用聚合函数

GROUP-BY使用

HAVING使用

 WHERE与HAVING的对比

SQL底层执行原理 

 SELECT执行顺序

 子查询

子查询分类

单行子查询

​编辑 多行子查询​编辑

 空值问题

 相关子查询

 EXIST和NOT EXIST

 子查询课后练习


聚合函数

常用聚合函数

AVG/SUM

MAX/MIN

COUNT,

select 1,'aa'#此时表中没有此选项,它会扩展至每一行

可通过count(1)计算表有多少项。

count()只会记录不为空的项的个数,空的它会跳过。

因此计算表中记录数要使用

count(*)、count(1)、count(不含null的某一字段)

GROUP-BY使用

 

 SELECT中出现非组函数的字段必须声明在GROUP BY中

 

HAVING使用

 HAVING和GROUP BY一定要联合使用

 WHERE与HAVING的对比

SQL底层执行原理 

 SELECT执行顺序

 练习

 子查询

子查询分类

单行、多行子查询

 相关、不相关子查询

 

单行子查询

 多行子查询

 空值问题

 相关子查询

 EXIST和NOT EXIST

使用exist时注意,里面的select不能使用count(*),count(*)没有检索到 的话就是0,仍会返回true,需要使用具体的列。

 子查询课后练习

#1.查询和Zlotkey相同部门的员工姓名和工资
SELECT last_name,salary
FROM employees e1 
WHERE e1.department_id = (
												SELECT e.department_id
												FROM employees e 
												WHERE e.last_name = 'Zlotkey'
)
#2.查询工资比公司平均工资高的员工的员工号,姓名和工资
SELECT employee_id,last_name,salary
FROM employees e
WHERE salary > (
								SELECT AVG(salary)
								FROM employees
								)
#3.选择工资大于所有JOB_ID = 'SA_MAN'的员工的工资的员工的last_name,job_id, salary
SELECT last_name,job_id, salary
FROM employees e 
WHERE salary > ALL(
										SELECT salary
										FROM employees
										WHERE job_id = 'SA_MAN'

)
#4.查询在部门的location_id为1700的部门工作的员工的员工号
SELECT employee_id
FROM employees e 
WHERE e.department_id IN (
													SELECT department_id
													FROM departments 
													WHERE location_id = 1700
)
-- 5.查询和姓名中包含字母u的员工在相同部门的员工的员工号和姓名
SELECT employee_id,last_name
FROM employees
WHERE department_id IN (
												SELECT department_id
												FROM employees
												WHERE last_name LIKE '%u%'
)

-- 6.查询管理者是King的员工姓名和工资
SELECT last_name,salary
FROM employees
WHERE manager_id IN (
										SELECT employee_id,first_name,last_name
										FROM employees
										WHERE last_name = 'King'
)
-- 7. 查询工资最低的员工信息: last_name, salary
SELECT last_name,salary
FROM employees
WHERE salary <= ALL(
										SELECT salary
										FROM employees
)

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) = (
																						SELECT MIN(av_sa)
																						FROM  (
																											SELECT department_id, avg(salary) av_sa
																											FROM employees
																											GROUP BY department_id
																						) aa 
												
											)
)
**********************************************
SELECT*
FROM departments
WHERE department_id = (
											SELECT department_id
											FROM employees
											GROUP BY department_id
											HAVING AVG(salary) <= ALL (
																								SELECT avg(salary) av_sa
																								FROM employees
																								GROUP BY department_id
											)
)
**********************************************
SELECT d.*
FROM departments d,(
SELECT department_id,AVG(salary) avg_sal
FROM employees
GROUP BY department_id
ORDER BY avg_sal
LIMIT 0,1) dept_avg_sal
WHERE d.department_id = dept_avg_sal.department_id

-- 9.查询平均工资最低的部门信息和该部门的平均工资(相关子查询)
SELECT d.*,(SELECT AVG(salary) FROM employees e WHERE e.department_id = d.department_id ) avg_sal
-- SELECT d.*,avg(SELECT salary FROM employees e WHERE e.department_id = d.department_id ) avg_sal
-- AVG要对表的某一列数据进行求平均,对于单列的表,直接写avg(表)也是错误的。
-- select中也可以子查询,此处为啥是相关子查询,执行顺序是from ——>WHERE——>SELECT,
-- 所以前面select中调用是在d表的里面
FROM departments d
WHERE department_id = (
											SELECT department_id
											FROM employees
											GROUP BY department_id
											HAVING AVG(salary) = (
																						SELECT MIN(av_sa)
																						FROM  (
																											SELECT department_id, avg(salary) av_sa
																											FROM employees
																											GROUP BY department_id
																						) aa 
												
											)
)
AVG()SELECT salary FROM employees e WHERE e.department_id = 50

-- 10. 查询平均工资最高的 job 信息
SELECT *
FROM jobs
WHERE job_id = (
								SELECT job_id
								FROM employees
								GROUP BY job_id
								HAVING AVG(salary) >= ALL(
																				SELECT AVG(salary)
																				FROM employees
																				GROUP BY job_id
								) 

)
**********************************************
SELECT *
FROM jobs
WHERE job_id = (
								SELECT job_id
								FROM employees
								GROUP BY job_id
								HAVING AVG(salary) = (
																				SELECT MAX(avg_sla)
																				FROM (
																						SELECT AVG(salary) avg_sla
																						FROM employees
																						GROUP BY job_id
																						) tablea 
																			)

								)
**********************************************
SELECT *
FROM jobs
WHERE job_id = (
									SELECT job_id
									FROM employees
									GROUP BY job_id
									HAVING AVG(salary) = (
																				SELECT AVG(salary)
																				FROM employees
																				GROUP BY job_id
																				ORDER BY AVG(salary) DESC
																				LIMIT 0,1
																				)
								)
**********************************************
SELECT j.*
FROM jobs j,(
							SELECT job_id,AVG(salary) avg_sla
							FROM employees
							GROUP BY job_id
							ORDER BY AVG(salary) DESC
							LIMIT 0, 1
						) jid_avgsla
WHERE j.job_id = jid_avgsla.job_id				
-- 11. 查询平均工资高于公司平均工资的部门有哪些?
SELECT department_name
FROM departments
WHERE department_id IN (#错误使用了=,注意用=时必须是只有一个值
												SELECT department_id
												FROM employees
												WHERE department_id is not NULL#可以从此处先排除那些id为空的部门
												GROUP BY department_id
												HAVING AVG(salary) > (
																							SELECT AVG(salary)
																							FROM employees
																							)
												)

-- 12. 查询出公司中所有 manager 的详细信息
SELECT *
FROM employees e 
WHERE e.employee_id IN ( #IN的地方通常可以改写为exist
												SELECT DISTINCT manager_id
												FROM employees
												WHERE manager_id is not NULL#此句多余
												)
**********************************************												
SELECT employee_id, last_name, salary
FROM employees e1
WHERE EXISTS (
							SELECT *
							FROM employees e2
							WHERE e2.manager_id = e1.employee_id
							);
**********************************************
SELECT DISTINCT e1.employee_id, e1.last_name, e1.salary
FROM employees e1 JOIN employees e2
WHERE e1.employee_id = e2.manager_id;

-- 13. 各个部门中 最高工资之中  最低的那个部门  的最低工资是多少?
SELECT MIN(salary)
FROM employees
WHERE department_id = (
												SELECT department_id
												FROM employees
												WHERE department_id IS NOT NULL
												GROUP BY department_id
												ORDER BY MAX(salary)
												LIMIT 0,1
											)
**********************************************
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
																						)
											);

-- 14. 查询平均工资最高的部门的 manager 的详细信息: last_name,department_id, email, salary

SELECT last_name,department_id, email, salary
FROM employees
WHERE employee_id = (
											SELECT manager_id
											FROM departments
											WHERE department_id = (
																							SELECT department_id
																							FROM employees
																							GROUP BY department_id
																							HAVING AVG(salary) >= all(
																																				SELECT AVG(salary)
																																				FROM employees
																																				GROUP BY department_id
																																				)
																						)
																					
										);

-- 15. 查询部门的部门号,其中不包括job_id是"ST_CLERK"的部门号
SELECT department_id
FROM departments
WHERE department_id != ( 
													SELECT DISTINCT department_id
													FROM employees
													WHERE job_id = 'ST_CLERK'
												)
**********************************************
SELECT department_id
FROM departments d
WHERE department_id NOT IN (
														SELECT DISTINCT department_id
														FROM employees
														WHERE job_id = 'ST_CLERK'
														);

16. 选择所有没有管理者的员工的last_name
SELECT last_name
FROM employees
WHERE manager_id is NULL

**********************************************
SELECT last_name
FROM employees e1
WHERE NOT EXISTS(#先写成exists的逻辑,在加not
							SELECT *
							FROM employees e2 
							WHERE e1.manager_id = e2.employee_id
							)
-- 17.查询员工号、姓名、雇用时间、工资,其中员工的管理者为 'De Haan'
SELECT employee_id,last_name,hire_date,salary
FROM employees e1
WHERE employee_id IN(
				SELECT employee_id
				FROM employees e2 
				WHERE e1.manager_id = (
																SELECT employee_id
																FROM employees
																WHERE last_name = 'De Haan'
															)
				)
**********************************************
SELECT employee_id, last_name, hire_date, salary
FROM employees e1
WHERE EXISTS (
							SELECT *
							FROM employees e2
							WHERE e2.`employee_id` = e1.manager_id
							AND e2.last_name = 'De Haan'
							);

**********************************************
SELECT employee_id, last_name, hire_date, salary
FROM employees
WHERE manager_id = (
										SELECT employee_id
										FROM employees
										WHERE last_name = 'De Haan'
										)

-- 18.查询各部门中工资比本部门平均工资高的员工的员工号, 姓名和工资(难
SELECT employee_id,last_name,salary
FROM employees e1 
WHERE EXISTS (
									SELECT count(*) #此处写count*,即便他检索到0个,但是仍返回true,所以应该用具体的某一列
									SELECT department_id
									FROM
									(SELECT avg(salary) avg_sla,department_id
									FROM employees
									WHERE department_id is not null
									GROUP BY department_id
-- 									HAVING avg_sla > 1000000
									) avg_did
									WHERE e1.department_id = avg_did.department_id  AND e1.salary > avg_did.avg_sla
												
							)

**********************************************				
	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;


-- 19.查询每个部门下的部门人数大于 5 的部门名称
SELECT department_name,department_id
FROM departments
WHERE department_id IN (
												SELECT department_id
												FROM employees
												GROUP BY department_id
												HAVING count(department_id) > 5
												)
												
**********************************************
SELECT department_name,department_id
FROM departments d
WHERE 5 < (
					SELECT COUNT(*)
					FROM employees e
					WHERE d.`department_id` = e.`department_id`
					);
-- 20.查询每个国家下的部门个数大于 2 的国家编号
SELECT country_id
FROM locations l  
WHERE 2 < (
						SELECT COUNT(*)
						FROM departments d 
						WHERE l.location_id = d.location_id
					)

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值