使用和濫用 GROUP BY
SELECT item.item_id, item.name, /* not SQL-92 */
COUNT(*) number_of_uses
FROM item
JOIN uses ON item.item_id, uses.item_id
GROUP BY item.item_id
將在名為 item
的表中顯示行,並在名為 uses
的表中顯示相關行的計數。這很好用,但不幸的是它不是標準的 SQL-92。
為什麼不?因為 GROUP BY
查詢中的 SELECT
子句(和 ORDER BY
子句)必須包含列
- 在
GROUP BY
條款中提到,或 - 聚合函式如
COUNT()
,MIN()
等。
這個例子的 SELECT
條款提到了 item.name
,這是一個不符合這些標準的列。如果 SQL 模式包含 ONLY_FULL_GROUP_BY
,MySQL 5.6 及更早版本將拒絕此查詢。
通過更改 GROUP BY
子句,可以使此示例查詢符合 SQL-92 標準,如下所示。
SELECT item.item_id, item.name,
COUNT(*) number_of_uses
FROM item
JOIN uses ON item.item_id, uses.item_id
GROUP BY item.item_id, item.name
如果 DBMS 可以證明它們與組金鑰列之間存在功能依賴性,則後面的 SQL-99 標準允許 SELECT
語句省略組金鑰中的未聚合列。因為 item.name
在功能上依賴於 item.item_id
,所以最初的例子是有效的 SQL-99。MySQL 在 5.7 版本中獲得了功能依賴性證明 。原始示例在 ONLY_FULL_GROUP_BY
下工作。