分组查询
分组查询过程
SQL执行顺序
:from
--> group by
--> count(pid)
--> select
--> having
--> order by
--> limit
语法示例
WHERE
子句:
从数据源中去掉不符合其搜索条件的数据
GROUP BY
子句:
搜集数据行到各个组中,统计函数为各个组计算统计值,每个组输出一行结果
-- 求每个系的最高分
SELECT c_name,
AVG(grade)
FROM score
GROUP BY c_name;
多字段分组
-- 多字段分组
SELECT stu_id,
c_name,
AVG(grade)
FROM score
GROUP BY c_name,
stu_id;
HAVING
分组筛选
分组之后,对统计结果进行筛选的话必须使用having
,不能使用where
从分组计算结果中进行过滤,去掉不符合其组搜索条件的各组数据行
-- 分组查询
-- 注意:分组之后,select的后边只能写分组字段和聚合函数
-- 分组之后的条件筛选不能使用where,要使用having
SELECT 字段1,
字段2,
from 表名
group by 指定分组的字段名
having 分组条件;
-- HAVING 对之前分组的结构进行过滤
SELECT c_name,
AVG(grade)
FROM score
GROUP BY c_name
HAVING AVG(grade) <= 90;
示例1:
-- 统计各个分类商品的个数,且只显示个数大于4的信息
SELECT category_id,
count(pid) as cnt
from product
GROUP BY category_id
HAVING cnt > 4;
示例2: 分组筛选+limit
-- 统计各个分类商品的个数,且只显示个数大于4的信息,将查询结果分组
-- SQL执行顺序:
-- from --> group by --> count(pid) --> select --> having --> order by --> limit
SELECT category_id,
count(pid) as cnt
from product
GROUP BY category_id
HAVING cnt > 4
ORDER BY cnt
LIMIT 1;