我现在正在学习SQL,我有一个问题。我最近遇到了一个查询,它在group by子句中处理了大量的列名。我之前使用过group by子句,而且我只看到过一个列名。
SELECT TransportType.Description, TransportType.CargoCapacity, TransportType.Range, Transport.SerialNumber, Transport.PurchaseDate, Transport.RetiredDate,
MAX(Repair.BeginWorkDate) AS LatestRepairDate
FROM Transport INNER JOIN
TransportType ON Transport.TransportTypeID = TransportType.TransportTypeID LEFT OUTER JOIN
Repair ON Transport.TransportNumber = Repair.TransportNumber
GROUP BY TransportType.Description, TransportType.CargoCapacity, TransportType.Range, Transport.SerialNumber, Transport.PurchaseDate,
Transport.RetiredDate
HAVING (Transport.RetiredDate IS NULL)
ORDER BY TransportType.Description, Transport.SerialNumber
为什么group by子句中有这么多列?
答案 0 :(得分:1)
除了MySQL和SQLite(对GROUP BY
宽容,有时候结果不确定),大多数RDBMS要求MAX(),MIN(),SUM(),COUNT()
列表中出现的每个非聚合列(SELECT
等)都在{ {1}}。
MySQL&的行为当GROUP BY
中的列SELECT
未列在GROUP BY
中时,SQLite的定义不明确。例如,您执行如下查询:
SELECT firstname, lastname, COUNT(*) FROM names GROUP BY lastname
MySQL会毫无怨言地给你一个结果。
但是,如果您的表格包含两个firstname
具有相同lastname
的不同值,那么您的结果COUNT(*)
会计算两个,而只返回一个的firstname
个。更重要的是, firstname
MySQL选择返回的没有被定义,因此您无法真正依赖它返回该对中的第一个,例如
从表格中如下:
firstname, lastname
--------------------
Jane Smith
John Smith
Peter Jones
不完全正确的结果可能是:
firstname, lastname, COUNT(*)
-----------------------------
Jane Smith 2 <----wrong!
Peter Jones 1
MySQL之外&amp; SQLite,SELECT
列表中任何位置引用的列也不会出现在GROUP BY
中,这将导致查询解析错误。
通常在Stack Overflow上,我们会遇到有关GROUP BY
的问题的用户,他们刚开始使用更严格的使用RDBMS。如果您首先在MySQL中学习聚合,那么在迁移到不同的RDBMS时,您可能需要重新学习它们。