Sie sind auf Seite 1von 11

Ejercicios Transact-SQL

Vistas
Un club dicta cursos de distintos deportes. Almacena la informacin en varias tablas.
El director no quiere que los empleados de administracin conozcan la estructura de las tablas ni
algunos datos de los profesores y socios, por ello se crean vistas a las cuales tendrn acceso.
1.- Crear una base de datos llamada db_Ejercicios
2.- Correr el siguiente Script, para crear las tabla e insertarle los datos.
create table socios(
documento char(8) not null,
nombre varchar(40),
domicilio varchar(30),
constraint PK_socios_documento
primary key (documento)
)
Go
create table profesores(
documento char(8) not null,
nombre varchar(40),
domicilio varchar(30),
constraint PK_profesores_documento
primary key (documento)
)
Go
create table cursos(
numero tinyint identity,
deporte varchar(20),
dia varchar(15),
constraint CK_inscriptos_dia check (dia
in('lunes','martes','miercoles','jueves','viernes','sabado')),
documentoprofesor char(8),
constraint PK_cursos_numero
primary key (numero),
)
Go
create table inscriptos(
documentosocio char(8) not null,
numero tinyint not null,
matricula char(1),
constraint CK_inscriptos_matricula check (matricula in('s','n')),
constraint PK_inscriptos_documento_numero
primary key (documentosocio,numero)

)
Go
--Ingrese algunos registros para todas las tablas:
insert into socios values('30000000','Fabian Fuentes','Caseros 987')Go
insert into socios values('31111111','Gaston Garcia','Guemes 65')Go
insert into socios values('32222222','Hector Huerta','Sucre 534')Go
insert into socios values('33333333','Ines Irala','Bulnes 345')Go
insert into profesores values('22222222','Ana Acosta','Avellaneda 231')Go
insert into profesores values('23333333','Carlos Caseres','Colon 245')Go
insert into profesores values('24444444','Daniel Duarte','Sarmiento 987')Go
insert into profesores values('25555555','Esteban Lopez','Sucre 1204')Go
insert into cursos values('tenis','lunes','22222222')Go
insert into cursos values('tenis','martes','22222222')Go
insert into cursos values('natacion','miercoles','22222222')Go
insert into cursos values('natacion','jueves','23333333')Go
insert into cursos values('natacion','viernes','23333333')Go
insert into cursos values('futbol','sabado','24444444')Go
insert into cursos values('futbol','lunes','24444444')Go
insert into cursos values('basquet','martes','24444444')Go
insert into inscriptos values('30000000',1,'s')Go
insert into inscriptos values('30000000',3,'n')Go
insert into inscriptos values('30000000',6,null)Go
insert into inscriptos values('31111111',1,'s')Go
insert into inscriptos values('31111111',4,'s')Go
insert into inscriptos values('32222222',8,'s')Go

1- Cree una vista en la que aparezca el nombre y documento del socio, el deporte, el da y el
nombre del profesor.
2- Realice una consulta a la vista donde muestre la cantidad de socios inscriptos en cada
deporte
3- ordenados por cantidad.
4- Muestre (consultando la vista) los cursos (deporte y da) para los cuales no hay inscriptos.
5- Muestre los nombres de los socios que no se han inscripto en ningn curso (consultando la
vista)
6- Cree una vista para que muestre la cantidad de inscriptos por curso, incluyendo el nmero
del curso, el nombre del deporte y el da.
7- Cree la vista "vis_deudores" que muestre el documento y nombre del socio, el deporte, el
da y la matrcula, de todas las inscripciones no pagas colocando "with check option".
8- Modifique la vista "vis_deudores" para que muestre el domicilio, coloque la opcin de
encriptacin y omita with check option".

Procedimientos almacenados
Una empresa almacena los datos de sus empleados en una tabla llamada "empleados".
1.- En la misma base de datos llamada db_Ejercicios creada en los ejercicios de vista
2.- Correr el siguiente Script, para crear las tablas e insertarle los datos.

create table empleados(


documento char(8),
nombre varchar(20),
apellido varchar(20),
sueldo decimal(6,2),
cantidadhijos tinyint,
seccion varchar(20),
primary key(documento)
)Go

-- Ingrese algunos registros:


insert into empleados values('22222222','Juan','Perez',300,2,'Contaduria')Go
insert into empleados values('22333333','Luis','Lopez',300,0,'Contaduria')Go
insert into empleados values ('22444444','Marta','Perez',500,1,'Sistemas')Go
insert into empleados values('22555555','Susana','Garcia',400,2,'Secretaria')Go
insert into empleados values('22666666','Jose Maria','Morales',400,3,'Secretaria')Go
insert into empleados values('22777777','Andres','Perez',3,'Sistemas')Go
insert into empleados values('22888888','Laura','Garcia',3,'Secretaria')

1. Cree un procedimiento almacenado llamado "pa_emp_sueldo" que seleccione los


nombres, apellidos y sueldos de los empleados.

2. Cree un procedimiento almacenado llamado "pa_emp_hijos" que seleccione los nombres,


