iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >SQL 中 HAVING 常见的使用方法
  • 514
分享到

SQL 中 HAVING 常见的使用方法

2024-04-02 19:04:59 514人浏览 八月长安
摘要

目录HAVING 子句1. 寻找缺失的编号2. 查询缺少编号的最小值3. 求众数4. 求中位数5. 查询不包含 NULL 的集合6. 关系除法运算总结HAVING 子

HAVING 子句

始终要记得 SQL是一种基于“面向集合”思想设计的语言 。

1. 寻找缺失的编号

查询这张表里是否存在数据缺失。当前这张表的编号并不是连续的,缺少了 4 和 7(这里给出的列是有序的,实际情景下很有可能是无序的)。

-- 如果有查询结果,说明存在缺失的编号
SELECT 1 AS gap
FROM SeQtbl
HAVING COUNT(*) <> MAX(seq);

如果这个查询结果有 1 行,说明存在缺失的编号;如果 1 行都没有,说明不存在缺失的编号。这是因为,如果用 COUNT(*) 统计出来的行数等于“连续编号”列的最大值,就说明编号从开始到最后是连续递增的,中间没有缺失。如果有缺失,COUNT(*) 会小于 MAX(seq) ,这样 HAVING 子句就变成真了。这个解法只需要 3 行代码,十分优雅。

上面的 sql 语句里没有 GROUP BY 子句,此时整张表会被聚合为一行。这种情况下 HAVING 子句也是可以使用的。在以前的 SQL 标准里,HAVING 子句必须和 GROUP BY 子句一起使用,所以到现在也有人会有这样的误解。但是,按照现在的 SQL 标准来说, HAVING 子句是可以单独使用的 。不过这种情况下,就不能在 SELECT 子句里引用原来的表里的列了,要么就得像示例里一样使用常量,要么就得像 SELECT COUNT(*) 这样使用聚合函数。

也可以认为是对空字段进行了 GROUP BY 操作,只不过省略了 GROUP BY 子句。如果使用窗口函数时不指定 PARTITioN BY 子句,就是把整个表当作一个分区来处理的,思路与这里也是一样的。

2. 查询缺少编号的最小值

-- 查询缺失编号的最小值
SELECT MIN(seq + 1) AS gap
FROM SeqTbl
WHERE (seq+ 1) NOT IN ( SELECT seq FROM SeqTbl);

要注意!

  • 如果表里没有编号 1,那么缺失编号的最小值应该是 1,但是这两条 SQL 语句都不能得出正确的结果
  • 如果表里包含 NULL ,那么这条 SQL 语句也不能得出正确的结果

3. 求众数

-- 求众数的SQL:使用极值函数
SELECT income, COUNT(*) AS cnt
FROM Graduates
GROUP BY income
HAVING COUNT(*) >= ( SELECT MAX(cnt) FROM ( SELECT COUNT(*) AS cnt FROM Graduates GROUP BY income) TMP ) ;

这里使用MAX极值函数而不是ALL谓词是因为极值函数可以避免Null值带来的问题。详细内容可以看 一文详解SQL 中的三值逻辑 这篇文章。

4. 求中位数

将集合里的元素按照大小分为上半部分和下半部分两个子集,同时让这 2 个子集共同拥有集合正中间的元素。

这样,共同部分的元素的平均值就是中位数:

-- 求中位数的SQL 语句:在HAVING 子句中使用非等值自连接
SELECT AVG(DISTINCT income) -- 这里一定要去重后 再求平均
FROM (  
        SELECT T1.income
        FROM Graduates T1, Graduates T2
        GROUP BY T1.income
        -- S1 的条件 小于等于T2的数量大于等于全部的一半
        HAVING SUM(CASE WHEN T2.income >= T1.income THEN 1 ELSE 0 END) >= COUNT(*) / 2
        -- S2 的条件 大于等于T2的数量大于等于全部的一半
        AND SUM(CASE WHEN T2.income <= T1.income THEN 1 ELSE 0 END) >= COUNT(*) / 2 
        -- 同时满足  小于等于T2的数量大于等于全部的一半 且 大于等于T2的数量大于等于全部的一半 即说明T2在前后两部分的中间的交集中
) TMP;

