在介绍GROUP BY 和 HAVING 子句前,我们必需先讲讲sql语言中一种特殊的函数:聚合函数, 例如SUM, COUNT, MAX, AVG等。这些函数和其它函数的根本区别就是它们一般作用在多条记录上。

SELECT SUM(population) FROM bbc

这里的SUM作用在所有返回记录的population字段上,结果就是该查询只返回一个结果,即国家的总人口数。

GROUP BY用法

Group By语句从英文的字面意义上理解就是“根据(by)一定的规则进行分组(Group)”。它的作用是通过一定的规则将一个数据集划分成若干个小的区域,然后针对若干个小区域进行数据处理。
注意:group by 是先排序后分组;
举例子说明:如果要用到group by 一般用到的就是“每这个字段” 例如说明现在有一个这样的表:每个部门有多少人 就要用到分组的技术

select DepartmentID as '部门名称',
COUNT(*) as '个数' from BasicDepartment group by DepartmentID

    这个就是使用了group by +字段进行了分组,其中我们就可以理解为我们按照了部门的名称ID,DepartmentID将数据集进行了分组;然后再进行各个组的统计数据分别有多少;
    通俗一点说:group by 字段1,字段2。。。(整个表中不止这两个字段)表示数据集中字段1相等,字段2也相等的数据归为一组,只显示一条数据。那么你可以对字段3进行统计(求和,求平均值等)

注意
select DepartmentID,DepartmentName from BasicDepartment group by DepartmentID

–将会出现错误

    选择列表中的列 ‘DepartmentName’ 无效,因为该列没有包含在聚合函数或 GROUP BY 子句中。这就是我们需要注意的一点,如果在返回集字段中,这些字段要么就要包含在Group By语句的后面,作为分组的依据;要么就要被包含在聚合函数中。为什么呢,根据前面的说明:DepartmentID相等的数据归为一组,只显示一条记录,那如果数据集中有这样三条数据。

      DepartmentID                              DepartmentName
            dept001                                            技术部
            dept001                                            综合部
            dept001                                            人力部
那我只能显示一条记录,我显示哪个?没法判断了。到这里有三种选择:

  1. 把DepartmentName也加入到分组的条件里去(GROUP BY DepartmentID,DepartmentName),那这三条记录就是三个分组。
  2. 不显示DepartmentName字段。
  3. 用聚合函数把这三条记录整合成一条记录count(DepartmentName)

WHERE和 HAVING

    HAVING子句可以让我们筛选成组后的各组数据。HAVING子句可以使用聚合函数
    WHERE子句在聚合前先筛选记录.也就是说作用在GROUP BY 子句和HAVING子句前. WHERE字句中不能使用聚合函数
    举例说明:
    一、显示每个地区的总人口数和总面积.

SELECT region, SUM(population), SUM(area)
FROM bbc
GROUP BY region

    先以region把返回记录分成多个组,这就是GROUP BY的字面含义。分完组后,然后用聚合函数对每组中的不同字段(一或多条记录)作运算。

    二、 显示每个地区的总人口数和总面积.仅显示那些面积超过1000000的地区。

SELECT region, SUM(population), SUM(area)
FROM bbc
GROUP BY region
HAVING SUM(area)>1000000

    在这里,我们不能用where来筛选超过1000000的地区,因为表中不存在这样一条记录。相反,HAVING子句可以让我们筛选成组后的各组数据

    需要注意说明:当同时含有where子句、group by 子句 、having子句及聚集函数时,执行顺序如下:
    执行where子句查找符合条件的数据;
    使用group by 子句对数据进行分组;对group by 子句形成的组运行聚集函数计算每一组的值;最后用having 子句去掉不符合条件的组。
    having子句和where子句都可以用来设定限制条件以使查询结果满足一定的条件限制。
    having子句限制的是组,而不是行。where子句中不能使用聚集函数,而having子句中可以。

GROUP BY 与COUNT的一些复杂用法

直接用例子来说明吧
现有表:居民区表:DW_DM_RE_RC,部分字段如下

select AREA_ID,AREA_NAME,CITY_ID,CITY_NAME,RC_ID,RC_NAME,RC_TYPE_ID,RC_TYPE_NAME,RC_ADDRESS,FLOOR_CNT,BUILDING_CNT from DW_DM_RE_RC

这里写图片描述
数据主要集中在宿迁和无锡两个地市。
现需要根据AREA_ID和CITY_NAME进行分组,且显示同一个AREA_ID的数据数量。(AREA_ID和AREA_NAME相关联,CITY_ID,CITY_NAME相关联)
第一步:
sql1:

select COUNT(*) as COUNT,AREA_ID,AREA_NAME,CITY_ID,CITY_NAME from DW_DM_RE_RC
group by AREA_ID,AREA_NAME,CITY_ID,CITY_NAME

