带有GROUP BY的SQL EXISTS运算符

时间:2016-12-13 10:28:01

标签: sql

我目前正在查看http://www.w3resource.com/sql/special-operators/sql_exists.php#上的EXISTS运算符示例,并且遇到了一个不太有意义的示例。代码如下:

SELECT cust_code,cust_name,cust_city,grade  
FROM customer  
WHERE grade=2 AND  
    EXISTS(  
        SELECT COUNT(*)
        FROM customer  
        WHERE grade=2  
        GROUP BY grade  
        HAVING COUNT(*)>2
    );

根据我的理解,子查询将始终评估为TRUE,并且它与更高级别的客户表无关 - 因此将其放在那里似乎无关紧要。

有人可以解释一下代码试图在这里实现的目标吗?

非常感谢!

4 个答案:

答案 0 :(得分:2)

EXISTS的记录数小于或等于2时,

false将评估为grade=2。查询是否有两个以上的记录grade=2。如果有外部select中提到的显示列。

答案 1 :(得分:1)

此代码验证customer表上带有grade = 2至少两条记录,否则,记录将被过滤。

答案 2 :(得分:0)

第二个子查询首先获取customer表中等级为2的所有行。

SELECT COUNT(*)
FROM customer  
WHERE grade=2 

下面的查询的下一部分。按等级将所有这些行组合在一起。

GROUP BY grade 

最后,下面的计数代码不包括任何不包含至少2个项目的组。

HAVING COUNT(*)>2

因此,您可能会遇到许多人都有成绩的情况,这是输入到客户表中的。如果两个或更多人没有相同的等级,则此查询将找不到任何结果。

答案 3 :(得分:0)

  

等级= 2和
      EXISTS(
          SELECT COUNT()           来自客户
          等级= 2
          GROUP BY等级
          有计数(
)> 2       );

TRUE and TRUE =TRUE 

因此,您的查询会检查Grade = 2,并且至少有一行具有以下条件

WHERE grade=2  
        GROUP BY grade  
        HAVING COUNT(*)>2

如果两个条件都不满意,您的查询将不会返回任何结果集