第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。