转载部分

分组group by 、group by having、whe

2018-10-11  本文已影响0人  月夜曾朦胧

现有表 score

name kecheng fenshu
张三 语文 81
张三 数学 75
李四 语文 76
李四 数学 90
王五 语文 81
王五 数学 100
王五 英语 90


group by 的使用
在使用group by 时,有一个规则需要遵守,即出现在select列表中的字段,如果没有在聚合函数中,那么必须出现在group by 子句中。

(select中的字段不可以单独出现,必须出现在group语句中或者在组函数中。)
select a.name,a.fengshu from score a group by a.name 这是错误的

select a.name,min(a.fengshu) from score a group by a.name 这是可以的
图片表内容 名字 和文字内容不同,看一眼就好


image.png image.png

以名字为主查询,
group by having的使用
having的筛选是在分组以后,并且针对分组中的每一条数据,只要有一条不符合要求,这一组都不会被筛选出来

筛选出每一门课程分数都大于80的学生姓名
select a.name from score a group by a.name having min(a.fengshu)>80


image.png

最低分数大于80 表里最低的 80 加了个=

where group by
where 的筛选是在分组之前,所以在where 里面可以出现任意字段
select a.namefrom score a
where a.fenshu>80
group by a.name


image.png

group by ordey by
select a.fenshu from score a group by a.fenshu order by a.fenshu

order by 排序
(1)order by price //默认升序排列
(2)order by price desc //降序排列
(3)order by price asc //升序排列,与默认一样
(4)order by rand() //随机排列,效率不高

image.png

ps:到底啥时候用group by ?
看select后的字段 能不能成为一个唯一标识,如果不能,则使用group by 可以分组


作者:枯木生花
来源:CSDN
原文:https://blog.csdn.net/qq_28007533/article/details/72859474?utm_source=copy

where和having的区别:
作用的对象不同。
WHERE 子句作用于表和视图,HAVING 子句作用于组。
WHERE 在分组和聚集计算之前选取输入行(因此,它控制哪些行进入聚集计算), 而 HAVING 在分组和聚集之后选取分组的行。因此,WHERE 子句不能包含聚集函数; 因为试图用聚集函数判断那些行输入给聚集运算是没有意义的。 相反,HAVING 子句总是包含聚集函数。(严格说来,你可以写不使用聚集的 HAVING 子句, 但这样做只是白费劲。同样的条件可以更有效地用于 WHERE 阶段。)
在上面的例子中,我们可以在 WHERE 里应用数量字段来限制,因为它不需要聚集。 这样比在 HAVING 里增加限制更加高效,因为我们避免了为那些未通过 WHERE 检查的行进行分组和聚集计算。
综上所述:
having一般跟在group by之后,执行记录组选择的一部分来工作的。where则是执行所有数据来工作的。
再者having可以用聚合函数,如having sum(fenshu)>1000


image.png

查询学生的 平均分,并且此学生有两门以上都小于80,

上一篇下一篇

猜你喜欢

热点阅读