apellidos y cantidad de hijos de los empleados con hijos.
3. Cree un procedimiento almacenado llamado "pa_emp_sueldo" que seleccione los
nombres, apellidos y sueldos de los empleados que tengan un sueldo superior o igual al
enviado como parmetro.
4. Cree un procedimiento almacenado llamado "pa_emp_actualizar_sueldo" que actualice
los sueldos iguales al enviado como primer parmetro con el valor enviado como segundo
parmetro.
a. Ejecute el procedimiento creado anteriormente y verifique si se ha ejecutado
correctamente: exec pa_emp_actualizar_sueldo 300,350
b. Ejecute el procedimiento almacenado "pa_emp_actualizar_sueldo" enviando en
primer lugar el parmetro @sueldonuevo y en segundo lugar @sueldoanterior
(parmetros por nombre).
5. Cree un procedimiento llamado "pa_suetotal" que reciba el documento de un empleado y
muestre su nombre, apellido y el sueldo total (resultado de la suma del sueldo y salario
por hijo, que es de $200 si el sueldo es menor a $500 y $100, si el sueldo es mayor o igual
a $500). Coloque como valor por defecto para el parmetro el patrn "%".
a. Ejecute el procedimiento anterior enviando diferentes valores:
exec pa_suetotal '22333333'
6. Cree un procedimiento que muestre todos los empleados de una seccin determinada que
se ingresa como parmetro. Si no se ingresa un valor, o se ingresa "null", se muestra un
mensaje y se sale del procedimiento.
7. Cree un procedimiento almacenado que permita modificar la cantidad de hijos ingresando
el documento de un empleado y la cantidad de hijos nueva. Ambos parmetros DEBEN
ingresarse con un valor distinto de "null". El procedimiento retorna "1" si la actualizacin
se realiza (si se ingresan valores para ambos parmetros) y "0", en caso que uno o ambos
parmetros no se ingresen o sean nulos.

Un profesor guarda en una tabla llamada "alumnos" el nombre de los alumnos y su nota.
create table alumnos(
documento char(8),
nombre varchar(40),
nota decimal(4,2),
primary key(documento)
)Go

-- Ingrese algunos registros:


insert into alumnos values ('22222222','Pedro Lopez',5)Go
insert into alumnos values ('23333333','Ana Lopez',4)Go
insert into alumnos values ('24444444','Maria Juarez',8)Go
insert into alumnos values ('25555555','Juan Garcia',5.6)Go
insert into alumnos values ('26666666','Karina Torres',2)Go
insert into alumnos values ('27777777','Nora Torres',7.5)Go
insert into alumnos values ('28888888','Mariano Herrero',3.5)
Go
create table aprobados(
documento char(8),
nombre varchar(40),
nota decimal(4,2)
)
Go
create table desaprobados(
documento char(8),
nombre varchar(40)
)
8. Cree el procedimiento para que seleccione todos los datos de los alumnos cuya nota es
igual o superior a 4. Y los Ingrese en la tabla "aprobados". Los alumnos cuya nota es
menor a 4. Los Ingrese en la tabla "desaprobados".
Una librera almacena los datos de los libros en una tabla denominada "libros" y en una tabla
"ventas" las ventas de los mismos.
create table libros(
codigo int identity,
titulo varchar(40),

autor varchar(30),
editorial varchar(20),
precio decimal(6,2),
cantidad int,
primary key (codigo)
)
Go
create table ventas(
numero int identity,
codigo int not null,
preciounitario decimal(6,2),
cantidad int,
constraint PK_ventas primary key (numero),
constraint FK_ventas_codigolibro
foreign key (codigo)
references libros(codigo)
on update cascade
) Go
--Ingrese algunos registros para ambas:
insert into libros values('Uno','Richard Bach','Planeta',15,100)Go
insert into libros values('Ilusiones','Richard Bach','Planeta',18,150)Go
insert into libros values('El aleph','Borges','Emece',25,200)Go
insert into libros values('Matematica estas ahi','Paenza','Nuevo siglo',20,300)Go
insert into libros values('Aprenda PHP','Mario Molina','Nuevo siglo',45,200)Go

insert into ventas values(1,15,1)Go

insert into ventas values(2,18,1)Go


insert into ventas values(3,25,100)Go
insert into ventas values(1,15,50)Go
9. Cree un procedimiento que muestre los datos de las ventas (nmero, ttulo, autor y
editorial del libro vendido, precio unitario, cantidad vendida, total por item).
10. Cree un procedimiento que permita ingresar una venta en "ventas" con los siguientes
datos: cdigo del libro y cantidad que se vende. El procedimiento debe controlar que haya
libros disponibles (es decir, que la cantidad que se vende sea mayor o igual a la cantidad
existente del libro) y luego restar la cantidad vendida de la tabla "libros": Este
procedimiento recibe parmetros, declara variables locales y modifica 2 tablas, en una de
ellas realiza una insercin y en la otra una actualizacin.

