📜  门| GATE CS 2012 |问题15

📅  最后修改于: 2021-06-30 01:21:30             🧑  作者: Mango

关于SQL查询,以下哪个陈述是正确的?
P:SQL查询即使没有GROUP BY子句也可以包含HAVING子句
问:仅当SQL查询具有GROUP BY子句时,才能包含HAVING子句
R:GROUP BY子句中使用的所有属性必须出现在SELECT子句中
S:并非GROUP BY子句中使用的所有属性都需要出现在SELECT子句中

(A) P和R
(B) P和S
(C) Q和R
(D) Q和S答案: (B)
说明:根据标准SQL,答案应该是选项(C),它是GATE权限给出的答案密钥。

如果我们谈论不同的SQL实现(例如MySQL),那么选项(B)也是正确的。但有疑问的是,他们似乎在谈论标准SQL,而不是实现。例如下面是

在大多数实现中,P是正确的。 HAVING子句也可以与聚合函数一起使用。如果我们使用不带GROUP BY子句的HAVING子句,则HAVING条件适用于满足搜索条件的所有行。换句话说,满足搜索条件的所有行都组成一个组。有关更多详细信息,请参见此内容。

S是正确的。若要验证S,请尝试在SQL中执行以下查询。

CREATE TABLE temp 
  ( 
     id   INT, 
     name VARCHAR(100) 
  ); 

INSERT INTO temp VALUES (1, "abc"); 
INSERT INTO temp VALUES (2, "abc"); 
INSERT INTO temp VALUES (3, "bcd"); 
INSERT INTO temp VALUES (4, "cde"); 

SELECT Count(*) 
FROM   temp 
GROUP  BY name; 

输出:

count(*)
--------
2
1
1

替代方式–

语句(P)“ SQL查询即使没有GROUP BY子句也可以包含HAVING子句”是正确的,因为在聚集阶段之后应用了“ Hallow”运算,如果要过滤聚集结果而“ Having”没有,则必须使用“ Hallow”要求使用“分组依据”子句。没有GROUP BY子句的HAVING子句在标准SQL中是有效的(并且可以说是有用的)语法。考虑以下示例,它是有效的标准SQL:

SELECT 'T' AS result
   FROM Book
 HAVING MIN(NumberOfPages) < MAX(NumberOfPages);

语句(S)“并非GROUP BY子句中使用的所有属性都需要出现在SELECT子句中”是正确的,但如果必须使用Group By子句,则对我们可以放入Select子句的内容有限制。

这个问题的测验