返回顶部
首页 > 资讯 > 数据库 >理解sql中的group by和having
  • 108
分享到

理解sql中的group by和having

理解sql中的groupby和having 2019-09-16 07:09:00 108人浏览 绘本
摘要

下面通过一个例子,来简单解释group by的原理。 1. GROUP BY 假设我们有表1,表名为test: 如果我们执行如下sql语句: SELECT name FROM test GROUP BY name 我们很容易可以

理解sql中的group by和having

下面通过一个例子,来简单解释group by的原理。

1. GROUP BY

假设我们有表1,表名为test:

如果我们执行如下sql语句:

SELECT name FROM test GROUP BY name

我们很容易可以得到运行的结果:

为了能够更好的理解“group by”多个列“和”聚合函数“的应用,这里可以在表1到表2的过程中,引入一个虚构的中间表:虚拟表3。

FROM test Group BY name:该句执行后,我们想象生成了虚拟表3,如下所图所示:

生成过程是这样的:group by name,那么找name那一列,具有相同name值的行,合并成一行,如对于name值为aa的,那么<1 aa 2>与<2 aa 3>两行合并成1行,所有的id值和number值写到一个单元格里面。

接下来再针对虚拟表3执行Select语句:

  1. 如果执行select *的话,那么返回的结果应该是虚拟表3,可是id和number中有的单元格里面的内容是多个值的,而关系数据库就是基于关系的,单元格中是不允许有多个值的,所以,执行select * 语句是不允许的。

    • 为了约束使用者在编写group by时select多值字段,设计DBMS的开发者也是伤透了脑筋。开发者并不知道将来这个数据库会被用来做什么,所以,他不可能从逻辑上来检查你的select上出现的语句是不是分组属性的一个子集。所以,最简单的方法就是看你的select上出现的属性在group by上出现过。出现过,就通过编译,否则不会。

    • Mysql对group by 进行了非ANSI标准的扩展,允许select后含有非group by 的列。所以在mysql中,group by时执行select *不会报错 ,但也得不到我们想要的数据,只会select出原表中的第一个数据

  2. 我们再看name列,每个单元格只有一个数据,所以我们select name的话,就没有问题了。为什么name列每个单元格只有一个值呢,因为我们就是用name列来group by的。

  3. 那么对于id和number里面的单元格有多个数据的情况怎么办呢?答案就是用聚合函数,聚合函数就用来输入多个数据,输出一个数据的。如cout(id),sum(number),而每个聚合函数的输入就是每一个多数据的单元格。

    • 例如我们执行select name,sum(number) from test group by name,那么sum就对虚拟表3的number列的每个单元格进行sum操作,例如对name为aa的那一行的number列执行sum操作,即2+3,返回5,最后执行结果如下:
  4. group by 多个字段该怎么理解呢:如group by name,number,我们可以把name和number 看成一个整体字段,以他们整体来进行分组的。如下图

    • 接下来就可以配合select和聚合函数进行操作了。如执行select name,sum(id) from test group by name,number,结果如下图:
    • -

2. HAVING

首先,不要错误的认为having必须和group by 配合使用。其实having可以单独使用

having关键字在我们的印象中,貌似和where关键字十分相似,那二者有什么区别呢?

  1. 含义:
    • “Where”是一个约束声明,在查询数据库的结果返回结果之前对数据库中的查询条件进行约束,即在结果返回之前起作用,且where后面不能使用“聚合函数”;
      • where后面之所以不能使用聚合函数是因为where的执行顺序在聚合函数之前,所以在执行where的时候,还没有结果集,更别说对结果集做聚合了。
    • Having”是一个过滤声明,所谓过滤是在查询数据库的结果返回之后进行过滤,即在结果返回之后起作用,并且having后面可以使用“聚合函数”。
      • having既然是对查出来的结果进行过滤,那么就不能对没有select出来的字段使用having,如select id , name from student having score >90;这句话就是错误的。

where和having,一个是起作用在结果返回前,用来过滤记录;一个是起作用在结果返回后,用来过滤结果。这种场景的典型应用如这句:SELECT region,count(school) FROM T02_Bejing_school WHERE region IN ("海淀" , "西城" , "东城") GROUP BY region HAVING count(school) > 10;该句sql可以筛选出北京西城、东城、海淀三个区中学校数量超过10所的区及各区学校数量。即先用where把这三个区的中学过滤出来,然后对结果集做group by,得到一张组合后的虚拟表,最后通过having对虚拟表做二次过滤。

  1. 使用的场景:
    • 只有WHERE可以使用的场景:
      • 除select外,where还可以用于update、delete和insert into values(select * from table where ..)语句中,having则不行。
      • select语句中,没有select出要被约束的字段的时候,也不可以使用having。就如上文提到的非法语句:select id , name from student having score >90;
    • 只有HAVING可以使用的场景:
      • 如果要过滤的字段是原生表中不存在的字段,而是经过聚合函数计算后的字段,那么不可以使用where,只能用having。如:
        • 合法语句:select id , avg(price) as ag from goods group by category having ag > 1000
        • 非法语句:select id , avg(price) as ag from goods where ag group by category > 1000
    • 二者都可以使用的场景:
      • 要约束的字段既是原生表的字段,又是sql中被select出来的字段,这时候where和having等效:
        • select price , name from goods where price > 100
        • select price , name from goods having price > 100

