背景问题:
准备数据:
create table seq_tbl(
seq int not null,
name text not null
);
insert into seq_tbl(seq, name)
values(1, '迪克'),
(2, '安'),
(3, '莱露'),
(5, '卡'),
(6, '玛丽'),
(8, '本');
/*
seq | name
-----+------
1 | 迪克
2 | 安
3 | 莱露
5 | 卡
6 | 玛丽
8 | 本
*/
背景问题:
- seq列是否是不连续的?
- 缺少的seq是哪些?
解法:
seq列是否是不连续的?
😱having居然可以脱离group by使用; 🤓在以前的sql标准里, having必须和group by一起使用的; 但是在当前的sql标准里, having可以单独使用的, 可以理解为group by了一个空字段;select 'seq列是不连续的' as gap from seq_tbl having count(*) < max(seq); /* gap ----------------- seq列是不连续的 (1 row) */
- group by的字段越多理论上, 分出的自己就越多, 如下图所示:
- 这一条sql语句是对空字段进行group by, 那么分出的子集就是集合本身, 这样就是对母集求count(), 求max(income), 如下图所示:
缺少的seq是哪些?*
🤓 order by不是sql运算的一部分, 而是光标定义的一部分;-- 使用not in select seq + 1 as gap from seq_tbl where seq + 1 not in (select seq from seq_tbl) order by gqp; /* gap ----- 4 7 9 (3 rows) */ -- 使用not exists ➕ 关联子查询 select seq + 1 as gap from seq_tbl as s1 where not exists (select * from seq_tbl as s2 where s1.seq+1 = s2.seq) order by gap; /* gap ----- 4 7 9 */