目录
#二 分组函数
/*
分类 :
sum
avg
max
min
count 计算个数
功能 统计
*/
#darediff 日期相差天数
SELECT DATEDIFF(MAX(hiredate),MIN(hiredate))
FROM employees;
SELECT SUM(salary) FROM employees;
SELECT AVG(salary) FROM employees;
SELECT MAX(salary) FROM employees;
SELECT COUNT(salary) FROM employees;
#可以一次查询多个 和嵌套搭配其他函数
SELECT SUM(salary) he, MAX(salary) zuida FROM employees;
#1参数支持哪些类型
# sum avg 参数 数值类型
# max min connt 全部支持 count统计不为null 的个数
#2以上分组函数全部忽略null 值
#3可以和distinct 搭配实现去重
SELECT COUNT(DISTINCT salary) FROM employees;
#4 count 单独介绍 4重载
SELECT COUNT(*) FROM employees;#统计总行数
SELECT COUNT(1) FROM employees;#传入常量值,相当于加了一列常量值,统计行数
SELECT COUNT('sdf') FROM employees;
SELECT COUNT(salary) FROM employees;
#count(*)效率最高
#和分组函数一同查询的字段有限制,要求是 group by后的字段
#进阶五 分组查询
/*
语法
select 分组函数 ,列(要求出现在 groupby后面)
from 表
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;
# 添加筛选条件
#邮箱中包含a字符的每个部门的员工的平均工资
SELECT AVG(salary),department_id
FROM employees
WHERE email LIKE'%a%'
GROUP BY department_id;
#复杂筛选条件 添加分组后的筛选 having ,原始表中有的字段可以用where查询,
#否则分组后用having
#哪个部门员工数量>2
SELECT COUNT(*) ,department_id
FROM employees
GROUP BY department_id
HAVING COUNT(*)>2;
/*
分组查询筛选条件分为两类
分组前 原始表 group by前 where
分组后筛选 分组后结果集 group by 后 having
分组函数做条件 肯定放在having子句中
*/
#按表达式或函数分组
# 按员工姓名长度分组 查询每一组员工个数 筛选大于5 的有哪些
SELECT COUNT(*) ,LENGTH(last_name) las
FROM employees
GROUP BY las #这里可以用别名
HAVING COUNT(*)>5;
#按多个字段查询
#查询每个部门 每个工种 员工平均工资
SELECT AVG(salary),department_id,job_id
FROM employees
GROUP BY department_id,job_id;
#添加排序
SELECT AVG(salary),department_id,job_id
FROM employees
GROUP BY department_id,job_id
HAVING AVG(salary)>10000
ORDER BY AVG(salary) DESC;