1

我是第一次学习 SQL,我被要求做这些查询。

我写了这些语句来解决问题,它们有效,但它们不使用group by.

有人可以建议我如何改变这个吗?他们应该只使用group by并且也许where,我认为这个任务不应该使用更高级的东西。

总统的最新出生日期是什么时候?(最年轻的总统)

SELECT birth, first_name, last_name 
FROM sampdb.president 
WHERE birth= (select MAX(birth) FROM sampdb.president);
+------------+------------+-----------+ 
| birth      | first_name | last_name |
+------------+------------+-----------+ 
| 1946-08-19 | William J. | Clinton   |
+------------+------------+-----------+ 
1 row in set (0.00 sec)

SELECT birth, first_name, last_name 
FROM sampdb.president 
WHERE birth>=ALL(SELECT MAX(birth) FROM sampdb.president);  
+------------+------------+-----------+
| birth      | first_name | last_name |
+------------+------------+-----------+
| 1946-08-19 | William J. | Clinton   |
+------------+------------+-----------+
1 row in set (0.00 sec)

最早的?(最年长的总统)

SELECT birth, first_name, last_name 
FROM sampdb.president 
WHERE birth=(SELECT MIN(birth) FROM sampdb.president);
+------------+------------+------------+
| birth      | first_name | last_name  |
+------------+------------+------------+
| 1732-02-22 | George     | Washington |
+------------+------------+------------+
1 row in set (0.00 sec)
4

2 回答 2

3

在您的情况下,使用了分组但它是隐含的:缺席GROUP BY暗示是GROUP BY ()。因此,如果需要使用显式 GROUP BY 子句,您可以在子查询中指定它:

SELECT birth, first_name, last_name 
FROM sampdb.president 
WHERE birth = (SELECT MAX(birth) FROM sampdb.president GROUP BY ());

但是,并非所有 SQL 产品都支持显式GROUP BY (),即使它们支持,实现的行为也可能与隐式的行为有所不同GROUP BY ()GROUP BY ()特别是,当源数据集为空时,可以为显式和隐式生成不同的输出。例如,如果samdb.president表是空的,这

SELECT MAX(birth) FROM sampdb.president GROUP BY ()

将导致此类 SQL 产品中没有行。相比之下,此查询将生成单行,其单列中为 NULL:

SELECT MAX(birth) FROM sampdb.president

众所周知,OracleSQL Server具有这种差异。

但是,由于您似乎将 GROUP BY 查询用作(标量)子查询,因此GROUP BY无论president表是否为空,查询的最终输出对于隐式和显式都是相同的,这意味着如果GROUP BY ()在您正在使用的 SQL 产品,您可以将其显式添加到子查询中,而不必担心它会影响输出。

于 2013-07-21T12:05:33.343 回答
2

您可以通过多种方式执行此操作,具体取决于平台。

在 Oracle 中,您可以执行以下操作:

SELECT *
FROM (SELECT birth, first_name, last_name 
      FROM sampdb.president
      ORDER BY birth)
WHERE rownum = 1

在 SQL Server 中,您可以这样做:

SELECT TOP 1 birth, first_name, last_name 
FROM sampdb.president
ORDER BY birth

在 MySQL 中,您可以执行以下操作:

SELECT birth, first_name, last_name 
FROM sampdb.president
ORDER BY birth
LIMIT 1;
于 2013-07-21T03:22:07.410 回答