📜  Group By 中的常见错误

📅  最后修改于: 2022-05-13 01:55:33.644000             🧑  作者: Mango

Group By 中的常见错误

先决条件: SQL |通过...分组

错误:
列 'col' 在选择列表中无效,因为它既不包含在聚合函数中,也不包含在 GROUP BY 子句中。

Emp样本表:


例子:

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 列表中引用该列,即使它没有出现在聚合表达式中” ——罗兰·布曼

通俗地说:

但是按唯一列分组没有意义,但是当涉及其他表时它会变得有用。

几个例外:
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 或更高版本来启用正确的行为。在这种情况下,查询会引发上述错误。