在这些情况下,如何使用group by仅选择组行

时间:2013-07-20 18:24:37

标签: sql subquery group-by

我第一次学习SQL,并且我得到了这些查询。

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

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

  

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

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)

2 个答案:

答案 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
众所周知,

OracleSQL Server会产生这种差异。

但是,由于您似乎将GROUP BY查询用作(标量)子查询,因此无论GROUP BYpresident,查询的最终输出对于隐式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;