Procesamiento lógico de consultas en SQL Server

Para aprender los conceptos básicos de SQL Server, debe comprender cómo un motor de consultas de SQL Server ejecuta una consulta SQL. T-SQL implica tanto el procesamiento de consultas lógicas como físicas. El procesamiento de consultas físicas trata sobre cómo un motor de base de datos procesa una consulta. Procesamiento lógico de consultas es un flujo conceptual, un orden de las cláusulas que sabe cómo SQL Server evalúa estas cláusulas mientras ejecuta una consulta.

La mayoría de los lenguajes de programación siguen lo fundamental de procesar un programa línea por línea, pero el servidor SQL tiene un orden de procesamiento de consultas lógico definido para ejecutar las consultas.

El orden de procesamiento lógico se ha dividido en dos ramas diferentes en función de si se incluye UNION o no.

Ejecución de consultas lógicas en SQL Server sin una cláusula UNION

1. DE, UNIRSE, APLICAR Y ENCENDER: Las condiciones de unión se evalúan y, a continuación, se aplica el filtro de consulta ON.

2. DÓNDE: Este es otro filtro de consulta aplicado para obtener registros que coinciden con el filtro de condiciones DÓNDE.

3. Funciones GROUP BY y Agregadas: Agrupaciones y operaciones de agregaciones realizadas.

4. TENIENDO: Este es el tercer filtro aplicado a un resultado agregado obtenido del grupo por para filtrar los grupos

5. SELECCIONAR: Lista de columnas a devolver por resultado de la consulta

6. DISTINTO: Para eliminar registros duplicados

7. ORDEN POR: Ordenando el resultado Ascendiendo / Descendiendo

8. PARTE SUPERIOR: El filtro TOP se aplica para seleccionar X número de filas definido

9. Para XML: Para devolver los resultados de la consulta como formato XML

Ejecución lógica de consultas en SQL Server con una cláusula UNION

1. DE, UNIRSE, APLICAR Y ENCENDER: Las condiciones de unión se evalúan y, a continuación, se aplica el filtro de consulta ON.

2. DÓNDE: Se aplicó otro filtro de consulta para obtener los registros que coinciden con el filtro de condiciones DÓNDE

3. Funciones GROUP BY y Agregadas: Agrupaciones y operaciones de agregaciones realizadas.

4. TENIENDO: El tercer filtro, aplicado a un resultado agregado obtenido del grupo por para filtrar los grupos

5. PARTE SUPERIOR: El filtro TOP se aplica para seleccionar X número definido de filas.

6. SELECT y UNION: Para combinar el conjunto de resultados de dos consultas y devolverlo utilizando la instrucción SELECT

7. DISTINTO: Para eliminar registros duplicados

8. ORDEN POR: Ordenando el resultado Ascendiendo / Descendiendo

9. Para XML: Para devolver los resultados de la consulta como formato XML

Ejemplos para demostrar orden de procesamiento de consultas lógicas

SI OBJECT_ID ('Empleado') NO ES UNA TABLA DE GOTA NULA Empleado; CREAR TABLA Empleado (Id. INT NO NULA IDENTIDAD (1,1) CLAVE PRIMARIA, Nombre VARCHAR (50) NO NULL, MiddleName VARCHAR (50) NO NULL, Apellido VARCHAR (50) NO NULO, Contacto No VARCHAR (10) NO NULO, Salario INT NULL); Insertar en valores de empleado ('Vishwanath', 'D', 'D', '9999955555', 12000); Insertar en valores de empleado ('Niraj', 'Y', 'Y', '9911223344', 14000); Insertar en los valores de empleado ('Chetan', 'V', 'G', '989898989', 700000); Insertar en valores de empleado ('Atul', 'K', 'K', '9876780987', 40000); Insertar en valores de empleado ('Vishal', 'M', 'P', '7777711111', 12000); 

1. Cláusula WHHERE Evaluada antes de SELECT

A menudo, los desarrolladores que no entienden el procesamiento lógico de consultas cometen este error: intentan usar un alias de columna definido en una cláusula SELECT en una cláusula WHERE. Esto no está permitido porque una cláusula SELECT se evalúa después de una cláusula WHERE, por lo que la cláusula WHERE no conoce el alias de columna. Se genera un error de "Nombre de columna no válido".

Para resolver este problema, puede usar el concepto de tabla derivada o (Salario * 12) en la cláusula where (que en realidad no es una buena práctica considerando la optimización del rendimiento).

SELECCIONE ID, (Salario * 12) como Anual de Asalariado del Empleado DONDE Anual de Asalariado> 10000; 

Msg 207, Nivel 16, Estado 1, Línea 3
Nombre de columna no válido 'YearlySalary'.

Cláusula 2.WHERE Evaluada antes de tener

La diferencia más importante para distinguir entre la cláusula WHERE y HAVING es la cláusula WHERE que se evalúa antes que la cláusula HAVING. La cláusula WHERE se aplica a las filas y la cláusula HAVING se aplica a los grupos creados utilizando la cláusula GROUP BY.

Intentemos encontrar departamentos de la tabla de empleados con una suma de salario superior a 300000. La siguiente consulta nos da un resultado, pero no cumple con el requisito de consulta. Hemos agregado un filtro en la cláusula WHERE que filtra a los empleados con un salario superior a 300000, no a los departamentos.

Estos son intentos incorrectos de filtrar los departamentos cuyo salario es superior a 300000.

SELECCIONE DeptId, SUM (Salario) como SumOfSalary DE Empleado DONDE Salario> 300000 GROUP BY DeptId; 
DeptId SumOfSalary 2 700000 

Consulta correcta con filtrar hacia fuera con la cláusula HAVING.

SELECCIONE DeptId, SUM (Salario) como SumOfSalary DE Empleado GRUPO POR DeptId QUE TIENE SUM (Salario)> 300000; 
DeptId SumOfSalary 2 752000 

3.Referir el alias de columna en una cláusula SELECT

Los alias de columna no son visibles para otra expresión en la misma cláusula SELECT. Provoca un error "Nombre de columna no válido YearlySalary" porque estamos tratando de referir el alias creado en la misma lista de selección. La razón por la que T-SQL evalúa todas las expresiones que aparecen en la misma fase de procesamiento lógico de consultas de una manera todo en una.

SELECCIONE (Salario * 12) como Anual Asalariado, Anual Asalariado / 100 DEL Empleado; 

Msg 207, Nivel 16, Estado 1, Línea 13
Nombre de columna no válido 'YearlySalary'.

4.Referir el alias de columna en la cláusula ORDER BY

Cuando creamos un alias de columna en una cláusula SELECT e intentamos ordenar el resultado según el nombre de alias de columna creado, se permite porque, según el procesamiento lógico de la consulta, se evalúa una cláusula SELECT antes de una cláusula ORDER BY.

SELECCIONE (Salario * 12) como Anual de Asalariado del Empleado ORDEN POR YearlySalary DESC; 
AnualSalary 8400000 480000 168000 144000 144000 

Lea más sobre la base de datos y la programación de SQL de Tech-Recipes.