这里写图片描述
这里COUNT显示的是以AREA_ID和CITY_NAME为条件进行分组的,
表示AREA_ID=510,CITY_NAME=‘滨湖区’(无锡市滨湖区)的数据有131条,表示AREA_ID=527,CITY_NAME=‘泗洪’(宿迁市泗洪区)的数据有101条,但我需要的是属于AREA_ID=510(无锡市,不管哪个区)的总数据量有多少,并且需要显示CITY_NAME。也就是需要改变显示的COUNT值。由此得到启发
sql2:

SELECT T1.AREA_ID,T1.AREA_NAME,T1.CITY_ID,T1.CITY_NAME,T2.COUNT FROM 
(SELECT COUNT(*) AS COUNT,AREA_ID,AREA_NAME,CITY_ID,CITY_NAME FROM DW_DM_RE_RC
GROUP BY AREA_ID,AREA_NAME,CITY_ID,CITY_NAME) T1
LEFT JOIN ( 
    SELECT COUNT(*) AS COUNT,AREA_ID,AREA_NAME FROM DW_DM_RE_RC
    GROUP BY AREA_ID,AREA_NAME
)T2 ON  T1.AREA_ID = T2.AREA_ID AND T1.AREA_NAME = T2.AREA_NAME

先对市、区分组,查出显示的主体(城市和区)。再对城市分组,查出城市对应的数量(T2里的COUNT字段,也就是需要显示的值),两者做一次关联。

查询结果如下。显示了无锡的各个区,并且显示整个无锡的数量,(而不是各个区的数量)
在这里插入图片描述

聚合函数在介绍GROUP BY 和 HAVING 子句前,我们必需先讲讲sql语言中一种特殊的函数:聚合函数, 例如SUM, COUNT, MAX, AVG等。这些函数和其它函数的根本区别就是它们一般作用在多条记录上。 SELECT SUM(population) FROM bbc 这里的SUM作用在所有返回记录的population字段上,结果就是该查询只返回一个结果,即国家的总人口数。
MySQL--Group by分组与count计数(进阶)1、Group by语法2、创建表格3、题目代码部分4、文末彩蛋      更多关于数据库知识请加关注哟~~。若需联系和想安装MySQL请加博主:      QQ:3327908431     &nbs...
CREATE TABLE IF NOT EXISTS `test_users` ( `email_id` int(11) unsigned NOT NULL auto_increment, `email` char(100) NOT NULL, `passwords` char(64) NOT NULL...
1、QL Server Group By语句,Group By 从字面意义上理解就是根据“By”指定的规则对数据进行分组,所谓的分组是将一个“数据集”划分成若干个“小区域”,然后针对若干个“小区域”进行数据处理。(以下是Group By的的语法,GROUP BY 子句为列中的每个值组合生成一个组。) 2、GROUP BY 子句通常与聚合函数一起用于统计数据。聚合函数对组执行计算并返回每个组的唯一值。 例如, COUNT() 函数返回每个组中的行数。(以下是GROUP BY 子句与COUNT()函数一起使用
语句用于结合聚合函数,根据一个或多个列对结果集进行分组。 select column1, column2, … column_n, aggregate_function (expression) from tables where predicates group by column1, column2, … column_n; having 下面是 HAVING 子句在 SELECT 查询中的位置: SELECT org.apache.ibatis.exceptions.TooManyResultsException: Expected one result (or null) to be returned by selectOne(), but found: 5 报错的意思是:期望的是一条数据,但是返回的是五条数据 在看一下报错的SQL语句 SELECT count( ma.goods_id ) AS num machin
之前听大佬说过,会学习的人将资料写下来,不会学习的人妄想将资料记到脑子里,我觉得还是有一定道理的,好记性不如烂笔头。以此篇博客记录我在实际开发中常用到的sql语句,方便以后查看。 相信很多用过sql的人,谈到sql语句第一时间想到的就是:select * form 表名 where 条件,这是最基本的查询,下面我将简单介绍SQL语句的执行顺序开始介绍。 sql执行顺序 (1)from (3) join (2) on (4) where (5)group by(开始使用select中的别名,后面的语句中都可以
最近在自学MySQL,跟着视频练练手,遇到了一些小问题百思不得其解,只能先MARK下来,待以后继续慢慢思考 有两行表(其他用不上的字段先不考虑了): 员工表(包含员工ID、员工名、部门ID) 部门表(包含部门ID、部门名字) 现在要查询每个部门的员工人数,考虑用group by按部门进行分组查询,语法如下: SELECT d., COUNT() 人数 FROM departments d LEFT...
数据:表dept_emp、表salaries 1. 获取所有部门中当前(dept_emp.to_date = ‘9999-01-01’)员工薪水最高的相关信息,给出dept_no, emp_no以及其对应的salary。 select a.dept_no,a.emp_no,max(b.salary) from dept_emp as a join salaries as b on a.emp_no=b.emp_no where 1=1 and a.to_date = '9999-01-01' and b.t