参考资料

  1. 理解group by
  2. Group by的理解
  3. 正确理解MySQL中的where和having的区别
您可能感兴趣的文档:

--结束END--

本文标题: 理解sql中的group by和having

本文链接: https://lsjlt.com/news/5928.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 理解sql中的group by和having
    下面通过一个例子,来简单解释group by的原理。 1. GROUP BY 假设我们有表1,表名为test: 如果我们执行如下SQL语句: SELECT name FROM test GROUP BY name 我们很容易可以...
    99+
    2019-09-16
    理解sql中的group by和having
  • sql中group by having用法
    group by 和 having 子句用于对 sql 查询结果进行分组和过滤。group by 将行划分为组,而 having 过滤满足特定条件的组。 GROUP...
    99+
    2024-05-09
    聚合函数
  • mysql中的group by 和 having使用
    mysql中的group by 和 having 使用 理论 –sql中的group by 用法解析: – Group By语句从英文的字面意义上理解就是“根据(by)一定的规则进行分组(G...
    99+
    2023-09-14
    mysql 数据库 sql
  • mysql之group by和having用法详解
    GROUP BY语法可以根据给定数据列的每个成员对查询结果进行分组统计,最终得到一个分组汇总表。 select子句中的列名必须为分组列或列函数,列函数对于group by子...
    99+
    2024-04-02
  • Mysql之分组查询,Group By,Group Having的用法
    一、group by 的用法 group by ,在mysql中用来给字段分组,sql语句如下,这是一条用来统计男女数量的sql语句。 这里我们要注意到,group by ,一定是和聚合函数配合使用的,而不能直接使用select...
    99+
    2023-08-17
    mysql 数据库 sql
  • sql server查询(SELECT ,where,distinct,like 查询,in,is null,group by 和having,order by,as)
    基本查询: 实例表 1 示例表 2 --部门表 3 4 create table dept( 5 6 deptno int primary key,--部门编号 7 8 dname nvarchar(3...
    99+
    2020-07-30
    sql server查询(SELECT ,where,distinct,like 查询,in,is null,group by 和having,order by,as)
  • sql语句中GROUP BY 和HAVING怎么用
    小编给大家分享一下sql语句中GROUP BY 和HAVING怎么用,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!在介绍...
    99+
    2024-04-02
  • 数据库中group by和having语法使用是什么样的
    本篇文章给大家分享的是有关数据库中group by和having语法使用是什么样的,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。有个...
    99+
    2024-04-02
  • PostgreSQL查询优化中对Having和Group By子句的简化处理分析
    这篇文章主要介绍“PostgreSQL查询优化中对Having和Group By子句的简化处理分析”,在日常操作中,相信很多人在PostgreSQL查询优化中对Having和Group ...
    99+
    2024-04-02
  • sql中having的作用
    having 子句用于 sql 中根据聚合结果筛选数据,它在 group by 操作后应用于聚合结果,以筛选满足特定条件的聚合组,如:根据总销售额过滤销售人员。 HAVIN&...
    99+
    2024-05-10
    聚合函数
  • sql中having的意思
    having 子句用于在 sql 查询中对分组数据进行过滤,与 where 子句对单个行进行过滤不同,having 子句用于对由 group by 子句创建...
    99+
    2024-05-02
    聚合函数
  • sql中having的用法
    having 子句用于过滤由 group by 子句分组后的结果集,可用于筛选聚合结果、比较聚合结果以及在子查询中嵌套使用聚合函数。 SQL 中 HAVING 子句的...
    99+
    2024-05-15
    聚合函数
  • sql中having和where的用法
    where 子句在 select 语句中筛选行,根据行条件过滤基础数据。having 子句在 group by 语句中筛选组,根据组的聚合结果过滤组。主要区...
    99+
    2024-05-02
  • sql中where和having的区别
    where 和 having 子句在 sql 中均用于过滤数据,但作用范围不同:where 子句过滤单行,having 子句过滤分组后的结果集。w...
    99+
    2024-05-01
    聚合函数
  • sql中having和where的区别
    在 sql 中,having 和 where 都用于过滤数据,但它们的区别在于:where 过滤单个行,而 having 过滤聚合函数的结果。wh...
    99+
    2024-05-07
    聚合函数
  • having在sql中的用法
    having 子句用来对聚合结果进行过滤,其用法有:在 group by 子句之后使用。指定条件,以筛选聚合结果。使用聚合函数(如 sum、avg)和分组列。常用于筛选满足特定...
    99+
    2024-04-29
    聚合函数
  • having在sql中的意思
    having 子句用于在 sql 查询中对聚合结果进行筛选,筛选满足特定条件的行。having 子句只能与 group by 子句一起使用,条件可以引用聚合函数和分组...
    99+
    2024-05-02
    聚合函数
  • 如何使用SQL中的having
    如何使用SQL中的having?针对这个问题,今天小编总结这篇有关having的文章,希望能帮助更多想解决这个问题的朋友找到更加简单易行的办法。“having”是“group ...
    99+
    2024-04-02
  • SQL中having和where如何使用
    这篇文章将为大家详细讲解有关SQL中having和where如何使用,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。“Where...
    99+
    2024-04-02
  • SQL中having和where怎么使用
    在SQL中,HAVING子句和WHERE子句都用于筛选数据,但它们的使用场景有所不同。 WHERE子句: ...
    99+
    2024-04-19
    SQL
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作