Group By 中的常见错误
先决条件: SQL |通过...分组
错误:
列 'col' 在选择列表中无效,因为它既不包含在聚合函数中,也不包含在 GROUP BY 子句中。
例子:
Input:
select empId, empName, empAmount from emp group by empId, empName
Output: Error
解释:
empAmount 不是按列表分组,也不是聚合函数,查询将给出上述错误。对于 empId 和 empName 有多个 empAmount,数据库引擎无法选择一个 empAmount。
Input:
select empId, sum(empAmount) as debit from emp group by empId
Output:
empId | debit
1 | 300
2 | 400
通过...分组:
从上面的示例中可以清楚地看出,我们只能在 select 子句中包含 group by 或聚合函数的参数中的那些列。但这并不完全正确。
“SQL 标准的 1999 和 2003 版本要求出现在 SELECT 列表中的列在功能上依赖于 GROUP BY 子句定义的组。换句话说,如果我们知道对于出现在 GROUP BY 子句中的列中的任何给定值组合,一列只包含一个值,我们可以在 SELECT 列表中引用该列,即使它没有出现在聚合表达式中” ——罗兰·布曼
通俗地说:
If columns in group by has a column which is either the primary key or unique key then the combination will only have one value for other columns.
但是按唯一列分组没有意义,但是当涉及其他表时它会变得有用。
几个例外:
MySQL 允许您使用 group by 在查询中选择任何内容。它将以随机顺序选择,无论哪个先返回您。
例子:
Input:
select empId, empName, empAmount from emp group by empId, empName
上面的查询不会给出任何错误。它将从列表中随机选择 empAmount 并将其与 empID 和 empName 配对。
可以通过添加标志(即 ONLY_FULL_GROUP_BY)或使用 MySQL v5.7.5 或更高版本来启用正确的行为。在这种情况下,查询会引发上述错误。