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?
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:
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
SET SHOWPLAN_ALL ON
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 WHERE
cual es:
1. WHERE
2. GROUP BY
3. HAVING
SELECT * FROM table1 INNER JOIN table2 ON col = col2 WHERE table1.col = @val
Aquí viene ON después de unirse, y seleccionar es lo primero, ¿alguna explicación?
FROM
primero, luego ON
y así sucesivamente.
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.
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
Piense en lo que debe hacer si desea implementar:
El orden es DONDE, AGRUPAR Y TENER.
En orden a continuación
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
Este es el orden SQL de ejecución de una consulta,
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 .
- 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.
- 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: -
SELECCIÓN
DE
JOINs
DONDE
GROUP BY
HAVING
ORDER BY