不同SQL平台中的ALL子句

时间:2014-03-07 06:52:50

标签: mysql sql database postgresql

我正在做一些面试练习,我遇到了这个有趣的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会有所不同吗?

3 个答案:

答案 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