2014/06/04

FASES DEL PROCESAMIENTO LOGICO DE UNA CONSULTA

Hola de nueva cuenta, en esta ocasión les explicaré un poco más, a grandes rasgos, del orden de procesamiento de las fases en SQL SERVER, comenzaré copiando una de las tablas para mostrarles:
IF OBJECT_ID(N'datosPrueba') IS NOT NULL
    DROP TABLE datosPrueba

SELECT BusinessEntityID,JobTitle,HireDate,VacationHours
INTO datosPrueba
FROM AdventureWorks2012.HumanResources.Employee

SELECT * FROM datosPrueba
Son 290 filas, ahora aplicaremos el siguiente query:
SELECT JobTitle, YEAR( HireDate ) AS yr, COUNT( BusinessEntityID ) AS cn
FROM datosPrueba
WHERE VacationHours > 5
GROUP BY JobTitle, YEAR( HireDate )
HAVING COUNT( BusinessEntityID ) > 5
ORDER BY JobTitle

El orden de las fases es:
1.       FROM
2.       WHERE
3.       GROUP BY
4.       HAVING
5.       SELECT
6.       ORDER BY
1.- FROM

La tabla o tablas de donde necesitamos la información. Es por ello que es la primera en ejecutarse.

2.- WHERE

Es aquí donde aplicamos los filtros necesarios, uno de los errores es cuando intentamos utilizar una columna generada a partir de una función o una operación:
SELECT JobTitle, YEAR( HireDate ) AS yr, COUNT( BusinessEntityID ) AS cn
FROM datosPrueba
WHERE cn > 5
GROUP BY JobTitle, YEAR( HireDate )
HAVING COUNT( BusinessEntityID ) > 5
ORDER BY JobTitle
Genera el error debido a que esa columna aún no es creada, se genera en la fase del SELECT y este aún no se ejecuta.

3.- GROUP BY

Una vez filtradas las filas que necesitamos, podemos utilizar la sentencia GROUP BY para agrupar resultados, recordemos que aquellas columnas que no utilicen una sentencia de agregado como MAX, MIN, AVG, COUNT, etc, deberán ser listadas en esta fase. De la misma forma que en la fase anterior, solemos cometer un error común:
SELECT JobTitle, YEAR( HireDate ) AS yr, COUNT( BusinessEntityID ) AS cn
FROM datosPrueba
WHERE VacationHours > 5
GROUP BY JobTitle, yr
HAVING COUNT( BusinessEntityID ) > 5
ORDER BY JobTitle
En este paso, tampoco ha sido creado la columna yr por ello nos genera ese error, debemos utilizar el nombre de la columna o en este caso YEAR( HireDate ).

4.- HAVING

Es similar a la fase WHERE pero aquí se filtran los resultados del GROUP BY, es por ello que se ejecuta después de esta última. Si intentamos filtrar por el nombre de una columna que será creada en el SELECT, este será el resultado.
SELECT JobTitle, YEAR( HireDate ) AS yr, COUNT( BusinessEntityID ) AS cn
FROM datosPrueba
WHERE VacationHours > 5
GROUP BY JobTitle, YEAR( HireDate )
HAVING cn > 5
ORDER BY JobTitle
Entonces lo correcto es utilizar funciones de agregado:
SELECT JobTitle, YEAR( HireDate ) AS yr, COUNT( BusinessEntityID ) AS cn
FROM datosPrueba
WHERE VacationHours > 5
GROUP BY JobTitle, YEAR( HireDate )
HAVING COUNT( BusinessEntityID ) > 5
ORDER BY JobTitle

5.- SELECT

Es en esta fase es donde las columnas son creadas a partir de las funciones que hemos indicado, por ejemplo YEAR, COUNT, AVG, etc. También podemos utilizar sentencias como CASE WHEN, IIF.
SELECT JobTitle, YEAR( HireDate ) AS yr, COUNT( BusinessEntityID ) AS cn, 
CASE WHEN YEAR( HireDate ) > 2004 THEN 'SI' ELSE 'NO' END AS otraColumna
FROM datosPrueba
WHERE VacationHours > 5
GROUP BY JobTitle, YEAR( HireDate )
HAVING COUNT( BusinessEntityID ) > 5
ORDER BY JobTitle

Lo que no podemos hacer es utilizar columnas que son creadas en la misma fase, por ejemplo:
SELECT JobTitle, YEAR( HireDate ) AS yr, COUNT( BusinessEntityID ) AS cn, 
CASE WHEN yr > 2004 THEN 'SI' ELSE 'NO' END AS otraColumna
FROM datosPrueba
WHERE VacationHours > 5
GROUP BY JobTitle, YEAR( HireDate )
HAVING COUNT( BusinessEntityID ) > 5
ORDER BY JobTitle

6.- ORDER BY

Es la última fase y es en la única en la que se permiten utilizar los ALIAS que fueron declarados en la fase SELECT dado que esta última se ejecuta previamente.
SELECT JobTitle, YEAR( HireDate ) AS yr, COUNT( BusinessEntityID ) AS cn, 
CASE WHEN YEAR( HireDate ) > 2004 THEN 'SI' ELSE 'NO' END AS otraColumna
FROM datosPrueba
WHERE VacationHours > 5
GROUP BY JobTitle, YEAR( HireDate )
HAVING COUNT( BusinessEntityID ) > 5
ORDER BY yr,JobTitle

Para mayor referencia pueden consultar un poster gratis y más a detalle de las fases de procesamiento dando click aquí.

Espero que les sirva de ayuda.

SALUDOS
COMPARTE ESTA INFORMACION SI TE PARECIO INTERESANTE

0 comentarios:

Publicar un comentario