5. 查询不包含 NULL 的集合

COUNT 函数的使用方法有 COUNT(*) 和 COUNT( 列名 ) 两种,

它们的区别有两个:

  • 第一个是性能上的区别;第二个是 COUNT(*) 可以用于 NULL ,而 COUNT( 列名 ) 与其他聚合函数一样,要先排除掉NULL 的行再进行统计。
  • 第二个区别也可以这么理解:COUNT(*) 查询的是所有行的数目,而 COUNT( 列名 ) 查询的则不一定是。

现在需要查找哪些学院的学生全部都提交了报告(即理学院、经济学院)。

SELECT dpt
FROM Students
GROUP BY dpt
HAVING COUNT(*) = COUNT(sbmt_date);

同样可以使用case表达式

SELECT dpt
FROM Students
GROUP BY dpt
HAVING COUNT(*) = SUM(CASE WHEN sbmt_date IS NOT NULL THEN 1 ELSE 0 END);

在这里,CASE 表达式的作用相当于进行判断的函数,用来判断各个元素(= 行)是否属于满足了某种条件的集合。这样的函数我们称为特征函数(characteristic function),或者从定义了集合的角度来将它称为定义函数

6. 关系除法运算

现在需要查询囊括了表 Items 中所有商品的店铺(仙台店和东京店)。

SELECT SI.shop
FROM ShopItems SI, Items I
WHERE SI.item = I.item
GROUP BY SI.shop
HAVING COUNT(SI.item) = (SELECT COUNT(item) FROM Items)

同样也可以写出 只包含 Items 中所有商品的店铺(东京店)

SELECT SI.shop
FROM ShopItems SI LEFT OUTER JOIN Items I
ON SI.item=I.item
GROUP BY SI.shop
HAVING COUNT(SI.item) = (SELECT COUNT(item) FROM Items) -- 条件1
       AND COUNT(I.item) = (SELECT COUNT(item) FROM Items); -- 条件2

总结

