专栏首页GreenLeavesSQL学习之HAVING过滤分组

SQL学习之HAVING过滤分组

1、SQL除了能用Group By分组数据之外,SQL还允许过滤分组,规定包括那些分组,排除那些分组。例如,你可能想要列出至少有两个订单的所有顾客。为此,必须基于完整的分组而不是个别的行进行过滤。

    基于上面的例子,我们第一时间想到的是通过使用WHERE来过滤数据,拿到我们想要的结果,但是在这个列子中WHERE不能完成任务,因为WHERE过滤指定的是行,而不是分组。事实上,WHERE没有分组的概念。

因此,SQL提供了专门用来过滤分组的类似与WHERE子句的子句,HAVING子句,事实上,几乎所有类型的WHERE子句都可以用HAVING来代替。唯一的差别是,WHERE过滤行数据,HAVING过滤分组数据。

如下代码:

select * from dbo.T_Unit_Equipment

现在有一个报表系统,需要展示每个单位,拥有每台设备的数量,这个时候用WHERE很麻烦(前提是数据量比较少的情况下),下面是解决代码:

select UnitId,EquipmentName,COUNT(*) as Equipments from dbo.T_Unit_Equipment group by UnitId,EquipmentName order by UnitId ASC

ok,完成需求!

现在,改变需求,现在需要检索出每家单位拥有的同一种设备大于等于2的记录,下面是解决代码:

select UnitId,EquipmentName,COUNT(*) as Equipments from dbo.T_Unit_Equipment group by UnitId,EquipmentName HAVING COUNT(*)>=2 order by UnitId ASC 

ok,完成需求!

上面的代码通过UnitId,EquipmentName两个字段进行分组,然后SELECT语句检索出UnitId,EquipmentName,以及Equipments(Equipments在这里是一个计算字段,通过COUNT()函数计算出每个分组的总记录数),然后HAVING子句告诉SELECT语句只检索出所有分组中的总记录数大于等于2的分组记录。这里的COUNT(*)>=2过滤了每家单位所拥有的同一种设备小于2的分组!

2、WHERE和HAVING的差别:

(1)WHERE在数据分组前进行过滤,HAVING在数据分组之后进行过滤,这是个很重要的区别,WHERE排除的行不包括在分组中。这可能会改变计算值,从而影响HAVING子句中基于这些值的过滤掉的分组,根据这个差别,我们可以确定WHERE子句和Group By子句的位置:WHERE子句会在数据分组之前,对行数据进行过滤。

(2)HAVING与WHERE非常类似,如果不指定Group By,则大多数DBMS会同等的对待他们,不过你自己要区分这一点,使用HAVING时应该结合Group By子句,而WHERE子句用于标准的行级数据过滤

下面通过一个例子来了解HAVING子句与WHERE子句的差别

select * from dbo.T_Unit_Equipment

现在需要检索出每家单位拥有的同一种设备大于等于2的记录,前提是设备必须有维护人员(对应表中的Person列值不能为空),下面是解决代码:

select UnitId,EquipmentName,COUNT(*) as Equipments from dbo.T_Unit_Equipment where Person!='' group by UnitId,EquipmentName HAVING COUNT(*)>=1 order by UnitId ASC 

ok,完成需求!

where 过滤了Person=''的列值,然后Group By在对剩余的数据进行分组,之后HAVING子句进行分组过滤!

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Array对象的判定

    /* 关于JS对象类型的判断,最复杂的在于RegExp和Array了,判定RegExp的情形不较少,而Array就比较多了,下面就是判断Array的...

    郑小超.
  • JavaScript之引用类型介绍

           引用类型的值(对象)是应用类型的一个实例。在ECMAScript中,引用类型是一种数据结构,用于将数据和功能组织在一起,用于将数据和功能组织在一起...

    郑小超.
  • Oracle 数据库和Sql Server数据库的区别

    Oracle数据库的访问方式,和SqlServer数据库是有很大差别的,下面用图来说明: 1、Sql Server数据库 ? SqlServer数据库的访问方式...

    郑小超.
  • 如何让所有实体类用相同名称的主键(很有力的问题,比如所有表实体主键都用ID)

    这个问题比较有力量,哈哈! 例如:有两个表userbases和products 两个表的主键分别为UserID和ProductID,那么,我想问有没有一种方法把...

    逸鹏
  • 不等款柱形图(时间刻度实现)

    今天要分享的图表仍然是昨天的不等款柱形图! ▽▼▽ 虽然最终制作出来的最终图表效果是相同的,但是制作理念和数据组织方式却截然不同,非常值得尝试! ●●●●● 数...

    数据小磨坊
  • 不用代码也可以采集到高质量网页数据!

    最近浙江省新高中信息技术教材将VB语言替换成python,并且使用「Python/Matplotlib/Pandas」组合作为高中计算机高考内容,这个引起了使用...

    沉默的白面书生
  • pathway common:综合性的pathway数据库

    network based analysis, 基于网络的数据分析,是目前最常见的研究基因功能的方法,最典型的有pathway和蛋白质相互作用网络的分析,基因间...

    生信修炼手册
  • Entity Framework 4.1 Code-First 学习笔记

      CodeFirst提供了一种先从代码开始工作,并根据代码直接生成数据库的工作方式。Entity Framework 4.1在你的实体不派生自任何基类、不添加...

    thz
  • Node基础:域名解析DNS(ok)

    Nodejs学习手册,基础总结之DNS模块。对从事web开发的同学来说,DNS解析再熟悉不过,在nodejs中也有一个模块可以完成dns解析的工作,使用非常简单...

    IMWeb前端团队
  • 优步宣布停止在美国亚利桑那州的自动驾驶汽车计划,解雇200多名相关工作人员

    “我们致力于自动驾驶技术,我们期待在不久的将来回到公共道路上,”优步发言人表示,“与此同时,我们仍将重点放在全面的安全评估上,让NTSB前任主席Christop...

    AiTechYun

扫码关注云+社区

领取腾讯云代金券