我们将学习 HAVING 子句的用法,进而理解面向集合语言的第二个特性——以集合为单位进行操作,SQL 作为面向集合语言的特征

HAVING子句是可以单独使用的

不过这种情况下,就不能在 SELECT 子句里引 用原来的表里的列了,要么就得像示例里一样使用常量,要么就得像 SELECT COUNT(*) 这样使用聚合函数。

/* 寻找缺失的编号 */
CREATE TABLE SeqTbl
(seq  INTEGER PRIMARY KEY,name VARCHAR(16) NOT NULL);INSERT INTO SeqTbl VALUES(1,   '迪克');
INSERT INTO SeqTbl VALUES(2,    '安');
INSERT INTO SeqTbl VALUES(3,    '莱露');
INSERT INTO SeqTbl VALUES(5,    '卡');
INSERT INTO SeqTbl VALUES(6,    '玛丽');
INSERT INTO SeqTbl VALUES(8,    '本');

– 如果有查询结果,说明存在缺失的编号

SELECT '存在缺失的编号' AS gap
FROM SeqTbl
HAVING COUNT(*) <> MAX(seq);

– 查询缺失编号的最小值

SELECT MIN(seq + 1) AS gap
FROM SeqTbl
WHERE (seq+ 1) NOT IN ( SELECT seq FROM SeqTbl);

用 HAVING 子句进行子查询 :求众数

/* 用HAVING子句进行子查询:求众数(求中位数时也用本代码) */
CREATE TABLE Graduates
(NAME   VARCHAR(16) PRIMARY KEY,income INTEGER NOT NULL);INSERT INTO Graduates VALUES('桑普森', 400000);
INSERT INTO Graduates VALUES('迈克',     30000);
INSERT INTO Graduates VALUES('怀特',   20000);
INSERT INTO Graduates VALUES('阿诺德', 20000);
INSERT INTO Graduates VALUES('史密斯',     20000);
INSERT INTO Graduates VALUES('劳伦斯',   15000);
INSERT INTO Graduates VALUES('哈德逊',   15000);
INSERT INTO Graduates VALUES('肯特',     10000);
INSERT INTO Graduates VALUES('贝克',   10000);
INSERT INTO Graduates VALUES('斯科特',   10000);

-- 求众数的 SQL 语句 (1):使用谓词
SELECT income, COUNT(*) AS cnt
FROM Graduates
GROUP BY income
HAVING COUNT(*) >= ALL ( SELECT COUNT(*)
FROM Graduates
GROUP BY income);
-- 求众数的 SQL 语句 (2) :使用极值函数
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 ) ;
-- 求中位数的 SQL 语句 :在 HAVING 子句中使用非等值自连接
SELECT AVG(DISTINCT income)
FROM (SELECT T1.income
FROM Graduates T1, Graduates T2
GROUP BY T1.income● 62 第1章 神奇的SQL
--S1 的条件
HAVING SUM(CASE WHEN T2.income >= T1.income THEN 1 ELSE 0 END)
>= COUNT(*) / 2
--S2 的条件
AND SUM(CASE WHEN T2.income <= T1.income THEN 1 ELSE 0 END)
>= COUNT(*) / 2 ) TMP;

查询不包含 NULL 的集合

-- 在对包含 NULL 的列使用时, COUNT(*) 和 COUNT( 列名 ) 的查询结果是不同的
SELECT COUNT(*), COUNT(col_1)
FROM NullTbl;

HAVING 子句“调查集合自身性质”的特长

我在教 SQL 课程的时候,最重要的课题之一是让学生们暂时忘掉 (unlearn)他们已经习惯了的面向过程语言。我使用的方法是强调 SQL的 处理单位不是记录,而是集合。 ——Joe Celko

笔者认为,学习 HAVING 子句的用 法是帮助我们顺利地忘掉面向过程语言的思考方式并理解 SQL 面向集合特性的最为有效的方法。这是因为, HAVING 子句的处理对象是集合而不 是记录,所以只有习惯了面向集合的思考方式,才能真正地学好它

