第2章,关系数据库的世界
2-5 GROUP BY和PARTITION BY
-- 从原来的表中抽出(大约)五分之一行的数据
SELECT * FROM SomeTbl
WHERE MOD(seq, 5)=0; -- seq为表中连续的编号
-- 表中没有连续编号的列时,使用ROW_NUMBER函数就可以了
SELECT * FROM(SELECT col,
ROW_NUMBER()OVER(ORDER BY col)AS seq
FROM SomeTbl) WHERE MOD(seq, 5)=0;
2-6 从面向过程思维向声明式思维、面向集合思维转变的7个关键点
用CASE表达式代替IF语句和CASE语句。
SQL更像一种函数式语言,之所以叫它CASE“表达式”而不是CASE“语句”(statement),是因为CASE表达式与1+(2-4)或者(x*y)/z一样,都是表达式,在执行时会被整体当作一个值来处理。
既然同样是表达式,那么能写1+1这样的表达式的地方就都能写CASE表达式,而且因为CASE表达式最终会作为一个确定的值来处理,所以我们也可以把CASE表达式当作聚合函数的参数来使用。
对于任意输入返回的都是一个值——从这个角度来说,我们还可以把CASE表达式看作一种函数。因此使用CASE表达式时的思维方式与使用函数式语言时是相似的。
~新思路。
2-9 消灭NULL委员会
解决方法很简单,分配异常编号就行了。例如ISO的性别编号中,除了“1:男性”“2:女性”,还定义了“0:未知”“9:不适用”这两个用于异常情况的编号。
编号9可用于法人的情况。这真是一种很棒的解决方案,无意间刚好与由Codd区分的两类NULL“未知”和“不适用”相吻合了。
~实用异常编号代替NULL,这种方法不错,也常用于实际项目中。
总结如下。(1)首先分析能不能设置默认值。(2)仅在无论如何都无法设置默认值时允许使用NULL。
~也就是说尽量使用默认值代替NULL,只有在必要的情况下才使用NULL。