SQL进阶之HAVING子句
HAVING子句
越前须知(雾)
- 本系列参考《SQL进阶教程》1,DBMS选用MySQL。
- 本系列不涉及数据库安装与基础语句,对初学者存在一定门槛;基础知识建议阅读《SQL必知必会(第四版)》与《SQL基础教程(第二版)》。
概述
- SQL是一种面向集合的语言,表的记录没有顺序;与面向过程的语言不同,它没有排序的关系运算符(Order by不是关系运算符);
- HAVING子句用法即以集合为单位进行操作
具体用法
寻找缺失的编号
- 创表
CREATE TABLE SeqTbl
(seq INTEGER PRIMARY KEY,
name VARCHAR(16) NOT NULL);
-- 起始编号 = 1
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, '本');
-- 起始编号 <> 1
DELETE FROM SeqTbl;
INSERT INTO SeqTbl VALUES(3, '迪克');
INSERT INTO SeqTbl VALUES(4, '安');
INSERT INTO SeqTbl VALUES(7, '莱露');
INSERT INTO SeqTbl VALUES(8, '卡');
INSERT INTO SeqTbl VALUES(10, '玛丽');
INSERT INTO SeqTbl VALUES(11, '本');
- 起始编号 = 1
Q:查看表是否有编号缺失
A:若编号缺失,count(*) <> max(seq)
select '存在缺失的编号' as gap
from SeqTbl
having count(*) <> max(seq);
-- 不分组,把整个表当成一个分区
Q:编号缺失时显示“存在缺失的编号”;编号完整时显示“不存在缺失的编号”
A:UNION / CASE
-- union
select '存在缺失的编号' as gap from SeqTbl having count(*) <> max(seq)
union
select '不存在缺失的编号' as gap from SeqTbl having count(*) = max(seq);
-- case
select case when count(*) <> max(seq) then '存在缺失的编号'
else '不存在缺失的函数'end as gap
from SeqTbl;
Q:寻找最小缺失编号
A:NOT IN / NOT EXISTS 子查询
-- NOT IN
select min(seq + 1)