Почему я должен явно указать все столбцы в пункте “GROUP BY” SQL - почему не “GROUP BY *”?

Это всегда беспокоило меня - почему делает пункт GROUP BY в SQL-операторе, требуют, чтобы я включал все несовокупные столбцы? Эти столбцы должны быть включены по умолчанию - своего рода "GROUP BY *" - так как я не могу даже выполнить запрос, если они все не включены. Каждый столбец должен или быть агрегатом или быть указан в "GROUP BY", но он походит на что-либо не агрегированное, должен быть автоматически сгруппирован.

Возможно, это - часть стандарта ANSI SQL, но несмотря на это, я не понимаю почему. Кто-то может помочь мне понять потребность в этой конвенции?

12
задан SqlRyan 5 May 2010 в 22:33
поделиться

1 ответ

Трудно точно сказать, что разработчики язык SQL думал, когда писал стандарт, , но вот мое мнение .

SQL, как правило, требует, чтобы вы явно заявили о своих ожиданиях и намерениях. Язык не пытается «угадать, что вы имели в виду» , а автоматически заполняет пробелы. Это хорошая вещь .

Когда вы пишете запрос, наиболее важным соображением является то, что он дает правильные результаты . Если вы допустили ошибку, вероятно, лучше, чтобы синтаксический анализатор SQL проинформировал вас, а не гадать о ваших намерениях и возвращать результаты, которые могут быть неверными. Декларативный характер SQL (где вы указываете, что вы хотите получить, а не шаги, как это получить) уже позволяет легко непреднамеренно совершать ошибки. Введение нечетких слов в синтаксис языка не улучшит ситуацию .

Фактически, каждый случай, который я могу придумать, где язык позволяет использовать ярлыки , вызывал проблемы. Возьмем, например, естественные объединения - где вы можете опустить имена столбцов, к которым хотите присоединиться, и позволить базе данных вывести их на основе имен столбцов. Как только имена столбцов меняются (что происходит естественным образом со временем) - семантика существующих запросов изменяется вместе с ними . Это плохо ... очень плохо - вы действительно не хотите, чтобы такая магия происходила за кулисами в коде вашей базы данных.

Однако одним из следствий этого выбора дизайна является то, что SQL - это многословный язык, на котором вы должны явно выражать свои намерения. Это может привести к тому, что вам придется писать больше кода, чем вам может понравиться, и вы будете беспокоиться о том, почему некоторые конструкции такие многословные ... но, в конце концов, это то, что есть.

22
ответ дан 2 December 2019 в 07:02
поделиться
Другие вопросы по тегам:

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