¿Por qué MySQL te permite agrupar por columnas que no están seleccionadas?

Estoy leyendo un libro sobre SQL (Sams Teach Yourself SQL en 10 minutos) y es bastante bueno a pesar de su título. Sin embargo, el capítulo sobre el grupo me confunde

"Agrupar datos es un process simple. Las columnas seleccionadas (la list de columnas que sigue a la palabra key SELECT en una consulta) son las columnas a las que se puede hacer reference en la cláusula GROUP BY. Si no se encuentra una columna en la instrucción SELECT, no puede utilizado en la cláusula GROUP BY. Esto es lógico si lo piensas, ¿cómo puedes agrupar datos en un informe si los datos no se muestran? "

¿Cómo es que cuando ejecuté esta statement en MySQL, funciona?

select EMP_ID, SALARY from EMPLOYEE_PAY_TBL group by BONUS; 

Porque el libro está mal.

Las columnas del group by solo tienen una relación con las columnas en la select según el estándar ANSI. Si una columna está en la select , sin function de agregación, entonces (o la expresión en la que se encuentra) debe estar en la statement group by . MySQL realmente relaja esta condición.

Esto es incluso útil. Por ejemplo, si desea seleccionar las filas con la identificación más alta para cada grupo de una tabla, una forma de escribir la consulta es:

 select t.* from table t where t.id in (select max(id) from table t group by thegroup ); 

(Nota: hay otras forms de escribir una consulta, esto es solo un ejemplo).

EDITAR:

La consulta que estás sugiriendo:

 select EMP_ID, SALARY from EMPLOYEE_PAY_TBL group by BONUS; 

funcionaría en MySQL pero probablemente no en ninguna otra database (a less que BONUS sea ​​una key primaria mal nombrada en la tabla, pero ese es otro asunto). Producirá una fila por cada valor de BONUS . Para cada fila, obtendrá un EMP_ID arbitrario y EMP_ID de las filas de ese grupo. La documentation en realidad dice "indeterminado", pero creo que arbitrario es más fácil de entender.

Lo que realmente debería saber sobre este tipo de consulta es simplemente no usarlo. Todas las columnas "vacías" en SELECT (es decir, sin funciones de agregación) deben estar en GROUP BY . Esto es requerido en la mayoría de las bases de datos. Tenga en count que esto es lo contrario de lo que dice el libro. No hay problema en hacer:

 select EMP_ID from EMPLOYEE_PAY_TBL group by EMP_ID, BONUS; 

Excepto que puede get varias filas para el mismo EMP_ID sin poder distinguir entre ellas.

Tienes razón, MySQL te permite crear consultas que son ambiguas y tienen resultados arbitrarios. MySQL confía en que sepa lo que hace, por lo que es su responsabilidad evitar consultas como esa.

Puede hacer que MySQL haga cumplir GROUP BY de una manera más estándar:

 mysql> SET SQL_MODE=ONLY_FULL_GROUP_BY; mysql> select EMP_ID, SALARY from EMPLOYEE_PAY_TBL group by BONUS; ERROR 1055 (42000): 'test.EMPLOYEE_PAY_TBL.EMP_ID' isn't in GROUP BY