GROUP BY与COUNT用法详解

GROUP BY与COUNT用法详解聚合函数在介绍GROUPBY和HAVING子句前,我们必需先讲讲sql语言中一种特殊的函数:聚合函数,例如SUM,COUNT,MAX,AVG等。这些函数和其它函数的根本区别就是它们一般作用在多条记录上。SELECTSUM(population)FROMbbc这里的SUM作用在所有返回记录的population字段上,结果就是该查询只返回一个结果,即国家的总人口数。

大家好,又见面了,我是你们的朋友全栈君。

聚合函数

    在介绍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字段,也就是需要显示的值),两者做一次关联。

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

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/141079.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • ninja工具_构建和谐社会最核心的是

    ninja工具_构建和谐社会最核心的是转自:http://guiquanz.me/2014/07/28/a_intro_to_Ninja/Ninja-chromium核心构建工具Jul28,2014[在线编辑]缘由经过上次对chr

    2022年8月5日
    3
  • 多元线性回归推导过程

    多元线性回归推导过程接上篇 人工智能开篇常用算法一多元线性回归详解 1 此次我们来学习人工智能的第一个算法 多元线性回归 文章会包含必要的数学知识回顾 大部分比较简单 数学功底好的朋友只需要浏览标题 简单了解需要哪些数学知识即可 本章主要包括以下内容数学基础知识回顾什么是多元线性回归多元线性回归的推导过程详解如何

    2025年8月1日
    1
  • selenium+webdriver_python爬虫安装

    selenium+webdriver_python爬虫安装1、下载地址:https://chromedriver.chromium.org/downloads根据谷歌浏览器的版本选择地址,一定要选择对应的版本,选择错误无法运行程序。如果找不到对应的版本,可以把谷歌浏览器更新到最新的版本,然后下载页面第一个程序(最新)2、安装步骤①将下载到的文件解压,应当只有一个EXE文件②将该文件拷贝一份放到谷歌浏览器目录下,找到快捷方式【打开所在目录】即可③将该文件再拷贝一份放到Python编译器目录下如图2所示。图1将文件放到谷歌浏览器目录下图2将文

    2022年9月19日
    0
  • spring cloud构建互联网分布式微服务云平台-服务链路追踪

    spring cloud构建互联网分布式微服务云平台-服务链路追踪

    2021年7月1日
    87
  • Pytest(15)pytest分布式执行用例「建议收藏」

    Pytest(15)pytest分布式执行用例「建议收藏」前言平常我们功能测试用例非常多时,比如有1千条用例,假设每个用例执行需要1分钟,如果单个测试人员执行需要1000分钟才能跑完当项目非常紧急时,会需要协调多个测试资源来把任务分成两部分,于是执行时间

    2022年7月30日
    7
  • 超分辨率的数据增强Python(超分辨率重建是什么)

    python在图像超分辨率重建中的应用洪华秀[1];【期刊名称】《计算机产品与流通》【年(卷),期】2019(000)002【摘要】图像超分辨率重建技术是低分辨率图像经过一系列算法处理后转换成高分辨率图像的过程,随着图像数据的应用领域不断延伸,这一技术也逐渐成了图像处理研究热点之一。近几年Python语言在人工智能领域逐渐占领榜首,它的优越性在于强大的第三方数据处理工具的支持。本文在图像超分辨率重…

    2022年4月12日
    196

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号