SQL vs MySQL: Reglas sobre operaciones agregadas y GROUP BY
Eneste libro Actualmente estoy leyendo mientras sigo un curso sobre bases de datos, se da el siguiente ejemplo de una consulta ilegal que utiliza un operador agregado:
Encuentra el nombre y la edad del marinero más viejo.
Considere el siguiente intento de responder a esta consulta:
SELECT S.sname, MAX(S.age)
FROM Sailors S
La intención es que esta consulta devuelva no solo la edad máxima, sino también el nombre de los marineros que tienen esa edad. Sin embargo, esta consulta es ilegal en SQL: si la cláusula SELECT usa una operación agregada, entonces debe usarsolamente operaciones agregadas a menos que la consulta contenga una cláusula GROUP BY!
Algún tiempo después, mientras hacía un ejercicio con MySQL, me enfrenté a un problema similar y cometí un error similar al mencionado. Sin embargo, MySQL no se quejó y solo escupió algunas tablas que luego resultaron no ser lo que necesitaba.
¿Es la consulta anterior realmente ilegal en SQL, pero legal en MySQL, y si es así, por qué? ¿En qué situación habría que hacer una consulta de este tipo?
Mayor elaboración de la pregunta:
La pregunta no es sobre si todos los atributos mencionados en un SELECT también deberían mencionarse en un GROUP BY. Se trata de por qué la consulta anterior, utilizando atributos junto con operaciones agregadas en atributos, sin ningún GRUPO BY es legal en MySQL.
Digamos que la mesa de los Marineros se veía así:
+----------+------+
| sname | age |
+----------+------+
| John Doe | 30 |
| Jane Doe | 50 |
+----------+------+
La consulta entonces regresaría:
+----------+------------+
| sname | MAX(S.age) |
+----------+------------+
| John Doe | 50 |
+----------+------------+
Ahora, ¿quién necesitaría eso? John Doe no tiene 50, ¡tiene 30! Como se indica en la cita del libro, este es un primer intento de obtener el nombre y la edad de la navegante más antigua, en este ejemplo, Jane Doe a la edad de 50 años.
SQL diría que esta consulta es ilegal, pero MySQL simplemente procede y escupe "basura". ¿Quién necesitaría este tipo de resultado? ¿Por qué MySQL permite esta pequeña trampa para los recién llegados?