使用和濫用 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 子句)必須包含列

  1. GROUP BY 條款中提到,或
  2. 聚合函式如 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 下工作。