Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Persona(ci,nombre,apellido,sexo,fecNac)
Empresa(codEmpresa,nomEmp,pais,rubro,
patrimonio,promedioSalarial
Trabaja(ci,codEmpresa,salario,cargo)
CTE: Common Table Expression
Mecanismo que nos permite poner un alias a una
consulta para usarla en otra consulta
WITH
PersonaTerceraEdad_CTE (ci,nombre,apellido,edad) AS
( select ci,nombre,apellido,year(GETDATE())-(year(fecNac))
CTE
from persona where year(GETDATE())-year(fecNac)>=60
Consulta
)
que usa
select count(*) from PersonaTerceraEdad_CTE la CTE
with
CTE
Consulta
que usa
la CTE
Utilidad de las CTEs
Útil para gestionar consultas complicadas, por ejemplo, una consulta
que requiere filtrar sobre datos ya filtrados, implementando
recursividad o reutilizando la consulta anterior.
Consultas más legibles
facilidad de mantenimiento de consultas complejas.
para poder aplicar recursividad a la información que queremos filtrar,
esto es, aplicar ciertas operaciones (o filtro) sobre un conjunto de
registros que previamente extrajimos (o consultamos) de la BD.
WITH PersonaTerceraEdad_CTE (ci,nombre,apellido,edad) AS
( select ci,nombre,apellido,year(GETDATE())-(year(fecNac))
CTE
from persona where year(GETDATE())-year(fecNac)>=60
)
Consulta
select count(*) from PersonaTerceraEdad_CTE que usa
la CTE
Ejemplo
/*
Ejemplos de CTE (common table expression)
OBTENER LA CANTIDAD DE PERSONAS CONTRATADAS POR EDAD
(SOLO CONSIDERAR LAS PERSONAS MAYORES DE 50)
*/
with personaMayor(ci,nombre,apellido,sexo,fecNac,edad)
as
(select *, year(GETDATE())-year(fecNac)
from persona
where (year(GETDATE())-year(fecNac) )>50
)
select edad,count(*) from personaMayor
group by edad
Ejemplo: Ejecución
/*
Ejemplos de CTE (common table expression)
OBTENER LA CANTIDAD DE PERSONAS CONTRATADAS POR EDAD
(SOLO CONSIDERAR LAS PERSONAS MAYORES DE 50)
*/
with personaMayor(ci,nombre,apellido,sexo,fecNac,edad)
as
(select *, year(GETDATE())-year(fecNac)
from persona
where (year(GETDATE())-year(fecNac) )>50
)
select edad,count(*) from personaMayor
group by edad
Ejemplo
-- obtener cantidad de empleados contratados en edad 40s y 50s x empresa
with CE(codEmpresa,nomEmpresa,decada)
as (select e.codEmpresa,nomEmp,(year(GETDATE())-year(fecNac))/10
from persona p, trabaja t, empresa e
where p.ci=t.ci and t.codEmpresa=e.codEmpresa
),
CE2(codEmpresa,nomEmpresa,decada,cant)
as (select codEmpresa,nomEmpresa,decada,count(*)
from CE
group by codEmpresa,nomEmpresa,decada
)
select t1.codEmpresa,t1.nomEmpresa,t1.decada, t1.cant,
t2.decada,t2.cant
from CE2 t1 full join CE2 t2
on (t1.codEmpresa=t2.codEmpresa and t1.decada+1=t2.decada)
where t1.decada=4
order by 2
Ejemplo: Ejecución
-- obtener cantidad de empleados contratados en edad 40s y 50s x empresa
with CE(codEmpresa,nomEmpresa,decada)
as (select e.codEmpresa,nomEmp,(year(GETDATE())-year(fecNac))/10
from persona p, trabaja t, empresa e
where p.ci=t.ci and t.codEmpresa=e.codEmpresa
),
CE2(codEmpresa,nomEmpresa,decada,cant)
as (select codEmpresa,nomEmpresa,decada,count(*)
from CE
group by codEmpresa,nomEmpresa,decada
)
select t1.codEmpresa,t1.nomEmpresa,t1.decada, t1.cant,
t2.decada,t2.cant
from CE2 t1 full join CE2 t2
on (t1.codEmpresa=t2.codEmpresa and t1.decada+1=t2.decada)
where t1.decada=4
order by 2
Ejercicios
Resolver los siguientes ejercicios
a) sin CTEs,
b) Usando CTEs
1. OBTENER LA cantidad de empleados
contratados por edad (SOLO CONSIDERAR
LAS PERSONAS MAYORES DE 50). La
respuesta debería tener edad, cant
2. OBTENER LA edad con mas contratados
(SOLO CONSIDERAR LAS PERSONAS
MAYORES DE 50)
/*
Ejemplos de CTE (common table expression)
*/OBTENER LA cantidad de contratados por edad
(SOLO CONSIDERAR LAS PERSONAS MAYORES DE 50)
with
personaMayor(ci,nombre,apellido,sexo,fecNac,edad)
as
(select *, year(GETDATE())-year(fecNac)
from persona
where (year(GETDATE())-year(fecNac) )>50
)
select edad,count(*) from personaMayor
group by edad
Ejemplo
Ejemplo
/*
Ejemplos de CTE (common table expression)
OBTENER LA edad con mas contratados
(SOLO CONSIDERAR LAS PERSONAS MAYORES DE 50)
*/
with
personaMayor(ci,nombre,apellido,sexo,fecNac,edad)
as
(select *, year(GETDATE())-year(fecNac)
from persona
where (year(GETDATE())-year(fecNac) )>50
),
cantPorEdad(edad,cant)
as
(select edad,count(*) from personaMayor
group by edad
),
mayorCant(mayCant) as
(select max(cant) as edadConMasContratados
from cantPorEdad)
select edad
from cantPorEdad t1, mayorCant t2
where cant=mayCant
/*
Ejecutando la consulta
Ejemplos de CTE (common table expression)
OBTENER LA edad con mas contratados
(SOLO CONSIDERAR LAS PERSONAS MAYORES DE 50)
*/
with
personaMayor(ci,nombre,apellido,sexo,fecNac,edad)
as
(select *, year(GETDATE())-year(fecNac)
from persona
where (year(GETDATE())-year(fecNac) )>50
),
cantPorEdad(edad,cant)
as
(select edad,count(*) from personaMayor
group by edad
),
mayorCant(mayCant) as
(select max(cant) as edadConMasContratados
from cantPorEdad)
select edad
from cantPorEdad t1, mayorCant t2
where cant=mayCant
Procedimientos almacenados
Script con secuencia de comandos para que
ejecute el DBMS
Buena forma de MODULARIZAR procesos
y procedimientos específicos
Puede tener entradas y salidas
Se ejecutan en el servidor, lo que puede
reducir los requerimientos de la
computadora y/o aplicación del cliente.
Utilidad de los procedim.
almacenados
Conveniencia: encapsulo en una unidad fácil de usar una
lógica compleja del negocio
Seguridad:
– previene el acceso a datos (haciendo que éstos sólo se
accedan mediante procedimientos almacenados)
– Ayuda a evitar SQL injection porque la entrada del usuario
(vía parámetros) es automáticamente capturada y no tratada
como parte del query.
EXEC ejemplo
modificar DEFINICIÓN DE
un procedim EXISTENTE
ALTER PROCEDURE ejemplo
-- parameters
AS
BEGIN
SELECT * from alumno
END
EXEC ejemplo
Borrar un procedim almacenado
DROP PROCEDURE ejemplo
SQLServer provee GUI para Crear
procedimientos almacenados
parámetros
Sentencia
SQL
GUI para Crear procedimientos almacenados
Ejecución del
procedim
almacenado
Sentencia
SQL
DDL para Crear procedim.
almacenados
Usando un arch. Sql
Store Procedures
Ejemplo Store Procedures
-- PROCEDIMIENTOS ALMACENADOS
-- procedimiento sin parámetros
CREATE PROCEDURE ejemplo
AS
SELECT * FROM empresa where patrimonio=200000
EXEC ejemplo
Ejemplo Store Procedures
-- PROCEDIMIENTOS ALMACENADOS
-- procedimiento con parámetros
CREATE PROCEDURE ejemplo2
@vPatrimonio float
AS
SELECT * FROM empresa where patrimonio=@vPatrimonio
AS
SELECT * FROM empresa
where patrimonio=@vPatrimonio and
promedioSalarial=@vPromedioSalarial