Aplicación de declaraciones condicionales en ON / WHERE
Aquí he explicado los pasos de procesamiento de consultas lógicas.
Referencia: Inside Microsoft® SQL Server ™ 2005 T-SQL Querying
Editor: Microsoft Press
Pub Fecha: 07 de marzo de 2006
Imprimir ISBN-10: 0-7356-2313-9
Imprimir ISBN-13: 978-0-7356-2313-2
Páginas: 640
Dentro de Microsoft® SQL Server ™ 2005 Consulta T-SQL
(8) SELECT (9) DISTINCT (11) TOP <top_specification> <select_list>
(1) FROM <left_table>
(3) <join_type> JOIN <right_table>
(2) ON <join_condition>
(4) WHERE <where_condition>
(5) GROUP BY <group_by_list>
(6) WITH {CUBE | ROLLUP}
(7) HAVING <having_condition>
(10) ORDER BY <order_by_list>
El primer aspecto notable de SQL que es diferente de otros lenguajes de programación es el orden en que se procesa el código. En la mayoría de los lenguajes de programación, el código se procesa en el orden en que está escrito. En SQL, la primera cláusula que se procesa es la cláusula FROM, mientras que la cláusula SELECT, que aparece primero, se procesa casi en último lugar.
Cada paso genera una tabla virtual que se utiliza como entrada para el siguiente paso. Estas tablas virtuales no están disponibles para la persona que llama (aplicación cliente o consulta externa). Solo la tabla generada por el paso final se devuelve a la persona que llama. Si una determinada cláusula no se especifica en una consulta, simplemente se omite el paso correspondiente.
Breve descripción de las fases de procesamiento de consultas lógicas
No se preocupe demasiado si la descripción de los pasos no parece tener mucho sentido por ahora. Estos se proporcionan como referencia. Las secciones que vienen después del ejemplo de escenario cubrirán los pasos con mucho más detalle.
FROM: se realiza un producto cartesiano (unión cruzada) entre las dos primeras tablas de la cláusula FROM y, como resultado, se genera la tabla virtual VT1.
ON: el filtro ON se aplica a VT1. Solo las filas para las cuales <join_condition>
es VERDADERO se insertan en VT2.
OUTER (join): si se especifica un OUTER JOIN (a diferencia de CROSS JOIN o INNER JOIN), las filas de la tabla o tablas preservadas para las que no se encontró una coincidencia se agregan a las filas de VT2 como filas externas, generando VT3. Si aparecen más de dos tablas en la cláusula FROM, los pasos 1 a 3 se aplican repetidamente entre el resultado de la última unión y la siguiente tabla en la cláusula FROM hasta que se procesen todas las tablas.
WHERE: el filtro WHERE se aplica a VT3. Solo las filas para las que <where_condition>
es VERDADERO se insertan en VT4.
GROUP BY: las filas de VT4 se organizan en grupos según la lista de columnas especificada en la cláusula GROUP BY. Se genera VT5.
CUBO | ROLLUP: los supergrupos (grupos de grupos) se agregan a las filas desde VT5, generando VT6.
HAVING: el filtro HAVING se aplica a VT6. Solo los grupos para los que <having_condition>
es VERDADERO se insertan en VT7.
SELECCIONAR: se procesa la lista SELECCIONAR, generando VT8.
DISTINCT: las filas duplicadas se eliminan de VT8. Se genera VT9.
ORDER BY: las filas de VT9 se ordenan según la lista de columnas especificada en la cláusula ORDER BY. Se genera un cursor (VC10).
ARRIBA: El número o porcentaje especificado de filas se selecciona desde el comienzo de VC10. La tabla VT11 se genera y se devuelve a la persona que llama.
Por lo tanto, (INNER JOIN) ON filtrará los datos (el recuento de datos de VT se reducirá aquí mismo) antes de aplicar la cláusula WHERE. Las siguientes condiciones de unión se ejecutarán con datos filtrados que mejoran el rendimiento. Después de eso, solo la condición WHERE aplicará condiciones de filtro.
(La aplicación de declaraciones condicionales en ON / WHERE no hará mucha diferencia en algunos casos. Esto depende de cuántas tablas haya unido y el número de filas disponibles en cada tabla de unión)