Ejercicio SQL
Ejercicio SQL
Ejercicio SQL
EJERCICIOS DE SQL
Considere el siguiente esquema para una base de datos que contiene informacin acerca de equipos
formados por profesores y alumnos en proyectos. Resuelva las siguientes consultas utilizando el
lenguaje SQL:
Profesor(P#, Nombre_Profesor, Categoria, Facultad)
Alumno(A#, Nombre_Alumno, Escuela)
Proyecto(T#, Fecha_Inicio, Fecha_Termino, Facultad)
Equipo(T#, P#, A#)
Con claves principales (P#), (A#), (T#), (T#, P#, A#) respectivamente.
Luiscorpin
Pgina 1
2. Obtener los datos de los proyectos con fecha ms antigua de cada facultad a la que pertenece el
proyecto.
SELECT *
FROM Proyecto p
WHERE
TRUNC(sysdate-p.fecha_inicio)>= ALL( SELECT TRUNC(sysdate-p1.fecha_inicio)
FROM Proyecto p1
WHERE p1.Facultad = p.Facultad );
Luiscorpin
Pgina 2
3. Obtener el P# y nombre de todos los profesores que sean de la misma facultad y simultneamente
hayan hecho parte del mismo proyecto.
SELECT DISTINCT p.p# , p.Nombre_Profesor
FROM Profesor p , Proyecto t , Equipo e
WHERE
p.p# = e.p# and t.t# = e.t# and 0< (SELECT COUNT(DISTINCT p1.p#)
FROM Profesor p1 , Equipo e1 , Proyecto t1
WHERE
p.p#<>p1.p# and p1.p# = e1.p# and p.Facultad=p1.Facultad
and t1.t#=e1.t# and e1.t#=t.t#);
4. Obtener el P# y nombre de los profesores que han orientado a un mismo alumno en todos los
proyectos de la Facultad de Qumica que se iniciaron y terminaron el 2013.
SELECT DISTINCT p.p# , p.Nombre_Profesor
FROM Profesor p , Alumno a , Proyecto t , Equipo e
WHERE
p.p#=e.p# and a.a#= e.a# and t.t# = e.t# and t.Facultad ='Quimica' and
TO_CHAR(t.Fecha_Inicio,'yyyy') =2013 and TO_CHAR(t.Fecha_Termino,'yyyy') =2013
and 1=( SELECT COUNT(DISTINCT e1.a#)
FROM Profesor p1 , Alumno a1 , Proyecto t1 , Equipo e1
WHERE
p.p#<>p1.p# and p1.p#=e1.p# and a1.a#= e1.a# and t1.t# = e1.t# and a.a#=a1.a#);
Luiscorpin
Pgina 3
5. Obtener el T# y la fecha de inicio de todos los proyectos de los cuales hagan (o hayan hecho) parte
dos alumnos homnimos.
SELECT DISTINCT t.t# , t.Fecha_inicio
FROM Proyecto t ,Alumno a , Equipo e
WHERE
a.a# = e.a# and t.t# = e.t# and
1 = ( SELECT COUNT (DISTINCT a1.a#)
FROM Alumno a1 , Equipo e1
WHERE
a.a#<>a1.a# and a.Nombre_Alumno=a1.Nombre_Alumno and a1.a# = e1.a# and e1.t#=e.t#);
6. Obtener el P# y nombre de los profesores que orientan (u orientaron), al menos a dos alumnos
diferentes en dos proyectos distintos.
SELECT DISTINCT p.p#, p.Nombre_Profesor
FROM Profesor p , Proyecto t , Equipo e, Alumno a
WHERE p.p# = e.p# and t.t# = e.t# and a.a#=e.a#
and 1< ( SELECT COUNT (DISTINCT e1.a#)
FROM Profesor p1, Alumno a1 , Proyecto t1, Equipo e1
WHERE
p.p# = p1.p# and p1.p# = e1.p# and a1.a#=e1.a# and
t1.t# =e1.t# and 1< ( SELECT COUNT (DISTINCT e2.t#)
FROM Profesor p2, Proyecto t2, Equipo e2
WHERE
p1.p#=p2.p# and p2.p#=e2.p# and t2.t#=e2.t#));
Luiscorpin
Pgina 4
7. Obtener las facultades que solo tengan profesores trabajando (o hayan trabajado) en un nico
proyecto.
SELECT DISTINCT t.Facultad
FROM Profesor p , Proyecto t , Equipo e
WHERE p.p# = e.p# and t.t# = e.t# and
1=( SELECT COUNT(DISTINCT e2.t#)
FROM Proyecto t2, Equipo e2, Profesor p2
WHERE p2.p# =p.p# and p2.p# = e2.p# and t2.t#=e2.t# ) ;
8. Obtener el T# de los proyectos donde trabajan (o hayan trabajado) por lo menos un alumno de
Medicina y solamente profesores de la misma facultad.
SELECT DISTINCT t.t#
FROM Proyecto t ,Alumno a , Equipo e
WHERE t.t#= e.t# and a.a# =e.a# and
EXISTS (SELECT *
FROM Proyecto t1, Alumno a1, Equipo e1
WHERE t1.t#=t.t# and t1.t# =e1.t# and e1.a#=a1.a# and
a1.Escuela='Medicina' );
Luiscorpin
Pgina 5
9. Obtener el nombre y la escuela de todos los alumnos que participan (o participaron) en un proyecto
donde exista por lo menos un profesor que orienta (u orient) a por lo menos un alumno de Derecho.
SELECT DISTINCT a.Nombre_Alumno , a.Escuela
FROM Alumno a , Profesor p ,Equipo e
WHERE
a.a# =e.a# and p.p#=e.p# and
EXISTS (SELECT *
FROM Profesor p1,Alumno a1, Equipo e1
WHERE p.p#=p1.p# and e1.p#=p1.p# and e1.a#=a1.a# and
a1.Escuela ='Derecho');
10. Obtener el nombre y facultad de los profesores que orientan en un nmero mayor de alumnos que el
promedio de alumnos orientados de todos los profesores.
SELECT DISTINCT p.Nombre_Profesor , p.Facultad
FROM Profesor p , Alumno a , Equipo e
WHERE p.p# = e.p# and a.a# = e.a# and
EXISTS (SELECT p1.p#
FROM profesor p1, equipo e1
GROUP BY p1.p#
HAVING p1.p# = e1.p# and p1.p#=p.p# and
COUNT(DISTINCT e1.a# ) > (SELECT AVG (COUNT ( a# ))
FROM Equipo
GROUP BY a# ));
Luiscorpin
Pgina 6
Considere el siguiente esquema para una base de datos que contiene la informacin de los clubes y la
participacin en distintos torneos. Resuelva las siguientes consultas utilizando el lenguaje SQL:
Empleado(Nombre_Empleado, Calle, Ciudad )
Trabaja(Nombre_Empleado, Nombre_Empresa, Sueldo)
Empresa(Nombre_Empresa, Ciudad)
Jefe(Nombre_Empleado, Nombre_Jefe)
Con claves principales (Nombre_Empleado), (Nombre_Empleado), (Nombre_Empresa, Ciudad),
(Nombre_Empleado) respectivamente.
Luiscorpin
Pgina 7
11. Obtener los nombres de los empleados que viven en la ciudad de la empresa para la que trabajan.
SELECT e.Nombre_Empleado
FROM Empleado e , Empresa p , Trabaja t
WHERE e.Nombre_Empleado = t.Nombre_Empleado and
p.Nombre_Empresa= t.Nombre_Empresa and e.Ciudad = p.Ciudad;
12. Obtener los nombres de los empleados que viven en la misma ciudad y en la misma calle que sus
jefes.
SELECT e.Nombre_Empleado
FROM Empleado e , Jefe j ,Empleado e1
WHERE e.Nombre_Empleado = j.Nombre_Empleado and
j.Nombre_Jefe = e1.Nombre_Empleado and e.Ciudad=e1.Ciudad and
e.Calle = e1.Calle;
13. Obtener el nombre de todos los empleados que ganan ms que sus jefes.
SELECT e.Nombre_Empleado
FROM Empleado e , Jefe j ,Empleado e1,Trabaja t,Trabaja t1
WHERE e.Nombre_Empleado = j.Nombre_Empleado and t.Nombre_Empleado
=e.Nombre_Empleado and
j.Nombre_Jefe = e1.Nombre_Empleado and e1.Nombre_Empleado = t1.Nombre_Empleado
and t1.Sueldo < t.Sueldo;
Luiscorpin
Pgina 8
14. Obtener el nombre de todos los empleados que ganan ms que cualquier empleado del Banco
Banterra.
SELECT DISTINCT e1.nombre_empleado
FROM Empleado e ,Empleado e1,Trabaja t,Trabaja t1,Empresa p,Empresa p1
WHERE e.Nombre_Empleado=t.Nombre_Empleado and p.Nombre_Empresa=t.Nombre_Empresa
and
e1.Nombre_Empleado=t1.Nombre_Empleado and p1.Nombre_Empresa=t1.Nombre_Empresa
and
t.Nombre_Empresa ='Banco Banterra' and t1.Nombre_Empresa NOT IN('Banco Banterra')and
t.Sueldo < t1.Sueldo;
15. Obtener los nombres de los empleados que trabajan en empresas que tienen sede en las ciudades de
Avila y Mostoles.
SELECT e.Nombre_Empleado
FROM Empleado e , Empresa p ,Empresa p1, Trabaja t
WHERE
e.Nombre_Empleado=t.Nombre_Empleado and p.Nombre_Empresa=t.Nombre_Empresa and
p.Nombre_Empresa= p1.Nombre_Empresa and
p.Ciudad = 'Avila' and p1.Ciudad = 'Mostoles';
Luiscorpin
Pgina 9
16. Obtener los nombres de los empleados que viven en la ciudad de Villaconejos o que trabajan en
alguna empresa que tiene sede en la ciudad de Villaconejos.
SELECT DISTINCT e.Nombre_Empleado
FROM Empleado e , Empresa p, Trabaja t
WHERE e.Nombre_Empleado = t.Nombre_Empleado and p.Nombre_Empresa = t.Nombre_Empresa
and
(e.Ciudad = 'Villaconejos' or p.Ciudad = 'Villaconejos');
17. Obtener el nombre de las empresas que no tienen sede en ninguna de las ciudades en las que tiene
sede el Banco Unicaja.
SELECT e.Nombre_Empresa
FROM Empresa e
WHERE
0 = (SELECT COUNT (e1.Ciudad)
FROM Empresa e1
WHERE
e.Nombre_Empresa=e1.Nombre_Empresa
and e1.Ciudad=ANY( SELECT Ciudad
FROM Empresa
WHERE
Nombre_Empresa='Unicaja'));
Luiscorpin
Pgina 10
18. Obtener el nombre de las empresas con sede en todas las ciudades en las que tiene sede el Banco
Banterra.
SELECT DISTINCT e.Nombre_Empresa
FROM Empresa e
WHERE
e.Nombre_Empresa<>'Banco Banterra'
and (SELECT COUNT(e1.Ciudad)
FROM Empresa e1
WHERE
e.Nombre_Empresa=e1.Nombre_Empresa and
e1.Ciudad = ANY( SELECT Ciudad
FROM Empresa
WHERE
Nombre_Empresa='Banco Banterra')) = (SELECT COUNT(Ciudad)
FROM Empresa
WHERE
Nombre_Empresa='Banco Banterra');
19. Obtener el nombre de los empleados que ganan ms que el sueldo promedio de los empleados de su
empresa.
SELECT DISTINCT e.Nombre_Empleado
FROM Empleado e ,Trabaja t,Empresa p
WHERE
e.Nombre_Empleado = t.Nombre_Empleado and p.Nombre_Empresa= t.Nombre_Empresa and
t.Sueldo > (SELECT AVG(t2.Sueldo)
FROM Trabaja t2
WHERE
t.Nombre_Empresa=t2.Nombre_Empresa);
Luiscorpin
Pgina 11
20. Obtener el nombre de las empresas cuyos empleados ganan un sueldo ms alto, en promedio, que el
sueldo promedio del Banco Unicaja.
SELECT DISTINCT p.Nombre_Empresa
FROM Empleado e , Empresa p , Trabaja t
WHERE
e.Nombre_Empleado = t.Nombre_Empleado and p.Nombre_Empresa = t.Nombre_Empresa and
(SELECT AVG(t1.Sueldo)
FROM Trabaja t1
WHERE
t.Nombre_Empresa=t1.Nombre_Empresa)>(SELECT AVG(t2.Sueldo)
FROM Trabaja t2
WHERE
t2.Nombre_Empresa = 'Unicaja');
Pgina 12
insert into
insert into
insert into
insert into
insert into
insert into
insert into
insert into
insert into
insert into
insert into
insert into
insert into
insert into
insert into
insert into
insert into
Luiscorpin
Pgina 13
insert into
insert into
insert into
insert into
insert into
insert into
insert into
insert into
insert into
insert into
insert into
insert into
insert into
insert into
insert into
insert into
insert into
Pgina 14
insert into
insert into
insert into
insert into
insert into
insert into
insert into
insert into
insert into
insert into
insert into
insert into
insert into
insert into
insert into
insert into
insert into
insert into
insert into
insert into
insert into
insert into
insert into
insert into
insert into
insert into
insert into
insert into
insert into
insert into
insert into
insert into
insert into
insert into
insert into
insert into
insert into
insert into
insert into
insert into
insert into
Luiscorpin
Pgina 15
Luiscorpin
Pgina 16