mysql分组查询

#分组函数
/*
功能:用作统计使用,又称为聚合函数或统计函数或组函数
分类:
sum求和 一般用于处理数值型
avg平均值
max最大值
min最小值
count计算个数

*/

SELECT SUM(salary) FROM employees;
SELECT AVG(salary) FROM employees;
SELECT MAX(salary) FROM employees;
SELECT MIN(salary) FROM employees;
SELECT COUNT(salary) FROM employees;

SELECT SUM(salary),AVG(salary) FROM employees;

#参数支持哪些类型
SELECT SUM(last_name),AVG(last_name) FROM employees; -- 不支持
SELECT SUM(hiredate),AVG(hiredate) FROM employees; -- 不支持

SELECT MAX(last_name),MIN(last_name) FROM employees; -- 可以
SELECT SUM(hiredate),MIN(hiredate) FROM employees; -- 可以

#忽视null
SELECT SUM(commission_pct),AVG(commission_pct) FROM employees;
SUM 和 AVG 忽视了NULL值
MAX 和 MIN 也是忽略NULL值

#和distinct搭配
SELECT SUM(DISTINCT salary),SUM(salary) FROM employees;

#count函数的详细介绍
SELECT COUNT(*) FROM employees; -- 统计总行数
SELECT COUNT(1) FROM employees; -- 相当于在表中加了一列1统计行数


#分组查询
/*
语法:
select 分组函数,列 (要求出现在group by的后面)
from 表
[where 筛选条件]
group by 分组的列表
[order by 字句]

*/

#查询每个工种的最高工资
SELECT MAX(salary),job_id FROM employees GROUP BY job_id;

#查询每个位置上的部门个数
SELECT COUNT(*),location_id FROM departments GROUP BY location_id;

#添加筛选条件
#案例1:查询邮箱中包含a字符的,每个部门的平均工资
SELECT AVG(salary),department_id FROM employees WHERE email LIKE '%a%' GROUP BY department_id;

#案例2:查询有奖金的每个领导手下员工的最高工资
SELECT MAX(salary),manager_id FROM employees WHERE commission_pct IS NOT NULL GROUP BY manager_id;

#案例3:查询哪个部门的员工个数大于2
1.查询每个部门的员工个数
SELECT COUNT(*),department_id FROM employees GROUP BY department_id;
2.根据1的结果进行筛选
SELECT COUNT(*),department_id FROM employees GROUP BY department_id
HAVING COUNT(*)>2;

#查询每个工种有奖金的员工的最高工资>12000的工种编号和最高工资
SELECT MAX(salary),job_id
FROM employees
WHERE commission_pct IS NOT NULL
GROUP BY job_id
HAVING MAX(salary)>12000;

#查询领导编号>102的每个领导手下的最低工资>5000的领导编号是哪个,以及其最低工资
SELECT MIN(salary),manager_id FROM employees
WHERE manager_id > 102
GROUP BY manager_id
HAVING MIN(salary)>5000;


#按函数分组或表达式

#按员工姓名的长度分组,查询每一组的员工个数,筛选员工个数>5的有哪些
SELECT COUNT(*),LENGTH(last_name) len_name
FROM employees
GROUP BY LENGTH(last_name) DESC
HAVING COUNT(*)>5;

#按多个字段分组
#案例:查询每个部门每个工种的员工的平均工资,并且按照平均工资的高低排序
SELECT AVG(salary),department_id,job_id
FROM employees
WHERE department_id IS NOT NULL
GROUP BY job_id,department_id
HAVING AVG(salary)>10000
ORDER BY AVG(salary) DESC;

 

posted @ 2020-03-22 11:04  鸡龟骨滚羹  阅读(181)  评论(0)    收藏  举报