Entiendo que ANSI SQL requiere que los atributos que no son GROUP BY se SELECCIONEN con la función agregada.
Por ejemplo, lo siguiente no es válido en ANSI SQL:
SELECT name, MAX(salary), dept FROM `employee_gb` GROUP BY dept; como name no se pasa a ninguna función agregada.
Sin embargo, MySQL lo permite. Si queremos que MySQL se comporte como ANSI SQL, debemos configurar el modo sql como se explica aquí . Pero cuando lo intenté, todavía no me dio ningún error:
SET GLOBAL sql_mode = 'ANSI';Supongo que la consulta anterior debería darme un error. ¿Qué me estoy perdiendo aquí?
A continuación se muestran las consultas para completar los datos:
CREATE TABLE `employee_gb` (name varchar(50), salary float, dept varchar(50)); INSERT INTO `employee_gb` VALUES('a',1,'dept3'); INSERT INTO `employee_gb` VALUES('b',2,'dept4'); INSERT INTO `employee_gb` VALUES('c',3,'dept1'); INSERT INTO `employee_gb` VALUES('d',4,'dept2'); INSERT INTO `employee_gb` VALUES('e',5,'dept2'); INSERT INTO `employee_gb` VALUES('g',5,'dept2'); INSERT INTO `employee_gb` VALUES('f',6,'dept1');Estas son algunas capturas de pantalla para la ejecución desde CLI:
ONLY_FULL_GROUP_BY se agregó al modo sql ANSI en MySQL 5.7, como se puede ver al comparar la documentación de 5.6 con la documentación de 5.7 .
Supongo que está ejecutando MySQL 5.6 o inferior. En esta versión, si desea ese comportamiento específico, debe configurar ONLY_FULL_GROUP_BY por separado, como:
SET SESSION sql_mode = 'ONLY_FULL_GROUP_BY';Demostración en DB Fiddle : una vez que se establece el modo sql adecuado, la consulta falla con:
'employee_gb.name' isn't in GROUP BY
Nota al margen: por lo general, no es una buena idea restablecer todo el sql_mode , ya que descartará los modos existentes. Puedes concatenar en su lugar:
SET SESSION sql_mode = concat_ws(',', @@sql_mode, 'ONLY_FULL_GROUP_BY');El modo SQL ANSI es una combinación de REAL_AS_FLOAT , PIPES_AS_CONCAT , ANSI_QUOTES , IGNORE_SPACE y (a partir de MySQL 5.7.5) ONLY_FULL_GROUP_BY .
Por lo tanto, verifique su versión de MySQL.
Establecer la opción global no cambia el valor de la sesión actual. Una sesión de MySQL copia los valores de las variables globales cuando se inicia la sesión, por lo que una sesión determinada no se ve afectada por cambios posteriores en las variables globales (con algunos casos de excepción, como read_only ).
Manifestación:
mysql> select @@sql_mode; +------------------------+ | @@sql_mode | +------------------------+ | NO_ENGINE_SUBSTITUTION | +------------------------+ 1 row in set (0.00 sec) mysql> set global sql_mode = 'ANSI'; Query OK, 0 rows affected (0.00 sec) mysql> select @@sql_mode; +------------------------+ | @@sql_mode | +------------------------+ | NO_ENGINE_SUBSTITUTION | +------------------------+ 1 row in set (0.00 sec) mysql> select @@global.sql_mode; +--------------------------------------------------------------------------------+ | @@global.sql_mode | +--------------------------------------------------------------------------------+ | REAL_AS_FLOAT,PIPES_AS_CONCAT,ANSI_QUOTES,IGNORE_SPACE,ONLY_FULL_GROUP_BY,ANSI | +--------------------------------------------------------------------------------+ 1 row in set (0.00 sec) mysql> select @@session.sql_mode; +------------------------+ | @@session.sql_mode | +------------------------+ | NO_ENGINE_SUBSTITUTION | +------------------------+ 1 row in set (0.00 sec)Intente lo siguiente para hacer lo que está tratando de hacer:
mysql> SET SESSION sql_mode = 'ANSI';Esto cambiará el valor de la sesión actual.
Una solución alternativa es volver a conectar después de cambiar la opción global, por lo que inicia una nueva sesión. Eso volverá a leer los valores globales.
mysql> connect; Connection id: 9 Current database: test mysql> select @@session.sql_mode; +--------------------------------------------------------------------------------+ | @@session.sql_mode | +--------------------------------------------------------------------------------+ | REAL_AS_FLOAT,PIPES_AS_CONCAT,ANSI_QUOTES,IGNORE_SPACE,ONLY_FULL_GROUP_BY,ANSI | +--------------------------------------------------------------------------------+ 1 row in set (0.00 sec)