Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

501
Vistas
Comprender GROUP BY no estándar con ONLY_FULL_GROUP_BY modo sql configurado en MySQL

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';

SELECCIONE nombre, MAX(salario), departamento DESDE employee_gb GROUP BY dept;

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:

ingrese la descripción de la imagen aquí

ingrese la descripción de la imagen aquí

over 4 years ago · Santiago Trujillo
3 Respuestas
Responde la pregunta

0

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');
over 4 years ago · Santiago Trujillo Denunciar

0

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.

over 4 years ago · Santiago Trujillo Denunciar

0

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)
over 4 years ago · Santiago Trujillo Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda