ejercicios resueltos

16
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

Upload: jaimeortega

Post on 09-Nov-2014

116 views

Category:

Documents


7 download

TRANSCRIPT

Page 1: Ejercicios Resueltos

Ejercicios Resueltos (SQL SERVER)PARTE 1 :     Consultas -------------------------------------------------------------------------CREATE DATABASE BANCOGOUSE BANCOGOCREATE TABLE CLIENTE(IDCLIENTE VARCHAR(5)PRIMARY KEY,APELLIDOS VARCHAR(30),NOMBRES VARCHAR(30))GOCREATE TABLE CUENTA(IDCLIENTE VARCHAR(5),IDCUENTA VARCHAR(5)PRIMARY KEY,SALDO FLOAT,DIVISA VARCHAR(20))GOCREATE TABLE MOVIMIENTO(IDCUENTA VARCHAR(5),IDMOVIMIENTO VARCHAR(5)PRIMARY KEY,TIPO VARCHAR(2),MONTO FLOAT,FECHA DATETIME)GOALTER TABLE CUENTAADD FOREIGN KEY(IDCLIENTE) REFERENCES CLIENTEGOALTER TABLE MOVIMIENTOADD FOREIGN KEY(IDCUENTA) REFERENCES CUENTAGO

--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.SALDOFROM CUENTA A INNER JOIN CLIENTE BON A.IDCLIENTE = B.IDCLIENTEWHERE 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 'DEPOSITO' WHEN 'R'THEN 'RETIRO' WHEN 'T' THEN 'TRANSFERENCIA' ENDFROM CUENTA A INNER JOIN CLIENTE B ON A.IDCLIENTE = B.IDCLIENTEINNER JOIN MOVIMIENTO C ON A.IDCUENTA = C.IDCUENTAWHERE 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.IDMOVIMIENTO, M.MONTO,M.TIPO

Page 2: Ejercicios Resueltos

FROM CLIENTE C INNER JOIN CUENTA CUON C.IDCLIENTE = CU.IDCLIENTEINNER JOIN MOVIMIENTO MON CU.IDCUENTA = M.IDCUENTAWHERE 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.DIVISAFROM CUENTA A INNER JOIN CLIENTE B ON A.IDCLIENTE = B.IDCLIENTEINNER JOIN MOVIMIENTO C ON A.IDCUENTA = A.IDCUENTAWHERE 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.TIPOFROM CUENTA A INNER JOIN CLIENTE B ON A.IDCLIENTE = B.IDCLIENTEINNER JOIN MOVIMIENTO C ON A.IDCUENTA = A.IDCUENTAWHERE 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)ASBEGINDECLARE @FECHACLIENTE DATETIMEDECLARE @MENSAJE VARCHAR(20)SELECT @FECHACLIENTE = FECHA FROM MOVIMIENTO WHERE TIPO = 'DEPOSITO'IF MONTH(@FECHACLIENTE) < MONTH(@FECHAPAGO)SET @MENSAJE = 'EL CLIENTE ES MOROSO'RETURN @MENSAJEEND--DEMOSELECT dbo.MOROSO ('15/02/2011')PARTE 2 :     Creacion de Objetos - Tablas ---------------------------------------------------------------------------2A--CREACION DE TABLASGOCREATE DATABASE EMPRESAGOUSE EMPRESAGOCREATE 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)

Page 3: Ejercicios Resueltos

