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 допускает эту маленькую ловушку для новичков?

Ответы на вопрос(4)

Ваш ответ на вопрос