GATE | GATE CS 2012 |问题15

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

null

(A) P和R (B) P和S (C) Q和R (D) Q和S 答复: (B) 说明: 根据标准SQL,答案应该是选项(C),这是大门管理局给出的答案键。

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

P在大多数实现中都是正确的。HAVING子句也可以与聚合函数一起使用。如果我们使用的HAVING子句没有GROUP BY子句,HAVING条件将应用于满足搜索条件的所有行。换句话说,所有满足搜索条件的行组成一个组。看见 更多细节。

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子句”是正确的,因为HAVING caluse是在聚合阶段之后应用的,如果要筛选聚合结果,HAVING不需要GROUP BY子句,则必须使用HAVING caluse。没有GROUP BY子句的HAVING子句在标准SQL中是有效且(可以说)有用的语法。考虑这个示例,它是有效的标准SQL:

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

语句“并非GROUP BY子句中使用的所有属性都需要出现在SELECT子句中”是正确的,但如果我们使用GROUP BY子句,则必须在SELECT子句中添加哪些属性,这是有限制的。

这个问题的小测验

© 版权声明
THE END
喜欢就支持一下吧
点赞15 分享