《SQL基础教程》+ 《SQL进阶教程》 学习笔记 (16)

不光可以用 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 表:

digit
0  
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)隐藏地址要怎么做

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zygdwg.html