Почему мне нужно явно указать все столбцы в предложении SQL «GROUP BY» - почему бы не «GROUP BY *»? - PullRequest
12 голосов
/ 06 мая 2010

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

Может быть, это часть стандарта ANSI-SQL, но даже в этом случае я не понимаю, почему. Может ли кто-нибудь помочь мне понять необходимость этого соглашения?

Ответы [ 3 ]

21 голосов
/ 06 мая 2010

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

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

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

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

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

0 голосов
/ 19 июля 2016

Единственная логическая причина, по которой я могу придумать, сохранить условие GROUP BY, так как вы можете включать поля, которые НЕ включены в столбец выбора в вашей группе.

Например.

Select column1, SUM(column2) AS sum
 FROM table1
 GROUP BY column1, column3

Несмотря на то, что column3 не представлен где-либо еще в запросе, вы все равно можете сгруппировать результаты по его значению. (Конечно, как только вы это сделаете, по результатам не сможете понять, почему записи были сгруппированы так, как они были.)

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

Возможно "GROUP BY *"

Поскольку в инструментах SQL уже довольно часто разрешаются ссылки на столбцы по номеру столбца результата (т. Е. GROUP BY 1,2,3, и т. Д.), Может показаться, что проще позволить пользователю автоматически включать все не агрегировать поля одним нажатием клавиши.

0 голосов
/ 14 мая 2016

Все просто, вот так: вы попросили sql сгруппировать результаты по каждому столбцу в предложении from, то есть для каждого столбца в предложении from SQL, механизм sql внутренне сгруппирует наборы результатов, прежде чем представить его вам. , Это объясняет, почему он также просит вас упомянуть все столбцы, представленные в разделе from, потому что его невозможно сгруппировать частично. Если вы упомянули о предложении group by, то достичь цели можно только путем группировки всех столбцов. Это математическое ограничение.

...