多行处理函数
mysql中的函数:
1,单行处理函数
特点:输入一条语句,处理的结果就是一条语句
2,多行处理函数(聚合函数,组函数)
特点:输入多条语句,处理结果为一条数据
mysql中的多行处理函数:
count(表达式); 统计函数
sum(表达式); 求和函数
avg(表达式); 求平均值函数
min(表达式); 求最小值函数
max(表达式); 求最大值函数
注意
1,多行处理函数都回去忽略null值,如果某字段的值为null那么聚合函数是统计不上null值的
2,返回的结果集只有一行一列
3,通过和group by连用
4, 多行处理函数不能直接作用where子句之后
#统计学生表中学生总数
SELECT
count(name) 学生总数
FROM
student
#统计学生总成绩
SELECT
sum(score)
FROM
student
#统计学生的平均成绩
SELECT
avg(score)
FROM
student
#查询学生最低成绩和最高成绩
SELECT
MIN(score),
MAX(score)
FROM
student;
多行处理函数不能直接作用where子句之后
求成绩大于平均成绩的学生信息
#错误写法
SELECT
id,
name,
score
FROM
student
WHERE
score>avg(score);
#正确写法
SELECT
id,
name,
score
FROM
student
WHERE
score>(SELECT
avg(score)
FROM
studert);
分组查询以及having子句
GROUP BY 用于分组查询
语法:
SELECT
列1,
列2,
FROM
表名
WHERE
【过滤条件】
GROUP BY 分组的字段
ORDER BY 排序字段 排序规则;
如果sql出现了group by子句 那么select之后查询列只能是聚合函数列和分组字段列,不能出现未分组的列
mysql语法上是属于松散语法的,不会报错,oracle中会报错
WHERE后面不能使用聚合函数的原因:
1,聚合函数通过和group连用
2,group by执行以后聚合函数才回去对结果集进行处理
HAVING 和where 的区别: where是分组前筛选数据,having分组后筛选数据
说明:能用分组前筛选尽量使用分组前筛选,如果实现不能使用分组前筛选的再使用分组后筛选
#查询各个科目的最高成绩
SELECT
class 科目,
max(score)
FROM
studert
GROUP BY class;
#查询最高分数大于60分的科目
SELECT
cless 科目,
max(score)
FROM
student
WHERE score>60
GROUP BY class;
#查询最高分数大于60分的科目(改用having的形式)
SELECT
class 科目,
max(score)
FROM
student
GROUP BY class
HAVING max(score)>60;