¿Cuál es la secuencia de ejecución de la cláusula Agrupar por, Tener y Dónde en SQL Server?


91

Simplemente estoy confundido con la secuencia de ejecución de una consulta SQL cuando usamos GROUP BY y HAVING con una cláusula WHERE. ¿Cuál se ejecuta primero? Cual es la secuencia?

Respuestas:


184

en orden:

FROM & JOIN s determinan y filtran filas
DONDE más filtros en las filas
GROUP BY combina esas filas en grupos
TENIENDO grupos de filtros
ORDER BY organiza las filas / grupos restantes
LIMIT filtros en las filas / grupos restantes


¿hay alguna referencia a esto?
Geshan

3
@Geshan, mira enSET SHOWPLAN_ALL ON
KM.

Hola, tengo una pregunta. ¿La declaración del caso cuando la condición anulará la condición where?
MAX

1
¿Qué pasa con la cláusula de selección? ¿Está en el último?
MAX

¡Respuesta corta y concisa! ¡Gracias!
Abhishek Ghosh

14

Aquí está la secuencia completa para el servidor SQL:

1.  FROM
2.  ON
3.  JOIN
4.  WHERE
5.  GROUP BY
6.  WITH CUBE or WITH ROLLUP
7.  HAVING
8.  SELECT
9.  DISTINCT
10. ORDER BY
11. TOP

Entonces, de la lista anterior, puede comprender fácilmente la secuencia de ejecución de la GROUP BY, HAVING and WHEREcual es:

1.  WHERE
2.  GROUP BY
3.  HAVING

Obtenga más información al respecto de Microsoft


SELECT * FROM table1 INNER JOIN table2 ON col = col2 WHERE table1.col = @valAquí viene ON después de unirse, y seleccionar es lo primero, ¿alguna explicación?
novato

Esta es solo la sintaxis de escribir una declaración SQL. La secuencia que mencioné es el orden real que evalúa un motor SQL. Eso significa que si la sintaxis de su consulta es correcta, entonces el motor evalúa FROMprimero, luego ONy así sucesivamente.
Md. Suman Kabir

1
@ShailajaGuptaKapoor Puede leer este blogs.x2line.com/al/archive/2007/06/30/3187.aspx
Md. Suman Kabir

8

DONDE es primero, luego AGRUPAS el resultado de la consulta, y por último, pero no menos importante, se toma la cláusula HAVING para filtrar el resultado agrupado. Este es el orden "lógico", no sé cómo se implementa técnicamente en el motor.


2
Vale la pena agregar que el optimizador puede mover cláusulas de HAVING a WHERE si no dependen de un agregado. Esto no afectará los resultados mostrados.
Damien_The_Unbeliever

2

Creo que está implementado en el motor como dijo Matthias: DÓNDE, GRUPO POR, TENIENDO

Estaba tratando de encontrar una referencia en línea que enumerara la secuencia completa (es decir, "SELECT" aparece en la parte inferior), pero no puedo encontrarla. Fue detallado en un libro "Inside Microsoft SQL Server 2005" que leí no hace mucho, por Solid Quality Learning

Editar: Encontré un enlace: http://blogs.x2line.com/al/archive/2007/06/30/3187.aspx


Muy buena explicación a la que vinculó :-).
sleske

1
Link está muerto. Si puedes arreglar eso, sería genial :)
Akash KC

2

En Oracle 12c, puede ejecutar código en cualquiera de las siguientes secuencias:

Where
Group By
Having

O

Where 
Having
Group by

1

Piense en lo que debe hacer si desea implementar:

  • DÓNDE : Es necesario ejecutar las operaciones JOIN.
  • AGRUPAR POR : Usted especifica Agrupar por para "agrupar" los resultados en la unión, luego tiene que hacerlo después de la operación JOIN, después del uso de WHERE.
  • HAVING : HAVING es para filtrar como dicen las expresiones GROUP BY. Luego, se ejecuta después de GROUP BY.

El orden es DONDE, AGRUPAR Y TENER.


Lo que explicaste aquí es brillante. Aclaró mi duda sobre TENER. Entonces, para resumir, GROUP BY & HAVING funciona igual que SELECT & WHERE. La cláusula HAVING siempre se ejecuta en datos de tabla COMPLETOS tomando la condición GROUP BY en la imagen y NO EN datos GROUPED.
Naveen Kumar

1

En orden a continuación

  1. DESDE Y UNIRSE
  2. DÓNDE
  3. AGRUPAR POR
  4. TENIENDO
  5. SELECCIONE
  6. PEDIR POR
  7. LÍMITE

0

Tener Cláusula puede venir antes / antes del grupo por cláusula.

Ejemplo: seleccione * FROM test_std; ROLL_NO SNAME DOB TEACH


     1 John       27-AUG-18 Wills     
     2 Knit       27-AUG-18 Prestion  
     3 Perl       27-AUG-18 Wills     
     4 Ohrm       27-AUG-18 Woods     
     5 Smith      27-AUG-18 Charmy    
     6 Jony       27-AUG-18 Wills     
       Warner     20-NOV-18 Wills     
       Marsh      12-NOV-18 Langer    
       FINCH      18-OCT-18 Langer    

9 filas seleccionadas.

seleccione enseñar, contar ( ) contar de test_std teniendo count ( )> 1 grupo por ENSEÑAR;

ENSEÑAR CONTEO


Langer 2 Testamentos 4


0

Este es el orden SQL de ejecución de una consulta,

ingrese la descripción de la imagen aquí

Puede comprobar el orden de ejecución con ejemplos de este artículo .

Para su pregunta, las líneas siguientes pueden ser útiles y se obtienen directamente de este artículo .

  1. GROUP BY -> Las filas restantes después de que se aplican las restricciones WHERE se agrupan en función de los valores comunes en la columna especificada en la cláusula GROUP BY. Como resultado de la agrupación, solo habrá tantas filas como valores únicos en esa columna. Implícitamente, esto significa que solo debería necesitar usar esto cuando tenga funciones agregadas en su consulta.
  1. HAVING -> Si la consulta tiene una cláusula GROUP BY, entonces las restricciones en la cláusula HAVING se aplican a las filas agrupadas, descarta las filas agrupadas que no satisfacen la restricción. Al igual que la cláusula WHERE, los alias tampoco son accesibles desde este paso en la mayoría de las bases de datos.

Referencias: -


-2

SELECCIÓN
DE
JOINs
DONDE
GROUP BY
HAVING
ORDER BY


13
En realidad, esto está mal. Según los instructores certificados de MS y el material de capacitación oficial, Order By es posterior a Select. Algo lógico cuando lo piensas. Sería una estupidez pedir una mesa virtual que aún no ha ido a buscar y pegar. :)
Simme
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.