我正在做一些面试练习,我遇到了这个有趣的SQL问题。
给出一个具有模式世界的表(名称,大陆,区域,人口,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 :(得分:1)
至于你的问题 - 据我所知,你的SQL很简单:
SELECT
MAX(area) AS max_area,
continent,
name
GROUP BY
continent,
name
至于ALL
通常情况下,它的工作原理与它ALL
的意义相同:即某些值符合条件(在您的情况下,"更大或等于")反对子查询中的所有值。
答案 1 :(得分: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)与子查询生成的唯一输出匹配。
答案 2 :(得分:-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