因为这本书是错误的。
中的列group by
与select
根据ANSI标准的中的列只有一种关系。如果某列位于中select
,没有聚合函数,则该列(或其所在的表达式)需要位于该group by
语句中。MysqL实际上放松了这种情况。
这甚至很有用。例如,如果要从表中为每个组选择具有最高ID的行,则写查询的一种方法是:
select t.*
from table t
where t.id in (select max(id)
from table t
group by thegroup
);
编辑:
您建议的查询:
select EMP_ID, SALARY
from EMPLOYEE_PAY_TBL
group by BONUS;
可以在MysqL中工作,但可能不能在任何其他数据库中工作(除非BONUS
碰巧是表上命名不佳的主键,但这是另一回事)。会为的每个值产生一行BONUS
。对于每一行,它会得到一个任意EMP_ID
和SALARY
该组中的行。该文档实际上说“不确定”,但我认为随意更容易理解。
您 真正 应该了解的这种类型的查询就是根本不使用它。中的所有“裸露”列SELECT
(即没有聚合函数)都应位于中GROUP BY
。在大多数数据库中,这是必需的。请注意,这与书中所说的 相反 。这样做没有问题:
select EMP_ID
from EMPLOYEE_PAY_TBL
group by EMP_ID, BONUS;
除了您可能会为同一行返回多个行EMP_ID
而无法在它们之间进行区分。