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

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

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

3 ответов


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

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

при написании запроса наиболее важным соображением является вот оно!--1-->дает правильные результаты. если вы допустили ошибку, вероятно, лучше, чтобы парсер SQL информировал вас, а не делать предположение о вашем намерении и возвращать результаты, которые могут быть неправильными. Декларативный характер SQL (где вы указываете, что вы хотите получить, а не шаги, как его получить) уже позволяет легко непреднамеренно совершать ошибки. введение fuzziniess в синтаксис языка не сделает этого лучше.

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

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


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


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

например.

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

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

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

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

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