9.6 自测题答案
(1) 答案为C。DUAL表有一行和一列。COUNT(*)函数返回表或者组中的行数。
A、B和D不正确。A不正确是因为表可以有0行或多行数据,但不可能有NULL行。B不正确是因为DUAL表有一行。D不正确是因为C正确。
(2) 答案为B。按照定义,分组函数每次作用于多行,这一点不同于单行函数。
A、C和D不正确。A不正确是因为在没有GROUP BY子句的情况下可以使用分组函数。这种情况下,将整个数据集作为一个组操作。C不正确是因为COUNT函数通常对整个表执行,这个表相当于一个组。D不正确是因为,将数据集划分到不同组之后,对每个组都要执行一次分组函数。
(3) 答案为A。SUM聚合函数忽略空值,将非空值相加。因为有9行包含的SALARY值是100,所以返回900。
B、C和D不正确。如果执行SUM(NVL(SALARY,100)),就会返回B中的结果。C是具有迷惑性的选择,因为包含NULL值的规则运算返回NULL结果。然而,聚合函数(除COUNT(*)以外)都忽略NULL值。D不正确是因为A正确。
(4) 答案为C。COUNT(*)计算所有行,包括具有NULL值的那些行。COUNT(SALARY)只计算非空行。
A、B和D不正确。
(5) 答案为C。NVL函数将一个NULL值转换为100。之后,AVG函数将SALARY值相加,得到结果1000。用这个值除以记录的数量,返回100。
A、B和D不正确。如果选择AVG(NVL(SALARY,0)),就会返回B中的结果。值得注意的是,如果选择AVG(SALARY),也会返回100,因为AVG函数求非空值的和,用这个和除以包含非空SALARY值的行数。因此可以像这样计算AVG(SALARY):900/9=100。
(6) 答案为C。依据SALARY列划分数据集。该语句创建两个组:一个组的SALARY值为100,另一个组包含一个空的SALARY值。第一个组中各行的SALARY值100的平均长度是3。NVL函数首先将NULL薪水值转换为数字0, SALARY的平均长度是1。SUM函数作用于两个组,将值3和1相加,返回4。
A、B和D不正确。A似是而非,因为分组函数不可能嵌套多于两层。虽然有4个函数,但只有两个是分组函数,而其他函数是在分组函数之前计算的单行函数。如果选择表达式SUM (AVG(LENGTH(SALARY))),就会返回B中的结果。D不正确是因为C正确。
(7) 答案为A。有12个不同的DEPARTMENT_ID值。这是分组特性,因此创建12个组,其中一个组包含空的DEPARTMENT_ID值。因此,返回12行。
B、C和D不正确。B不正确是因为空的DEPARTMENT_ID值是一个有效的唯一值,可根据它进行分组。C不正确是因为返回了12行。D不正确是因为A正确。
(8) 答案为C。要使用GROUP BY子句,分组函数必须出现在SELECT列表中。
A、B和D不正确,因为从语法上看语句不准确,而且Oracle不接受这种形式。不要将名为MAX_SALARY的列误解成MAX(SALARY)函数。
(9) 答案为B。依据其公共DEPT_ID值创建两个组。DEPT_ID值为10的组由5行组成,这些行的SALARY值都是100。因此,该组的SUM(SALARY)函数返回500,它满足HAVING SUM (SALARY) > 400子句。DEPT_ID值为20的组有4行,这些行的SALARY值为100,并且有一行包含空的SALARY。SUM(SALARY) 只返回400,该组不满足HAVING子句的条件。
A、C和D不正确。注意SELECT语句中的SUM(NVL(SALARY,100))表达式。这个表达式选择输出的格式,它不限制或者限定数据集。如果HAVING子句确定有两组可以应用聚合函数,A就是正确的,C不正确是因为只有一个要聚合的集合,所以只返回一行。D不正确是因为B正确。
(10) 答案为A。依据其公共DEPT_ID值创建两个组。DEPT_ID值为10的组由5行组成,这些行的SALARY值是100。因此,该组的SUM(NVL(SALARY,100))函数返回500,它满足HAVING SUM(NVL(SALARY,100))>400子句。DEPT_ID值为20的组有4行,这些行的SALARY值为100,并且有一行包含空的SALARY。SUM(NVL(SALARY,100)) 返回500,这一组满足HAVING子句,因此返回2行。
B、C和D不正确。虽然SELECT子句包含SUM(SALARY),它对两个组返回500和400,但是HAVING子句包含SUM(NVL(SALARY,100))表达式,它指定组级行的包含和排除标准。如果HAVING子句确定有一组可以应用聚合函数,B就是正确的,C不正确是因为有两个要聚合的集合,所以返回两行。D不正确,因为A正确。
(11) 答案为A和E。标准偏差在数学上定义为其方差的平方根。LISTAGG函数在WITHIN GROUP子句中使用ORDER BY给数据排序,返回一个有序的连接字符串。
B、C和D不正确。所有这些语句都是错误的。
(12) 答案是B。数据集不使用GROUP BY子句分组,因此LISTAGG函数把整个表作为一个数据集来处理。返回一个很长的行,其中包含LAST_NAME值的连接列表。
A、C、D和E不正确。A不正确是因为LISTAGG至少返回一行。如果数据集分为10和107个组,C和D就是正确的。E不正确,因为正确答案是B。