当前位置: 首页 > news >正文

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子句进行分组过滤!

转载于:https://www.cnblogs.com/GreenLeaves/p/5817410.html

相关文章:

  • 项目中 处理后端返回多数据值, 数组形式 展示tab 列表上
  • ES6第一篇
  • 前端开发中,会遇到字符串填充的问题,padStart() 和 padEnd()
  • VS.net 2013中使用Git建立源代码管理 版本管理
  • react 项目中,选中一条信息,自动带出对应的信息
  • Linux 命令用法
  • 计算选中数据的某项 数据总和
  • 前端处理数组 在 js中把已知对象循环遍历后再push新的数组中
  • scrapy 爬取 useragent
  • react 项目中,某需求需要根据返回数据的某条件禁止选择行
  • 函数式思维的小例子
  • 基于LNMP的Zabbbix之Zabbix Server源码详细安装,但不给图
  • 前端 禁止微信调整字体大小
  • SQL练习之求解填字游戏
  • 前端 项目中 判断两个对象value值是否相等
  • 【407天】跃迁之路——程序员高效学习方法论探索系列(实验阶段164-2018.03.19)...
  • 【跃迁之路】【463天】刻意练习系列222(2018.05.14)
  • java取消线程实例
  • Java深入 - 深入理解Java集合
  • niucms就是以城市为分割单位,在上面 小区/乡村/同城论坛+58+团购
  • vue-router 实现分析
  • 阿里云应用高可用服务公测发布
  • 彻底搞懂浏览器Event-loop
  • 基于OpenResty的Lua Web框架lor0.0.2预览版发布
  • 树莓派 - 使用须知
  • 数据可视化之 Sankey 桑基图的实现
  • 线上 python http server profile 实践
  • 用jQuery怎么做到前后端分离
  • 云大使推广中的常见热门问题
  • ​软考-高级-信息系统项目管理师教程 第四版【第19章-配置与变更管理-思维导图】​
  • (007)XHTML文档之标题——h1~h6
  • (7)STL算法之交换赋值
  • (C语言)编写程序将一个4×4的数组进行顺时针旋转90度后输出。
  • (免费领源码)Java#Springboot#mysql农产品销售管理系统47627-计算机毕业设计项目选题推荐
  • (一)VirtualBox安装增强功能
  • .NET Core、DNX、DNU、DNVM、MVC6学习资料
  • .NET Core实战项目之CMS 第十二章 开发篇-Dapper封装CURD及仓储代码生成器实现
  • .NET 分布式技术比较
  • .net 桌面开发 运行一阵子就自动关闭_聊城旋转门家用价格大约是多少,全自动旋转门,期待合作...
  • .net解析传过来的xml_DOM4J解析XML文件
  • .Net小白的大学四年,内含面经
  • .net中的Queue和Stack
  • @RequestBody的使用
  • [ C++ ] STL---string类的模拟实现
  • [Android]如何调试Native memory crash issue
  • [BROADCASTING]tensor的扩散机制
  • [Gamma]阶段测试报告
  • [HDOJ4911]Inversion
  • [iOS]-NSTimer与循环引用的理解
  • [JavaWeb]——过滤器filter与拦截器Interceptor的使用、执行过程、区别
  • [JS]JavaScript 简介
  • [Linux] 进程间通信基础
  • [MAT]使用MAT比較多个heap dump文件
  • [MYSQL]mysql将两个表结果合并到一起
  • [one_demo_14]一个简单的easyui的demo