2016-12-13 36 views
2

我目前正在通過EXISTS運營商的例子http://www.w3resource.com/sql/special-operators/sql_exists.php#尋找,並遇到了一個不太合理的例子。代碼如下:SQL EXISTS運營商與GROUP BY

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的<= 2個客戶,子查詢不會返回任何結果,因此並不總是正確的? – user3012759

+0

這應該在w3資源網站上解釋。 – McNets

+0

'......不涉及客戶表更高'你是對的。雖然這是正確的,但這個例子很糟糕,IMO。 – joop

回答

1

此代碼驗證是否有至少customer兩個記錄表與grade = 2,如果沒有,記錄將被過濾。

2

EXISTS將評估爲false當與grade=2記錄計數小於或等於2.查詢檢查是否有多於兩個的記錄與grade=2。如果有,然後在外部select中提到顯示列。

+0

正確,查詢顯示所有客戶的等級= 2,如果有至少三個這樣的客戶,否則沒有。 –

0

的第二子查詢的工作原理是在客戶表中第一個讓所有的行,其中的等級是否等於2

SELECT COUNT(*) 
FROM customer 
WHERE grade=2 

下面的查詢的下一部分。按級別將所有這些行分組在一起。

GROUP BY grade 

最後,下面的計數代碼排除了沒有至少2個項目的任何組。

HAVING COUNT(*)>2 

因此,您可能會遇到一些情況,其中有許多人有成績,並將其輸入客戶表。如果兩個或兩個以上的人沒有相同的成績,則此查詢將找不到結果。

0

級= 2且
EXISTS(
SELECT COUNT() FROM顧客
WHERE級= 2
GROUP BY級
HAVING COUNT(
)> 2 );如果

TRUE and TRUE =TRUE 

所以您的查詢檢查等級= 2,有ATLEAST一行下面條件

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

如果這兩個條件不satify,你的查詢將不會返回任何結果集