我目前正在查看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,并且它与更高级别的客户表无关 - 因此将其放在那里似乎无关紧要。
有人可以解释一下代码试图在这里实现的目标吗?
非常感谢!
答案 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
如果两个条件都不满意,您的查询将不会返回任何结果集