¿Por qué necesito para especificar explícitamente todas las columnas en una cláusula SQL “GROUP BY” - ¿por qué no “GROUP BY *”?

StackOverflow https://stackoverflow.com/questions/2777235

Pregunta

Esto siempre me ha molestado - ¿por qué la cláusula GROUP BY en una instrucción SQL requiere que incluyo todas las columnas no agregadas? Estas columnas se incluyen por defecto - una especie de "GROUP BY *" - ya que no puedo incluso ejecutar la consulta a menos que estén todos incluidos. Cada columna tiene que ser o bien un agregado o se especificará en el "GROUP BY", pero parece que todo lo que no agregados deben agruparse de forma automática.

Tal vez es parte de la norma ANSI-SQL, pero aún así, no entiendo por qué. ¿Puede alguien me ayuda entender la necesidad de esta convención?

¿Fue útil?

Solución

Es difícil saber exactamente lo que los diseñadores del lenguaje SQL estaban pensando cuando escribieron la norma, pero aquí está mi opinión .

SQL, como regla general, requiere que se indique explícitamente sus expectativas y su intención. El idioma no trata de "adivinar lo que quería decir" , y llenar automáticamente los espacios en blanco. Esto es una cosa buena .

Cuando se escribe una consulta de la consideración más importante es que da resultados correctos . Si comete un error, es probable que sea mejor que el analizador de SQL le informa, en lugar de hacer una suposición acerca de su intención y devolver los resultados que pueden no ser correcta. La naturaleza declarativa de SQL (donde se especifique que desea recuperar en lugar de los pasos cómo recuperarla) ya hace que sea fácil cometer errores por descuido. La introducción de fuzziniess en la sintaxis del lenguaje no haría esto mejor .

De hecho, todos los casos que se puede pensar en que el lenguaje permite a los problemas atajos ha causado. Tomemos, por ejemplo, se une naturales - donde se puede omitir los nombres de las columnas que desea unirse en la base de datos y permiten inferir ellos basados ??en nombres de columna. Una vez que el cambio de nombres de columna (como hacen de forma natural con el tiempo) - la semántica de las consultas existentes cambia con ellos . Esto es malo ... muy malo -. Que realmente no quiere este tipo de mágica sucediendo detrás de las escenas en el código base de datos

Una de las consecuencias de esta elección de diseño, sin embargo, es que SQL es un prolijo idioma en el que se debe expresar de forma explícita su intención. Esto puede dar lugar a tener que escribir más código que le gusten, y queja acerca de por qué ciertas construcciones son tan prolijo ... pero al final del día -. es lo que es

Otros consejos

Es simple como esto: usted pidió al grupo de SQL los resultados de cada columna en la cláusula from, es decir, para cada columna en la cláusula from SQL, el motor SQL grupo internamente los conjuntos de resultados antes de presentarlo a usted . Eso explica por qué se le pedirá que mencionar todas las columnas presentes en el de demasiado porque no es posible grupo parcialmente. Si usted ha mencionado el grupo por la cláusula que sólo es posible a SQL lograr su intento por agrupar todas las columnas también. Es una restricción matemáticas.

La razón lógico que se me ocurre para mantener la cláusula GROUP BY como lo es que se puede incluir campos que no están incluidos en su columna de selección en su agrupación.

Por ejemplo.

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

A pesar de que las columnas 3 no está representada en la consulta en otro lugar, todavía se puede grupales los resultados por su valor. (Por supuesto, una vez que haya hecho eso, no se puede decir por el resultado por eso que los registros se agruparon como estaban.)

Parece como un simple atajo para el escenario más común aplastante (agrupación por cada una de las columnas no agregadas) sería una herramienta simple pero eficaz para acelerar la codificación.

Tal vez "GROUP BY *"

Dado que ya es bastante común en las herramientas de SQL para permitir que las referencias a las columnas por el número de columna de resultados (es decir. GROUP BY 1,2,3, etc.) Parecería más simple todavía ser capaz de permitir al usuario para incluir automáticamente todos los campos de la no agregadas en una pulsación de tecla.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top