【问题标题】:How to use group by to select only group row in these case scenarios在这些情况下如何使用 group by 仅选择组行
【发布时间】:2013-07-20 18:24:37
【问题描述】:

我是第一次学习 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)

【问题讨论】:

  • 那么,问题是什么?如何使用GROUP BY重写查询?
  • 您可以将ALL 版本简单地编写为:... WHERE birth >= ALL (SELECT birth FROM sampdb.president),否则您的查询似乎很好。我认为没有必要使用GROUP BY
  • 我认为在您的示例中不需要 GROUP BY 语句,您正在根据 1 个条件选择 1 条记录。否则你的查询是正确的。
  • 没错,有人告诉我,我需要对这个查询使用 group by。但正如我已经表明的那样,没有必要。但是,如果我确实使用了 group by,我会使用什么 group by 来获得与上面显示的相同的结果?
  • 这是一个措辞糟糕的练习。它是在聚合函数练习和分组练习中,所以这是我的误解。

标签: sql subquery group-by


【解决方案1】:

在您的情况下,使用了分组 ,但它是隐含的:不存在的 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 表是空还是不是,意思是,如果您使用的 SQL 产品支持GROUP BY (),您可以将其显式添加到子查询中,而不必担心会影响输出。

【讨论】:

    【解决方案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;
    

    【讨论】:

    • 感谢您的反馈。我现在被告知它不需要分组。感谢您的帮助。
    • 不用担心。从我的回答中可以看出,我也不使用“分组依据”
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-04-09
    • 1970-01-01
    • 2012-01-26
    • 1970-01-01
    • 1970-01-01
    • 2021-06-27
    • 1970-01-01
    相关资源
    最近更新 更多