HAVING 子句的力量 和 HAVING 子句又回来了相关推荐

  1. MICK-SQL进阶教程 1.4 HAVING 子句的力量

    1.4 HAVING 子句的力量 寻找缺失的编号 -- 在表SeqTbl中有缺失的连续编号{1,2,3,5,6,8}(缺4和7)-- 1.查询表中是否有编号确实 -- 面向过程的思路: -- (1)对 ...

  2. java catch子句的排列,对于catch子句的排列

    19.在异常处理中,如释放资源.关闭文件.关闭数据库等由( A.try 子句 B.catch 子句 C.finally 子句 D.throw 子句 20.对于 catch 子句的排列,下列哪种是... ...

  3. mysql where子句 参数_MySql——使用where子句过滤数据

    参考资料:<Mysql必知必会> 1.使用where子句 示例如下:查询价格等于10.5的行 select * from commodity where price=10.5 输出: 1 ...

  4. 数据库的基本查询二:普通查询 包括AS结果集字段别名;LIMIT:分页查询子句;ORDER BY:排序子句;DISTINCT :去重子句;

    本篇博客,内容有点啰嗦,需要时,快速浏览,效果更佳. 目录 零:导入SQL文件,创建演示所需的表: 一:基本查询 1.最基本查询 : 2.给[结果集]中的字段重命名:AS 3.查询语句中子句的执行顺序 ...

  5. oracle子句的用法,oracle RETURNING 子句使用方法

    RETURNING 自己通常结合DML 语句使用.(INSERT UPDATE DELETE) 使用方法: sql;"> UPDATE table_name SET expr1 RET ...

  6. SQL基础学习总结:5(HAVING子句的使用ORDER BY排序子句的使用)

    为聚合结果指定条件 HAVING子句 HAVING子句可以让我们筛选分组之后的各种数据,其语法结构如下: SELECT <列名1>,<列名2>,<列名3> FROM ...

  7. Python培训:try-except语句与else子句联合使用处理可能出现的程序异常

    异常处理的主要目的是防止因外部环境的变化导致程序产生无法控制的错误,而不是处理程序的设计错误.因此,将所有的代码都用try语句包含起来的做法是不推荐的,try语句应尽量只包含可能产生异常的代码.Pyt ...

  8. oracle 开窗子句,分析函数和开窗函数

    分析函数 分析函数是Oracle专门用于解决复杂报表统计需求的功能强大的函数,它可以在数据中进行分组然后计算基于组的某种统计值,并且每一组的每一行都可以返回一个统计值 分析函数和聚合函数的区别 普通的 ...

  9. mysql having子句_mysql having子句学习

    在用到having子句的地方,出现最多的往往是sql的聚合函数,例如SUM, COUNT, MAX, AVG等. 这些函数和其它函数的根本区别就是它们一般作用在多条记录上. 示例: SELECT SU ...

最新文章

  1. sklearn 朴素贝叶斯分类示例
  2. 关于ACCESS的事务与存储过程的调用
  3. Android下HelloWorld项目的R.java文件介绍
  4. 【数学建模】MATLAB应用实战系列(九十)-变异系数法应用案例(附MATLAB和Python代码)
  5. Mybatis基本配置和搭建
  6. 【渝粤教育】广东开放大学 财务管理 形成性考核 (58)
  7. java 从键盘中读取字符流 自定义异常
  8. 无序数组求第k大的数 python_【python刷题】寻找数组中第K大/小的数
  9. 华为留了一手!将继续发布P50、Mate50:搭载麒麟9000...
  10. WordPress实践:上传文件时提示“缺少临时文件夹”
  11. python自动化测试流程_接口自动化基本流程(python)
  12. golang interface 类型转换_Golang面试题41道
  13. Java Web 获取客户端真实IP
  14. Mysql 数据库中Where 关键字的使用
  15. MAC OSX stdio.h或iostream等头文件无法找到的解决办法
  16. ViveInputUtility-手柄触摸3D物体(6)
  17. oracle如何写不等于号,Oracle中不等于号问题-Oracle
  18. 工作展望简短_2018励志句子简短大全 展望2018励志正能量句子最新励志说说
  19. 《How to make a pizza: Learning a compositional layer-based GAN model》学习笔记
  20. 腾讯开放平台接口鉴权(计算签名)工具类 java版

热门文章

  1. 安岳高中2021高考成绩查询,四川省安岳中学2021年排名
  2. php5 geoip,php5.2 geoip pecl模块安装
  3. 初始3D打印机(Hori 3D Z600)
  4. python docx转换成txt文本
  5. python报错“IndentationError: unexpected indent“的两三解决方法
  6. Basler相机调用及图像存储
  7. linux查看IP端口占用情况
  8. c++入门必学算法 质数筛
  9. 金蝶 EAS WebService 发布过程
  10. 路由交换技术一二章总结