UNIVERSIDAD NACIONAL DE LA AMAZONIA
PERUANA
FACULTAD DE INGENIERIA DE SISTEMAS E
INFORMTICA
F. I . S . I.
GUIA DE PRCTICA:
CONSULTAS SQL UTILIZANDO LA BASE DE DATOS
EJEMPLO NORTHWIND
CURSO:
TEORIA DEL DISEO DE BASE DE DATOS
AUTORES:
ING. JOS EDGAR GARCA DAZ
SAN JUAN PERU
2009
Guia Prctica: Consultas SQL utilizando la Base de Datos ejemplo Northwind
INDICE
Pag.
PRESENTACIN
BREVE REFERENCIA DE LA BD NORTHWIND
PRACTICA 01: CONSULTAS BASICAS
PRACTICA 02: CREACION DE TABLAS E INDICES
PRACTICA 03: SELECCION DE REGISTROS CRUZADAS
PRACTICA 04: SUB CONSULTAS
PRACTICA 05: PROCEDIMIENTOS ALMACENADOS
PRACTICA 06: TRIGGERS
PRACTICA 07: CURSORES
Ing. Jos Edgar. Garca Daz
2
3
5
7
11
13
16
18
21
24
Guia Prctica: Consultas SQL utilizando la Base de Datos ejemplo Northwind
PRESENTACION
El presente trabajo corresponde a un anlisis de la relacin que existe
entre las tablas de la Base de Datos Northwind la cual se adjunta como
Base de Datos Ejemplo con la instalacin de la versin del MS SQL
Server 2000, pero que puede ser utilizado con las distintas versiones de
este gestor de base de datos.
Las consultas que vamos a realizar nos servir para un adiestramiento
tcnico en la realizacin de consultas utilizando el Leguaje Transact y
podr ser aplicado por los alumnos del Curso de Teora del Diseo de
Base de Datos.
Ing. Jos Edgar. Garca Daz
3
Guia Prctica: Consultas SQL utilizando la Base de Datos ejemplo Northwind
Ing. Jos Edgar. Garca Daz
4
Guia Prctica: Consultas SQL utilizando la Base de Datos ejemplo Northwind
BREVE REFERENCIA DE LA BASE DE DATOS NORTHWIND
Qu es la Base de Datos Northwind?
La base de datos Northwind es una base de datos de ejemplo que
originalmente fue desarrollada para su uso con Microsoft Access. Es una
Base de Datos ms compleja que la otra base de datos ejemplo, Pubs, y tiene
un tamao de casi 4 Mb, y se utilizar para que el alumno adquiera la
experiencia y los conocimientos bsicos necesarios en la elaboracin de
consultas a Base de Datos.
La Base de Datos almacena los datos de un Sistema de Ventas de la
Empresa Northwind, y tambin comprende el manejo de Proveedores,
Clientes y Ciudades de origen de cada uno de ellos.
La Base de Datos Northwin est comprendido de las siguientes Tablas.
-
Products
Categories
Orders
Order Details
Employees
EmployeeTerritories
Territories
Region
Shippers
Suppliers
Customers
CustomerDemo
CustomerDemographics
Ing. Jos Edgar. Garca Daz
5
Guia Prctica: Consultas SQL utilizando la Base de Datos ejemplo Northwind
Modelo Entidad Relacin Northwind
Ing. Jos Edgar. Garca Daz
6
Guia Prctica: Consultas SQL utilizando la Base de Datos ejemplo Northwind
PRACTICA 01: CONSULTAS VARIAS
1. Seleccionar los primeros clientes utilizando la tabla CUSTOMERS
SOLUCION.
-- Para hacerlo utilizamos el comando TOP
SELECT TOP 2 * FROM CUSTOMERS
2. Concatenar los nombres y apellidos de los empleados utilizando la tabla
EMPLOYEES
SOLUCION.
-- Para hacerlo utilizamos la sintaxis + +
SELECT FIRSTNAME + ' ' + LASTNAME AS 'NOMBRE COMPLETO' FROM
EMPLOYEES
3. Seleccionar el Nombre del Producto y los Productos Suspendidos y No
Suspendidos utilizando la tabla PRODUCTS
SOLUCION.
-- Para hacerlo utilizamos la sintxis CASE WHEN THEN ELSE END
SELECT PRODUCTNAME, CASE WHEN DISCONTINUED=1 THEN 'SI' ELSE
'NO' END AS SUSPENDIDO
FROM PRODUCTS
Ing. Jos Edgar. Garca Daz
7
Guia Prctica: Consultas SQL utilizando la Base de Datos ejemplo Northwind
4. Seleccionar el Nombre del Producto y la cantidad de Productos Suspendidos
y No Suspendidos utilizando la tabla PRODUCTS
SOLUCION.
-- Para hacerlo utilizamos la sintxis SUM(CASE WHEN THEN ELSE END)
SELECT SUM(CASE WHEN DISCONTINUED=1 THEN 1 ELSE 0 END) AS
SUSPENDIDOS,
SUM(CASE WHEN DISCONTINUED=0 THEN 1 ELSE 0 END) AS 'NO
SUSPENDIDOS' FROM PRODUCTS
5. Seleccionar el Nombre del Producto, Precio Unitario y la Ganancia Obtenida
por producto utilizando la tabla PRODUCTS
SOLUCION.
-- Para hacerlo utilizamos la multiplicacin *
SELECT PRODUCTNAME, UNITPRICE, UNITSINSTOCK, UNITPRICE *
UNITSINSTOCK AS GANANCIA
FROM PRODUCTS
6. Seleccionar la cantidad productos existentes en la tabla PRODUCTS
SOLUCION.
-- Para hacerlo utilizamos el comando COUNT()
SELECT COUNT(*) FROM PRODUCTS
7. Seleccionar el precio promedio de los productos existentes en la tabla
PRODUCTS.
SOLUCION.
-- Para hacerlo utilizamos el comando AVG()
SELECT AVG(UNITPRICE) FROM PRODUCTS
Ing. Jos Edgar. Garca Daz
8
Guia Prctica: Consultas SQL utilizando la Base de Datos ejemplo Northwind
8. Seleccionar el precio mximo y mnimo de los productos existentes en la tabla
PRODUCTS
SOLUCION.
-- Para hacerlo utilizamos el comando MAX() y MIN()
SELECT MAX(UNITPRICE), MIN(UNITPRICE) FROM PRODUCTS
9. Seleccionar los pases a los que pertenece cada cliente utilizando la tabla
CUSTOMERS
SOLUCION.
-- Para hacerlo utilizamos el comando DISTINCT
SELECT DISTINCT COUNTRY FROM CUSTOMERS
10. Seleccionar la cantidad de clientes por pases utilizando la tabla
CUSTOMERS
SOLUCION.
-- Para hacerlo utilizamos la combinacin de DISTINCT y COUNT
SELECT DISTINCT COUNTRY, COUNT(COUNTRY) FROM CUSTOMERS
GROUP BY COUNTRY ORDER BY COUNT(COUNTRY) DESC
11. Seleccionar la cantidad de clientes por pases en la cual sea mayor de 5
clientes utilizando la tabla CUSTOMERS
SOLUCION.
-- Para hacerlo utilizamos el comando HAVING
SELECT DISTINCT COUNTRY, COUNT(COUNTRY) FROM CUSTOMERS
GROUP BY COUNTRY HAVING COUNT(COUNTRY) >= 5
ORDER BY COUNT(COUNTRY) DESC
Ing. Jos Edgar. Garca Daz
9
Guia Prctica: Consultas SQL utilizando la Base de Datos ejemplo Northwind
12. Mostrar la sumatoria de la ganancia obtenida del precio unitario y las
cantidades vendidas utilizando la tabla ORDER DETAILS
SOLUCION.
-- Para hacerlo utilizamos el comando WITH ROLLUP
SELECT ORDERID, SUM(UNITPRICE*QUANTITY) FROM [ORDER DETAILS]
GROUP BY
ORDERID WITH ROLLUP
13. Seleccionar el Codigo del Cliente y la fecha de pedido
SOLUCION.
-- Para hacerlo utilizamos el comando CONVERT(CHAR(),DATO,107)
SELECT CUSTOMERID, CONVERT(CHAR(12),ORDERDATE,107) FROM
ORDERS
14. Seleccionar las edades de los empleados desde la tabla EMPLOYEES
SOLUCION.
-- Para hacerlo utilizamos el comando DATEDIFF(YYYY, BIRTHDATE,
GETDATE())
SELECT FIRSTNAME + ' ' + LASTNAME AS 'NOMBRE COMPLETO',
DATEDIFF(YYYY, BIRTHDATE, GETDATE()) AS EDAD FROM EMPLOYEES
ORDER BY EDAD DESC
15. Comando para seleccionar la fecha actual y adicionar 30 das a la misma.
SOLUCION.
-- Para hacerlo utilizamos el comando DATEADD(DAY, 30, GETDATE())
SELECT DATEADD(DAY, 30, GETDATE())
Ing. Jos Edgar. Garca Daz
10
Guia Prctica: Consultas SQL utilizando la Base de Datos ejemplo Northwind
PRACTICA 02: CREACION DE TABLAS E INDICES
1.
En la Base de Datos Nortwind crear la tabla ALUMNOS, en la cual se
especifique los siguientes campos:
codigo --> Primary Key, Autonumrico
apellidos --> tipo carcter
nombres --> tipo carcter
fecha de nacimiento --> tipo fecha menor a fecha actual
dni --> tipo carcter de 0 a 9 por digito.
cuota --> tipo numrico con 120 por defecto
retirado --> tipo binario con 0 por defecto
SOLUCION.
-- Para hacerlo debemos especificar y hacer lo siguiente:
CREATE TABLE ALUMNOS
(CODIGO INT IDENTITY(1,1) PRIMARY KEY CLUSTERED,
APELLIDOS CHAR(25) NOT NULL,
NOMBRES CHAR(25) NOT NULL,
FNACIMIENTO DATETIME NOT NULL CHECK(FNACIMIENTO <= GETDATE()),
DNI CHAR(8) NULL CHECK(DNI LIKE '[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]'),
CUOTA NUMERIC(10,2) DEFAULT(120),
RETIRADO BIT NOT NULL DEFAULT(0)
)
2.
En la Base de Datos Nortwind crear la tabla NOTAS, en la cual se
especifique los sigiuentes campos:
idalumno --> Foreing Key, con referencia al campo codigo de la tabla alumno
nota1 --> tipo numrico con 0 por defecto y aceptacin slo hasta 20
nota2 --> tipo numrico con 0 por defecto y aceptacin slo hasta 20
promedio --> tipo numrico con la operacin por defecto
Ing. Jos Edgar. Garca Daz
11
Guia Prctica: Consultas SQL utilizando la Base de Datos ejemplo Northwind
SOLUCION.
-- Para hacerlo debemos hacer lo siguiente:
CREATE TABLE NOTAS
(IDALUMNO INT REFERENCES ALUMNOS(CODIGO),
NOTA1 NUMERIC(5,2) DEFAULT(0) CHECK(NOTA1 BETWEEN 0 AND 20),
NOTA2 NUMERIC(5,2) DEFAULT(0) CHECK(NOTA2 BETWEEN 0 AND 20),
PROMEDIO AS ((NOTA1+NOTA2)/2)
3.
Modificar la columna apellidos de la tabla ALUMNOS
SOLUCION.
-- Para hacerlo debemos hacer lo siguiente:
ALTER TABLE ALUMNOS
ALTER COLUMN APELLIDOS CHAR(35) NOT NULL
4.
Adicionar un check a la tabla ALUMNOS
SOLUCION.
-- Para hacerlo debemos hacer lo siguiente:
ALTER TABLE ALUMNOS WITH NOCHECK
ADD CONSTRAINT CHK_DNI CHECK(DNI LIKE '[0-9][0-9][0-9][0-9][0-9][0-9][0-9]
[0-9]')
5.
Crear un ndice utilizando el campo dni de la tabla ALUMNOS
SOLUCION.
-- Para hacerlo debemos hacer lo siguiente:
CREATE UNIQUE INDEX IDX_DNI ON ALUMNOS(DNI)
Ing. Jos Edgar. Garca Daz
12
Guia Prctica: Consultas SQL utilizando la Base de Datos ejemplo Northwind
PRACTICA 03: SELECCION DE REGISTROS CRUZADOS
1. Seleccionar la cantidad de clientes de determinados pases utilizando la tabla
CUSTOMERS
SOLUCION.
-- Para hacerlo utilizamos el comando IN()
SELECT DISTINCT COUNTRY, COUNT(COUNTRY) FROM CUSTOMERS
WHERE
COUNTRY IN ('Brazil', 'Argentina', 'USA') GROUP BY COUNTRY
ORDER BY COUNT(COUNTRY) DESC
2. Seleccionar los productos cuyos precios unitarios se encuentren en un
determinado rango, utilizando la tabla PRODUCTS
SOLUCION.
-- Para hacerlo utilizamos el comando BETWEEN AND
SELECT * FROM PRODUCTS WHERE UNITPRICE BETWEEN 50 AND 100
3. Seleccionar los productos que comienzen con la letra A C de la tabla
PRODUCTS
SOLUCION.
-- Para hacerlo utilizamos el comando LIKE '[A.C]%'
SELECT * FROM PRODUCTS WHERE PRODUCTNAME LIKE '[A.C]%'
4. Seleccionar las ordenes que se realizaron durante el ao 1998 utilizando la
tabla ORDERS
SOLUCION.
-- Para hacerlo utilizamos el comando DATEPART(YYYY, DATO_FECHA)
Ing. Jos Edgar. Garca Daz
13
Guia Prctica: Consultas SQL utilizando la Base de Datos ejemplo Northwind
SELECT * FROM ORDERS WHERE DATEPART(YYYY, ORDERDATE) = 1998
5. Seleccionar las ordenes que se realizaron durante los cuatro trimestres del
ao 1997 utilizando la tabla ORDERS
SOLUCION.
-- Para hacerlo utilizamos el comando DATEPART(QQ, DATO_FECHA)
SELECT DATEPART(QQ, ORDERDATE) AS TRIMESTRE, COUNT(*) FROM
ORDERS
WHERE DATEPART(YEAR,ORDERDATE)=1997 GROUP BY
DATEPART(QQ,ORDERDATE)
6. Mostrar un reporte de referencia cruzada con las ventas por aos y
meses(columnas) utilizando la tabla ORDERS
SOLUCION.
-- Para hacerlo primero debemos crear una tabla llamada #TEMPO de la siguiente
manera:
SELECT DATEPART(YEAR,[Link]) AS AO,
DATEPART(MONTH,[Link]) AS MES,
SUM([Link]*[Link]) AS MONTO
INTO #TEMPO
FROM ORDERS O
INNER JOIN [ORDER DETAILS] OD
ON [Link]=[Link]
GROUP BY
DATEPART(YEAR,[Link]),DATEPART(MONTH,[Link])
-- Luego debemos consultar a la tabla #TEMPO de la siguiente manera:
SELECT AO,STR(SUM(CASE WHEN MES=1 THEN MONTO ELSE 0
END),10,2) ENERO,
STR(SUM(CASE WHEN MES=2 THEN MONTO ELSE 0 END),10,2) FEBRERO,
STR(SUM(CASE WHEN MES=3 THEN MONTO ELSE 0 END),10,2) MARZO,
STR(SUM(CASE WHEN MES=4 THEN MONTO ELSE 0 END),10,2) ABRIL,
STR(SUM(CASE WHEN MES=5 THEN MONTO ELSE 0 END),10,2) MAYO,
STR(SUM(CASE WHEN MES=6 THEN MONTO ELSE 0 END),10,2) JUNIO,
Ing. Jos Edgar. Garca Daz
14
Guia Prctica: Consultas SQL utilizando la Base de Datos ejemplo Northwind
STR(SUM(CASE WHEN MES=7 THEN MONTO ELSE 0 END),10,2) JULIO,
STR(SUM(CASE WHEN MES=8 THEN MONTO ELSE 0 END),10,2) AGOSTO,
STR(SUM(CASE WHEN MES=9 THEN MONTO ELSE 0 END),10,2)
SETIEMBRE,
STR(SUM(CASE WHEN MES=10 THEN MONTO ELSE 0 END),10,2) OCTUBRE,
STR(SUM(CASE WHEN MES=11 THEN MONTO ELSE 0 END),10,2)
NOVIEMBRE,
STR(SUM(CASE WHEN MES=12 THEN MONTO ELSE 0 END),10,2)
DICIEMBRE
FROM #TEMPO
GROUP BY AO
Ing. Jos Edgar. Garca Daz
15
Guia Prctica: Consultas SQL utilizando la Base de Datos ejemplo Northwind
PRACTICA 04: SUB CONSULTAS
1. Utilizando sub consultas seleccionar el nmero de orden y el total por orden.
SOLUCION.
-- Para hacerlo realizamos lo siguiente:
SELECT [Link], [Link] AS TOTAL FROM ORDERS O
INNER JOIN (SELECT [Link], SUM([Link] * [Link])
ST FROM [ORDER DETAILS] OD
GROUP BY [Link]) AS OD ON [Link] = [Link]
2. Utilizando sub consulta seleccionar los clientes que s efectuaron compras
SOLUCION.
-- Para hacerlo realizamos lo siguiente:
SELECT * FROM CUSTOMERS
WHERE CUSTOMERID IN (SELECT DISTINCT CUSTOMERID FROM ORDERS)
3. Seleccionar el monto de Venta Agrupado por Ao y Trimestre utilizando las
tablas ORDERS y ORDER DETAILS
SOLUCION.
-- Para hacerlo primero debemos crear una tabla llamada ventas de la siguiente
manera:
SELECT DATEPART(YEAR, [Link]) AS AO,
DATEPART(QUARTER, [Link]) AS TRIMESTRE,
SUM([Link] * [Link]) AS MONTOVENTA
INTO VENTAS FROM ORDERS O
INNER JOIN [ORDER DETAILS] OD ON [Link] = [Link]
GROUP BY DATEPART(YEAR,[Link]), DATEPART(QUARTER,
[Link])
Ing. Jos Edgar. Garca Daz
16
Guia Prctica: Consultas SQL utilizando la Base de Datos ejemplo Northwind
-- Luego debemos consultar a la tabla ventas de la siguiente manera:
SELECT V1.*, (V1.T1+V1.T2+V1.T3+V1.T4) TOTAL
FROM (SELECT AO,
SUM(CASE WHEN TRIMESTRE=1 THEN MONTOVENTA ELSE 0 END) T1,
SUM(CASE WHEN TRIMESTRE=2 THEN MONTOVENTA ELSE 0 END) T2,
SUM(CASE WHEN TRIMESTRE=3 THEN MONTOVENTA ELSE 0 END) T3,
SUM(CASE WHEN TRIMESTRE=4 THEN MONTOVENTA ELSE 0 END) T4
FROM VENTAS GROUP BY AO WITH ROLLUP) V1
Ing. Jos Edgar. Garca Daz
17
Guia Prctica: Consultas SQL utilizando la Base de Datos ejemplo Northwind
PRACTICA 05: PROCEDIMIENTOS ALMACENADOS
1.
Crear un Procedimiento Almacenado para Insertar un proveedor y que
devuelva el codigo que le asigno al registro.
SOLUCION.
-- Para hacerlo realizamos lo siguiente:
CREATE PROCEDURE INSPROVEEDOR_SP
@COMPANYNAME CHAR(40)='',
@CONTACTNAME CHAR(30)='',
@CONTACTITLE CHAR(30)='',
@ADDRESS CHAR(60)='',
@CITY CHAR(15)='',
@REGION CHAR(15)='',
@POSTALCODE CHAR(10)='',
@COUNTRY CHAR(15)='',
@PHONE CHAR(24)='',
@FAX CHAR(24)='',
@HOMEPAGE TEXT,
@CODIGO INTEGER OUTPUT
AS
INSERT INTO SUPPLIERS
VALUES(@COMPANYNAME,@CONTACTNAME,@CONTACTITLE,@ADDRESS
,@CITY,@REGION,
@POSTALCODE,@COUNTRY,@PHONE,@FAX,@HOMEPAGE)
SELECT @@IDENTITY as CodigoProveedor
-- EJECUCION:
--------DECLARE @CODIGO INTEGER
EXEC INSPROVEEDOR_SP 'TORRES CIA','JULIO TORRES
DIAZ','Administrador','Pizarro 920','Trujillo','La Libertad','044','Peru','044
930282','044 930282','[Link]',@CODIGO OUT
Ing. Jos Edgar. Garca Daz
18
Guia Prctica: Consultas SQL utilizando la Base de Datos ejemplo Northwind
2.
Crear un Procedimiento Almacenado para actualizar los datos de un
producto
SOLUCION.
-- Para hacerlo realizamos lo siguiente:
CREATE PROCEDURE ACTPRODUC_SP
@CODIGO INTEGER=0,
@PRODUCTNAME CHAR(40)='',
@SUPPLIERID INTEGER=0,
@CATEGORYID INTEGER=0,
@QUANTITYPERUNIT CHAR(20)='',
@UNITPRICE MONEY=0,
@UNITSINSTOCK SMALLINT=0,
@UNITSONORDER SMALLINT=0,
@REORDERLEVEL SMALLINT=0,
@DISCONTINUED BIT=0
AS
UPDATE PRODUCTS
SET
PRODUCTNAME=@PRODUCTNAME,
SUPPLIERID=@SUPPLIERID,
CATEGORYID=@CATEGORYID,
QUANTITYPERUNIT=@QUANTITYPERUNIT,
UNITPRICE=@UNITPRICE,
UNITSINSTOCK=@UNITSINSTOCK,
UNITSONORDER=@UNITSONORDER,
REORDERLEVEL=@REORDERLEVEL,
DISCONTINUED=@DISCONTINUED
WHERE PRODUCTID=@CODIGO
SELECT * FROM PRODUCTS WHERE PRODUCTID=@CODIGO
-- EJECUCION:
--------EXEC ACTPRODUC_SP 77,'Vino Peruano',15,4,'500 ml',40,15,1,5,0
Ing. Jos Edgar. Garca Daz
19
Guia Prctica: Consultas SQL utilizando la Base de Datos ejemplo Northwind
3.
Crear un Procedimiento Almacenado para Eliminar un registro de la tabla
CUSTOMERS.
SOLUCION.
-- Para hacerlo realizamos lo siguiente:
CREATE PROCEDURE ELIMCLIENTE_SP
@CODIGO CHAR(5)
AS
DELETE FROM CUSTOMERS
WHERE CUSTOMERID=@CODIGO
---EJECUCION:
--------SELECT * FROM CUSTOMERS
EXEC ELIMCLIENTE_SP 'ALFKI'
Ing. Jos Edgar. Garca Daz
20
Guia Prctica: Consultas SQL utilizando la Base de Datos ejemplo Northwind
PRACTICA 06: TRIGGERS
1. Crear un Trigger para las actualizaciones realizadas a la tabla CUSTOMERS
identificando al usuario que lo realiz en una tabla USUARIOS
SOLUCION.
-- Para hacerlo primero debemos crear una tabla llamada USUARIOS con los
campos Usuario, Fecha, Programa y Pc para acumular la informacin
SOLUCIONicitada y luego realizar lo siguiente:
CREATE TRIGGER INGRESAR_USUARIO ON CUSTOMERS
FOR UPDATE
AS
INSERT INTO USUARIOS
VALUES (SUSER_SNAME(),
GETDATE(),
APP_NAME(),
HOST_NAME())
Crear un Trigger para las actualizaciones realizadas en la tabla
CUSTOMERS y actualizar los datos del usuario que lo realiz
en la tabla USUARIOS
SOLUCION.
-- Para hacerlo tenemos dos alternativas realizando lo siguiente:
-- Primera alternativa de SOLUCIONucin:
CREATE TRIGGER MODIFICAR_USUARIO ON CUSTOMERS
FOR UPDATE
AS
DECLARE @CODIGO INT
SELECT @CODIGO = [Link] FROM DELETED
UPDATE USUARIO
SET USUARIO = SUSER_SNAME(),
FECHA = GETDATE(),
Ing. Jos Edgar. Garca Daz
21
Guia Prctica: Consultas SQL utilizando la Base de Datos ejemplo Northwind
PROGRAMA = APP_NAME()
WHERE CODIGO = @CODIGO
-- Segunda alternativa de SOLUCIONucin:
CREATE TRIGGER MODIFICAR ON CUSTOMERS
FOR UPDATE
AS
UPDATE CLIENTE
SET USUARIO = SUSER_SNAME(),
FECHA = GETDATE(),
PROGRAMA = APP_NAME(),
PC = HOST_NAME()
FROM CLIENTE INNER JOIN DELETED
ON [Link] = [Link]
2. Crear un Trigger para registrar un Historial de las inserciones, modificaciones
y eliminaciones realizadas en la tabla CUSTOMERS
-- Para hacerlo realizamos lo siguiente:
CREATE TRIGGER T_HISTORIA ON CUSTOMERS
FOR INSERT, UPDATE, DELETE
AS
INSERT INTO TUS_CLIENTES
VALUES('INSERCION',GETDATE(),SUSER_SNAME(),'ACTUALIZACION')
3. Activar y Desactivar los Triggers existentes para una determinada tabla:
SOLUCION.
-- Primera activar:
ALTER TABLE CLIENTE ENABLE TRIGGER CLIENTES
-- Primera desactivar:
ALTER TABLE CLIENTE DISABLE TRIGGER CLIENTES
Ing. Jos Edgar. Garca Daz
22
Guia Prctica: Consultas SQL utilizando la Base de Datos ejemplo Northwind
4. Crear un Trigger para actualizar el campo freight de la tabla ORDERS con
el 10% de la sumatoria de la multiplicacin de los campos quantity y
unitprice de las ventas del pedido.
SOLUCION.
-- Para hacerlo realizamos lo siguiente:
CREATE TRIGGER TU_DETALLE ON ORDERS
FOR UPDATE
AS
DECLARE @ST NUMERIC(12,2),
@CODIGO INT
SELECT @CODIGO = [Link] FROM DELETED
SELECT @ST = SUM(QUANTITY * UNITPRICE) FROM ORDENES
WHERE ORDERID = @CODIGO
UPDATE ORDEN
SET FREIGHT = @ST*0.1
WHERE ORDERID = @CODIGO
5. Crear un Trigger para las registrar los empleados modificados de la tabla
EMPLOYEES registrandolos en una tabla Auditoria
SOLUCION.
-- Para hacerlo primero debemos crear una tabla llamada Auditoria con los
campos Codigo, Nombre, Apellido, Fecha y Usuario para acumular la
informacin SOLUCIONicitada y luego realizar lo siguiente:
CREATE TRIGGER T_EMPLOYEE ON EMPLOYEES
FOR UPDATE
AS
IF (COLUMNS_UPDATED() & 128) IS NOT NULL
INSERT INTO AUDITORIA
SELECT [Link], [Link],
[Link], GETDATE(), SUSER_SNAME() FROM DELETED
Ing. Jos Edgar. Garca Daz
23
Guia Prctica: Consultas SQL utilizando la Base de Datos ejemplo Northwind
PRACTICA 07: CURSORES
1. Crear un Cursor para actualizar todas las filas del campo freight de la tabla
ORDER DETAILS con el 10% de la sumatoria de la multiplicacin de los
campos quantity y unitprice de las ventas del pedido.
-- Para hacerlo realizamos lo siguiente:
DECLARE CUR_PEDIDOS CURSOR FOR
SELECT ORDERID FROM ORDERS
DECLARE @NRO_PEDIDO INT, @ST NUMERIC(16,2)
OPEN CUR_PEDIDOS
FETCH NEXT FROM CUR_PEDIDOS
INTO @NRO_PEDIDO
WHILE @@FETCH_STATUS = 0
BEGIN
SELECT @ST = SUM(QUANTITY * UNITPRICE)
FROM [ORDER DETAILS]
WHERE ORDERID = @NRO_PEDIDO
UPDATE ORDERS
SET FREIGHT = @ST * 0.1
WHERE ORDERID = @NRO_PEDIDO
FETCH NEXT FROM CUR_PEDIDOS
INTO @NRO_PEDIDO
END
CLOSE CUR_PEDIDOS
DEALLOCATE CUR_PEDIDOS
2. Crear un Cursor para actualizar todas las filas del campo freight de la tabla
ORDER DETAILS con la sumatoria de la multiplicacin de los campos
quantity y unitprice nemos el descuento correspondientes de las ventas del
pedido.
SOLUCION.
-- Para hacerlo realizamos lo siguiente:
DECLARE CUR_PEDIDOS CURSOR FOR
Ing. Jos Edgar. Garca Daz
24
Guia Prctica: Consultas SQL utilizando la Base de Datos ejemplo Northwind
SELECT ORDERID FROM ORDERS
DECLARE @NRO_PEDIDO INT, @ST NUMERIC(16,2),
@VENTAS NUMERIC(16,2)
OPEN CUR_PEDIDOS
FETCH NEXT FROM CUR_PEDIDOS
INTO @NRO_PEDIDO
WHILE @@FETCH_STATUS = 0
BEGIN
DECLARE CUR_VENTAS CURSOR FOR
SELECT QUANTITY * UNITPRICE * (1-DISCOUNT)
FROM [ORDER DETAILS]
WHERE ORDERID = @NRO_PEDIDO
SELECT @ST = 0
OPEN CUR_VENTAS
FETCH NEXT FROM CUR_VENTAS
INTO @VENTAS
WHILE @@FETCH_STATUS = 0
BEGIN
SELECT @ST = @ST + @VENTAS
FETCH NEXT FROM CUR_VENTAS
INTO @VENTAS
END
CLOSE CUR_VENTAS
DEALLOCATE CUR_VENTAS
UPDATE ORDERS
SET FREIGHT = @ST
WHERE ORDERID = @NRO_PEDIDO
FETCH NEXT FROM CUR_PEDIDOS
INTO @NRO_PEDIDO
END
CLOSE CUR_PEDIDOS
DEALLOCATE CUR_PEDIDOS
Ing. Jos Edgar. Garca Daz
25
Guia Prctica: Consultas SQL utilizando la Base de Datos ejemplo Northwind
3. Crear un Cursor para mostrar las ventas efectuadas por cada empleado
SOLUCION.
-- Para hacerlo primero debemos crear una tabla temporal llamada Ventas en el
mismo cursor con los campos ID_Empleado, Empleado y Ventas para ir
acumulando la informacin solicitada y debemos realizar lo siguiente:
DECLARE CUR_EMPLEADOS CURSOR FOR
SELECT EMPLOYEEID, LASTNAME + '' + FIRSTNAME
FROM EMPLOYEES
OPEN CUR_EMPLEADOS
CREATE TABLE #VENTAS(ID_EMPLEADO INT, EMPLEADO CHAR(50),
VENTAS NUMERIC(12,2))
DECLARE @ID_EMPLEADO INT, @EMPLEADO CHAR(50),
@VENTAS NUMERIC(12,2)
FETCH NEXT FROM CUR_EMPLEADOS
INTO @ID_EMPLEADO, @EMPLEADO
WHILE @@FETCH_STATUS = 0
BEGIN
SELECT @VENTAS=SUM([Link] * [Link])
FROM ORDERS AS O INNER JOIN [ORDER DETAILS] AS OD
ON [Link] = [Link]
WHERE EMPLOYEEID = @ID_EMPLEADO
INSERT INTO #VENTAS
VALUES(@ID_EMPLEADO, @EMPLEADO, @VENTAS)
FETCH NEXT FROM CUR_EMPLEADOS
INTO @ID_EMPLEADO, @EMPLEADO
END
CLOSE CUR_EMPLEADOS
DEALLOCATE CUR_EMPLEADOS
SELECT * FROM #VENTAS
DROP TABLE #VENTAS
Ing. Jos Edgar. Garca Daz
26
Guia Prctica: Consultas SQL utilizando la Base de Datos ejemplo Northwind
Ing. Jos Edgar. Garca Daz
27