我第一次学习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)
答案 0 :(得分: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
众所周知,Oracle和SQL Server会产生这种差异。
但是,由于您似乎将GROUP BY查询用作(标量)子查询,因此无论GROUP BY
是president
,查询的最终输出对于隐式GROUP BY ()
都是相同的。 table是空的还是没有,这意味着,如果您正在使用的SQL产品支持{{1}},则可以将其显式添加到子查询中,而不必担心它会影响输出。
答案 1 :(得分:2)
您可以通过多种方式执行此操作,具体取决于平台。
在Oracle中,您可以执行以下操作:SELECT *
FROM (SELECT birth, first_name, last_name
FROM sampdb.president
ORDER BY birth)
WHERE rownum = 1
在SQL服务器中,您可以这样:
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;