# 分组查询 GROUP BY 子句语法
/**
SELECT COLUMN 字段 ,GROUP_FUNCTION(COLUMN) 分组函数
FROM table 表名
WHERE 条件
GROUP BY 分组的表达式 字段
ORDER BY 排序字段
注意:查询列表必须特殊 要求分组函数和GROUP BY 后出现的字段
特点:分组查询分为两类
数据源 位置 关键字
分组前筛选 库中的表(原始表) GROUP BY 子句的之前 WHERE
分组后筛选 分组后的结果集 GROUP BY 子句之后 HAVING
分组函数做条件肯定放在having子句中
优先使用分组前筛选
2.GROUP BY 子句支持单个字段,多个字段分组(字段间用逗号分隔 没有顺序要求) 表达式 函数
3,也支持排序 函数排序 字段排序
*/
#查询每个位置上的部门个数
SELECT COUNT(*) count , location_id FROM departments GROUP BY location_id
# 添加分组前筛选条件
# 案例1:查询邮箱中包含a字符的,每个部门的平均工资
SELECT AVG(salary) avg, department_id FROM employees WHERE email LIKE '%a%' GROUP BY department_id
#查询有奖金的每个领导手下员工的最高工资
SELECT MAX(salary) max , manager_id FROM employees WHERE commission_pct is not null GROUP BY manager_id
# 添加分组后筛选条件 HAVING
#查询那个部门的员工个数>2
SELECT COUNT(*) employ_num ,department_id FROM employees GROUP BY department_id HAVING employ_num >2
# 查询每个工种有奖金的员工的最高工资>12000
SELECT MAX(salary) max ,job_id FROM employees WHERE commission_pct is NOT NULL GROUP BY job_id HAVING max >12000
#查询领导编号>102的每个领导手下的最低工资>5000的领导编号是哪个,以及其最低工资
SELECT MIN(salary) min ,manager_id FROM employees WHERE manager_id>102 GROUP BY manager_id HAVING min>5000;
# 按表达式或者函数分组
#案例 按照员工姓名的长度分组 查询每一组的员工个数 筛选员工个数>5 的有那些
SELECT COUNT(*) 员工个数 , LENGTH(last_name) as 姓名长度 FROM employees GROUP BY 姓名长度 HAVING 员工个数>5
# orcle GROUP BY 和where 不支持别名
# 按多个字段分组
# 查询每个部门每个工种的员工的平均工资 将部门编号 和 工种一致的合并为一组
SELECT AVG(salary) avg ,department_id ,job_id FROM employees GROUP BY department_id ,job_id;
# 添加排序
# 查询每个部门每个工种的员工的平均工资 并且按平均工资的高低显示 部门不为null 平均工资 > 10000
SELECT
AVG( salary ) avg,
department_id,
job_id
FROM
employees
WHERE
department_id IS NOT NULL
GROUP BY
department_id,
job_id
HAVING
avg > 10000
ORDER BY
avg DESC;
分组查询# 分组查询 GROUP BY 子句语法/**SELECT COLUMN 字段 ,GROUP_FUNCTION(COLUMN) 分组函数 FROM table 表名WHERE 条件GROUP BY 分组的表达式 字段ORDER BY 排序字段注意:查询列表必须特殊 要求分组函数和GROUP BY 后出现的字段特点:分组查询分为两类 数据源 位置 关键字 分组前筛选 库中的表(原始表) GROUP BY 子句的