Funciones
Una clnica almacena los turnos para los distintos mdicos en una tabla llamada "consultas" y en
otra tabla "medicos" los datos de los mdicos.
create table medicos (
documento char(8) not null,
nombre varchar(30),
constraint PK_medicos
primary key clustered (documento)
)Go

create table consultas(


fecha datetime,
medico char(8) not null,
paciente varchar(30),
constraint PK_consultas
primary key (fecha,medico),
constraint FK_consultas_medico
foreign key (medico)

references medicos(documento)
on update cascade
on delete cascade
)Go

3- Ingrese algunos registros:


insert into medicos values('22222222','Alfredo Acosta')Go
insert into medicos values('23333333','Pedro Perez')Go
insert into medicos values('24444444','Marcela Morales')Go

insert into consultas values('2007/03/26 8:00','22222222','Juan Juarez')Go


insert into consultas values('2007/03/26 8:00','23333333','Gaston Gomez')Go
insert into consultas values('2007/03/26 8:30','22222222','Nora Norte')Go
insert into consultas values('2007/03/28 9:00','22222222','Juan Juarez')Go
insert into consultas values('2007/03/29 8:00','24444444','Nora Norte')Go
insert into consultas values('2007/03/24 8:30','22222222','Hector Huerta')Go
insert into consultas values('2007/03/24 9:30','23333333','Hector Huerta')Go
11. Cree la funcin "f_nombreDia" que recibe una fecha (tipo string) y nos retorne el nombre
del da en espaol.
12. Cree la funcin "f_horario" que recibe una fecha (tipo string) y nos retorne la hora y
minutos.
13. Muestre todas las consultas del mdico llamado 'Alfredo Acosta', incluyendo el da
(emplee la funcin "f_nombreDia", el horario (emplee la funcin "f_horario") y el nombre
del paciente.
Disparador (trigger)
Una empresa almacena los datos de sus empleados en una tabla denominada "empleados2" y en
otra tabla llamada "secciones2", el cdigo de la seccin y el sueldo mximo de cada una de ellas.
create table secciones2(

codigo int identity,


nombre varchar(30),
sueldomaximo decimal(8,2),
constraint PK_secciones primary key(codigo)
)
Go
create table empleados2(
documento char(8) not null,
nombre varchar(30) not null,
domicilio varchar(30),
codigoseccion int not null,
sueldo decimal(8,2),
constraint PK_empleados primary key(documento),
constraint FK_empelados_seccion
foreign key (codigoseccion) references secciones(codigo)
)Go
--Ingrese algunos registros en ambas tablas:
insert into secciones2 values('Administracion',1500)Go
insert into secciones2 values('Sistemas',2000)Go
insert into secciones2 values('Secretaria',1000)Go
insert into empleados2 values('22222222','Ana Acosta','Avellaneda 88',1,1100)Go
insert into empleados2 values('23333333','Bernardo Bustos','Bulnes 345',1,1200)Go
insert into empleados2 values('24444444','Carlos Caseres','Colon 674',2,1800)Go
insert into empleados2 values('25555555','Diana Duarte','Colon 873',3,1000)Go
14. Cree un disparador para que se ejecute cada vez que una instruccin "insert" ingrese
datos en "empleados2"Go el mismo debe verificar que el sueldo del empleado no sea

mayor al sueldo mximo establecido para la seccin, si lo es, debe mostrar un mensaje
indicando tal situacin y deshacer la transaccin.
15. Cree un disparador para controlar que no se elimine un empleado si su sueldo es mayor
que 0. El disparador se activar cada vez que se ejecuta un "delete" sobre " empleados2",
si se est eliminando un empleado cuyo sueldo sea mayor a 0, el disparador debe retornar
un mensaje de error y deshacer la transaccin.
Una empresa almacena los datos de sus empleados en una tabla denominada "empleados" y los
datos de las distintas sucursales en una tabla "sucursales".
create table sucursales(
codigo int identity,
domicilio varchar(30),
constraint PK_sucursales primary key (codigo)
)Go

create table empleados3(


documento char(8) not null,
nombre varchar(30),
domicilio varchar(30),
sucursal int not null,
constraint PK_empleados primary key (documento),
constraint FK_empleados_sucursal foreign key(sucursal)
references sucursales(codigo)
)Go

-- Ingrese algunos registros en las dos tablas:


insert into sucursales values ('Colon 123')Go
insert into sucursales values ('Sucre 234')Go
insert into sucursales values ('Rivadavia 345')Go

insert into empleados3 values ('22222222','Ana Acosta','Avellaneda 1258',1)Go


insert into empleados3 values ('23333333','Betina Bustos','Bulnes 345',2)Go
insert into empleados3 values ('24444444','Carlos Caseres','Caseros 948',3)Go
insert into empleados3 values ('25555555','Fabian Fuentes','Francia 845',1)Go
insert into empleados3 values ('26666666','Gustavo Garcia','Guemes 587',2)Go
insert into empleados3 values ('27777777','Maria Morales','Maipu 643',3)Go
16. Cree un disparador de insercin, eliminacin y actualizacin que no permita
modificaciones en la tabla "empleados" si tales modificaciones afectan a empleados de la
sucursal de 1