2014-03-07 23 views
0

我正在做一些面試練習,並且遇到了這個有趣的SQL問題。不同SQL平臺中的ALL子句

給定一個表與模式世界(名稱,大陸,地區,人口,GDP)在每個大陸找到最大的國家(按面積),顯示大陸,名稱和麪積。

一個可能的解決辦法是:

SELECT continent, name, area 
FROM world x 
WHERE area >= ALL (
    SELECT area FROM world y 
    WHERE y.continent=x.continent) 

我真的不明白是怎麼ALL關鍵字作品,所以我不知道這個查詢實際上是如何解決這個問題。另外,在SQL平臺之間使用ALL是否有所不同?

+0

https://dev.mysql.com/doc/refman/5.7/en/all-subqueries.html – user2864740

回答

1

至於你的問題 - 因爲據我瞭解,你的SQL將是簡單的:

SELECT 
    MAX(area) AS max_area, 
    continent, 
    name 
GROUP BY 
    continent, 
    name 

至於ALL通常情況下,它的工作原理,因爲它是相當因爲它應該是從ALL含義:即一些值適合給定條件(在你的情況下,「大於或等於」)所有值在子查詢中。

-1
SELECT x.continent, x.name, x.area 
FROM world x, 
    (SELECT continent, MAX(area) 
     FROM world x 
     GROUP BY continent) max_res 
WHERE x.area=max_res.area 
     AND x.continent=max_res.continent 
+0

做'JOIN'(你的情況隱含)有什麼意義? –

+0

@AlmaDo對不起,糾正了一下查詢。在子查詢中,我們計算每個大陸的最大面積。之後,我們會爲每個大陸的所有國家提供該地區。 – StanislavL

+0

我看到了含義 - 但 - 爲什麼?我的意思是,簡單的「GROUP BY」似乎適合這個問題(哦,那個DV不是我的) –

1

也許這不會回答你的問題,但會幫助你瞭解MySQL的ALL

ALL關鍵字返回的數據,如果在外部查詢中給定的行滿足由返回的所有行值的條件子查詢:

下面是一個例子:

mysql> SELECT * FROM t1; 
+------+ 
| i | 
+------+ 
| 1 | 
| 2 | 
| 3 | 
| 4 | 
| 5 | 
+------+ 
5 rows in set (0.00 sec) 

mysql> SELECT * FROM t2; 
+------+ 
| j | 
+------+ 
| 2 | 
| 4 | 
| 6 | 
+------+ 
3 rows in set (0.00 sec) 


mysql> SELECT * FROM t1 WHERE i = ALL (SELECT j FROM t2); 
Empty set (0.00 sec) 

這裏空集,因爲返回MySQL將t1表中的給定值與表t2中的所有值進行比較。如果t1的值等於子查詢返回的所有值,則它將顯示爲輸出。

mysql> SELECT * FROM t1 WHERE i <> ALL (SELECT j FROM t2); 
+------+ 
| i | 
+------+ 
| 1 | 
| 3 | 
| 5 | 
+------+ 
3 rows in set (0.00 sec) 

這裏顯示了t1表中的所有值,它們完全不等於子查詢返回的值。

此外,<>ALL是功能上等同於NOT IN=ANY在功能上等同於IN

mysql> SELECT * FROM t1 WHERE i = ALL (SELECT j FROM t2 WHERE j = 2); 
+------+ 
| i | 
+------+ 
| 2 | 
+------+ 
1 row in set (0.12 sec) 

這返回2作爲輸出,因爲2(來自表t1)與由子所產生的唯一的輸出相匹配查詢。