SQL vs MySQL: Regras sobre operações agregadas e GROUP BY
Emeste livro No momento, estou lendo enquanto estou seguindo um curso sobre bancos de dados, o seguinte exemplo de uma consulta ilegal usando um operador agregado é fornecido:
Encontre o nome e a idade do marinheiro mais velho.
Considere a seguinte tentativa de responder a esta consulta:
SELECT S.sname, MAX(S.age)
FROM Sailors S
A intenção é que essa consulta retorne não apenas a idade máxima, mas também o nome dos marinheiros com essa idade. No entanto, essa consulta é ilegal no SQL - se a cláusula SELECT usa uma operação agregada, ela deve usarsó operações agregadas, a menos que a consulta contenha uma cláusula GROUP BY!
Algum tempo depois, ao fazer um exercício usando o MySQL, enfrentei um problema semelhante e cometi um erro semelhante ao mencionado. No entanto, o MySQL não reclamou e apenas cuspiu algumas tabelas que mais tarde acabaram não sendo o que eu precisava.
A consulta acima é realmente ilegal em SQL, mas legal no MySQL, e se sim, por que isso? Em que situação seria necessário fazer tal consulta?
Mais elaboração da pergunta:
A questão não é se todos os atributos mencionados em um SELECT devem ou não ser mencionados em um GROUP BY. É por isso que a consulta acima, usando atributos juntamente com operações agregadas em atributos, sem qualquer GROUP BY, é legal no MySQL.
Vamos dizer que a mesa dos marinheiros ficou assim:
+----------+------+
| sname | age |
+----------+------+
| John Doe | 30 |
| Jane Doe | 50 |
+----------+------+
A consulta retornaria:
+----------+------------+
| sname | MAX(S.age) |
+----------+------------+
| John Doe | 50 |
+----------+------------+
Agora quem precisaria disso? John Doe não é 50, ele é 30! Como dito na citação do livro, esta é uma primeira tentativa de obter o nome e a idade do marinheiro mais velho, neste exemplo, Jane Doe aos 50 anos.
O SQL diria que esta consulta é ilegal, mas o MySQL apenas procede e cospe "lixo". Quem precisaria desse tipo de resultado? Por que o MySQL permite essa pequena armadilha para recém-chegados?