Почему MySQL разрешает “группу” запросами БЕЗ агрегатных функций?

Удивление - это - совершенно допустимый запрос в MySQL:

select X, Y from someTable group by X

При попытке этого запроса в Oracle Server или SQL Server Вы получили бы естественное сообщение об ошибке:

Column 'Y' is invalid in the select list because it is not contained in 
either an aggregate function or the GROUP BY clause.

Таким образом, как MySQL определяет который Y показать для каждого X? Это просто выбирает тот. Из того, что я могу сказать, это просто выбирает первый Y, который это находит. Объяснение быть, если Y не является ни агрегатной функцией, ни в группе пунктом, то определение “выбора Y” в Вашем запросе не имеет никакого смысла для начала. Поэтому я как механизм базы данных возвращу то, что я хочу, и Вам понравится он.

Существует даже параметр конфигурации MySQL для выключения этой “слабости”. http://dev.mysql.com/doc/refman/5.7/en/sql-mode.html#sqlmode_only_full_group_by

Эта статья даже упоминает, как MySQL был подвергнут критике за то, что он был ANSI SQL, несовместимым в этом отношении. http://www.oreillynet.com/databases/blog/2007/05/debunking_group_by_myths.html

Мой вопрос: Почему MySQL был разработан этот путь? Каково было их объяснение для разрыва с ANSI SQL?

59
задан dreftymac 17 September 2019 в 00:33
поделиться

2 ответа

Я считаю, что это было сделано для случая, когда группировка по одному полю будет означать, что другие поля также группируются:

SELECT user.id, user.name, COUNT(post.*) AS posts 
FROM user 
  LEFT OUTER JOIN post ON post.owner_id=user.id 
GROUP BY user.id

В этом случае имя пользователя всегда будет уникальным для каждого пользователя. id, поэтому удобно не требовать user.name в предложении GROUP BY (хотя, как вы говорите, существует определенная область для проблем)

20
ответ дан 24 November 2019 в 18:33
поделиться

К сожалению, почти все разновидности SQL имеют ситуации, когда они нарушают ANSI и дают непредсказуемые результаты.

Мне кажется, что они намеревались рассматривать его как функцию «ПЕРВЫЙ (Y)» это есть во многих других системах.

Более чем вероятно, что эта конструкция - это то, о чем команда MySQL сожалеет, но не хочет прекращать поддержку из-за количества приложений, которые могут выйти из строя.

Роб

2
ответ дан 24 November 2019 в 18:33
поделиться
Другие вопросы по тегам:

Похожие вопросы: