在很多场景时,需要对数据按照某条件进行分组统计其数量、平均值等等。有这种需求,SQL自然也有解决方式。

在SQL中通过group by子句对结果按某条件进行分组。语法:

select count(column1), columnJ from table_name group by columnJ;

group by是后接检索的列或者表达式。表示对该列或者表达式的数据进行分组,该列上或者表达式相同的数据放在同一组。

group by使用的注意点:

  • group by必须作用在检索列上或者表达式上
  • group by可以作用在多个列上,会按照列的顺序,进行逐层分组
  • group by后的列是select的子句中的检索列或者表达式
  • group by会将列为NULL值的作为一组

注:大多数情况的场景都是使用group by进行分组,然后对分组的数据进行聚合统计。很少是分组后取某组中的个别列的数据。如:

select name, age from teacher group by age;

select子句中包含了非聚合的列name(这属于取分组结果中个别列的数据情况)。

在Mysql中默认模式:ONLY_FULL_GROUP_BY下,如果执行以上SQL会报错;可以将其关闭,如果再执行以上SQL,mysql将会取分组中的每组的第一行数据作为结果集。

通过看下面的示例,来熟悉下group by:

select age, count(name) as group_count from teacher group by age;

以上的SQL表示的含义:按年龄分组统计每个年龄的老师数量,执行结果:

age group_count
25 2
26 2
27 1
28 1
29 1

再来看一个例子:

select name, max(age), min(age) from person group by name;

以上SQL表示,按照姓名分组统计,找出每组中最大年龄,最小年龄的人,执行结果如下

name max min
xiaohei 20 29
xiaohong 28 26
xiaolan 67 56

以上的例子足以理解group by。group by即对结果集进行按条件进行分组,然后常进行聚合处理。

但是往往仍需要对分组后的结果进行过滤处理,SQL中使用另外一个子句HAVING对group by的分组结果进行过滤处理,如下:

select age, count(name) as group_count from teacher group by age having age < 27;

执行结果

age count
25 2
26 2

对分组结果进行过滤,只检索出分组中年龄小于27的组。

在看到having时,不免联系到where子句,下面总结下他们的异同点:

相同点 1.having和where都是对结果按照条件过滤;
2.在使用where的地方都可以使用having(不常用);
不同点 1.针对的过滤数据不一样,having主要是用来过滤分组,where主要是过滤表中数据行;
2.having和where子句的位置不一样,having在group by后,where在from子句后;
3.having通常配合group by使用;

那么在有having过滤情况下是否还能使用where呢?

根据上表中不同点1可以看出,是可以的。where是对数据行过滤,然后再对过滤后的行进行分组,再对分组进行having过滤。

下表列出了SQL的执行顺序:

子句 说明 使用场景
select 查询数据 在db数据检索时使用
from 检索的表 检索时使用
where 过滤数据的条件 需要对数据进行筛选时
gropu by 分组select的结果集 需要聚合统计时常用
having 过滤分组 对分组进行过滤时需要
order by 排序结果集 需要按照某种顺序展示数据
参考

《SQL必知必会》

最新文章

  1. ExtJs控件属性配置详细
  2. Linux下php安装Redis扩展
  3. Android仿快递 物流时间轴 的代码实现
  4. Python实现ORM
  5. 在windows下创建基于github的hexo静态博客
  6. imacros实现Excel数据自动录入到网页中
  7. iscc2016-basic-find-to-me
  8. node入门笔记
  9. Oracle DB 总结(SQL)
  10. James Munkres Topology: Sec 22 Exer 6
  11. Hello Json(c#)
  12. [蓝桥杯]PREV-22.历届试题_国王的烦恼
  13. angular1时间控件之时间比较大小,比如入住日期和离店日期,入住不能晚于离店时间
  14. 宝塔面板安装在根目录www下
  15. JSP内置对象——pageContext对象和config对象
  16. 基于canvas图像处理的图片 灰色图像
  17. C# windform 使用TreeGridView
  18. js浏览器缩放提示
  19. iosttableViewCell右侧的箭头,圆形等
  20. Qt 学习之路 2(35):文件

热门文章

  1. MySQL Other--mysql_config_editor学习使用
  2. MySQL基础SQL命令---增删改查
  3. USACO Poker Hands
  4. html--前端css样式初识
  5. [Javascript] Creating an Iterator from an Array
  6. [RN] React Native 使用 teaset(Drawer)实现侧边菜单
  7. 动态规划:数字和为sum的方法数
  8. spark基础知识一
  9. django数据处理
  10. 动态的src路径怎么写