Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

502
Views
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 answers
Answer question

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 Report

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 Report

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 Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!