GOCREATE 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)GOCREATE TRIGGER TRG_COPIAEMPLEADOSON EMPLEADOSFOR INSERTASBEGININSERT INTO COPIAEMPLEADOSSELECT * FROM INSERTEDENDGO--2B—INGRESAR REGISTROSINSERT INTO EMPLEADOS VALUES ('22999000','CORDOVA','WLIMER','SISTEMAS',680,'24/10/2005')INSERT INTO EMPLEADOS VALUES ('22333444','ACOSTA','ANA','SECRETARIA',500,'05/05/2000')INSERT INTO EMPLEADOS VALUES ('22777888','CORDOVA','DANIELA','SECRETARIA',560,'25/08/2006')GO--DEMOSELECT * FROM EMPLEADOSSELECT * 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% masGOCREATE PROCEDURE USP_EMPLEADOS_AUMENTARSUELDOASDECLARE @FECHA DATETIMEDECLARE @DIF TINYINTSELECT @FECHA = FECHAINGRESO FROM EMPLEADOSSET @DIF = YEAR(GETDATE()) - YEAR(@FECHA)IF MONTH(GETDATE()) < MONTH(@FECHA)SET @DIF = @DIF - 1IF MONTH(GETDATE()) = MONTH(@FECHA) ANDDAY(GETDATE()) < DAY(@FECHA)SET @DIF = @DIF - 1IF (@DIF> = 3)UPDATE EMPLEADOS SET SUELDO = (SUELDO + (SUELDO * 0.20))GO

Page 4: Ejercicios Resueltos

--EJECUTAR SOLO UNA VEZEXECUTE USP_EMPLEADOS_AUMENTARSUELDOGO--VERIFICANDOSELECT * FROM EMPLEADOS---------------------------------------------------------------------------3B—Procedimiento que Permite Almacenar valores nulos en los Campos SUELDO Y FECHADEINGRESOGOCREATE PROCEDURE USP_EMPLEADOSINGRESAR@DOCUMENTO VARCHAR(30),@APELLIDO VARCHAR(30),@NOMBRE VARCHAR(30),@SECCION VARCHAR(20)ASBEGININSERT INTO EMPLEADOS VALUES (@DOCUMENTO,@APELLIDO,@NOMBRE,@SECCION,NULL,NULL)ENDGO--DEMOEXECUTE USP_EMPLEADOSINGRESAR '22777889','DURAND','DANY','SECRETARIA'GO--VERIFICANDOSELECT * FROM EMPLEADOS------------------------------------------------------------------------3C—Procedimiento que Permite Realizar BACKUP a la Base de Datos EMPRESAGOCREATE PROCEDURE COPIADATABASEASBACKUP DATABASE EMPRESA TO DISK = 'F:\\BACKUP.bak'WITH INITGO--DEMOEXECUTE COPIADATABASEGO--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 CONTROLESGOCREATE TRIGGER TRG_CONTROLESON EMPLEADOSFOR INSERTASINSERT INTO CONTROLES VALUES (Suser_Name(),GETDATE())GO--DEMOINSERT INTO EMPLEADOS VALUES ('22777899','GONZALES','LUIS','SECRETARIA',560,'25/08/2008')GOSELECT * FROM CONTROLES---------------------------------------------------------------------------4B – DESENCADENADOR QUE DESCUENTA LA EXISTENCIA DE LA TABLA PRODUCTOS SEGUN EL PEDIDO

Page 5: Ejercicios Resueltos

GOCREATE DATABASE ALMACENGOUSE ALMACENGOCREATE 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))GOCREATE 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--DESENCADENADORCREATE TRIGGER TRG_PEDIDO_ARTICULOSON PEDIDOFOR INSERTASUPDATE PRODUCTOS SET EXISTENCIA = EXISTENCIA - (SELECT CANTIDAD_PEDIDO FROM INSERTED)WHERE ID_PRODUCTO = (SELECT ID_PRODUCTO FROM INSERTED)GOINSERT 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--DEMOINSERT INTO PEDIDO VALUES('P003',5)--VERIFICANDOSELECT * FROM PRODUCTOSSELECT * 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

Page 6: Ejercicios Resueltos

create view v_listaclientes

as

select IdCliente,NombreCompañía,País from Clientes

go

nota :  para ejecutar la vista se hace lo 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 que liste NombreProducto,NombreCategoría,PrecioUnidad,Suspendido 

Page 7: Ejercicios Resueltos

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

Page 8: Ejercicios Resueltos

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 e where e.Nombre=c.Nombre and YEAR(FechaPedido)=1995)as Año_1995,

(select COUNT(*)from v_empleado e where e.Nombre =c.Nombre and YEAR(FechaPedido)=1996)as Año_1996

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

-- Combinación de Tablas -----