到此这篇关于SQL 中 HAVING 常见的使用方法的文章就介绍到这了,更多相关SQL HAVING内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: SQL 中 HAVING 常见的使用方法

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

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

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • SQL 中 HAVING 常见的使用方法
    目录HAVING 子句1. 寻找缺失的编号2. 查询缺少编号的最小值3. 求众数4. 求中位数5. 查询不包含 NULL 的集合6. 关系除法运算总结HAVING 子句 始终要记得 SQL是一种...
    99+
    2022-09-19
  • SQL 中 HAVING 常见的使用方法
    目录HAVING 子句1. 寻找缺失的编号2. 查询缺少编号的最小值3. 求众数4. 求中位数5. 查询不包含 NULL 的集合6. 关系除法运算总结HAVING 子...
    99+
    2022-11-13
  • 如何使用SQL中的having
    如何使用SQL中的having?针对这个问题,今天小编总结这篇有关having的文章,希望能帮助更多想解决这个问题的朋友找到更加简单易行的办法。“having”是“group ...
    99+
    2022-10-18
  • PHP常见的SQL防注入方法
    利用Mysqli和PDO 产生原因主要就是一些数据没有经过严格的验证,然后直接拼接 SQL 去查询。导致产生漏洞,比如: $id = $_GET['id'];$sql = "SELECT na...
    99+
    2023-09-26
    php sql
  • mysql数据库中having的使用方法
    这期内容当中小编将会给大家带来有关mysql数据库中having的使用方法,以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。having字句可以让我们筛选成组后的各种数...
    99+
    2022-10-18
  • MySQL Workbench使用中的常见方法
    MySQL Workbench 是可视化数据库设计软件,为数据库管理员和开发人员提供了一整套可视化的数据库操作环境,主要功能有数据库设计与模型建立、SQL 开发(取代 MySQL Query Browser)、数据库管理(取代 MySQL ...
    99+
    2021-05-02
    MySQL Workbench使用中的常见方法 数据库入门 数据库基础教程
  • C++ STL中常见的算法使用方式
    目录什么是STL?0. < algorithm> 是什么:1. Non-modifying sequence operations:1.1 find:(Find valu...
    99+
    2022-11-12
  • SQL Server模糊查询的常见方法总结
    在数据查询的时候,有完整查询和模糊查询之分.在Access和SQL Server中使用模糊查询有一下几种查询: 1.用_通配符查询 "_"号表示任意单个字符,该字符号只能匹配一个字符...
    99+
    2022-11-11
  • SQL的常见错误用法有哪些
    今天小编给大家分享一下SQL的常见错误用法有哪些的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。1、LIMIT 语句分页查询是...
    99+
    2023-06-28
  • Java中enum常见的使用方法有哪些
    这篇文章主要介绍了Java中enum常见的使用方法有哪些,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。Java的特点有哪些Java的特点有哪些1.Java语言作为静态面向对象...
    99+
    2023-06-14
  • 在HTML中使用CSS的常见方法有哪些
    这篇文章主要讲解了“在HTML中使用CSS的常见方法有哪些”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“在HTML中使用CSS的常见方法有哪些”吧!层叠样式...
    99+
    2022-10-19
  • 安装sql server 2008的常见错误和解决方法
    这篇文章将为大家详细讲解有关安装sql server 2008的常见错误和解决方法,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。安装sql server 2...
    99+
    2022-10-19
  • SQL Server中row_number函数的常见用法示例详解
    row_number函数是在SQL Server中用来给每行数据生成一个唯一的编号。它常用于对数据进行排序、分组和分页操作。以下是r...
    99+
    2023-08-14
    SQL Server
  • Linux中的常见操作方法
    这篇文章将为大家详细讲解有关Linux中的常见操作方法,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。1. Linux的用户管理Linux系统是一个多用户多任务的操作系统,任何一个要使用系统资源的用户,都必...
    99+
    2023-06-20
  • Python分支语句常见的使用方法
    目录前言一、单分支语句:if语句二、二分支语句:if else语句三、多分支结构:if – elif – else语句四、嵌套分支结构前言 Python分支语...
    99+
    2022-11-11
  • mybaits-plus lambdaQuery() 和 lambdaUpdate() 常见的使用方法
    目录mybaits-plus lambdaQuery() 和 lambdaUpdate() 比较常见的使用方法简介前言学生类mybaits-plus lambdaQuery() 和 ...
    99+
    2023-01-28
    mybaits-plus lambdaQuery() 和 lambdaUpdate() mybaits-plus lambdaQuery() 使用 mybaits-plus lambdaUpdate(
  • react中常见hook的使用方式
    目录1、什么是hook? 2、为什么要出现hook? 3、有哪些常用的hook? (1) useState (2) useEffect (3) useContext (4) useR...
    99+
    2022-11-12
  • 这8种常见的SQL错误用法,80%的人还在使用
    点点这个链接免费获取:【推荐】2020年最新Java电子书集合.pdf(吐血整理) >>> 1、LIMIT 语句   分页查询是最常用的场景之一,但也通常也是最容易出问题的地方。比如对于下面简单的语句,一般 DBA 想到的办法是在 ...
    99+
    2017-08-02
    这8种常见的SQL错误用法,80%的人还在使用
  • Oracle常用的SQL方法总结
       在项目中一般需要对一些数据进行处理,以下提供一些基本的SQL语句:     1.基于条件的插入和修改:需要在表中插入一条记录,插入前根据key标识判断...
    99+
    2022-10-18
  • SQL中distinct的使用方法
    这篇文章主要介绍“SQL中distinct的使用方法”,在日常操作中,相信很多人在SQL中distinct的使用方法问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”SQL中di...
    99+
    2022-10-18
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作