Ejercicios Resueltos (SQL SERVER) PARTE 1 :
Consultas
------------------------------------------------------------------------CREATE DATABASE BANCO GO USE BANCO GO CREATE TABLE CLIENTE (IDCLIENTE VARCHAR(5)PRIMARY KEY, APELLIDOS VARCHAR(30), NOMBRES VARCHAR(30)) GO CREATE TABLE CUENTA (IDCLIENTE VARCHAR(5), IDCUENTA VARCHAR(5)PRIMARY KEY, SALDO FLOAT, DIVISA VARCHAR(20)) GO CREATE TABLE MOVIMIENTO (IDCUENTA VARCHAR(5), IDMOVIMIENTO VARCHAR(5)PRIMARY KEY, TIPO VARCHAR(2), MONTO FLOAT, FECHA DATETIME) GO ALTER TABLE CUENTA ADD FOREIGN KEY(IDCLIENTE) REFERENCES CLIENTE GO ALTER TABLE MOVIMIENTO ADD FOREIGN KEY(IDCUENTA) REFERENCES CUENTA GO --Según el Modelo Realice las Siguientes Preguntas --1A --Consultar las Cuentas de los clientes cuyo Apellido empiece por A SELECT B.APELLIDOS + ',' + B.NOMBRES AS CLIENTE, A.IDCUENTA, A.SALDO FROM CUENTA A INNER JOIN CLIENTE B ON A.IDCLIENTE = B.IDCLIENTE WHERE B.APELLIDOS LIKE 'A%' --1B–Consultar todo los Movimientos de las Cuentas en Divisa EURO del Cliente cuyos Apellidos es PEREZ SELECT A.IDCUENTA, C.FECHA, C.MONTO, TIPO = CASE C.TIPO WHEN 'D' THEN 'DE POSITO' WHEN 'R'THEN 'RETIRO' WHEN 'T' THEN 'TRANSFERENCIA' END FROM CUENTA A INNER JOIN CLIENTE B ON A.IDCLIENTE = B.IDCLIENTE INNER JOIN MOVIMIENTO C ON A.IDCUENTA = C.IDCUENTA WHERE A.DIVISA ='EUROS'AND B.APELLIDOS = 'PEREZ' ORDER BY C.FECHA DESC --1C– Consultar todo los movimientos de las Cuentas del Cliente PEREZ en EUROS (Aunque tenga cuentas en otras divisas) Ordenados por el numero de Cuenta
SELECT C.NOMBRES, C.APELLIDOS, CU.IDCUENTA, CU.SALDO, CU.DIVISA, M.IDMOVI MIENTO, M.MONTO,M.TIPO FROM CLIENTE C INNER JOIN CUENTA CU ON C.IDCLIENTE = CU.IDCLIENTE INNER JOIN MOVIMIENTO M ON CU.IDCUENTA = M.IDCUENTA WHERE C.APELLIDOS = 'PEREZ' ORDER BY CU.IDCUENTA --1D –Consultar las Divisas que no tengan ninguna Cuenta Asociada SELECT B.IDCLIENTE, B.APELLIDOS, B.NOMBRES, A.IDCUENTA, A.DIVISA FROM CUENTA A INNER JOIN CLIENTE B ON A.IDCLIENTE = B.IDCLIENTE INNER JOIN MOVIMIENTO C ON A.IDCUENTA = A.IDCUENTA WHERE A.DIVISA = 'SIN CUENTA' --1E –Consultar los Movimientos de Ingreso de PEREZ y los Movimientos de Traspaso de RODRIGUEZ SELECT A.IDCUENTA, C.FECHA, C.MONTO, C.TIPO FROM CUENTA A INNER JOIN CLIENTE B ON A.IDCLIENTE = B.IDCLIENTE INNER JOIN MOVIMIENTO C ON A.IDCUENTA = A.IDCUENTA WHERE C.TIPO = 'DEPOSITO' AND B.APELLIDOS = 'PEREZ' OR C.TIPO = 'TRANSACCIONES' AND B.APELLIDOS = 'RODRIGUEZ' ORDER BY C.FECHA DESC --1F –CREAR UNA FUNCION QUE RETORNE SI UN CLIENTE ES MOROSO CREATE FUNCTION MOROSO(@FECHAPAGO DATETIME) RETURNS VARCHAR(20) AS BEGIN DECLARE @FECHACLIENTE DATETIME DECLARE @MENSAJE VARCHAR(20) SELECT @FECHACLIENTE = FECHA FROM MOVIMIENTO WHERE TIPO = 'DEPOSITO' IF MONTH(@FECHACLIENTE) < MONTH(@FECHAPAGO) SET @MENSAJE = 'EL CLIENTE ES MOROSO' RETURN @MENSAJE END --DEMO SELECT dbo.MOROSO ('15/02/2011')
PARTE 2 :
Creacion de Objetos - Tablas
-------------------------------------------------------------------------2A--CREACION DE TABLAS GO CREATE DATABASE EMPRESA GO USE EMPRESA GO CREATE TABLE EMPLEADOS (ID INT NOT NULL IDENTITY, DOCUMENTO VARCHAR(30) NOT NULL, APELLIDO VARCHAR(30) NOT NULL, NOMBRE VARCHAR(30) NOT NULL, SECCION VARCHAR(20) NOT NULL,
SUELDO FLOAT NULL, FECHAINGRESO DATETIME NULL) GO CREATE TABLE CONTROLES (USUARIO VARCHAR(5), FECHA DATETIME) GO ------------------------------------------------------------------------CREATE TABLE COPIAEMPLEADOS (ID INT NOT NULL, DOCUMENTO VARCHAR(30) NOT NULL, APELLIDO VARCHAR(30) NOT NULL, NOMBRE VARCHAR(30) NOT NULL, SECCION VARCHAR(20) NOT NULL, SUELDO FLOAT NULL, FECHAINGRESO DATETIME NULL) GO CREATE TRIGGER TRG_COPIAEMPLEADOS ON EMPLEADOS FOR INSERT AS BEGIN INSERT INTO COPIAEMPLEADOS SELECT * FROM INSERTED END GO --2B—INGRESAR REGISTROS INSERT INTO EMPLEADOS VALUES ('22999000','CORDOVA','WLIMER','SISTEMAS',680,'24/1 0/2005') INSERT INTO EMPLEADOS VALUES ('22333444','ACOSTA','ANA','SECRETARIA',500,'05/05/ 2000') INSERT INTO EMPLEADOS VALUES ('22777888','CORDOVA','DANIELA','SECRETARIA',560,'2 5/08/2006') GO --DEMO SELECT * FROM EMPLEADOS SELECT * FROM COPIAEMPLEADOS
--PARTE 3 -- Creacion de Procedimientos Almacenados --3A—Incrementar Sueldo de los Empleados con mas de 3 Años de Servicio a un 20% mas GO CREATE PROCEDURE USP_EMPLEADOS_AUMENTARSUELDO AS DECLARE @FECHA DATETIME DECLARE @DIF TINYINT SELECT @FECHA = FECHAINGRESO FROM EMPLEADOS SET @DIF = YEAR(GETDATE()) - YEAR(@FECHA) IF MONTH(GETDATE()) < MONTH(@FECHA) SET @DIF = @DIF - 1 IF MONTH(GETDATE()) = MONTH(@FECHA) AND DAY(GETDATE()) < DAY(@FECHA) SET @DIF = @DIF - 1
IF (@DIF> = 3) UPDATE EMPLEADOS SET SUELDO = (SUELDO + (SUELDO * 0.20)) GO --EJECUTAR SOLO UNA VEZ EXECUTE USP_EMPLEADOS_AUMENTARSUELDO GO --VERIFICANDO SELECT * FROM EMPLEADOS --------------------------------------------------------------------------3B—Procedimiento que Permite Almacenar valores nulos en los Campos SUELDO Y FECHADEINGRESO GO CREATE PROCEDURE USP_EMPLEADOSINGRESAR @DOCUMENTO VARCHAR(30), @APELLIDO VARCHAR(30), @NOMBRE VARCHAR(30), @SECCION VARCHAR(20) AS BEGIN INSERT INTO EMPLEADOS VALUES (@DOCUMENTO,@APELLIDO,@NOMBRE,@SECCION,NULL,NULL) END GO --DEMO EXECUTE USP_EMPLEADOSINGRESAR '22777889','DURAND','DANY','SECRETARIA' GO --VERIFICANDO SELECT * FROM EMPLEADOS -----------------------------------------------------------------------3C—Procedimiento que Permite Realizar BACKUP a la Base de Datos EMPRESA GO CREATE PROCEDURE COPIADATABASE AS BACKUP DATABASE EMPRESA TO DISK = 'F:\\BACKUP.bak' WITH INIT GO --DEMO EXECUTE COPIADATABASE GO
--PARTE 4—CREACION DE DISPARADORES --------------------------------------------------------------------------4A -- DISPARADOR QUE REGISTRA EL USUARIO Y LA FECHA EN LA QUE SE REALIZA UN INSERT EN LA TABLA EMPLEADOS Y LOS ALMACENA EN LA TABLA CONTROLES GO CREATE TRIGGER TRG_CONTROLES ON EMPLEADOS FOR INSERT AS INSERT INTO CONTROLES VALUES (Suser_Name(),GETDATE()) GO --DEMO INSERT INTO EMPLEADOS VALUES ('22777899','GONZALES','LUIS','SECRETARIA',560,'25/ 08/2008') GO SELECT * FROM CONTROLES
--------------------------------------------------------------------------4B – DESENCADENADOR QUE DESCUENTA LA EXISTENCIA DE LA TABLA PRODUCTOS SEGUN EL PEDIDO GO CREATE DATABASE ALMACEN GO USE ALMACEN GO CREATE TABLE PRODUCTOS (ID_PRODUCTO CHAR(8) PRIMARY KEY NOT NULL, NOMBREPRODUCTO VARCHAR(25) NOT NULL, EXISTENCIA INT NULL, PRECISO DECIMAL(10,2) NOT NULL, PRECIOVENTA DECIMAL (10,2)) GO CREATE TABLE PEDIDO (ID_PEDIDO INT IDENTITY, ID_PRODUCTO CHAR(8) NOT NULL, CANTIDAD_PEDIDO INT CONSTRAINT PK_ID_PRODUCTO FOREIGNKEY (ID_PRODUCTO)REFERENCES PRODUCTOS(ID _PRODUCTO)) GO --DESENCADENADOR CREATE TRIGGER TRG_PEDIDO_ARTICULOS ON PEDIDO FOR INSERT AS UPDATE PRODUCTOS SET EXISTENCIA = EXISTENCIA (SELECT CANTIDAD_PEDIDO FROM INSERTED) WHERE ID_PRODUCTO = (SELECT ID_PRODUCTO FROM INSERTED) GO INSERT INTO PRODUCTOS VALUES('P001','FILTROS PANTALLA',5,10,12.5) INSERT INTO PRODUCTOS VALUES('P002','PARLATES',7,10,11.5) INSERT INTO PRODUCTOS VALUES('P003','MAUSE',8,4.5,6) GO --DEMO INSERT INTO PEDIDO VALUES('P003',5) --VERIFICANDO SELECT * FROM PRODUCTOS SELECT * FROM PEDIDO
----- Vistas---Una vista es una consulta especial que se emplea para registrar selecciones complejas o que se usan frecuentemente. Una vez creada la vista se puede realizar una selección de los datos como si fuera esta una tabla e incluso se puede utilizar para definir procedimientos almacenados.
EJEMPLOS : 1. Crear una vista que liste 3 campos de clientes
create view v_listaclientes as select IdCliente,NombreCompañía,País from Clientes go
nota: paraejecutarla vista se hacelo siguiente
select * from v_listaclientes go
2. Crear una vista que muestre el subtotal de los pedidos create view v_subtotal as select IdPedido,SUM(d.PrecioUnidad * Cantidad * (1-d.Descuento ))as Subtotal from DetallesDepedidos d inner join Productos p on d.IdProducto=p.IdProducto group by IdPedido go
select * from v_subtotal go
3.
Crear una vista liste NombreProducto,NombreCategoría,PrecioUnidad,Suspendido
que
create view v_productos as select NombreProducto,NombreCategoría,PrecioUnidad,Suspendido from Productos p inner join Categorías c on p.IdCategoría =c.IdCategoría go
select * from v_productos order by NombreCategoría,NombreProducto go
4. Utilizando la vista anterior , crear una vista que muestre el total de productos x categoria create view total_prodxcateg as select NombreCategoría,COUNT(*)as Totalprodxcateg from v_productos group by NombreCategoría go
select * from total_prodxcateg
5. Crear una vista que nos devuelva la cantidad de pedidos que tiene cada empleado en los ---años 94,95 y 96
create view v_cant_pedidos as select Nombre,(Select COUNT (*)from v_empleado e where e.Nombre=c.Nombre and YEAR(FechaPedido)=1994) as Año_1994, (select COUNT(*)from v_empleado YEAR(FechaPedido)=1995)as Año_1995, (select COUNT(*)from v_empleado YEAR(FechaPedido)=1996)as Año_1996
e
e
where
where
e.Nombre=c.Nombre
e.Nombre
=c.Nombre
from v_empleado c group by Nombre
select * from v_cant_pedidos
6. Crear una vista que presente el total de pedido que tiene cada compañia de envio
create view v_totalpedidos as select NombreCompañía,COUNT(*)as Total_Pedidos from v_compañia group by NombreCompañía go
select * from v_totalpedidos
and
and
-- Combinaciónde Tablas-----
1 . CombinaciónInternade Tablas
Hay 2 formas de hacerlo: Para este caso lo voy hacer con la tabla Productos y Categorìas
- Primera Forma : (INNER JOIN)
SELECT NOMBRECATEGORÍA,NOMBREPRODUCTO FROM Productos P INNER JOIN Categorías C ON P.IdCategoría =C.IdCategoría GO
-Segunda Forma : (WHERE)
SELECT NOMBRECATEGORÍA,NOMBREPRODUCTO FROM Productos P , Categorías C WHERE P.IdCategoría =C.IdCategoría GO
2. CombinaciónExternade Tablas -- IZQUIERDA---> LISTA TODAS LOS PRODUCTOS QUE NO TIENEN CATEGORÍAS SELECT NOMBRECATEGORÍA,NOMBREPRODUCTO FROM Productos P LEFTOUTERJOIN Categorías C ON P.IdCategoría =C.IdCategoría GO ---DERECHA---> LISTA TODAS LA CATEGORÍAS QUE NO TIENES PRODUCTOS SELECT NOMBRECATEGORÍA,NOMBREPRODUCTO FROM Productos P RIGHTOUTERJOIN Categorías C ON P.IdCategoría =C.IdCategoría GO ---- COMPLETA----> LISTA TODOS LOS PRODUCTOS CON SUS CATEGORÍAS, PRODUCTOS QUE NO TIENE CATEGORÍAS Y LAS CATEGORIAS QUE NO TIENEN PRODUCTOS SELECT NOMBRECATEGORÍA,NOMBREPRODUCTO FROM Productos P FULLOUTERJOIN Categorías C
ON P.IdCategoría =C.IdCategoría GO
---- CREACIONDE BASEDE DATOS---Creamos la base de datos llamada ventas
create database ventas go use ventas go
Para crear la tabla tienda preguntamos si existe, si existe la borramos y la creamos para evitar errores al momento de ejecutar varias veces
if exists(select * from sysobjects where type ='u' and name ='Tienda') drop table Tienda go create table Tienda ( IdTienda int identity(1,1)primarykey, NombreTienda varchar(30) not null, Estado varchar(10)not null) go nota: - estoy estableciendo que el campo IdTienda es llave primaria - estoy estableciendo que el campo NombreTienda tiene que ser llenado obligatoriamente al momento de ingresar un nuevo registro
Creamos la tabla TiendaProducto
if exists(select * from sysobjects where type='u' and name ='TiendaProducto') drop table TiendaProducto go create table TiendaProducto ( IdTienda int not null, IdProducto int not null, Cantidad int ) go -estoyasignandodos llavesprimariasa la tabla TiendaProducto alter table TiendaProducto add constraint pk_TiendaProducto primary key(IdTienda,IdProducto) -estoyrelacionandoel campoIdTiendaque es llaveprimariaconel campoIdTiendade la tablaTienda alter table TiendaProducto add constraint fk_TiendaProducto foreign key(IdTienda) references Tienda(IdTienda) -estoyrelacionandoel campoIdProductoque es llave primariaconel campo IdProducto de la tabla Producto alter table TiendaProducto add constraint fk_TiendaProduct foreign key(IdProducto) references Producto(IdProducto)
Creamos la tabla Producto
if exists(select * from sysobjects where type='u' and name ='Producto') drop table Producto go create table Producto ( IdProducto int identity(1,1)primary key, NombreProducto char(30) not null, Precio Money not null) go
Creamos la tabla Empleado if exists(select * from sysobjects where type='u' and name ='Empleado') drop table Empleado go create table Empleado ( IdEmpleado int identity(1,1)primary key, Nombres char(30) not null, Apellidos varchar(30)not null, -relacionoel campoIdTiendade EmpleadoconIdTiendade Tienda IdTienda int foreign key references Tienda(IdTienda)) go
Estas lineas de código es para generar el diagrama de tablas relacionadas exec sp_dbcmptlevel 'ventas','90'; alter authorization on database ::ventas to Sa exec sp_dbcmptlevel 'ventas','90'; go
---- SUBCONSULTAS---Una subconsulta es una consulta dentro de otra que se puede emplear para obtener totales y selección de datos de tablas anidadas
EJEMPLOS: ---CONTARA LOSCLIENTESDE UN DETERMINADOPAÍS--select distinct País ,(select COUNT(*) from Clientes c2 where c2.País =c1.País) as total_clientes from Clientes c1 order by País go ---SUMAEL PRECIODE UNACATEGORÍADE PRODUCTOS--select Nombrecategoría,(select SUM(PrecioUnidad)from Productos p
where p.IdCategoría = c.IdCategoría )as Suma_PrecioUnidad from Categorías c go ---CUENTALOSPEDIDOSDELCLIENTE--select NombreCompañía ,(select COUNT(*)from Pedidos p where p.IdCliente=c.IdCliente ) as Pedidos_Del_Cliente from Clientes c go ---CLIENTESQUESEANDE MÉXICO--select NombreCompañía as Clientes from Clientes where IdCliente IN (select IdCliente from Clientes where País='México') go ---CLIENTESQUECOMPRARONEL PRODUCTOPEZESPADA--select NombreCompañía as Clientes from Clientes where IdCliente in (select IdCliente from Pedidos where IdPedido in (select IdPedido from DetallesDepedidos where IdProducto in (select IdProducto from Productos where NombreProducto='Pez Espada'))) go
---MUESTRA LA CANTIDAD DE PEDIDOS POR AÑO --select distinct year(fechaPedido),(select COUNT(*) from Pedidos d where year(d.FechaPedido ) = year(p.FechaPedido )) as Pedidos_X_Año from Pedidos p go