SQL против MySQL: правила для агрегатных операций и GROUP BY
Вэта книга В настоящее время я читаю во время прохождения курса по базам данных, приведен следующий пример недопустимого запроса с использованием оператора агрегирования:
Найдите имя и возраст самого старого моряка.
Рассмотрим следующую попытку ответить на этот запрос:
SELECT S.sname, MAX(S.age)
FROM Sailors S
Цель этого запроса - вернуть не только максимальный возраст, но и имя моряков, имеющих этот возраст. Однако этот запрос недопустим в SQL - если в предложении SELECT используется агрегатная операция, он должен использоватьтолько агрегатные операции, если запрос не содержит предложение GROUP BY!
Некоторое время спустя, выполняя упражнение с использованием MySQL, я столкнулся с подобной проблемой и допустил ошибку, похожую на упомянутую. Однако MySQL не жаловался, а просто выплевывал некоторые таблицы, которые позже оказались не тем, что мне было нужно.
Является ли приведенный выше запрос действительно недопустимым в SQL, но допустимым в MySQL, и если да, то почему? В какой ситуации нужно будет сделать такой запрос?
Дальнейшая проработка вопроса:
Вопрос не в том, должны ли все атрибуты, упомянутые в SELECT, также упоминаться в GROUP BY. Это о том, почему вышеупомянутый запрос, использующий атрибуты вместе с агрегатными операциями над атрибутами, без какого-либо GROUP BY, является допустимым в MySQL.
Допустим, таблица Sailors выглядела так:
+----------+------+
| sname | age |
+----------+------+
| John Doe | 30 |
| Jane Doe | 50 |
+----------+------+
Затем запрос вернет:
+----------+------------+
| sname | MAX(S.age) |
+----------+------------+
| John Doe | 50 |
+----------+------------+
Теперь кому это понадобится? Джону Доу не 50, ему 30! Как указано в цитате из книги, это первая попытка узнать имя и возраст самого старшего моряка, в данном примере Джейн Доу в возрасте 50 лет.
SQL сказал бы, что этот запрос недопустим, но MySQL просто продолжает и выплевывает «мусор». Кому нужен такой результат? Почему MySQL допускает эту маленькую ловушку для новичков?