不光可以用 NOT EXISTS ,也可以有其他方式:
-- 方法一:用谓词表达全称量化命题 SELECT team_id, member FROM Teams T1 WHERE NOT EXISTS ( SELECT * FROM Teams T2 WHERE T1.team_id = T2.team_id AND status <> '待命' ); -- 方法二:用集合表达全称量化命题(1) SELECT team_id FROM Teams GROUP BY team_id HAVING COUNT(*) = SUM( CASE WHEN status = '待命' THEN 1 ELSE 0 END ); -- 方法三:用集合表达全称量化命题(2) SELECT team_id FROM Teams GROUP BY team_id HAVING MAX(status) = '待命' AND MIN(status) = '待命'; -- 方法四、比上面方式的更直观的展示方式(但性能比上面差):列表显示各个队伍是否所有队员都在待命 SELECT team_id, CASE WHEN MAX(status) = '待命' AND MIN(status) = '待命' THEN '全都在待命' ELSE '队长!人手不够' END AS status FROM Teams GROUP BY team_id;NOT EXISTS 写法跟 其他方法( HAVING 子句或者 ALL 谓词)的区别:
NOT EXISTS 写法可读性差
NOT EXISTS 性能更好
2、调查集合性质下面是整理的在调查集合性质时经常用到的条件。
这些条件可以在 HAVING 子句中使用,也可以通过SELECT 子句写在CASE 表达式里使用。
No 条件表达式 用途1 COUNT (DISTINCT col) = COUNT (col) col 列没有重复的值
2 COUNT(*) = COUNT(col) col 列不存在NULL
3 COUNT(*) = MAX(col) col 列是连续的编号(起始值是1)
4 COUNT(*) = MAX(col) - MIN(col) + 1 col 列是连续的编号(起始值是任意整数)
5 MIN(col) = MAX(col) col 列都是相同值,或者是NULL
6 MIN(col) * MAX(col) > 0 col 列全是正数或全是负数
7 MIN(col) * MAX(col) < 0 col 列的最大值是正数,最小值是负数
8 MIN(ABS(col)) = 0 col 列最少有一个是0
9 MIN(col - 常量) = - MAX(col - 常量) col 列的最大值和最小值与指定常量等距
十四、其他知识点 1、生成连续编号
先建一张 Digits 表:
digit0
1
2
3
4
5
6
7
8
9
-- 方法一:直接求(如1~542) SELECT D1.digit + (D2.digit * 10) + (D3.digit * 100) AS seq FROM Digits D1 CROSS JOIN Digits D2 CROSS JOIN Digits D3 WHERE D1.digit + (D2.digit * 10) + (D3.digit * 100) BETWEEN 1 AND 542 ORDER BY seq; -- 方法二、先生成视图待用 -- 1、生成序列视图(包含0~999) CREATE VIEW Sequence (seq) AS SELECT D1.digit + (D2.digit * 10) + (D3.digit * 100) FROM Digits D1 CROSS JOIN Digits D2 CROSS JOIN Digits D3; -- 2、从序列视图中获取1~100 SELECT seq FROM Sequence WHERE seq BETWEEN 1 AND 100 ORDER BY seq;
有了这个连续编号,我们可以接着干很多事,具体可参考原书。
2、想尽一切办法隐藏地址精巧的数据结构搭配笨拙的代码,远远好过笨拙的数据结构搭配精巧的代码。——大教堂与集市
(1)大家一起摆脱地址即使放眼 SQL 之外的其他编程语言,各个编程语言的历史中也都一直存在着“如何对程序员隐藏地址”的课题。与 C 语言以及汇编语言相比,Pascal、Java、Perl 等新一代的语言都在努力地对用户隐藏指针。在这一点上,关系数据库与 SQL 的发展轨迹是一致的。
如 C 的指针,在 Java / Python 中被引用代替。
引用类似指针,只是不能进行指针运算,比如不能用 p + 1 指向下一个元素。
可能会有人列举出用户可以使用的指针,比如 Oracle 中的 rowid 或 PostgreSQL 中的 oid 来反对。确实,用户可以使用这些指针,但是它们都是个别数据库厂商违反 SQL 标准而进行的扩展,而标准 SQL一直在努力摆脱指针。
(2)为什么要隐藏地址例如,SQL 和数据库都在极力提升数据在表现层的抽象度,以及对用户隐藏物理层的概念。
因此放弃地址的深刻意义是,通过放弃掉系统中没有意义的东西,创造出一个易于人类理解的有意义的世界。
(3)隐藏地址要怎么做