1 .  Combinación Interna de Tablas

Hay 2 formas de hacerlo:Para este caso lo voy hacer con la tabla Productos y Categorìas

Page 9: Ejercicios Resueltos

- Primera Forma :  (INNER JOIN)

SELECT NOMBRECATEGORÍA,NOMBREPRODUCTOFROM Productos P INNER JOIN Categorías CON P.IdCategoría =C.IdCategoríaGO

Page 10: Ejercicios Resueltos

-Segunda Forma : (WHERE)

SELECT NOMBRECATEGORÍA,NOMBREPRODUCTOFROM Productos P , Categorías CWHERE P.IdCategoría =C.IdCategoríaGO

2.   Combinación Externa de Tablas

-- IZQUIERDA ---> LISTA TODAS LOS PRODUCTOS QUE NO TIENEN CATEGORÍAS

SELECT NOMBRECATEGORÍA,NOMBREPRODUCTOFROM Productos P LEFT OUTER JOIN Categorías CON P.IdCategoría =C.IdCategoríaGO

---DERECHA ---> LISTA TODAS LA CATEGORÍAS QUE NO TIENES PRODUCTOS

SELECT NOMBRECATEGORÍA,NOMBREPRODUCTOFROM Productos P RIGHT OUTER JOIN Categorías CON P.IdCategoría =C.IdCategoríaGO

---- 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,NOMBREPRODUCTOFROM Productos P FULL OUTER JOIN Categorías CON P.IdCategoría =C.IdCategoríaGO

---- CREACION DE BASE DE DATOS ----

Creamos la base de datos llamada ventas

create database ventasgouse ventas

Page 11: Ejercicios Resueltos

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 Tiendagocreate table Tienda(IdTienda int identity(1,1)primary key,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 TiendaProductogocreate table TiendaProducto(IdTienda int not null,IdProducto int not null,Cantidad int )go 

-estoy asignando dos llaves primarias a la tabla  TiendaProducto alter table TiendaProducto add constraint pk_TiendaProducto primary key(IdTienda,IdProducto)

-estoy relacionando el campo IdTienda que es llave primaria con el campo IdTienda de

Page 12: Ejercicios Resueltos

la tabla Tiendaalter table TiendaProducto add constraint fk_TiendaProducto foreign key(IdTienda) references Tienda(IdTienda)

-estoy relacionando el campo IdProducto que es llave primaria con el campo  IdProducto  de la tabla Productoalter 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 Productogocreate 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 Empleadogocreate table Empleado(IdEmpleado int identity(1,1)primary key,Nombres char(30) not null,Apellidos varchar(30)not null,-relaciono el campo IdTienda de Empleado con IdTienda de Tienda IdTienda int foreign key references Tienda(IdTienda))go

Page 13: Ejercicios Resueltos

Estas lineas de código es para generar el diagrama de tablas relacionadas

exec sp_dbcmptlevel 'ventas','90';alter authorization on database ::ventas to Saexec 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 :

---CONTAR A LOS CLIENTES DE UN DETERMINADO PAÍS---select distinct País ,(select COUNT(*)                       from Clientes c2                       where c2.País =c1.País)                       as total_clientesfrom Clientes c1order by Paísgo

---SUMA EL PRECIO DE UNA CATEGORÍA DE PRODUCTOS ---select Nombrecategoría,(select SUM(PrecioUnidad)from Productos pwhere p.IdCategoría = c.IdCategoría )as Suma_PrecioUnidadfrom Categorías cgo

---CUENTA LOS PEDIDOS DEL CLIENTE ---select NombreCompañía ,(select COUNT(*)from Pedidos p where p.IdCliente=c.IdCliente )as Pedidos_Del_Clientefrom Clientes cgo

---CLIENTES QUE SEAN DE MÉXICO ---select NombreCompañía as Clientes from Clienteswhere IdCliente IN (select IdCliente from Clientes where País='México')go

---CLIENTES QUE COMPRARON EL PRODUCTO PEZ ESPADA ---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

Page 14: Ejercicios Resueltos

---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ñofrom Pedidos pgo