GROUP BY的用法

1、group by概述:

    简单来说:将数据库的数据用'by'后面接的规则进行分组,即将一个大数据库分成一个个相同类型数据在一起的小区域。

2、group by的语法:

SELECT column_name, function(column_name)  //此处的function()函数是指SQL中的一些聚合函数,例如:MAX(),MIN(),SUM(),AVG(),COUNT()等等
FROM table_name
WHERE column_name operator value    //where条件语句
GROUP BY column_name;    //以某一列分组

3、group by实例操作:

  • 原表:在此处就叫做call_task表吧

select group by 对应es 的java select group by where_数据库

  • group by正确的进入方法:
SELECT is_pause,pause_type,count(stu_id)
FROM call_task
WHERE is_pause='1'
GROUP BY is_pause,pause_type

    语句整个的意思就是从call_task这个表中,先筛选出满足is_pause='1'这个条件的所有数据,然后又对这些数据按照is_pause和pause_type这两个字段分组,最后将is_pause、pause_type和学生总人数展示在结果集中。(这个过程就是一个将原数据库按照条件不断筛选最后得到我们需要的一个小的数据库的过程。这里面又会牵扯到一个sql语句执行顺序的问题,详细情况请看SQL执行顺序和SQL别名问题)。

    上面的语句执行之后得到的结果数据集如下图所示:

select group by 对应es 的java select group by where_SQL分组操作_02

  • group by错误的打开方式:
SELECT is_pause,user_id,pause_type,count(stu_id)
FROM call_task
WHERE is_pause='1'
GROUP BY is_pause,pause_type    //在分组中并没有user_id这个字段

    我们先看结果再来分析原因:

select group by 对应es 的java select group by where_group_03

大家可以对比原数据库数据,很快会发现虽然pause_type和学生总数这两栏数据没有问题,但是user_id那一栏显示明显不对。为什么会出现这种情况呢???因为我们在分组的时候只把is_pause和pause_type这两个字段当做分组条件,所以SQL只会对原数据库中的这两列的数据进行分组操作,其他列并不会参与到这个分组过程中(注意!!),但是在显示结果集时你非要让它显示没有进行分组操作的列,当然数据库就会出现错误了啦。其实数据库在这里也是很纠结的,因为user_id存在多个情况,它也不知道要显示哪个user_id,最后它采取的方式是选取满足where和分组条件时出现的第一组数据的user_id。

4、group by和select的一些总结:

  • 如果在有group by操作中,select后面接的结果集字段只有两种:要么就只有group by后出现的字段,要么就是group by后出现的字段+聚合函数的组合(常用的五种聚合函数:min()求列中最小数值,max()求列中最大数值,avg()求平均值,sum()求列中字段对应数值的总和,count()求列的总条数)
  • 其实分组的思想很简单:就拿上面例子来说,把分组条件想成一个二维数组,满足这个数组就将个数加1。(is_pause,pause_type)就是一个简单的二维数组,结合筛选条件和数据库中的数据来看,(is_pause,pause_type)就分成下面三种情况:(1,2),(1,4),(1,5),遇到满足数组情况的count(stu_id)数值加1。同理,如果你的分组条件是3个,4个或者更多,就按照这个思路想,也不会晕菜。