Ejercicios SQL: Consultas y Tablas

0% encontró este documento útil (0 votos)
76 vistas110 páginas
El documento presenta una serie de ejercicios SQL utilizando diferentes tablas como EMPLE, DEPART, ALUM0405, NOTAS, entre otras. Los ejercicios van desde consultas simples hasta joins y subc…

Cargado por

saag

Ejercicios SQL (Capitulo 3):

➢ 1. Obtener la descripción de la tabla DEPART

DESC DEPART;

➢ 2. Seleccionar nombre, localidad y Nº Departamento de la tabla DEPART

SELECT * FROM DEPART;

➢ 3. Descripción de la tabla EMPLE.

DESC EMPLE;

➢ 4. Seleccionar los empleados del Departamento 30 ordenados por oficio en descendente.

SELECT * FROM EMPLE


WHERE DEPT_NO=30
ORDER BY OFICIO DESC;
➢ 5. Consulta los empleados cuyo oficio sea empleado, clasificado por numero de empleado en
ascendente y apellido en descendente.

SELECT * FROM EMPLE


WHERE OFICIO='EMPLEADO'
ORDER BY EMP_NO, APELLIDO DESC;

➢ 6. Descripción de la tabla ALUM0405

DESC ALUM0405;

➢ 7. Sacar los datos de los alumnos que se apellidan Martín o que cursen 2º Curso.

SELECT * FROM ALUM0405


WHERE APELLIDOS LIKE 'MARTIN%' OR CURSO=2;

➢ 8. Sacar la descripción de la tabla Notas alumno.


DESC NOTAS;
➢ 9. Sacar todos los alumnos y sus notas medias de aquellos que tengan una nota media menor que 6 y
clarificarlos con alias de la tabla NOTAS_ALUMNOS.

SELECT NOMBRE_ALUMNO "Nombre Alumnos", ((NOTA1+NOTA2+NOTA3)/3) "Nota Media"


FROM NOTAS_ALUMNOS
WHERE ((NOTA1+NOTA2+NOTA3)/3)<6;

➢ 10. Sacar los alumnos cuya segunda nota sea menor que 6 y su nota media mayor que 5.

SELECT NOMBRE_ALUMNO "Nombre Alumnos", ((NOTA1+NOTA2+NOTA3)/3) "Nota Media"


FROM NOTAS_ALUMNOS
WHERE ((NOTA1+NOTA2+NOTA3)/3)>5 AND NOTA2<6;

➢ 11. Sacar de la tabla EMPLE, aquellos empleados cuyo apellido empiece por J y termine por O.

SELECT * FROM EMPLE


WHERE APELLIDO LIKE 'J%O';

➢ 12. Sacar los empleados que no cobran comisión y trabajan en el Departamento 10 o 20.

SELECT * FROM EMPLE


WHERE COMISION IS NULL
AND (DEPT_NO=10 OR DEPT_NO=20);

➢ 13. Sacar los empleados que no son director y trabajan en el departamento 20.

SELECT * FROM EMPLE


WHERE OFICIO!='DIRECTOR'
AND DEPT_NO=20;
➢ 14. Sacar los Vendedores cuya comisión es superior a 40.000€.
SELECT * FROM EMPLE
WHERE COMISION>40000;

La comisión mas alta es de 1020€: SELECT * FROM EMPLE;

➢ 15. De la Tabla EMPLE obtener la Fecha de Alta con el mismo oficio que Fernandez.

SELECT FECHA_ALT FROM EMPLE


➢ WHERE OFICIO=(SELECT OFICIO FROM EMPLE WHERE APELLIDO='FERNANDEZ');

➢ 16. Sacar los datos de los empleados con un salario menor que el salario de Gil o que tengan el mismo
oficio que Negro.

SELECT * FROM EMPLE


WHERE SALARIO<(SELECT SALARIO FROM EMPLE WHERE APELLIDO='GIL')
OR OFICIO=(SELECT OFICIO FROM EMPLE WHERE APELLIDO='NEGRO');
➢ 17. De la tabla empleados sacar el apellido de los empleados del Departamento 20 o 30 cuyo oficio
sea vendedor.

SELECT APELLIDO FROM EMPLE


WHERE (DEPT_NO=20 OR DEPT_NO=30) AND OFICIO='VENDEDOR';

➢ 18. De la tabla empleados sacar el oficio y Apellido de los empleados que trabajen en el
Departamento 40 o ganen menos de 2000€.

SELECT OFICIO, APELLIDO FROM EMPLE


WHERE DEPT_NO=40 OR SALARIO<2000;

➢ 19. De la tabla empleados sacar el oficio y Apellido de los empleados que trabajen en el
Departamento 40 y ganen menos de 2000€.

SELECT OFICIO, APELLIDO FROM EMPLE


WHERE DEPT_NO=40 AND SALARIO<2000;

Ejercicios SQL del Libro (Capitulo 3 pagina 125)

 Visualiza los nombres de los alumnos que tengan una nota entre 7 y 8 en la asignatura de “FOL”.

SELECT APENOM FROM ALUMNOS, NOTAS, ASIGNATURAS


WHERE [Link]=[Link]
AND [Link]=[Link]
AND NOTA BETWEEN 7 AND 8
AND NOMBRE='FOL';

 Visualiza los nombres de asignaturas que no tengan suspensos.

SELECT NOMBRE FROM ASIGNATURAS


WHERE COD IN (SELECT COD FROM NOTAS WHERE NOTA>=5)
AND COD !=(SELECT COD FROM NOTAS WHERE NOTA<5);
Ejercicios SQL del Libro (Capitulo 3 pagina 127)

Tablas EMPLE y DEPART

 1. Selecciona el apellido, el oficio y la localidad de los departamentos de aquellos empleados cuyo


oficio sea "ANALISTA".
Es una consulta de la unión de 2 tablas con una condición

SELECT * FROM (SELECT APELLIDO, OFICIO, LOC


FROM EMPLE, DEPART
WHERE EMPLE.DEPT_NO=DEPART.DEPT_NO) WHERE OFICIO='ANALISTA';

 2. Obtén los datos de los empleados cuyo director (columna DIR de la tabla EMPLE) sea "CEREZO".
Primero se debe consultar el código de EMP_NO de Cerezo, que es código de Director para otros
empleados, para realizar la consulta propuesta.

SELECT * FROM EMPLE


WHERE DIR=(SELECT EMP_NO FROM EMPLE WHERE APELLIDO='CEREZO');

 3. Obtén los datos de los empleados del departamento de "VENTAS".

SELECT DEPT_NO FROM DEPART


WHERE DNOMBRE='VENTAS';

Primero hay que hacer una consulta para saber el numero de departamento de VENTAS y en base a
esa consulta hacer otra para obtener los datos requeridos.

SELECT * FROM EMPLE


WHERE DEPT_NO=(SELECT DEPT_NO FROM DEPART WHERE DNOMBRE='VENTAS');
 4. Obtén los datos de los departamentos que NO tengan empleados.

SELECT * FROM DEPART


WHERE DEPT_NO NOT IN (SELECT DISTINCT DEPT_NO FROM EMPLE);

 5. Obtén los datos de los departamentos que tengan empleados.

SELECT * FROM DEPART


WHERE DEPT_NO IN (SELECT DISTINCT DEPT_NO FROM EMPLE);

 6. Obtén el apellido y el salario de los empleados que superan todos los salarios de los empleados del
departamento 20 (superen el salario máximo del Departamento 20).

SELECT APELLIDO, SALARIO FROM EMPLE


WHERE SALARIO>(SELECT MAX (SALARIO) FROM EMPLE WHERE DEPT_NO=20);

Tenemos que sacar el valor máximo de salario de los empleados del departamento 20 con MAX y
sobre este resultado hacer la selección que se pide.

Tabla LIBRERIA

 7. Visualiza el tema, estante y ejemplares de las filas de librería con ejemplares comprendidos entre 8
y 15.

SELECT TEMA, ESTANTE, EJEMPLARES FROM LIBRERIA


WHERE EJEMPLARES BETWEEN 8 AND 15;

También se puede hacer de la siguiente manera:

SELECT TEMA, ESTANTE, EJEMPLARES FROM LIBRERIA


WHERE EJEMPLARES>=8 AND EJEMPLARES<=15;
 8. Visualiza las columnas TEMA, ESTANTE y EJEMPLARES de las filas cuyo ESTANTE no este
comprendido entre la “B” y la “D”.

SELECT TEMA, ESTANTE, EJEMPLARES FROM LIBRERIA


WHERE ESTANTE NOT BETWEEN 'B' AND 'D';

 9. Visualiza con una sola orden SELECT todos los temas de LIBRERIA cuyo numero de ejemplares
sea inferior a los que hay en "MEDICINA".

SELECT TEMA FROM LIBRERIA


WHERE EJEMPLARES<(SELECT EJEMPLARES FROM LIBRERIA WHERE
TEMA='MEDICINA');

También valdría con la siguiente sentencia, siempre y cuando no haya mas nombres que empiecen
con medicina pero tengan otro nombre detrás como MEDICINA NUCLEAR.

SELECT TEMA FROM LIBRERIA


WHERE EJEMPLARES<(SELECT EJEMPLARES FROM LIBRERIA WHERE TEMA LIKE
'MEDICINA%');

 10. VISUALIZA los temas de LIBRERIA cuyo numero de ejemplares no este entre 15 y 20, ambos
inclusive.

SELECT TEMA FROM LIBRERIA


WHERE EJEMPLARES NOT BETWEEN 15 AND 20;
Tablas ALUMNOS, ASIGNATURAS y NOTAS

 11. Visualiza todas las asignaturas que contengan tres letras “o” en su interior y tengan alumnos
matriculados en “Madrid”.

SELECT NOMBRE FROM ASIGNATURAS


WHERE NOMBRE LIKE '%o%o%o%'
AND COD IN (SELECT COD FROM ALUMNOS, NOTAS WHERE
[Link]=[Link] AND POBLA='Madrid');

 12. Visualiza los nombres de alumnos de “Madrid” que tengan alguna asignatura suspendida.

SELECT APENOM FROM ALUMNOS


WHERE POBLA='Madrid'
AND DNI=(SELECT DNI FROM NOTAS WHERE NOTA<5);

 13. Muestra los nombres de alumnos que tengan la misma nota que tiene “Diaz Fernandez, María” en
FOL en alguna asignatura.

SELECT DISTINCT APENOM FROM ALUMNOS, NOTAS


WHERE [Link]=[Link]
AND NOTA=(SELECT NOTA FROM ASIGNATURAS, NOTAS, ALUMNOS WHERE
[Link]=[Link] AND [Link]=[Link] AND APENOM='Díaz
Fernández, María' AND NOMBRE='FOL');

Ahora discriminando el nombre con el que comparamos.

SELECT DISTINCT APENOM FROM ALUMNOS, NOTAS


WHERE [Link]=[Link]
AND NOTA=(SELECT NOTA FROM ASIGNATURAS, NOTAS, ALUMNOS WHERE
[Link]=[Link] AND [Link]=[Link] AND APENOM='Díaz
Fernández, María' AND NOMBRE='FOL')
AND APENOM !='Díaz Fernández, María';

 14. Obtén los datos de las asignaturas que no tengan alumnos.

SELECT * FROM ASIGNATURAS WHERE COD NOT IN (SELECT COD FROM NOTAS);
 15. Obtén el nombre y apellido de los alumnos que tengan nota en la asignatura con código 1.

SELECT APENOM FROM NOTAS, ALUMNOS


WHERE [Link]=[Link]
AND COD=1;

 16. Obtén el nombre y apellido de los alumnos que no tengan nota en la asignatura con código 1.

SELECT DISTINCT APENOM FROM ALUMNOS, NOTAS


WHERE [Link]=[Link]
AND COD!=1
AND APENOM !=(SELECT APENOM FROM NOTAS, ALUMNOS WHERE
[Link]=[Link] AND COD=1);
IEFPS Elorrieta-ErrekaMari GBLHI curso 2010-11 ikasturtea
Sistemas Gestores de Bases de Datos 

Tablas utilizadas en los ejercicios

EMPLE

EMP_NO APELLIDO OFICIO DIR FECHA_ALT SALARIO COMISION DEPT_NO


Number(4) Varchar2(10) Varchar2(10) Number(4) Date Number (10) Number(10) Number(2)
7369 SANCHEZ EMPLEADO 7902 17/12/1990 1040 20
7499 ARROYO VENDEDOR 7698 20/02/1990 1500 390 30
7521 SALA VENDEDOR 7698 22/02/1991 1625 650 30
7566 JIMENEZ DIRECTOR 7839 02/04/1991 2900 20
7654 MARTIN VENDEDOR 7698 29/09/1991 1600 1020 30
7698 NEGRO DIRECTOR 7839 01/05/1991 3005 30
7782 CEREZO DIRECTOR 7839 09/06/1991 2885 10
7788 GIL ANALISTA 7566 09/11/1991 3000 20
7839 REY PRESIDENTE 17/11/1991 4100 10
7844 TOVAR VENDEDOR 7698 08/09/1991 1350 0 30
7876 ALONSO EMPLEADO 7788 23/09/1991 1430 20
7900 JIMENO EMPLEADO 7698 03/12/1991 1335 30
7902 FERNANDEZ ANALISTA 7566 03/12/1991 3000 20
7934 MUÑOZ EMPLEADO 7782 23/01/1992 1690 10

DEPART

DEPT_NO DNOMBRE LOC


Number(2) Varchar2(14) Varchar2(14)
10 CONTABILIDAD SEVILLA
20 INVESTIGACION MADRID
30 VENTAS BARCELONA
40 PRODUCCION BILBAO

NOMBRES NOTAS_ALUMNOS

NOMBRE EDAD NOMBRE_ALUMNO NOTA1 NOTA2 NOTA3


Varchar2(15) Number(2) Varchar2(25) Number(2) Number(2) Number(2)
PEDRO 17 Alcalde García, M. Luisa 5 5 5
JUAN 17 Benito Martín, Luis 7 6 8
MARÍA 16 Casas Martínez, Manuel 7 5 5
CLARA 14 Corregidor Sánchez, Ana 6 9 8
15 Díaz Sánchez, María 7
18

Unidad 04. Funciones Pág. 1 or.


IEFPS Elorrieta-ErrekaMari GBLHI curso 2010-11 ikasturtea
Sistemas Gestores de Bases de Datos 

MISTEXTOS

TITULO AUTOR EDITORIAL PAGINA


Varchar2(32) Varchar2(22) Varchar2(15) Number(3)
METODOLOGÍA DE LA PROGRAMACIÓN. ALCALDE, GARCÍA MCGRAWHILL 140
“INFORMÁTICA BÁSICA.” GARCÍA GARCERAN PARANINFO 130
SISTEMAS OPERATIVOS J.F. GARCÍA OBSBORNE 300
SISTEMAS DIGITALES. M.A. RUIZ PRENTICE HALL 190
“MANUAL DE C.” M.A. RUIZ MCGRAWHILL 340

LIBRERÍA

TEMA ESTANTE EJEMPLARES


Char(15) Char(1) Number(2)
Informática A 15
Economía A 10
Deportes B 8
Filosofía C 7
Dibujo C 10
Medicina C 16
Biología A 11
Geología D 7
Sociedad D 9
Labores B 20
Jardinería E 6

LIBROS

TITULO AUTOR EDITORIAL PAGINA


Varchar2(32) Varchar2(22) Varchar2(15) Number(3)
LA COLMENA CELA, CAMILO JOSÉ PLANETA 240
LA HISTORIA DE MI HIJO GORDIMER, NADINE [Link] 327
LA MIRADA DEL OTRO G. DELGADO, FERNANDO PLANETA 298
ULTIMAS TARDES CON TERESA MARSÉ, JUAN CIRCULO 350
LA NOVELA DE P. ANSUREZ TORRENTE B., GONZALO PLANETA 162

NACIMIENTOS

NOMBRE APELLIDO FECHANAC EDAD


Char(15) Char(15) Date Number
PEDRO SÁNCHEZ 12/05/1982 17
JUAN JIMÉNEZ 23/08/1982 17
MARÍA LÓPEZ 02/02/1983 16
CLARA LASECA 20/05/1985 14

Unidad 04. Funciones Pág. 2 or.


IEFPS Elorrieta-ErrekaMari GBLHI curso 2010-11 ikasturtea
Sistemas Gestores de Bases de Datos 

Ejercicios Adicionales (Unidad 4).

1.- ¿Cuál sería la salida de ejecutar estas funciones?

ABS(146) = ABS(-30) = POWER(3,-1) = ROUND(33.67) =


CEIL(2) = CEIL(1.3) = ROUND(-33.67,2) = ROUND(-33.67,-2) =
CEIL(-2.3) = CEIL(-2) = ROUND(-33.27,1) = ROUND(-33.27,-1) =
FLOOR(-2) = FLOOR(-2.3) = TRUNC(67.232) = TRUNC(67.232,-2) =
FLOOR(2) = FLOOR(1.3) = TRUNC(67.232,2) = TRUNC(67.58,-1) =
MOD(22,23) = MOD(10,3) = TRUNC(67.58,1) =
POWER(10,0) = POWER(3,2) =

SELECT ABS(146) FROM DUAL;

SELECT CEIL(2) FROM DUAL;

SELECT CEIL(-2.3) FROM DUAL;

SELECT FLOOR(-2) FROM DUAL;

SELECT FLOOR(2) FROM DUAL;

SELECT MOD(22,23) FROM DUAL;

Ejercicios Propuestos Unidad 04. Pág. 1 or. F. Urrutibeaskoa


IEFPS Elorrieta-ErrekaMari GBLHI curso 2010-11 ikasturtea
Sistemas Gestores de Bases de Datos 

SELECT POWER(10,0) FROM DUAL;

SELECT ABS(-30) FROM DUAL;

SELECT CEIL(1.3) FROM DUAL;

SELECT CEIL(-2) FROM DUAL;

SELECT FLOOR(-2.3) FROM DUAL;

SELECT FLOOR(1.3) FROM DUAL;

SELECT MOD(10,3) FROM DUAL;

SELECT POWER(3,2) FROM DUAL;

Ejercicios Propuestos Unidad 04. Pág. 2 or. F. Urrutibeaskoa


IEFPS Elorrieta-ErrekaMari GBLHI curso 2010-11 ikasturtea
Sistemas Gestores de Bases de Datos 

SELECT POWER(3,-1) FROM DUAL

SELECT ROUND(-33.67,2) FROM DUAL;

SELECT ROUND(-33.27,1) FROM DUAL;

SELECT TRUNC(67.232) FROM DUAL;

SELECT TRUNC(67.232,2) FROM DUAL;

SELECT TRUNC(67.58,1) FROM DUAL;

SELECT ROUND(33.67) FROM DUAL;

SELECT ROUND(-33.67,-2) FROM DUAL;

SELECT ROUND(-33.27,-1) FROM DUAL;

Ejercicios Propuestos Unidad 04. Pág. 3 or. F. Urrutibeaskoa


IEFPS Elorrieta-ErrekaMari GBLHI curso 2010-11 ikasturtea
Sistemas Gestores de Bases de Datos 

SELECT TRUNC(67.232,-2) FROM DUAL;

SELECT TRUNC(67.58,-1) FROM DUAL;

2.- a) A partir de la tabla EMPLE, visualizar cuántos apellidos de los empleados empiezan por la letra 'A'
SELECT COUNT (APELLIDO)
FROM EMPLE
WHERE APELLIDO LIKE 'A%';

Otra forma de hacerlo


SELECT COUNT (APELLIDO)
FROM EMPLE
WHERE SUBSTR (APELLIDO,1,1) = 'A%';

b) Obtén el apellido o apellidos de empleados que empiecen por la letra ‘A’ y que tengan máximo salario (de los
que empiezan por la letra ‘A’).
SELECT APELLIDO
FROM EMPLE
WHERE APELLIDO LIKE 'A%'
AND SALARIO=(SELECT MAX (SALARIO) FROM EMPLE WHERE APELLIDO LIKE 'A%');

3.- Contar las filas de LIBRERÍA cuyo tema tenga, por lo menos, una 'a'.
SELECT COUNT (TEMA)
FROM LIBRERIA
WHERE TEMA LIKE '%A%' OR TEMA LIKE '%a%';

Otra forma de hacerlo:


SELECT COUNT (TEMA)
FROM LIBRERIA
WHERE UPPER (TEMA) LIKE '%A%';

Ejercicios Propuestos Unidad 04. Pág. 4 or. F. Urrutibeaskoa


IEFPS Elorrieta-ErrekaMari GBLHI curso 2010-11 ikasturtea
Sistemas Gestores de Bases de Datos 

4.- Visualizar el número de estantes distintos que hay en la tabla LIBRERÍA de aquellos temas que contienen, al
menos, una 'e'.
SELECT COUNT (DISTINCT ESTANTE) “Distintos Estantes”
FROM LIBRERIA
WHERE TEMA LIKE '%E%';

5.- Visualizar el número de estantes diferentes que hay en la tabla LIBRERÍA.


SELECT COUNT (DISTINCT ESTANTE) “Numero Estantes”
FROM LIBRERIA;

6.- Obtener en una columna el apellido y el oficio de cada uno de los empleados de la tabla EMPLE, de la
siguiente manera: APELLIDO es OFICIO. Por ejemplo, ‘SANCHEZ es EMPLEADO’.
SELECT CONCAT (APELLIDO || ' es ', OFICIO) “Puestos Empleados”
FROM EMPLE;

7.- Obtener en una columna el apellido y el oficio de cada uno de los empleados de la tabla EMPLE, de la
siguiente manera: Apellido es Oficio. Por ejemplo, ‘Sanchez es Empleado’.
Todas en minúsculas:
SELECT CONCAT (LOWER (APELLIDO) || ' es ', LOWER (OFICIO)) “Puestos Empleados”
FROM EMPLE;
La primera en mayúscula y el resto minúsculas:
SELECT CONCAT (INITCAP (APELLIDO) || ' es ', INITCAP (OFICIO)) "Puestos Empleados"
FROM EMPLE;

Ejercicios Propuestos Unidad 04. Pág. 5 or. F. Urrutibeaskoa


IEFPS Elorrieta-ErrekaMari GBLHI curso 2010-11 ikasturtea
Sistemas Gestores de Bases de Datos 

8.- Obtener en una columna el apellido y el oficio de cada uno de los empleados de la tabla EMPLE, de la
siguiente manera: APELLIDO es OFICIO alineado todo a la derecha.
Por ejemplo: Sanchez es Empleado
Arroyo es Vendedor
Sala es Vendedor

SELECT LPAD ((CONCAT (INITCAP (APELLIDO) || ' es ', INITCAP (OFICIO))), 25 , ' ') "Apellidos Empleados"
FROM EMPLE;

9.- Utilizar la función LPAD para obtener las siguientes salidas.


Ejem1 Ejem2 Ejem3 Ejem4
****X *.*.*X *.*.X ……HOLA

SELECT LPAD ('X', 5, '*') “Ejem1” FROM DUAL;

SELECT LPAD ('X', 6, '*.') “Ejem1” FROM DUAL;

Ejercicios Propuestos Unidad 04. Pág. 6 or. F. Urrutibeaskoa


IEFPS Elorrieta-ErrekaMari GBLHI curso 2010-11 ikasturtea
Sistemas Gestores de Bases de Datos 

SELECT LPAD ('X', 5, '*.') “Ejem1” FROM DUAL;

SELECT LPAD ('HOLA', 9, '.') “Ejem1” FROM DUAL;

10.- Mostrar el apellido y primera letra del apellido de la tabla empleados.

SELECT APELLIDO "Apellido", SUBSTR (APELLIDO, 1, 1) "Inicial Apellido"


FROM EMPLE;

11.- Apellido y primera letra del apellido seguido de ocho asteriscos.

SELECT APELLIDO "Apellido", RPAD ((SUBSTR (APELLIDO, 1, 1)),8,'*') "Inicial Apellido"


FROM EMPLE;

Ejercicios Propuestos Unidad 04. Pág. 7 or. F. Urrutibeaskoa


IEFPS Elorrieta-ErrekaMari GBLHI curso 2010-11 ikasturtea
Sistemas Gestores de Bases de Datos 

12.- Mostrar apellido de todos los empleados sustituyendo EZ por O.


SELECT REPLACE (APELLIDO, 'EZ' , 'O') "Apellido empleados"
FROM EMPLE;

13.- Mostrar apellido con la primera letra en mayúscula.


SELECT INITCAP (APELLIDO) "Apellido empleados"
FROM EMPLE;

14.- De la tabla Nacimientos, mostrar el nombre y apellido con el siguiente formato: Apellido, Nombre. Las
primeras letras han de ir en mayúsculas.

SELECT INITCAP (APELLIDO) "Apellidos" ,INITCAP (NOMBRE) "Nombre"


FROM NACIMIENTOS;

Ejercicios Propuestos Unidad 04. Pág. 8 or. F. Urrutibeaskoa


IEFPS Elorrieta-ErrekaMari GBLHI curso 2010-11 ikasturtea
Sistemas Gestores de Bases de Datos 

15.- De la tabla Nacimientos, mostrar el nombre y apellido con el siguiente formato: NOMBRE inicial
APELLIDO punto, seguido de la fecha de nacimiento y sustituyendo en ésta las barras por guiones. Es decir
PEDRO S., 12-05-1982
SELECT UPPER (NOMBRE) "Nombre", RPAD ((SUBSTR (APELLIDO,1,1)),3,'.,') "Apellido", REPLACE (FECHANAC,
'/', '-') "Fecha Nacimiento" FROM NACIMIENTOS;

16.- Buscar el empleado con el apellido más largo.


SELECT APELLIDO "Apellido"
FROM EMPLE
WHERE LENGTH (APELLIDO)=(SELECT MAX (LENGTH (APELLIDO)) FROM EMPLE);

17.- ¿Cuál es el resultado de éstas sentencias SELECT?

SELECT TRANSLATE (‘OGRO’, ‘O’, ‘AS’); 


SELECT TRANSLATE ('OGRO', 'O', 'AS') FROM DUAL;

SELECT REPLACE (‘OGRO’, ‘O’, ‘AS’); 


SELECT REPLACE ('OGRO', 'O', 'AS') FROM DUAL;

SELECT TRANSLATE (‘OGRON’, ‘ON’, ‘AS’); 


SELECT TRANSLATE ('OGRON', 'ON', 'AS') FROM DUAL;

SELECT REPLACE (‘OGRON’, ‘ON’, ‘AS’); 


SELECT REPLACE ('OGRON', 'ON', 'AS') FROM DUAL;

Ejercicios Propuestos Unidad 04. Pág. 9 or. F. Urrutibeaskoa


IEFPS Elorrieta-ErrekaMari GBLHI curso 2010-11 ikasturtea
Sistemas Gestores de Bases de Datos 

18.- ¿Cuál es el resultado de éstas sentencias SELECT?

SELECT INSTR (‘abracadabra’, ‘bra’, 2, 2); 


SELECT INSTR ('abracadabra', 'bra', 2, 2) FROM DUAL;

SELECT INSTR (‘abracadaBRA’, ‘bra’, 4, 2); 


SELECT INSTR ('abracadaBRA', 'bra', 4, 2) FROM DUAL;

SELECT INSTR (‘abracadabra’, ‘BRA’, 2, 2); 


SELECT INSTR ('abracadabra', 'BRA', 2, 2) FROM DUAL;

19.- ¿Cuál es el resultado de éstas sentencias SELECT?

SELECT INSTR (‘II VUELTA CICLISTA A TALAVERA’, ‘TA’, 3, 2); 


SELECT INSTR ('II VUELTA CICLISTA A TALAVERA', 'TA', 3, 2) FROM DUAL;

SELECT INSTR (‘II VUELTA CICLISTA A TALAVERA’, ‘A’, -1); 


SELECT INSTR ('II VUELTA CICLISTA A TALAVERA', 'A', -1) FROM DUAL;

SELECT INSTR (‘II VUELTA CICLISTA A TALAVERA’, ‘A’, -3); 


SELECT INSTR ('II VUELTA CICLISTA A TALAVERA', 'A', -3) FROM DUAL;

20.- Encontrar la primera ocurrencia de la letra ‘A’ en la columna AUTOR de la tabla MISTEXTOS
SELECT AUTOR, INSTR (AUTOR, 'A')"Posicion 1ª A"
FROM MISTEXTOS;

Ejercicios Propuestos Unidad 04. Pág. 10 or. F. Urrutibeaskoa


IEFPS Elorrieta-ErrekaMari GBLHI curso 2010-11 ikasturtea
Sistemas Gestores de Bases de Datos 

21.- Encontrar el número de caracteres de las columnas TITULO y AUTOR para todas las filas de la tabla
MISTEXTOS.
SELECT TITULO, LENGTH (TITULO) "Longitud Titulo", AUTOR, LENGTH (AUTOR) "Longitud Autor"
FROM MISTEXTOS;

22.- Calcular el número de caracteres de la columnas TEMA para todas las filas de la tabla LIBRERIA.
SELECT TEMA, INSTR(TEMA, ' ')-1 FROM LIBRERIA;
SELECT TEMA, LENGTH (RTRIM (TEMA)) FROM LIBRERIA;

23.- Calcular el número de días que tiene febrero del año que viene.
SELECT TO_CHAR (LAST_DAY('12/02/2013'), 'dd') FROM DUAL ;

24.- Calcular la edad de cada uno utilizando la función MONTHS_BETWEEN de la tabla NACIMIENTOS.
SELECT TRUNC (MONTHS_BETWEEN (SYSDATE, FECHANAC)/12) "Edad" FROM NACIMIENTOS;

25.- A partir de la tabla EMPLE, obtener la fecha de alta formateada, de manera que aparezca el nombre del
mes con todas sus letras en minúscula, el número de día del mes y el año. Por ejemplo, diciembre 17, 1990
SELECT FECHA_ALT, TO_CHAR (FECHA_ALT, 'month dd yyyy') "Fecha Formateada" FROM EMPLE;

Ejercicios Propuestos Unidad 04. Pág. 11 or. F. Urrutibeaskoa


IEFPS Elorrieta-ErrekaMari GBLHI curso 2010-11 ikasturtea
Sistemas Gestores de Bases de Datos 

26.- A partir de la tabla EMPLE, obtener la fecha de alta formateada, de manera que aparezca el nombre del
mes con la primera letra en MAYÚSCULA, el número de día del mes y el año.
SELECT TO_CHAR (FECHA_ALT, 'Month "," dd yyyy') "Fecha Formateada" FROM EMPLE;

27.- A partir de la tabla EMPLE, obtener la fecha de alta formateada, de manera que aparezca el nombre del mes
con todas sus letras en MAYÚSCULA, el número de día del mes y el año.
SELECT TO_CHAR (FECHA_ALT, 'MONTH "," dd yyyy') "Fecha Formateada" FROM EMPLE;

28.- A partir de la tabla EMPLE, obtener la fecha de alta formateada, de manera que aparezca el nombre del
mes con tres letras, el número de día del año y los tres últimos dígitos del año. Ejemplo, dic 352 990
SELECT TO_CHAR (FECHA_ALT, 'mon "," ddd yyy') "Fecha Formateada" FROM EMPLE;

Ejercicios Propuestos Unidad 04. Pág. 12 or. F. Urrutibeaskoa


IEFPS Elorrieta-ErrekaMari GBLHI curso 2010-11 ikasturtea
Sistemas Gestores de Bases de Datos 

29.- Obtener la fecha de hoy formateada de la siguiente manera “Hoy es martes, 1 de noviembre de 2010” .
SELECT SYSDATE, TO_CHAR (SYSDATE, '"Hoy es " day dd " de " month " de " yyyy') "Fecha Formateada"
FROM DUAL;

30.- Visualizar los temas con menor número de ejemplares de la tabla librería que contengan una “g”.
SELECT TEMA
FROM LIBRERIA
WHERE UPPER (TEMA) LIKE '%G%'
AND EJEMPLARES = (SELECT MIN (EJEMPLARES) FROM LIBRERIA WHERE TEMA LIKE '%G%') ;
Con UPPER obligamos a poner todo en mayúsculas a la hora de hacer al comprobación con G

31.- Mirad si hay a algún alumno le sale nota media negativa en la tabla notas_alumnos
SELECT NOMBRE_ALUMNO
FROM NOTAS_ALUMNOS
WHERE (NOTA1+NOTA2+NOTA3)/3<0;

Ejercicios Propuestos Unidad 04. Pág. 13 or. F. Urrutibeaskoa


IEFPS Elorrieta-ErrekaMari GBLHI curso 2010-11 ikasturtea
Sistemas Gestores de Bases de Datos 

Ejercicios Del Libro (pagina 155)

1.- Dada la tabla EMPLE, obtén el sueldo medio, el numero de comisiones no nulas, el máximo sueldo y el mínimo
sueldo de los empleados del departamento 30. Emplea el formato adecuado para la salida para las cantidades
numéricas.
SELECT TO_CHAR (AVG (SALARIO), '99G999D99') "Salario medio", COUNT (COMISION) "Con NO nula",
TO_CHAR (MAX (SALARIO), '99G999D99') "Salario maximo", TO_CHAR (MIN (SALARIO), '99G999D99')
"Salario minimo" FROM EMPLE WHERE DEPT_NO=30;

2.- Visualiza los temas con mayor numero de ejemplares de la tabla librería y que tengan al menos, una 'E'
(pueden ser un tema o varios).
SELECT TEMA, EJEMPLARES
FROM LIBRERIA
WHERE TEMA LIKE '%E%'
AND EJEMPLARES=(SELECT MAX (EJEMPLARES) FROM LIBRERIA);

3.- Dada la tabla MISTEXTOS ¿que sentencia SELECT se debe ejecutar para tener este resultado?.
Resultado
------------------
METODOLOGIA DE LA PROGRAMACION-^-^-^-^-
INFORMATICA BASICA-^-^-^-^-^-^-^-^-^-^-
SISTEMAS OPERATIVOS-^-^-^-^-^-^-^-^-^-^-
SISTEMAS DIGITALES-^-^-^-^-^-^-^-^-^-^-
MANUAL DE C-^-^-^-^-^-^-^-^-^-^-^-^--^-^-^-
en total 40 caracteres.
SELECT RPAD (RTRIM (LTRIM (TITULO,'"'),'."'),40,'-^') "Resultado" FROM MISTEXTOS;

4.- Visualiza los títulos de la tabla MISTEXTOS sin los caracteres punto y comillas, y en minúscula, de dos
formas conocidas.
SELECT LOWER (RTRIM (LTRIM (TITULO,'"'),'."')) "Resultado" FROM MISTEXTOS;

Ejercicios Propuestos Unidad 04. Pág. 14 or. F. Urrutibeaskoa


IEFPS Elorrieta-ErrekaMari GBLHI curso 2010-11 ikasturtea
Sistemas Gestores de Bases de Datos 

5.- Dada la tabla LIBROS, escribe la sentencia SELECT que visualice dos columnas, una con el AUTOR y otra con
el apellido del autor.
Busco la coma del apellido y sabiendo la posición de la coma, se hasta donde llega el apellido y cojo esa parte de la
cadena.
SELECT INSTR(AUTOR,( ',')) "Apellido" FROM LIBROS; devuelve la posición de la ','

SELECT AUTOR, SUBSTR (AUTOR, 1, INSTR (AUTOR,',') -1) "Apellido" FROM LIBROS; Devuelve el contenido
de autor hasta la posición indicada por la sentencia anterior y restando 1 para que no aparezca la “,”
CELA, CAMILO JOSE queremos que de: CELA

6.- Escribe la sentencia SELECT que visualice las columnas de AUTOR y otra columna con el nombre del autor
(sin el apellido) de la tabla LIBROS.
SELECT AUTOR, SUBSTR (AUTOR, INSTR (AUTOR,',') +2) "Nombre" FROM LIBROS;
CELA, CAMILO JOSE queremos que de: CAMILO JOSE

7.- A partir de la tabla LIBROS, realiza una sentencia SELECT que visualice en una columna, primero el nombre
del autor y luego, su apellido.
SELECT SUBSTR (AUTOR, INSTR (AUTOR,',') +2) "Nombre", SUBSTR (AUTOR, 1, INSTR (AUTOR,',') -1)
"Apellido" FROM LIBROS;

8.- A partir de la tabla LIBROS, realiza una sentencia SELECT para que aparezcan los títulos ordenados por su
numero de caracteres.
SELECT TITULO, LENGTH (TITULO) "Longitud"
FROM LIBROS
ORDER BY LENGTH (TITULO);

Ejercicios Propuestos Unidad 04. Pág. 15 or. F. Urrutibeaskoa


IEFPS Elorrieta-ErrekaMari GBLHI curso 2010-11 ikasturtea
Sistemas Gestores de Bases de Datos 

9.- Dada la tabla NACIMIENTOS, realiza una sentencia SELECT que obtenga la siguiente salida: NOMBRE,
FECHANAC, FECHA_FORMATEADA, done FECHA_FORMATEADA tiene el siguiente formato.
“Nació el 12 de mayo de 1982”.
SELECT NOMBRE, FECHANAC, TO_CHAR (FECHANAC, '"Nacio el " dd " de " month " de " yyyy') "Fecha
Formateada" FROM NACIMIENTOS;

11.- A partir de la tabla NACIMIENTOS, visualiza en una columna el NOMBRE seguido de su fecha de
nacimiento formateada (quita blancos del nombre).
SELECT CONCAT (RTRIM (NOMBRE), TO_CHAR (FECHANAC, '" Nacio el " dd " de " month " de " yyyy') )
"Nombre y Fecha nacimiento" FROM NACIMIENTOS;

12.- Convierte la cadena '010712' a fecha y visualiza su nombre de mes en mayúsculas.


SELECT TO_CHAR (TO_DATE ('010712', 'ddmmyy'), 'MONTH') FROM DUAL

13,- Visualiza aquellos temas de la tabla LIBRERIA cuyos ejemplares sean 7 con el nombre de tema de "SEVEN";
el resto de temas que no tengan 7 ejemplares se visualizaran como están.
SELECT TEMA, EJEMPLARES, DECODE (EJEMPLARES, 7, 'SEVEN', EJEMPLARES) "Código" FROM LIBRERÍA ;

TEMA EJEMPLARES CODIGO


--------------- ---------- ------------
Informática 15 Informática
Economía 10 Economía
Deportes 8 Deportes
Filosofía 7 SEVEN
Dibujo 10 Dibujo
Medicina 16 Medicina
Biología 11 Biología
Geología 7 SEVEN
Sociedad 9 Sociedad
Labores 20 Labores
Jardinería 6 Jardinería

11 filas seleccionadas.

14.- A partir de la tabla EMPLE, obtén el apellido de los empleados que lleven mas de 15 años trabajando.
SELECT APELLIDO
FROM EMPLE
WHERE TRUNC (MONTHS_BETWEEN (SYSDATE, FECHA_ALT)/12)>15;

Ejercicios Propuestos Unidad 04. Pág. 16 or. F. Urrutibeaskoa


IEFPS Elorrieta-ErrekaMari GBLHI curso 2010-11 ikasturtea
Sistemas Gestores de Bases de Datos 

15.- Selecciona el apellido de los empleados de la tabla EMPLE que lleven mas de 16 años trabajando en el
departamento “VENTAS”.
SELECT APELLIDO
FROM EMPLE
WHERE TRUNC (MONTHS_BETWEEN (SYSDATE, FECHA_ALT)/12)>16
AND DEPT_NO=(SELECT DEPT_NO FROM DEPART WHERE DNOMBRE='VENTAS');

16.- Visualiza el apellido, el salario, y el numero de departamento de aquellos empleados de la tabla EMPLE cuyo
salario sea el mayor de su departamento.
SELECT APELLIDO, SALARIO, DEPT_NO
FROM EMPLE A
WHERE SALARIO=(SELECT MAX (SALARIO) FROM EMPLE B WHERE A.DEPT_NO=B.DEPT_NO);

17.- Visualiza el apellido, el salario y el numero de departamento de aquellos empleados de la tabla EMPLE cuyo
salario supere a la media en su departamento.
SELECT APELLIDO, SALARIO, DEPT_NO
FROM EMPLE A
WHERE SALARIO>(SELECT AVG (SALARIO) FROM EMPLE B WHERE A.DEPT_NO=B.DEPT_NO);

Ejercicios Propuestos Unidad 04. Pág. 17 or. F. Urrutibeaskoa


IEFPS Elorrieta-ErrekaMari GBLHI curso 2010-11 ikasturtea
Sistemas Gestores de Bases de Datos 

Actividades Complementarias (Unidad 4).

1.- Obtén en una columna el apellido y el oficio de cada uno de los empleados de la tabla EMPLE, de la siguiente
manera: APELLIDO es OFICIO, por ejemplo, SANCHEZ es EMPLEADO (hay que anidar dos funciones CONCAT).
SELECT CONCAT (CONCAT (APELLIDO, ' es '), OFICIO) FROM EMPLE;

2.- ¿Que salida obtiene esta SELECT?:


SELECT RPAD ('X', 5, '*.') "Der", LPAD ('X', 5, '*.') "Izq" FROM DUAL;

3.- Visualiza la columna TITULO de la tabla MISTEXTOS sin las comillas de la derecha y de la izquierda ; y el
punto de la derecha.
SELECT LTRIM (RTRIM (TITULO, '."'), '"') "Titulo sin comillas y pto" FROM MISTEXTOS;

4.- Visualiza el apellido del empleado y la primera letra del apellido en minúscula.
SELECT APELLIDO, SUBSTR(LOWER (APELLIDO),1,1)"Inicial" FROM EMPLE;

Ejercicios Propuestos Unidad 04. Pág. 18 or. F. Urrutibeaskoa


IEFPS Elorrieta-ErrekaMari GBLHI curso 2010-11 ikasturtea
Sistemas Gestores de Bases de Datos 

5.- A partir de la tabla MISTEXTOS visualiza la columna TITULO sin los caracteres punto y comillas dobles (.”).
SELECT LTRIM(RTRIM(TITULO,'."'),'"')"Titulo sin caracteres" FROM MISTEXTOS;

6.- Calcula el numero de caracteres de la columna TEMA para todas las filas de la tabla librería. Comenta el
resultado obtenido.
SELECT LENGTH (RTRIM(TEMA,' ')) FROM LIBRERIA;

SELECT LENGTH (RTRIM(TEMA)) FROM LIBRERIA; Daría el mismo resultado (usado para quitar
espacios).

7.- Resta 3 años a la fecha de alta de los empleados de EMPLE.


SELECT ADD_MONTHS(FECHA_ALT,-36) FROM EMPLE;

8.- ¿Cual es la fecha del ultimo día del mes de Febrero del año 2008? ¿Y del año 2009?.
SELECT LAST_DAY ('01022008') FROM DUAL;

Ejercicios Propuestos Unidad 04. Pág. 19 or. F. Urrutibeaskoa


IEFPS Elorrieta-ErrekaMari GBLHI curso 2010-11 ikasturtea
Sistemas Gestores de Bases de Datos 

9.- Obtén la fecha de hoy con el siguiente formato: “Hoy es nombre_día, día_mes de nombre_mes de año”.
SELECT TO_CHAR (SYSDATE, '"Hoy es " day ", " dd " de " month " de " yyyy' ) FROM DUAL;

10.- Visualiza la suma de salarios de la tabla EMPLE de manera formateada, de tal manera que aparezca el símbolo
de la moneda local, el punto para los miles y la coma para los decimales.
SELECT TO_CHAR (SUM (SALARIO),'99G999L')"Suma Salario formateada" FROM EMPLE;

11.- ¿En que día de la semana naciste?


SELECT TO_CHAR (TO_DATE ('02071964','ddmmyy'), 'day')"Dia que naci" FROM DUAL;

12.- Dada la tabla librería, visualiza todas sus filas sustituyendo el tema 'DIBUJO' por 'DISEÑO', y 'LABORES'
por 'HOGAR'. En cualquier otro caso, deja el tema como esta.
SELECT REPLACE (REPLACE (TEMA, 'DIBUJO', 'DISEÑO'), 'LABORES', 'HOGAR') "Dibujo=diseño y
Labores=Hogar" FROM LIBRERIA;

13.- Representa en formato carácter los caracteres 1 al 4 del APELLIDO 'SALA' de la tabla EMPLE.

Ejercicios Propuestos Unidad 04. Pág. 20 or. F. Urrutibeaskoa


IEFPS Elorrieta-ErrekaMari GBLHI curso 2011-12 ikasturtea
Sistemas Gestores de Bases de Datos 

Tablas utilizadas en los ejercicios (Unidad 5)

EMPLE

EMP_NO APELLIDO OFICIO DIR FECHA_ALT SALARIO COMISION DEPT_NO


Number(4) Varchar2(10) Varchar2(10) Number(4) Date Number (10) Number(10) Number(2)
7369 SANCHEZ EMPLEADO 7902 17/12/1980 104000 20
7499 ARROYO VENDEDOR 7698 20/02/1980 208000 39000 30
7521 SALA VENDEDOR 7698 22/02/1981 162500 65000 30
7566 JIMENEZ DIRECTOR 7839 02/04/1981 386750 20
7654 MARTIN VENDEDOR 7698 29/09/1981 162500 182000 30
7698 NEGRO DIRECTOR 7839 01/05/1981 370500 30
7782 CEREZO DIRECTOR 7839 09/06/1981 318500 10
7788 GIL ANALISTA 7566 09/11/1981 390000 20
7839 REY PRESIDENTE 17/11/1981 650000 10
7844 TOVAR VENDEDOR 7698 08/09/1981 195000 0 30
7876 ALONSO EMPLEADO 7788 23/09/1981 143000 20
7900 JIMENO EMPLEADO 7698 03/12/1981 123500 30
7902 FERNANDEZ ANALISTA 7566 03/12/1981 390000 20
7934 MUÑOZ EMPLEADO 7782 23/01/1982 169000 10

DEPART PARALEER

DEPT_NO DNOMBRE LOC COD_LIBRO NOMBRE_LIBRO


Number(2) Varchar2(14) Varchar2(14) Number(15) Varchar2(40)
10 CONTABILIDAD SEVILLA 100 Cien Años de Soledad
20 INVESTIGACION MADRID 200 Los Mitos Griegos
30 VENTAS BARCELONA 300 El Camino
40 PRODUCCION BILBAO

LEIDOS
ANTIGUOS
COD_LIBRO FECHA
Number(3) Date
NOMBRE EDAD LOCALIDAD
300 20/02/1999
Varchar2(20) Number(2) Varchar2(15)
200 11/04/1999
MARÍA 20 MADRID
ERNESTO 21 MADRID
ANDRÉS 26 LAS ROZAS
IRENE 24 LAS ROZAS
ALUM

NOMBRE EDAD LOCALIDAD


NUEVOS
Varchar2(20) Number(2) Varchar2(15)
JUAN 18 COSLADA
NOMBRE EDAD LOCALIDAD
PEDRO 19 COSLADA
Varchar2(20) Number(2) Varchar2(15)
ANA 17 ALCALA
JUAN 18 COSLADA
LUISA 18 TORREJÓN
MAITE 15 ALCALA
MARÍA 20 MADRID
SOFÍA 14 ALCALA
ERNESTO 21 MADRID
ANA 17 ALCALA
RAQUEL 19 TOLEDO
ERNESTO 21 MADRID
IEFPS Elorrieta-ErrekaMari GBLHI curso 2011-12 ikasturtea
Sistemas Gestores de Bases de Datos 

PERSONAL

COD_CENTRO DNI APELLIDOS FUNCION SALARIO


Number(4) Number(10) Varchar2(30) Varchar2(15) Number(10)
10 1112345 Martínez Salas, Fernando PROFESOR 220000
10 4123005 Bueno Zarco, Elisa PROFESOR 220000
10 4122025 Montes García, [Link] PROFESOR 220000
15 1112345 Rivera Silvestre, Ana PROFESOR 205000
15 9800990 Ramos Ruiz, Luis PROFESOR 205000
15 8660990 De Lucas Fdez, [Link] PROFESOR 205000
22 7650000 Ruiz Lafuente, Manuel PROFESOR 220000
45 43526789 Serrano Laguía, María PROFESOR 205000
10 4480099 Ruano Cerezo, Manuel ADMINISTRATIVO 180000
15 1002345 Albarrán Serrano, Alicia ADMINISTRATIVO 180000
15 7002660 Muñoz Rey, Felicia ADMINISTRATIVO 180000
22 5502678 Marín Marín, Pedro ADMINISTRATIVO 180000
22 6600980 Peinado Gil, Elena CONSERJE 175000
45 4163222 Sarro Molina, Carmen CONSERJE 175000

PROFESORES

COD_CENTRO DNI APELLIDOS ESPECIALIDAD


Number(4) Number(10) Varchar2(30) Varchar2(16)
10 1112345 Martínez Salas, Fernando INFORMÁTICA
10 4123005 Bueno Zarco, Elisa MATEMÁTICAS
10 4122025 Montes García, [Link] MATEMÁTICAS
15 9800990 Ramos Ruiz, Luis LENGUA
15 1112345 Rivera Silvestre, Ana DIBUJO
15 8660990 De Lucas Fdez, [Link] LENGUA
22 7650000 Ruiz Lafuente, Manuel MATEMÁTICAS
45 43526789 Serrano Laguía, María INFORMÁTICA

CENTROS

COD_ TIPO_ NOMBRE DIRECCION TELEFONO NUM_


CENTRO CENTRO Varchar2(30) Varchar2(26) Varchar2(10) PLAZAS
Number(4) Char(1) Number(4)
10 S IES El Quijote Avda. Los Molinos 25 965-887654 538
15 P CP Los Danzantes c/Las Musas s/n 985-112322 250
22 S IES Planeta Tierra C/Mina 45 925-443400 300
45 P CP Manuel Hidalgo C/Granada 5 926-202310 220
50 S IES Antoñete C/ Los Toreros 21 989-406090 310

TEMA ESTANTE EJEMPLARES LIBRERÍA


Char(15) Char(1) Number(2)
Informática A 15
Economía A 10
Deportes B 8
Filosofía C 7
Dibujo C 10
Medicina C 16
Biología A 11
Geología D 7
Sociedad D 9
Labores B 20
Jardinería E 6
IEFPS Elorrieta-ErrekaMari GBLHI curso 2011-12 ikasturtea
Sistemas Gestores de Bases de Datos 

TABLAS BANCOS CAP 05

BANCOS

SUCURSALES

CUENTAS

MOVIMIENTOS

Ejercicios Propuestos y Adicionales Unidad 05. Pág. 1 or.


IEFPS Elorrieta-ErrekaMari GBLHI curso 2011-12 ikasturtea
Sistemas Gestores de Bases de Datos 

Ejercicios Propuestos y Adicionales (Unidad 5).

1.- Visualizar los departamentos en los que el salario medio es mayor o igual que la media de
todos los salarios.
SELECT DEPT_NO, AVG (SALARIO)
FROM EMPLE
GROUP BY DEPT_NO
HAVING AVG (SALARIO)>=(SELECT AVG (SALARIO) FROM EMPLE);

2.- a1) Obtén los nombres de departamentos que tengan más de 4 personas trabajando.
SELECT DNOMBRE "Nombre Departamentos"
FROM DEPART
WHERE DEPT_NO IN (SELECT DEPT_NO FROM EMPLE GROUP BY DEPT_NO HAVING
COUNT (*)>4);

a2) Obtén los nombres de departamentos que tengan más de 4 personas trabajando y
numero de empleados.
#Esta sentencia no cuenta el numero de empleados:
SELECT DEPT_NO, DNOMBRE
FROM DEPART
WHERE DEPT_NO
IN (SELECT DEPT_NO FROM EMPLE GROUP BY DEPT_NO HAVING COUNT (*)>4);

Esta sentencia si da el resultado que se pide:


SELECT E.DEPT_NO, DNOMBRE, COUNT (*)
FROM EMPLE E, DEPART D
WHERE E.DEPT_NO=D.DEPT_NO
GROUP BY E.DEPT_NO, DNOMBRE
HAVING COUNT (*)>4;

Ejercicios Propuestos y Adicionales Unidad 05. Pág. 1 or.


IEFPS Elorrieta-ErrekaMari GBLHI curso 2011-12 ikasturtea
Sistemas Gestores de Bases de Datos 

Lo mismo de la forma clásica sin renombrar (da el mismo resultado):


SELECT EMPLE.DEPT_NO, DNOMBRE, COUNT (*)
FROM EMPLE, DEPART
WHERE EMPLE.DEPT_NO=DEPART.DEPT_NO
GROUP BY EMPLE.DEPT_NO, DNOMBRE
HAVING COUNT (*)>4;

b) Visualiza el número de departamento, el nombre de departamento y el número de


empleados del departamento con más empleados.
SELECT EMPLE.DEPT_NO, DNOMBRE, COUNT (*)
FROM EMPLE, DEPART
WHERE EMPLE.DEPT_NO=DEPART.DEPT_NO
GROUP BY EMPLE.DEPT_NO, DNOMBRE
HAVING COUNT (*)= (SELECT MAX (COUNT (*)) FROM EMPLE GROUP BY DEPT_NO);

3.- Sentencia Ejemplo de Combinación externa (OUTER JOIN):


SELECT D.DEPT_NO, DNOMBRE, COUNT (E.EMP_NO)
FROM EMPLE E, DEPART D
WHERE E.DEPT_NO (+) = D.DEPT_NO
GROUP BY D.DEPT_NO, DNOMBRE;

a) Analiza lo que ocurre si en lugar de COUNT(E.EMP_NO) ponemos COUNT(*) en la sentencia


SELECT anterior.
SELECT D.DEPT_NO, DNOMBRE, COUNT (*)
FROM EMPLE E, DEPART D
WHERE E.DEPT_NO (+) = D.DEPT_NO
GROUP BY D.DEPT_NO, DNOMBRE;

Da un 1 en la fila del Dept. 40 porque interpretamos que como aparece una vez la fila hay 1
empleado, esto es debido a usar COUNT (*).

Ejercicios Propuestos y Adicionales Unidad 05. Pág. 2 or.


IEFPS Elorrieta-ErrekaMari GBLHI curso 2011-12 ikasturtea
Sistemas Gestores de Bases de Datos 

b) Analiza también lo que ocurre si a la derecha de SELECT ponemos E.DEPT_NO en lugar de


D.DEPT_NO.
SELECT E.DEPT_NO, DNOMBRE, COUNT (E.EMP_NO)
FROM EMPLE E, DEPART D
WHERE E.DEPT_NO (+) = D.DEPT_NO
GROUP BY D.DEPT_NO, DNOMBRE;

Se corrige la parte del GROUP BY con E.DEPT_NO también y da:


SELECT E.DEPT_NO, DNOMBRE, COUNT (E.EMP_NO)
FROM EMPLE E, DEPART D
WHERE E.DEPT_NO (+) = D.DEPT_NO
GROUP BY E.DEPT_NO, DNOMBRE;

4.- Esta consulta también se puede hacer usando el operador IN. Escribe la consulta anterior
utilizando el operador IN.

5.- a) Visualizar los nombres de los alumnos de la tabla ALUM que aparezcan en alguna de
estas tablas: NUEVOS y ANTIGUOS. o ALUM intersección (NUEVOS unión ANTIGUOS) o
(ALUM intersección ANTIGUOS) unión (ALUM intersección ANTIGUOS)

OR = unión = UNION AND = intersección = INTERSEC = IN

b) Escribir las distintas formas en que se puede poner la consulta anterior llegando al
mismo resultado.

1ª Forma de hacerlo:
SELECT NOMBRE
FROM ALUM
WHERE NOMBRE
IN (SELECT NOMBRE FROM NUEVOS UNION SELECT NOMBRE FROM ANTIGUOS);

Ejercicios Propuestos y Adicionales Unidad 05. Pág. 3 or.


IEFPS Elorrieta-ErrekaMari GBLHI curso 2011-12 ikasturtea
Sistemas Gestores de Bases de Datos 

2ª Forma de hacerlo:
SELECT NOMBRE
FROM ALUM
WHERE NOMBRE
IN (SELECT NOMBRE FROM NUEVOS)
OR NOMBRE
IN (SELECT NOMBRE FROM ANTIGUOS);

3ª Forma de hacerlo:
SELECT NOMBRE
FROM ALUM
INTERSECT (SELECT NOMBRE FROM NUEVOS UNION SELECT NOMBRE FROM
ANTIGUOS);

c) Visualizar los nombres de los alumnos de la tabla ALUM que aparezcan en las dos
tablas: NUEVOS y ANTIGUOS. O : ALUM intersección (NUEVOS intersección ANTIGUOS)
1ª Forma de hacerlo:
SELECT NOMBRE
FROM ALUM
WHERE NOMBRE IN (SELECT NOMBRE FROM NUEVOS INTERSECT SELECT NOMBRE
FROM ANTIGUOS);

2ª Forma de hacerlo:
SELECT NOMBRE
FROM ALUM
INTERSECT (SELECT NOMBRE FROM NUEVOS INTERSECT SELECT NOMBRE FROM
ANTIGUOS);

Ejercicios Propuestos y Adicionales Unidad 05. Pág. 4 or.


IEFPS Elorrieta-ErrekaMari GBLHI curso 2011-12 ikasturtea
Sistemas Gestores de Bases de Datos 

3ª Forma de hacerlo:
SELECT NOMBRE
FROM ALUM
INTERSECT (SELECT NOMBRE FROM NUEVOS WHERE NOMBRE IN (SELECT NOMBRE
FROM ANTIGUOS));

d) Visualizar los nombres de los alumnos de la tabla ALUM que no aparezcan en las
tablas: NUEVOS y ANTIGUOS. O lo que es lo mismo: ALUM - (NUEVOS unión ANTIGUOS)
- = NOT IN = MINUS
1ª Forma de hacerlo:
SELECT NOMBRE
FROM ALUM
WHERE NOMBRE
NOT IN (SELECT NOMBRE FROM NUEVOS UNION SELECT NOMBRE FROM ANTIGUOS);

2ª Forma de hacerlo:
SELECT NOMBRE
FROM ALUM
MINUS (SELECT NOMBRE FROM NUEVOS UNION SELECT NOMBRE FROM ANTIGUOS);

6.- A partir de la tabla EMPLE, visualizar el número de vendedores del departamento


'VENTAS'.
SELECT DEPT_NO "Dpto. VENTAS", COUNT(*) "Empleados"
FROM EMPLE
WHERE DEPT_NO=(SELECT DEPT_NO FROM DEPART WHERE DNOMBRE='VENTAS')
GROUP BY DEPT_NO ;

7.- Dada la tabla LIBRERIA, visualizar por cada estante la suma de los ejemplares.
SELECT ESTANTE, SUM (EJEMPLARES) "Suma Ejemplares"
FROM LIBRERIA
GROUP BY ESTANTE;

Ejercicios Propuestos y Adicionales Unidad 05. Pág. 5 or.


IEFPS Elorrieta-ErrekaMari GBLHI curso 2011-12 ikasturtea
Sistemas Gestores de Bases de Datos 

8.- Visualizar el estante con más ejemplares de la tabla LIBRERIA.


SELECT ESTANTE, SUM (EJEMPLARES) "Suma Ejemplares"
FROM LIBRERIA
GROUP BY ESTANTE
HAVING SUM (EJEMPLARES) = (SELECT MAX(SUM(EJEMPLARES))
FROM LIBRERIA
GROUP BY ESTANTE);

9.- En la tabla PERSONAL, obtener por cada función el número de trabajadores.


SELECT FUNCION, COUNT(*) "Numero Trabajadoes"
FROM PERSONAL
GROUP BY FUNCION;

10.- Visualizar los diferentes estantes de la tabla LIBRERIA ordenados descendentemente


por estante.
SELECT ESTANTE
FROM LIBRERIA
GROUP BY ESTANTE
ORDER BY ESTANTE DESC;

Otra forma de hacerlo que da el mismo resultado:


SELECT DISTINCT ESTANTE
FROM LIBRERIA
ORDER BY ESTANTE DESC;

Ejercicios Propuestos y Adicionales Unidad 05. Pág. 6 or.


IEFPS Elorrieta-ErrekaMari GBLHI curso 2011-12 ikasturtea
Sistemas Gestores de Bases de Datos 

11.- Averiguar cuántos temas tiene cada estante de la tabla LIBRERÍA.


SELECT ESTANTE, COUNT(*) "Numero de Temas"
FROM LIBRERIA
GROUP BY ESTANTE;

12.- Visualizar los estantes que tengan tres temas en la tabla LIBRERÍA.
SELECT ESTANTE, COUNT(*) "Numero de Temas"
FROM LIBRERIA
GROUP BY ESTANTE
HAVING COUNT(*)=3;

Ejercicios Propuestos y Adicionales Unidad 05. Pág. 7 or.


IEFPS Elorrieta-ErrekaMari GBLHI curso 2011-12 ikasturtea
Sistemas Gestores de Bases de Datos 

Actividades complementarias Cap. 5 del Libro (pag. 167)

1.- Partiendo de la tabla EMPLE, visualiza por cada oficio de los empleados del departamento
'VENTAS' la suma de salarios.
SELECT DEPT_NO, OFICIO, SUM (SALARIO)"Suma salarios"
FROM EMPLE
WHERE DEPT_NO= (SELECT DEPT_NO FROM DEPART WHERE DNOMBRE='VENTAS')
GROUP BY DEPT_NO, OFICIO ORDER BY SUM (SALARIO);

2.- Selecciona aquellos apellidos de la tabla EMPLE cuyo salario sea igual a la media del salario
en su departamento.
SELECT APELLIDO
FROM EMPLE E1
WHERE SALARIO=(SELECT AVG(SALARIO) FROM EMPLE E2 WHERE E2.DEPT_NO =
E1.DEPT_NO GROUP BY DEPT_NO);

3.- A partir de la tabla EMPLE, visualiza el numero de empleados de cada departamento cuyo
oficio sea 'EMPLEADO'.
SELECT DEPT_NO "Departamento", COUNT (*) "Empleados con Oficio EMPLEADO"
FROM EMPLE
WHERE OFICIO='EMPLEADO'
GROUP BY DEPT_NO;

4.- Desde la tabla EMPLE, visualiza el departamento que tenga mas empleados cuyo oficio sea
'EMPLEADO'.
SELECT DEPT_NO "Departamento", COUNT (*) "Empleados con Oficio EMPLEADO"
FROM EMPLE
WHERE OFICIO='EMPLEADO'
GROUP BY DEPT_NO
HAVING COUNT(*)=(SELECT MAX (COUNT(*)) FROM EMPLE WHERE
OFICIO='EMPLEADO' GROUP BY DEPT_NO );

Ejercicios Propuestos y Adicionales Unidad 05. Pág. 8 or.


IEFPS Elorrieta-ErrekaMari GBLHI curso 2011-12 ikasturtea
Sistemas Gestores de Bases de Datos 

5.- A partir de las tablas EMPLE y DEPART, visualiza el numero de departamento y el nombre
de departamento que tenga mas empleados cuyo oficio sea 'EMPLEADO'.
SELECT DNOMBRE "Nombre Departamento", E.DEPT_NO "Departamento", COUNT (*)
"Empleados con Oficio EMPLEADO"
FROM EMPLE E, DEPART D
WHERE E.DEPT_NO=D.DEPT_NO AND OFICIO='EMPLEADO'
GROUP BY E.DEPT_NO, DNOMBRE
HAVING COUNT(*)=(SELECT MAX (COUNT(*)) FROM EMPLE WHERE
OFICIO='EMPLEADO' GROUP BY DEPT_NO );

6.- Busca los departamento que tienen mas de dos personas trabajando en la misma profesión.
SELECT DNOMBRE
FROM DEPART
WHERE DEPT_NO=(SELECT DISTINCT (DEPT_NO) FROM EMPLE GROUP BY
EMPLE.DEPT_NO, OFICIO HAVING COUNT(*)>2);

SELECT DEPT_NO, COUNT(*), OFICIO


FROM EMPLE
GROUP BY DEPT_NO, OFICIO HAVING COUNT(*)>2;

10.- Realiza una consulta en la que aparezca por cada centro y en cada especialidad el numero
de profesores. Si el centro no tiene profesores, debe aparecer un 0 en la columna de numero
de profesores. Las columnas a visualizar son: nombre de centro, especialidad y numero de
profesores.
SELECT NOMBRE "Centro", ESPECIALIDAD "Especialidad", COUNT (DNI)"Profesores"
FROM CENTROS C, PROFESORES P
WHERE C.COD_CENTRO =P.COD_CENTRO (+)
GROUP BY NOMBRE, ESPECIALIDAD ORDER BY COUNT (DNI) DESC;

Ejercicios Propuestos y Adicionales Unidad 05. Pág. 9 or.


IEFPS Elorrieta-ErrekaMari GBLHI curso 2011-12 ikasturtea
Sistemas Gestores de Bases de Datos 

11.- Obtén por cada centro el numero de empleados. Si el centro carece de empleados, ha de
aparecer un 0 como numero de empleados.
SELECT NOMBRE "Centro", COUNT (DNI)"Profesores"
FROM CENTROS C, PERSONAL P
WHERE C.COD_CENTRO =P.COD_CENTRO (+)
GROUP BY NOMBRE ORDER BY COUNT (DNI) DESC;

12.- Obtener la especialidad con menos profesores.


SELECT ESPECIALIDAD
FROM PROFESORES
GROUP BY ESPECIALIDAD
HAVING COUNT (*) = (SELECT MIN (COUNT (*)) FROM PROFESORES GROUP BY
ESPECIALIDAD);

13.- Obten el banco con mas sucursales. Los datos a obtener son:
Nombre de Banco NºSucursales
xxxxx xxx
SELECT NOMBRE_BANC "BANCO", COUNT (*) "Sucursales"
FROM BANCOS B, SUCURSALES S
WHERE B.COD_BANCO=S.COD_BANCO
GROUP BY NOMBRE_BANC
HAVING COUNT (*) = (SELECT MAX (COUNT(*)) FROM BANCOS B, SUCURSALES S
WHERE B.COD_BANCO=S.COD_BANCO GROUP BY NOMBRE_BANC);

SELECT NOMBRE_BANC "BANCO", COUNT (COD_SUCUR) "Sucursales"


FROM BANCOS B, SUCURSALES S
WHERE B.COD_BANCO=S.COD_BANCO
GROUP BY NOMBRE_BANC
HAVING COUNT(COD_SUCUR)=(SELECT MAX (COUNT(COD_SUCUR)) FROM
SUCURSALES GROUP BY COD_BANCO);

Ejercicios Propuestos y Adicionales Unidad 05. Pág. 10 or.


IEFPS Elorrieta-ErrekaMari GBLHI curso 2011-12 ikasturtea
Sistemas Gestores de Bases de Datos 

14.- El saldo actual de los bancos de 'GUADALAJARA', 1 fila por cada banco.
Nombre de Banco Saldo Debe Saldo Haber
xxxxx [Link] xx,xx

SELECT B.NOMBRE_BANC "Nombre Banco", SUM (SALDO_DEBE) "Saldo Debe", SUM


(SALDO_HABER) "Saldo Haber"
FROM BANCOS B, CUENTAS C
WHERE B.COD_BANCO = C.COD_BANCO
AND POBLACION = 'GUADALAJARA'
GROUP BY B.NOMBRE_BANC;

15.- Datos de la cuenta o cuentas con mas movimientos.


Nombre Cta Nºmovimientos
xxxxx xx
SELECT M.NUM_CTA "Numero Cta", NOMBRE_CTA "NOMBRE Cta", COUNT(*) "N
Movimientos"
FROM MOVIMIENTOS M, CUENTAS C
WHERE M.NUM_CTA=C.NUM_CTA
AND C.COD_SUCUR=M.COD_SUCUR
AND C.COD_BANCO=M.COD_BANCO
GROUP BY M.NUM_CTA, NOMBRE_CTA
HAVING COUNT(*)=(SELECT MAX (COUNT (*)) FROM MOVIMIENTOS GROUP BY
NUM_CTA);

16.- El nombre de la sucursal que haya tenido mas suma de reintegros.


Nombre Sucursal Suma Reintegros
xxxxx xx,xx
SELECT S.NOMBRE_SUC, SUM (IMPORTE) "Suma Reintegros"
FROM SUCURSALES S, MOVIMIENTOS M
WHERE S.COD_BANCO = M. COD_BANCO AND S.COD_SUCUR = M. COD_SUCUR and M.TIPO_MOV = 'R'
GROUP BY NOMBRE_SUC
HAVING SUM(IMPORTE) = (SELECT MAX( SUM (IMPORTE)) FROM MOVIMIENTOS M
WHERE M.TIPO_MOV = 'R'
GROUP BY COD_BANCO, COD_SUCUR);

Ejercicios Propuestos y Adicionales Unidad 05. Pág. 11 or.


Actividades complementarias 1 (Unidad 6)

Tablas ALUM, NUEVO y ANTIGUOS

1.- Dadas las tablas ALUM y NUEVOS, insertar en la tabla ALUM los nuevos alumnos.
INSERT INTO ALUM
SELECT * FROM NUEVOS MINUS SELECT * FROM ALUM;

2.- Borrar de la tabla ALUM los ANTIGUOS alumnos.


DELETE FROM ALUM
WHERE (NOMBRE, EDAD, LOCALIDAD)
IN (SELECT * FROM ANTIGUOS);

Tablas EMPLE y DEPART

3.- Insertar a un empleado de apellido 'SAAVEDRA' con número 2000. La fecha de alta será
la actual, el SALARIO será el mismo salario de 'SALA' más el 20 por 100 (SALARIO*1.2) y el
resto de datos serán los mismos que los datos de 'SALA'.
INSERT INTO EMPLE
SELECT 2000, 'SAAVEDRA', OFICIO, DIR, SYSDATE, SALARIO*1.2, COMISION, DEPT_NO
FROM EMPLE
WHERE APELLIDO='SALA';

4.- Modificar el número de departamento de 'SAAVEDRA'. El nuevo departamento será el


departamento donde hay más empleados cuyo oficio sea 'EMPLEADO'.
UPDATE EMPLE SET DEPT_NO =
(SELECT DEPT_NO FROM EMPLE WHERE OFICIO = 'EMPLEADO'
GROUP BY DEPT_NO HAVING COUNT (*) = (SELECT MAX (COUNT (*)) FROM
EMPLE WHERE OFICIO = 'EMPLEADO' GROUP BY DEPT_NO))
WHERE APELLIDO = 'SAAVEDRA' ;

5.- Borrar todos los departamentos de la tabla DEPART para los cuales no existan empleados
en EMPLE.
DELETE FROM DEPART
WHERE DEPT_NO=
(SELECT DEPT_NO FROM DEPART WHERE DEPT_NO NOT IN
(SELECT DEPT_NO FROM EMPLE));

Otra forma seria:


DELETE FROM DEPART
WHERE DEPT_NO IN
(SELECT DEPT_NO FROM DEPART MINUS SELECT DEPT_NO FROM EMPLE);
Otra forma seria:
DELETE FROM DEPART
WHERE DEPT_NO NOT IN (SELECT DEPT_NO FROM EMPLE);

Tablas PERSONAL, PROFESORES y CENTROS

6.- Modificar el número de plazas con un valor igual a la mitad en aquellos centros con menos
de dos profesores.
UPDATE CENTROS
SET NUM_PLAZAS=NUM_PLAZAS/2
WHERE COD_CENTRO IN (SELECT COD_CENTRO FROM PROFESORES GROUP BY
COD_CENTRO HAVING COUNT(*)<2);

no hay centros con menos de 2 profesores.

7.- Eliminar los centros que no tengan personal.


DELETE FROM CENTROS
WHERE COD_CENTRO
IN (SELECT COD_CENTRO FROM CENTROS MINUS SELECT COD_CENTRO FROM
PERSONAL);

Ha borrado el centro con código 50

Otra forma:
DELETE FROM CENTROS
WHERE COD_CENTRO
NOT IN (SELECT DISTINCT COD_CENTRO FROM PERSONAL);

8.- Añadir un nuevo profesor en el centro o en los centros cuyo número de administrativos
sea 1 en la especialidad de 'IDIOMA', con DNI 8790055 y de nombre 'Clara Salas'.
INSERT INTO PROFESORES
SELECT DISTINCT COD_CENTRO, 879055, 'Clara Salas','IDIOMA'
FROM PERSONAL
WHERE COD_CENTRO
IN (SELECT COD_CENTRO FROM PERSONAL WHERE FUNCION='ADMINISTRATIVO'
GROUP BY COD_CENTRO HAVING COUNT(*)=1);
9.- Borrar al personal que esté en centros de menos de 300 plazas y con menos de dos
profesores.
DELETE FROM PERSONAL
WHERE COD_CENTRO IN
(SELECT COD_CENTRO FROM CENTROS WHERE NUM_PLAZAS<300)
AND COD_CENTRO IN (SELECT COD_CENTRO FROM PERSONAL GROUP BY
COD_CENTRO HAVING COUNT(*)<2);

No hay centros con menos de 2 profesores.

10.- Borrar a los profesores que estén en la tabla PROFESORES y que no estén en la tabla
PERSONAL.
DELETE FROM PROFESORES
WHERE DNI IN
(SELECT DNI FROM PROFESORES MINUS SELECT DNI FROM PERSONAL);

Ejercicio 1 del libro pag. 171


INSERT INTO PROFESORES
VALUES (22, 23444800, 'Gonzalez Sevilla, Miguel A.', 'HISTORIA');
Escribe la sentencia INSERT anterior de otra manera:
INSERT INTO PROFESORES (COD_CENTRO, DNI, APELLIDOS, ESPECIALIDAD)
VALUES (22, 23444800, 'Gonzalez Sevilla, Miguel A.', 'HISTORIA');

inserta un profesor cuya especialidad supere los 16 caracteres de longitud.


INSERT INTO PROFESORES (COD_CENTRO, DNI, APELLIDOS, ESPECIALIDAD)
VALUES (22, 23444806, 'Gonzalez Perez, Angel', 'HISTORIA del arte contemporaneo de
hoy');

Ejercicio 3 del libro pag. 174


aumenta en 100€ el salario y en 10 € la comisión a todos los empleados del departamento 10,
de la tabla EMPLE.

UPDATE EMPLE
SET SALARIO=SALARIO+100, COMISION=COMISION+10 WHERE DEPT_NO=10;
Actividades complementarias 2 (Unidad 6)

Un almacén de distribución de artículos desea mantener información sobre las ventas hechas
por las tiendas que compran al almacén. Dispone de las siguientes tablas para mantener esta
información:

Tablas ARTICULOS, FABRICANTES, TIENDAS, PEDIDOS y VENTAS

Artículos: almacena cada uno de los artículos que el almacén puede abastecer a las tiendas.
Cada articulo viene determinado por las columnas : ARTICULO, COD_FABRICANTE, PESO y
CATEGORIA. La categoría puede ser 'Primera', 'Segunda' o 'Tercera'.

Fabricantes: Contiene los países de origen de los fabricantes de artículos. Cada


COD_FABRICANTE tiene su país.

Tiendas: Almacena los datos de las tiendas que venden artículos. Cada tienda se identifica por
su NIF.

Pedidos: Son los pedidos que realizan las tiendas al almacén. Cada pedido se identifica por:
NIF, ARTICULO, COD_FABRICANTE, PESO, CATEGORIA y FECHA_PEDIDO. Cada fila de la
tabla representa un pedido.

Ventas: Almacena las ventas de artículos que hace cada una de las tiendas. Cada venta se
identifica por: NIF, ARTICULO, COD_FABRICANTE, PESO, CATEGORIA y FECHA_VENTA.
Cada fila de la tabla representa una venta.

Diagrama E/R:

*Cod_Fabricante M:N
Nombre Fabricantes Fecha Venta
País Unidades vendidas
Ventas a
Clientes

*DNI
1 :N Tienen Tiendas Nombre
Dirección
Población
M:N Provincia
CodPostal
*Articulo
Precio Venta Pedidos a
Precio costo Artículos
Existencias Proveedores
*Categoría Fecha Pedido
*Peso Unidades pedidas
11.- Dar de alta un nuevo artículo de 'Primera' categoría para los fabricantes de 'FRANCIA'
y abastecer con cinco unidades de ese artículo a todas las tiendas y en la fecha de hoy.
INSERT INTO ARTICULOS
SELECT 'Tocino', COD_FABRICANTE, 2, 'Primera', 50, 30, 100
FROM FABRICANTES
WHERE PAIS='FRANCIA';
Esta sentencia inserta 1 fila

INSERT INTO PEDIDOS


SELECT NIF, ARTICULO, COD_FABRICANTE, PESO, 'CATEGORIA', SYSDATE, 5
FROM TIENDAS T, FABRICANTES F, ARTICULOS A
WHERE [Link]='FRANCIA' AND [Link]='Tocino';
Esta sentencia inserta 6 filas

12.- Realizar una venta para todas las tiendas de 'TOLEDO' de 10 unidades en los artículos
de 'Primera' categoría.
INSERT INTO VENTAS
SELECT NIF, ARTICULO, COD_FABRICANTE, PESO, CATEGORIA, SYSDATE, 10
FROM ARTICULOS, TIENDAS
WHERE CATEGORIA='Primera'
AND PROVINCIA='TOLEDO';
Esta sentencia inserta 38 filas (31 + 1 +6 , esta ultimas son la insertadas en el ejercicio 11)

13.- Cambiar todos los artículos de 'Primera' categoría a 'Segunda' categoría del país
UPDATE ARTICULOS
SET CATEGORIA='Segunda'
WHERE CATEGORIA='Primera' AND COD_FABRICANTE IN (SELECT COD_FABRICANTE FROM
FABRICANTES WHERE PAIS='ITALIA');
Esta sentencia actualiza 2 filas

14.- Eliminar aquellas tiendas que no han realizado ventas.


DELETE FROM TIENDAS
WHERE NIF NOT IN (SELECT NIF FROM VENTAS);
Esta sentencia borra 2 filas

15.- Restar uno a las unidades de los últimos pedidos de la tienda con NIF '5555-B'.
UPDATE PEDIDOS
SET UNIDADES_PEDIDAS=UNIDADES_PEDIDAS-1
WHERE NIF='5555-B'
AND FECHA_PEDIDO=(SELECT MAX(FECHA_PEDIDO) FROM PEDIDOS WHERE NIF='5555-B');

16.- Para aquellos artículos de los que se hayan vendido más de 30 unidades, realizar un
pedido de 10 unidades para la tienda con NIF '5555-B' con la fecha actual.
INSERT INTO PEDIDOS
SELECT '5555-B', ARTICULO, COD_FABRICANTE, PESO, CATEGORIA, SYSDATE, 10
FROM VENTAS
GROUP BY ARTICULO, COD_FABRICANTE, PESO, CATEGORIA
HAVING SUM(UNIDADES_VENDIDAS)>30;
17.- Dar de alta dos tiendas en la provincia de 'SEVILLA' y abastecerlas con 30 unidades de
artículos de la marca de fabricante 'GALLO'.
INSERT INTO TIENDAS
VALUES ('5456-C', 'Tienda Sevilla 1', 'C/Sevilla 10', 'Ajete', 'SEVILLA','56789');

INSERT INTO TIENDAS


VALUES ('5457-J', 'Tienda Sevilla 2', 'C/Sevilla 12', 'Ajete', 'SEVILLA','56789');

INSERT INTO PEDIDOS


SELECT '5456-C', ARTICULO, COD_FABRICANTE, PESO, CATEGORIA, SYSDATE, 30
FROM ARTICULOS
WHERE COD_FABRICANTE = (SELECT COD_FABRICANTE FROM FABRICANTES WHERE
NOMBRE='GALLO');

INSERT INTO PEDIDOS


SELECT '5457-J', ARTICULO, COD_FABRICANTE, PESO, CATEGORIA, SYSDATE, 30
FROM ARTICULOS
WHERE COD_FABRICANTE = (SELECT COD_FABRICANTE FROM FABRICANTES WHERE
NOMBRE='GALLO');

Como solo hay de Sevilla las dos que hemos metido también se puede hacer así:
INSERT INTO PEDIDOS
SELECT NIF, ARTICULO, COD_FABRICANTE, PESO, CATEGORIA, SYSDATE, 30
FROM TIENDAS, ARTICULOS A, FABRICANTES F
WHERE PROVINCIA='SEVILLA', AND [Link]='GALLO' AND A.COD_FABRICANTE =
F.COD_FABRICANTE;

18.- Borrar los pedidos de 'Primera' categoría cuyo país de procedencia sea 'BÉLGICA'.
DELETE FROM PEDIDOS
WHERE CATEGORIA='Primera'
AND COD_FABRICANTE=(SELECT COD_FABRICANTE FROM FABRICANTES WHERE
PAIS='BELGICA');

19.- Borrar los pedidos que no tengan tienda.


DELETE FROM PEDIDOS
WHERE NIF NOT IN (SELECT NIF FROM TIENDAS);

12.- Insertar un pedido de 20 unidades en la tienda '1111-A' con el artículo que mayor número
de ventas haya realizado.
Esta sentencia actualiza 1 filas
13.- Dar de alta una tienda en la provincia de 'MADRID' y abastecerla con 20 unidades de
cada uno de los artículos existentes.

17.- Cambiar los datos de la tienda con NIF '1111-A' igualándolos a los de la tienda con NIF
'2222-A'.

19.- Modificar aquellos pedidos en los que la cantidad pedida sea superior a las existencias
del artículo, asignando el 20 por 100 de las existencias a la cantidad que se ha pedido.

21.- Eliminar los artículos que no hayan tenido ni compras ni ventas.


IEFPS Elorrieta-ErrekaMari GBLHI 11-12 ikasturtea
 Sistemas Gestores de Bases de Datos 

Capitulo 7 - Ejercicios Propuestos.

1.- Crear las siguientes tablas de acuerdo con las restricciones que se mencionan:
Tabla ARTICULOS, TIENDAS, FABRICANTES, PEDIDOS y VENTAS

CREATE TABLE ARTICULOS2


(
ARTICULO VARCHAR2 (20),
COD_FABRICANTE NUMBER (3),
PESO NUMBER (3),
CATEGORIA VARCHAR2 (10),
PRECIO_VENTA NUMBER (6,2),
PRECIO_COSTO NUMBER (6,2),
EXISTENCIAS NUMBER (5),
CONSTRAINT FK_CODFAB FOREIGN KEY (COD_FABRICANTE) REFERENCES FABRICANTES2 ON DELETE
CASCADE,
CONSTRAINT PK_CLAVEP PRIMARY KEY (ARTICULO, COD_FABRICANTE, PESO, CATEGORIA),
CONSTRAINT MAYORQUE0 CHECK (PRECIO_VENTA>0 AND PRECIO_COSTO>0 AND PESO>0),
CONSTRAINT CATEGORI CHECK (CATEGORIA IN ('PRIMERA', 'SEGUNDA', 'TERCERA'))
);

CREATE TABLE FABRICANTES2


(
COD_FABRICANTE NUMBER (3) ,
NOMBRE VARCHAR2 (15) ,
PAIS VARCHAR (15) ,
CONSTRAINT CODFAB_PK PRIMARY KEY (COD_FABRICANTE),
CONSTRAINT NOMBRE_MAYUSCULA CHECK (NOMBRE=UPPER(NOMBRE)),
CONSTRAINT PAIS_MAYUSCULAS CHECK (PAIS=UPPER (PAIS))
);

Unidad 07. Creación, supresión y modificación de tablas y de vistas Pág. 1 or. F. Urrutibeaskoa
IEFPS Elorrieta-ErrekaMari GBLHI 11-12 ikasturtea
 Sistemas Gestores de Bases de Datos 

CREATE TABLE TIENDAS2


(
NIF VARCHAR2 (10),
NOMBRE VARCHAR2 (30) NOT NULL,
DIRECCION VARCHAR2 (20),
POBLACION VARCHAR2 (20),
PROVINCIA VARCHAR2 (20),
CODPOSTAL NUMBER (5),
CONSTRAINT PK_ELNIF PRIMARY KEY (NIF),
CONSTRAINT MAYUSCU CHECK (PROVINCIA = UPPER (PROVINCIA))
);

CREATE TABLE PEDIDOS2


(
NIF VARCHAR2 (10),
ARTICULO VARCHAR2 (20),
COD_FABRICANTE NUMBER (3),
PESO NUMBER (3),
CATEGORIA VARCHAR2 (10),
FECHA_PEDIDO DATE,
UNIDADES_PEDIDAS NUMBER (4),
EXISTENCIAS NUMBER (5),
CONSTRAINT FK_CODFABP FOREIGN KEY (COD_FABRICANTE) REFERENCES FABRICANTES2 ON DELETE
CASCADE,
CONSTRAINT PK_CLAVEPP PRIMARY KEY (NIF, ARTICULO, COD_FABRICANTE, PESO, CATEGORIA,
FECHA_PEDIDO),
CONSTRAINT FK_CLAVENIFP FOREIGN KEY (NIF) REFERENCES TIENDAS2 ON DELETE CASCADE,
CONSTRAINT FK_CODFRABP FOREIGN KEY (COD_FABRICANTE) REFERENCES FABRICANTES2 ON
DELETE CASCADE,
CONSTRAINT CATEGORIP CHECK (CATEGORIA IN ('PRIMERA', 'SEGUNDA', 'TERCERA'))
);

Unidad 07. Creación, supresión y modificación de tablas y de vistas Pág. 2 or. F. Urrutibeaskoa
IEFPS Elorrieta-ErrekaMari GBLHI 11-12 ikasturtea
 Sistemas Gestores de Bases de Datos 

CREATE TABLE VENTAS2


(
NIF VARCHAR2 (10),
ARTICULO VARCHAR2 (20),
COD_FABRICANTE NUMBER (3),
PESO NUMBER (3),
CATEGORIA VARCHAR2 (10),
FECHA_VENTA DATE,
UNIDADES_VENDIDAS NUMBER (4),
CONSTRAINT PK_CLAVEPV PRIMARY KEY (NIF, ARTICULO, COD_FABRICANTE, PESO, CATEGORIA,
FECHA_VENTA),
CONSTRAINT FK_CODFABV FOREIGN KEY (COD_FABRICANTE) REFERENCES FABRICANTES2 ON
DELETE CASCADE,
CONSTRAINT VENDIDAS_MAY0 CHECK (UNIDADES_VENDIDAS >0),
CONSTRAINT CATEGORIV CHECK (CATEGORIA IN ('PRIMERA', 'SEGUNDA', 'TERCERA')),
CONSTRAINT FK_CLAVEAJEV FOREIGN KEY (ARTICULO, COD_FABRICANTE, PESO, CATEGORIA)
REFERENCES ARTICULOS2 ON DELETE CASCADE,
CONSTRAINT FK_NIFV FOREIGN KEY (NIF) REFERENCES TIENDAS2 ON DELETE CASCADE
);

Unidad 07. Creación, supresión y modificación de tablas y de vistas Pág. 3 or. F. Urrutibeaskoa
IEFPS Elorrieta-ErrekaMari GBLHI 11-12 ikasturtea
 Sistemas Gestores de Bases de Datos 

2.- Añadir una restricción a la tabla TIENDAS para que el NOMBRE de la tienda sea de tipo título (InitCap).
ALTER TABLE TIENDAS2
ADD CONSTRAINT NOMBRETIENDAMAY CHECK (NOMBRE = INITCAP (NOMBRE));

INSERT INTO TIENDAS2


VALUES (16789654, 'romero', Valderejo 5', 'VIZCAYA', 'EREMUA', 56342);

3.- Visualizar las constraints definidas para las tablas anteriores.


SELECT CONSTRAINT_NAME, COLUMN_NAME FROM USER_CONS_COLUMNS WHERE TABLE_NAME=
'TIENDAS2';

4.- Modificar las columnas de las tablas PEDIDOS y VENTAS para que las UNIDADES_VENDIDAS y las
UNIDADES_PEDIDAS puedan almacenar cantidades numéricas de 6 dígitos.
ALTER TABLE PEDIDOS2
MODIFY (UNIDADES_PEDIDAS NUMBER (6));

ALTER TABLE VENTAS2


MODIFY (UNIDADES_VENDIDAS NUMBER (6));

Unidad 07. Creación, supresión y modificación de tablas y de vistas Pág. 4 or. F. Urrutibeaskoa
IEFPS Elorrieta-ErrekaMari GBLHI 11-12 ikasturtea
 Sistemas Gestores de Bases de Datos 

5.- Impedir que se den de alta más tiendas en la provincia de 'TOLEDO'.


ALTER TABLE TIENDAS2
ADD CONSTRAINT PROVNOTOLEDO CHECK (PROVINCIA != 'TOLEDO')
;

6.- Añadir a las tablas PEDIDOS y VENTAS una nueva columna para que almacenen el PVP del artículo.
ALTER TABLE PEDIDOS2
ADD (PVP NUMBER (9));

ALTER TABLE VENTAS2


ADD (PVP NUMBER (9));

Tablas PERSONAL, PROFESORES y CENTROS

Unidad 07. Creación, supresión y modificación de tablas y de vistas Pág. 5 or. F. Urrutibeaskoa
IEFPS Elorrieta-ErrekaMari GBLHI 11-12 ikasturtea
 Sistemas Gestores de Bases de Datos 

7.- Crear una vista que se llame CONSERJES que contenga el nombre del centro y el nombre de sus conserjes.

8.- Crear un sinónimo llamado CONSER asociado a la vista creada antes.

9.- Añadir a la tabla PROFESORES una columna llamada COD_ASIG con dos posiciones numéricas.
ALTER TABLE PROFESORES
ADD (COD_ASIG NUMBER (2));

10.- Crear la tabla TASIG con las siguientes columnas: COD_ASIG numérico, 2 posiciones y NOM_ASIG cadena
de 20 caracteres.
CREATE TABLE TASIG
(
NOM_ASIG VARCHAR2 (20),
COD_ASIG NUMBER (2)
);

11.- Añadir la restricción de clave primaria a la columna COD_ASIG de la tabla TASIG.


ALTER TABLE TASIG
ADD CONSTRAINT PK_CODASIG PRIMARY KEY (COD_ASIG);

Unidad 07. Creación, supresión y modificación de tablas y de vistas Pág. 6 or. F. Urrutibeaskoa
IEFPS Elorrieta-ErrekaMari GBLHI 11-12 ikasturtea
 Sistemas Gestores de Bases de Datos 

12.- Añadir la restricción de clave ajena a la columna COD_ASIG de la tabla PROFESORES.


ALTER TABLE PROFESORES
ADD CONSTRAINT FK_CODASIG FOREIGN KEY (COD_ASIG)
REFERENCES TASIG ON DELETE CASCADE;
Se pone ON DELETE CASCADE si queremos que se borre en las dos al actualizar.

13.- Visualizar los nombres de constraints y las columnas afectadas para las tablas TASIG y PROFESORES.

14.- Cambiar de nombre la tabla PROFESORES y llamarla PROFES.

15.- Borrar la tabla TASIG.

16.- Devolver la tabla PROFESORES a su situación inicial.

Unidad 07. Creación, supresión y modificación de tablas y de vistas Pág. 7 or. F. Urrutibeaskoa
IEFPS Elorrieta-ErrekaMari GBLHI 11-12 ikasturtea
 Sistemas Gestores de Bases de Datos 

EJERCICIOS DEL LIBRO:

Ejercicio 4 pag.197

CREATE TABLE EJEMPLO2


(
DNI VARCHAR2 (10) NOT NULL,
NOMBRE VARCHAR (30) DEFAULT 'No Definido',
USUARIO NUMBER DEFAULT UID
);

Ejercicio 6 pag.199

CREATE TABLE ARTICULOS2


(
ARTICULO VARCHAR2 (20),
COD_FABRICANTE NUMBER (3),

Unidad 07. Creación, supresión y modificación de tablas y de vistas Pág. 8 or. F. Urrutibeaskoa
IEFPS Elorrieta-ErrekaMari GBLHI 11-12 ikasturtea
 Sistemas Gestores de Bases de Datos 

PESO NUMBER (3),


CATEGORIA VARCHAR2 (10),
PRECIO_VENTA NUMBER (6,2),
PRECIO_COSTO NUMBER (6,2),
EXISTENCIAS NUMBER (5),
CONSTRAINT FK_CODFAB FOREIGN KEY (COD_FABRICANTE) REFERENCES
FABRICANTES2 ON DELETE CASCADE,
CONSTRAINT PK_CLAVEP PRIMARY KEY (ARTICULO, COD_FABRICANTE, PESO,
CATEGORIA),
CONSTRAINT MAYORQUE0 CHECK (PRECIO_VENTA>0 AND PRECIO_COSTO>0 AND
PESO>0),
CONSTRAINT CATEGORI CHECK (CATEGORIA IN ('PRIMERA', 'SEGUNDA', 'TERCERA'))
);

CREATE TABLE FABRICANTES2


(
COD_FABRICANTE NUMBER (3) ,
NOMBRE VARCHAR2 (15) ,
PAIS VARCHAR (15) ,
CONSTRAINT CODFAB_PK PRIMARY KEY (COD_FABRICANTE),
CONSTRAINT NOMBRE_MAYUSCULA CHECK (NOMBRE=UPPER(NOMBRE)),
CONSTRAINT PAIS_MAYUSCULAS CHECK (PAIS=UPPER (PAIS))
);

Ejercicio 7 pag.207

CREATE TABLE TIENDAS2


(
NIF VARCHAR2 (10),
NOMBRE VARCHAR2 (20),
DIRECCION VARCHAR2 (20),
POBLACION VARCHAR2 (20),

Unidad 07. Creación, supresión y modificación de tablas y de vistas Pág. 9 or. F. Urrutibeaskoa
IEFPS Elorrieta-ErrekaMari GBLHI 11-12 ikasturtea
 Sistemas Gestores de Bases de Datos 

PROVINCIA VARCHAR2 (20),


CODPOSTAL NUMBER (5)
);

ALTER TABLE TIENDAS2


ADD CONSTRAINT PK_ELNIF PRIMARY KEY (NIF);

ALTER TABLE TIENDAS2


ADD CONSTRAINT MAYUSCU CHECK (PROVINCIA = UPPER (PROVINCIA));

ALTER TABLE TIENDAS2


MODIFY (NOMBRE VARCHAR2 (30) NOT NULL);

Unidad 07. Creación, supresión y modificación de tablas y de vistas Pág. 10 or. F. Urrutibeaskoa
Ejercicio1. Matrículas

Supongamos el siguiente diagrama E/R:

ALUMNOS_U Matric_ MODULOS_U


U

• DNI Nota • Cod_Modulo


Nombre NombreModulo
Direccion
Telefono
Curso
Modelo

1.- Crea las tablas teniendo en cuenta las características que se señalan:

a) tabla ALUMNOS_U. ALUMNOS_U Null? Tipo


DNI Not Null VARCHAR2(9)
- Clave Primaria (PK): DNI NOMBRE Not Null VARCHAR2(20)
- CURSO: valores 1 o 2. LOCALIDAD VARCHAR2(20)
- MODELO: valores A (Castellano) o D TEL VARCHAR2(9) (Euskara).
CURSO NUMBER
MODELO CHAR(1)

b) tabla MODULOS_U.

MODULOS_U Null? Tipo


COD_MODULO Not Null NUMBER(2)
NOMBRE_MODULO VARCHAR2(50)

– Clave Primaria (PK): Cod_Modulo

c) tabla MATRIC_U.

MATRIC_U Null? Tipo


DNI Not Null VARCHAR2(9)
COD_MODULO Not Null NUMBER(2)
NOTA NUMBER(2)

- Clave Primaria (PK): DNI, Cod_Modulo


- Clave ajena: DNI ==> tabla ALUMNOS_U.
Cod_Modulo ==> tabla MODULOS_U.
– NOTA: valor 0 por defecto. Valores entre 0 y 10.
Comandos para crear las tablas:
CREATE TABLE ALUMNOS_U
(
DNI VARCHAR2(9) NOT NULL,
NOMBRE VARCHAR2(20) NOT NULL,
LOCALIDAD VARCHAR2(20),
TEL VARCHAR2(9),
CURSO NUMBER,
MODELO CHAR(1),
CONSTRAINT PK_DNI_A PRIMARY KEY (DNI),
CONSTRAINT CUR_A CHECK (CURSO IN (1,2)),
CONSTRAINT MOD_A CHECK (MODELO IN ('A','D'))
);

CREATE TABLE MODULOS_U


(
COD_MODULO NUMBER(2) NOT NULL,
NOMBRE_MODULO VARCHAR2(50),
CONSTRAINT PK_COD_M PRIMARY KEY (COD_MODULO)
);

CREATE TABLE MATRIC_U


(
DNI VARCHAR2(9) NOT NULL,
COD_MODULO NUMBER(2) NOT NULL,
NOTA NUMBER(2) DEFAULT 0,
CONSTRAINT PK_DNI_M PRIMARY KEY (DNI, COD_MODULO),
CONSTRAINT FK_DNI_M FOREIGN KEY (DNI) REFERENCES ALUMNOS_U ON DELETE
CASCADE,
CONSTRAINT FK_COD_M FOREIGN KEY (COD_MODULO) REFERENCES MODULOS_U
ON DELETE CASCADE,
CONSTRAINT NOTA_M CHECK (NOTA BETWEEN 0 AND 10)
);

2.- Crea la tabla MODULOS_U con estos datos:


COD_ NOMBRE_MODULO
MODULO
20
25 Poner las asignaturas del ciclo
10
15
50
55
40
45
60
65

Datos tabla MODULOS_U:


01 IMPLANTACION DE SISTEMAS OPERATIVOS cod 20
02 PLANIFICACION Y ADMINISTRACION DE REDES cod 25
03 FUNDAMENTOS DE HARDWARE cod 10
04 GESTION DE BASES DE DATOS cod 15
05 LENGUAJE DE MARCAS cod 50
06 ADMINISTRACION DE SISTEMAS OPERATIVOS cod 55
07 SERVICIOS DE RED E INTERNET cod 40
08 INGLES cod 45
09 ADMINISTRACION DE SGBD cod 60
10 SEGURIDAD cod 65

Comandos para introducir los datos:


INSERT INTO MODULOS_U
VALUES (20, 'IMPLANTACION DE SISTEMAS OPERATIVOS');

INSERT INTO MODULOS_U


VALUES (25, 'PLANIFICACION Y ADMINISTRACION DE REDES');

INSERT INTO MODULOS_U


VALUES (10, 'FUNDAMENTOS DE HARDWARE');

INSERT INTO MODULOS_U


VALUES (15, 'GESTION DE BASES DE DATOS');

INSERT INTO MODULOS_U


VALUES (50, 'LENGUAJE DE MARCAS');

INSERT INTO MODULOS_U


VALUES (55, 'ADMINISTRACION DE SISTEMAS OPERATIVOS');

INSERT INTO MODULOS_U


VALUES (40, 'SERVICIOS DE RED E INTERNET');

INSERT INTO MODULOS_U


VALUES (45, 'INGLES');

INSERT INTO MODULOS_U


VALUES (60, 'ADMINISTRACION DE SGBD');
INSERT INTO MODULOS_U
VALUES (65, 'SEGURIDAD');

Vista de los datos introducidos:


SELECT * FROM MODULOS_U;

• Los datos de la tabla ALUMNOS_U se crearán ejecutando el fichero [Link].


Estos son los datos:

DNI NOMBRE LOCALIDAD TEL CURSO MODELO


12345678A Juan Ramirez Bilbao 654345678 2 D
12342278A Jose Valenciano San Ignacio 675894567 2 D
12342278B Unai Rico Algorta 666453212 1 D
12342278C Juan Carlos Perrez Getxo 685342312 2 A
12342278D Maialen Saenz Astrabudua 645342354 2 A
12342278E Jon Ander Lopez Plencia 634562398 1 D
12342278F Diego Freijo Berango 647234512 2 D
12342278G 1 A
12342278H 2 D
12342278I 1 A
12342278J 2 A
12342278K 1 D
12342278L 1 D
12342278M 1 A
12342278N 2 D
12342278P 2 A
12342278Q 2 A
12342278R 2 A
12342278S 1 D
12342278T 1 D
12342278U 2 D
12342278V 2 D
12342278X 1 D
12342278Y 1 A
12342278Z 2 A
12342271A 2 A
12342272A 1 D
12342273A 1 A
12342274A 1 A
12342275A 1 A
12342276A 1 A
Instrucciones para insertar los datos:
INSERT INTO ALUMNOS_U
VALUES ('12345678A', 'Juan Ramirez', 'Bilbao', 654345678, 2, 'D');

INSERT INTO ALUMNOS_U


VALUES ('12342278A', 'Jose Valenciano', 'San Ignacio', 675894567, 2, 'D');

INSERT INTO ALUMNOS_U


VALUES ('12342278B', 'Unai Rico', 'Algorta', 666453212, 1, 'D');

INSERT INTO ALUMNOS_U


VALUES ('12342278C', 'Juan Carlos Perrez', 'Getxo', 685342312, 2, 'A');

INSERT INTO ALUMNOS_U


VALUES ('12342278D', 'Maialen Saenz', 'Astrabudua', 645342354, 2, 'A');

INSERT INTO ALUMNOS_U


VALUES ('12342278E', 'Jon Ander Lopez', 'Plencia', 634562398, 1, 'D');

INSERT INTO ALUMNOS_U


VALUES ('12342278F', 'Diego Freijo', 'Berango', 647234512, 2, 'D');

INSERT INTO ALUMNOS_U


VALUES ('12342273F', 'Juan Navarro', 'Leioa', 647234592, 1, 'D');

INSERT INTO ALUMNOS_U


VALUES ('12942273F', 'Pedro Aznar', 'Bilbao', 657232592, 1, 'A');

Vista de los datos introducidos:


SELECT * FROM ALUMNOS_U ;

• Invéntate algunos datos para la tabla MATRIC_U. Incluye algunos suspensos.

Instrucciones para insertar los datos:


INSERT INTO MATRIC_U
VALUES ('12342273F', 15, 7);

INSERT INTO MATRIC_U


VALUES ('12342273F', 25, 6);
INSERT INTO MATRIC_U
VALUES ('12342273F', 55, 9);

INSERT INTO MATRIC_U


VALUES ('12345678A', 10, 5);

INSERT INTO MATRIC_U


VALUES ('12345678A', 40, 9);

INSERT INTO MATRIC_U


VALUES ('12342278A', 20, 4);

INSERT INTO MATRIC_U


VALUES ('12342278A', 50, 4);

INSERT INTO MATRIC_U


VALUES ('12342278B', 25, 8);

INSERT INTO MATRIC_U


VALUES ('12342278B', 15, 5);

INSERT INTO MATRIC_U


VALUES ('12342278C', 15, 3);

INSERT INTO MATRIC_U


VALUES ('12342278C', 10, 5);

INSERT INTO MATRIC_U


VALUES ('12342278C', 50, 5);

INSERT INTO MATRIC_U


VALUES ('12342278D', 50, 5);

INSERT INTO MATRIC_U


VALUES ('12342278E', 55, 5);

INSERT INTO MATRIC_U


VALUES ('12342278F', 40, 6);

INSERT INTO MATRIC_U


VALUES ('12342278F', 55, 9);

INSERT INTO MATRIC_U


VALUES ('12342278F', 10, 8);

INSERT INTO MATRIC_U


VALUES ('12345678A', 45, 9);

INSERT INTO MATRIC_U


VALUES ('12342278D', 60, 4);

INSERT INTO MATRIC_U


VALUES ('12342278D', 55, 7);

INSERT INTO MATRIC_U


VALUES ('12942273F', 50, 4);
Vista de los datos introducidos:
SELECT * FROM MATRIC_U ;

3.- Crea las sentencias SQL para obtener la información de cada item:

a) La lista de todos los alumnos, ordenados por curso y modelo.


SELECT * FROM ALUMNOS_U
ORDER BY CURSO, MODELO ;

b) El número de alumnos de cada grupo (1A, 1D, 2A y 2D).


SELECT CURSO, MODELO, COUNT(*) "Nº ALUMNOS"
FROM ALUMNOS_U
GROUP BY CURSO, MODELO ;
c)¿Cuál es el grupo con el mayor número de alumnos?
SELECT CURSO, MODELO, COUNT(*) "Nº ALUMNOS"
FROM ALUMNOS_U
GROUP BY CURSO, MODELO
HAVING COUNT(*) = (SELECT MAX (COUNT (*)) FROM ALUMNOS_U GROUP BY CURSO, MODELO) ;

d) Este se hace al final.

e) Calcula el número de alumnos matriculado en cada uno de los módulos.


SELECT NOMBRE_MODULO "MODULO", COUNT (*)
FROM MATRIC_U M , MODULOS_U N
WHERE M.COD_MODULO=N.COD_MODULO
GROUP BY NOMBRE_MODULO ;

f) Calcula la nota media de todos los alumnos matriculados en 1º.


SELECT NOMBRE_MODULO "MODULO", M.COD_MODULO, AVG (NOTA) "NOTA MEDIA"
FROM MATRIC_U M , MODULOS_U N , ALUMNOS_U A
WHERE M.COD_MODULO=N.COD_MODULO AND [Link]=[Link] AND CURSO=1
GROUP BY NOMBRE_MODULO, M.COD_MODULO ;
g) Calcula el número de aprobados en cada uno de los módulos.
SELECT NOMBRE_MODULO, COUNT(*)
FROM MATRIC_U M, MODULOS_U N
WHERE M.COD_MODULO=N.COD_MODULO
AND NOTA>=5
GROUP BY NOMBRE_MODULO ;

h) Calcula el porcentaje de aprobados en cada uno de los módulos.


CREATE VIEW "APROBADOS"
AS SELECT *
FROM MATRIC_U
WHERE NOTA>=5 ;

SELECT MA.COD_MODULO, (TO_CHAR (COUNT([Link])/COUNT([Link])*100,'990D99') ||'%')


"PORCENTAJE APROBADOS"
FROM MATRIC_U MA, APROBADOS A
WHERE A.COD_MODULO(+) = MA.COD_MODULO
AND [Link](+) = [Link]
GROUP BY MA.COD_MODULO ;

d) Ponles un 7 a todos los alumnos matriculados en ‘Base de Datos’ y ‘Redes’.


Alumnos que cumplen alguna de las condiciones: Hacerlo al final después del h)
SELECT * FROM MATRIC_U WHERE COD_MODULO=15 OR COD_MODULO=25;
Como se puede observar hay tres alumnos que cumplen la condición indicada, DNI: 12342273F, DNI:
12342278B y DNI: 12342278C.

Necesitamos los códigos para Bases de Datos y Redes:


SELECT COD_MODULO FROM MODULOS_U WHERE NOMBRE_MODULO = 'GESTION DE BASES DE
DATOS';
SELECT COD_MODULO FROM MODULOS_U WHERE NOMBRE_MODULO = 'PLANIFICACION Y
ADMINISTRACION DE REDES';

SELECT COD_MODULO FROM MODULOS_U


WHERE NOMBRE_MODULO= 'GESTION DE BASES DE DATOS' OR NOMBRE_MODULO=
'PLANIFICACION Y ADMINISTRACION DE REDES';

La instrucción que responde a la pregunta es:


UPDATE MATRIC_U
SET NOTA=7
WHERE COD_MODULO IN (SELECT COD_MODULO FROM MODULOS_U WHERE NOMBRE_MODULO=
'GESTION DE BASES DE DATOS' OR NOMBRE_MODULO= 'PLANIFICACION Y ADMINISTRACION
DE REDES') ;

SELECT * FROM MATRIC_U WHERE COD_MODULO=15 OR COD_MODULO=25;


ELORRETA-ERREKAMARI curso 02-03
GESTION DE BASE DE DATOS

Otros ejercicios. Ejercicio2. Gimnasio

Tenemos una BD en la que se refleja la situación de un gimnasio donde los usuarios pagan las distintas actividades
que realizan por medio de un recibo mensual por el banco. Además se contemplan también las posibles relaciones
de parentesco o amistad entre los socios. La BD cuenta con las siguientes tablas:

• La tabla de BANCOS contiene una fila por cada uno de los bancos:

CREATE TABLE BANCOS


( ENT_SUC NUMBER(8) NOT NULL,
NOMBRE VARCHAR2(50),
DIRECCION VARCHAR2(50),
LOCALIDAD VARCHAR2(30),
TELEFONOS VARCHAR2(30),
CONSTRAINT CLAVE_PRIMARIA_BANCOS PRIMARY KEY(ENT_SUC)) ;

• La tabla de USUARIOS contiene una fila por cada usuario:

CREATE TABLE USUARIOS


( NUM_SOCIO VARCHAR2(7) NOT NULL,
DNI VARCHAR2(9) NOT NULL,
NOMBRE VARCHAR2(20),
APELLIDOS VARCHAR2(30),
FOTOGRAFIA LONG RAW,
DOMICILIO VARCHAR2(40),
LOCALIDAD VARCHAR2(50),
CP VARCHAR2(5),
FECHA_NACIMIENTO DATE,
TELEFONO VARCHAR2(20),
TAQUILLA VARCHAR2(15),
HORARIO VARCHAR2(15),
FECHA_ALTA DATE,
FECHA_BAJA DATE,
CUOTA_SOCIO NUMBER(7),
CUOTA_FAMILIAR NUMBER(7),
PAGA_BANCO CHAR NOT NULL
CONSTRAINT CHEQUEO1 CHECK (PAGA_BANCO IN ('S','N')),
CODIGO_BANCO NUMBER(8),
CUENTA NUMBER(10),
DIGITO_CONTROL NUMBER(2),
OBSERVACIONES VARCHAR2(500),
CONSTRAINT CLAVE_PRIMARIA_USUARIOS PRIMARY KEY (NUM_SOCIO),
CONSTRAINT CLAVE_ALTERNATIVA_USUARIOS UNIQUE (DNI),
CONSTRAINT CLAVE_AJENA_BANCOS FOREIGN KEY (CODIGO_BANCO)
REFERENCES BANCOS(ENT_SUC)) ;

Pág. 1.
ELORRETA-ERREKAMARI curso 02-03
GESTION DE BASE DE DATOS

• La tabla de ACTIVIDADES contiene una fila por cada actividad:

CREATE TABLE ACTIVIDADES


( CODIGO_ACTIVIDAD VARCHAR2(7) NOT NULL,
DESCRIPCION VARCHAR2(50),
CUOTA NUMBER(7),
CONSTRAINT CLAVE_PRIMARIA_ACTIVIDADES PRIMARY KEY (CODIGO_ACTIVIDAD)) ;

• La tabla de ACTIVIDADES_USUARIOS contiene una fila por cada actividad que realiza un usuario:

CREATE TABLE ACTIVIDADES_USUARIOS


( CODIGO_ACTIVIDAD VARCHAR2(7) NOT NULL,
CODIGO_USUARIO VARCHAR2(7) NOT NULL,
FECHA_ALTA DATE,
FECHA_BAJA DATE,
CONSTRAINT CLAVE_PRIMARIA_ACT_USU
PRIMARY KEY(CODIGO_ACTIVIDAD,CODIGO_USUARIO),
CONSTRAINT CLAVE_AJENA_ACT FOREIGN KEY (CODIGO_ACTIVIDAD)
REFERENCES ACTIVIDADES(CODIGO_ACTIVIDAD),
CONSTRAINT CLAVE_AJENA_USU FOREIGN KEY (CODIGO_USUARIO)
REFERENCES USUARIOS(NUM_SOCIO) ) ;

• La tabla de PAGOS contiene una fila por cada pago mensual de cada usuario:

CREATE TABLE PAGOS


( CODIGO_USUARIO VARCHAR2(7) NOT NULL,
NUMERO_MES NUMBER(2) NOT NULL,
CUOTA NUMBER(7),
OBSERVACIONES VARCHAR2(500),
CONSTRAINT CLAVE_PRIMARIA_PAGOS PRIMARY KEY(CODIGO_USUARIO, NUMERO_MES),
CONSTRAINT CLAVE_AJENA_PAG_USU FOREIGN KEY(CODIGO_USUARIO)
REFERENCES USUARIOS(NUM_SOCIO) ON DELETE CASCADE) ;

• La tabla de USUARIOS_ASOCIADOS contiene una fila por usuario que tiene relación con otro:

CREATE TABLE USUARIOS_ASOCIADOS


( CODIGO_USUARIO VARCHAR2(7) NOT NULL,
USUARIO_ASOCIADO VARCHAR2(7) NOT NULL,
CONSTRAINT CLAVE_PRIMARIA_USUARIOS_ASOC
PRIMARY KEY(CODIGO_USUARIO, USUARIO_ASOCIADO),
CONSTRAINT CLAVE_AJENA_USU_USU FOREIGN KEY(CODIGO_USUARIO)
REFERENCES USUARIOS(NUM_SOCIO),
CONSTRAINT CLAVE_AJENA_USU_ASOC FOREIGN KEY(USUARIO_ASOCIADO)
REFERENCES USUARIOS(NUM_SOCIO)) ;

Pág. 2.
ELORRETA-ERREKAMARI curso 02-03
GESTION DE BASE DE DATOS

1.- Crea el modelo E/R que les corresponde a las especificaciones.

Usuarios
Asociados

Usuarios Tienen Banco

Actividades
Hacen Realizan
Usuarios

Actividades Pagos

2.- Ejecuta el fichero [Link] para crear las tablas en tu ordenador.


CONNECT HR/HR
START [Link]

3.- Ejecuta las sentencias SQL para obtener los siguientes datos:

a.- Selecciona las actividades cuya cuota es superior al 15% de la media de las cuotas de los usuarios que
no pagan mediante banco.
SELECT CODIGO_ACTIVIDAD "Codigo",DESCRIPCION "Actividad"
FROM ACTIVIDADES
WHERE CUOTA>(SELECT AVG (CUOTA_SOCIO)*0.15 FROM USUARIOS WHERE PAGA_BANCO='N') ;

b.- Multiplica por 3 las cuotas de todas las actividades.

UPDATE ACTIVIDADES
SET CUOTA = CUOTA*3 ;

Pág. 3.
ELORRETA-ERREKAMARI curso 02-03
GESTION DE BASE DE DATOS

7 row(s) updated.

c.- Selecciona las actividades cuya cuota es igual a alguna de las cuotas de los usuarios.
SELECT CODIGO_ACTIVIDAD "CODIGO", DESCRIPCION "ACTIVIDAD"
FROM ACTIVIDADES
WHERE CUOTA IN (SELECT CUOTA_SOCIO FROM USUARIOS) ;

d.- Selecciona las actividades cuya cuota es inferior a la cuota de socio mínima de entre todos los usuarios.
SELECT CODIGO_ACTIVIDAD "CODIGO", DESCRIPCION "ACTIVIDAD"
FROM ACTIVIDADES
WHERE CUOTA < (SELECT MIN (CUOTA_SOCIO) FROM USUARIOS) ;

e.- Selecciona los nombres y el número de socio de los usuarios cuyas cuotas de socio sean inferiores al
total de pagos realizados.
SELECT NOMBRE "Nombre", NUM_SOCIO "Nº Socio"
FROM USUARIOS
WHERE CUOTA_SOCIO < (SELECT SUM (CUOTA) FROM PAGOS WHERE USUARIOS.NUM_SOCIO =
PAGOS.CODIGO_USUARIO) ;

Pág. 4.
ELORRETA-ERREKAMARI curso 02-03
GESTION DE BASE DE DATOS

f.- Crea una vista que muestre el nombre de cada usuario, la descripción de las actividades en que participa
y la fecha de alta en esa actividad.
CREATE VIEW NOMBRE_USUARIO
AS SELECT [Link], [Link], AU.FECHA_ALTA FROM USUARIOS U,
ACTIVIDADES_USUARIOS AU, ACTIVIDADES A WHERE U.NUM_SOCIO = AU.CODIGO_USUARIO
AND AU.CODIGO_USUARIO = A.CODIGO_ACTIVIDAD ;

g.- Crea una vista con los socios que no tengan cuota nula.
CREATE VIEW USUCUOTANONULA
AS SELECT NOMBRE, APELLIDOS
FROM USUARIOS
WHERE CUOTA_SOCIO IS NOT NULL ;

h.- Crea una vista con las actividades cuya cuota sea superior a 3500.
CREATE VIEW ACTIVIDADCUOTA3500
AS SELECT CODIGO_ACTIVIDAD, DESCRIPCION
FROM ACTIVIDADES
WHERE CUOTA > 3500 ;

i.- Crea una vista que muestre los códigos de los bancos y la suma de las cuotas para cada banco.
CREATE VIEW CODIBANK_CUOTASUM
AS SELECT CODIGO_BANCO, SUM (CUOTA_SOCIO)
FROM USUARIOS
GROUP BY CODIGO_BANCO ;

j.- Actualiza en un 10% la cuota de socio de aquellos usuarios que estén inscritos en la actividad de
'Gimnasia de Mantenimiento'.
UPDATE USUARIOS
SET CUOTA_SOCIO = (CUOTA_SOCIO*0.10)+CUOTA_SOCIO
WHERE NUM_SOCIO IN (SELECT CODIGO_USUARIO
FROM ACTIVIDADES_USUARIOS AU, ACTIVIDADES A
WHERE AU.CODIGO_ACTIVIDAD = A.CODIGO_ACTIVIDAD
AND DESCRIPCION = 'GIMNASIA DE MANTENIMIENTO') ;

k.- Elimina los usuarios que practican ‘Natacion 2’.


DELETE FROM USUARIOS
WHERE NUM_SOCIO IN (SELECT CODIGO_USUARIO
FROM ACTIVIDADES_USUARIOS AU, ACTIVIDADES A
WHERE AU.CODIGO_ACTIVIDAD = A.CODIGO_ACTIVIDAD
AND DESCRIPCION = 'NATACION 2') ;

Nota: Reflexiva en Entidad usuario (realiza actividades)

Pág. 5.
ELORRETA-ERREKAMARI curso 02-03
GESTION DE BASE DE DATOS

Datos de las tablas:

BANCOS

ENT_SUC NOMBRE DIRECCION LOCALIDAD TELEFONOS


Number(8) Varchar2(50) Varchar2(50) Varchar2(30) Varchar2(30)
30700018 BANESTO MANUEL LLANEZA, 33 MIERES
20480070 CAJA DE ASTURIAS MANUEL LLANEZA, 17 MIERES
43000250 HERRERO MANUEL LLANEZA, 22 MIERES
85002222 SANTANDER LA CAMARA, 13 AVILES
22223333 BBV LA RIBERA, 17 LUANCO
33334444 ATLANTICO GIJON, 56 LUANCO

ACTIVIDADES

CODIGO_ DESCRIPCION CUOTA


ACTIVIDAD Varchar2(50) Number(7)
Varchar2(7)
G000001 GIMNASIA DE MANTENIMIENTO 1000
G000002 GIMNASIA RITMICA 800
AM00001 JUDO 1200
AM00002 KARATE 1100
N000001 NATACION 1 900
N000002 NATACION 2 1000
G000003 MUSCULACION 1300

ACTIVIDADES_USUARIOS

CODIGO_ CODIGO_USUARIO FECHA_ FECHA_


ACTIVIDAD Varchar2(7) ALTA BAJA
Varchar2(7) Date Date
G000001 A1111 30/03/1999
AM00002 A1111 30/03/1999
AM00001 A2222 30/03/1999
N000001 A2222 30/03/1999
N000002 I2222 01/03/1999
AM00002 I2222 11/02/19999

Pág. 6.
ELORRETA-ERREKAMARI curso 02-03
GESTION DE BASE DE DATOS

PAGOS

CODIGO_ NUMERO_ CUOTA OBSERVACIONES


USUARIO MES Number(7) Varchar2(500)
Varchar2(7) Number(2)
A1111 1 5000
A1111 2 5000
A1111 3 5000
A1111 4 5500
A1111 5 5500
A1111 6 5000
A2222 1 7800
A2222 2 7800
A2222 5 7800
A2222 6 8000
A2222 3 7800
A2222 4 9000
I1111 5 4500
I1111 7 5000
I1111 1 3456
A2222 7 8000
A3333 2 4500
I2222 1 5000
I2222 2 5000
I2222 3 5500
I2222 4 5500
I2222 6 6000
J1111 1 1000
J1111 2 10000
J1111 4 10000
J1111 5 10000
J1111 12 10000
J2222 12 8000
J2222 1 1000
J2222 3 10000
J2222 11 10000
J3333 1 1000
J3333 2 2000
J3333 3 3000
J3333 4 4000
J3333 5 500
J3333 11 800
J3333 12 1500

Pág. 7.
USUARIOS

NUM_SOCIO DNI NOMBRE APELLIDOS DOMICILIO LOCALIDAD CP FECHA_ CUOTA_ PAGA_ CODIGO_ CUENTA DC
Varchar(7) Varchar2 Varchar2(20) Varchar2(30) Varchar2 Varchar2 Varchar2 ALTA SOCIO BANCO BANCO Number Number
(9) (40) (50) (5) Date N(7) Char Number(8) (10) (2)
A1111 01111111 JUAN LUIS ARIAS ALVAREZ C/LA VEGA, 18 MIERES 33600 10/01/1996 5500 S 30700018 1111 10
A2222 02222222 INES PEREZ DIAZ C/DR. FLEMING, 14 MIERES 33600 10/01/1996 6800 S 20480070 2222 47
A3333 03333333 JOSE RUIZ PEÑA C/AVILES, 18 LUANCO 33400 21/05/1996 6000 N
I1111 00111111 MARIA EGIA SANTAMARINA C/GERNIKA, 3 MIERES 33600 10/11/1998 7000 S 43000250 123456 21
I2222 77896542 MARTA ARIAS SANTOLAYA C/ASTURIAS, 23 4º MIERES 33600 12/12/1997 4500 S 20480070 2242 41
J1111 11111111 ANA GUTIERREZ ALONSO C/ASTURIAS, 51 4º LUANCO 33440 02/03/1998 5000 S 85002222 2342 61
J2222 22222222 LAURA FERNANDEZ ALONSO C/TEVERGA, 17 2º LUANCO 33440 11/12/1997 5000 S 85002222 234255 34
J3333 33333333 MARIA ALONSO GUTIERREZ C/OVIEDO, 8 1º LUANCO 33440 10/11/1998 6000 S 22223333 425566 43
J4444 44444444 MANUEL ALONSO OVIES C/ OVIEDO, 18 4º LUANCO 33440 05/06/1996 6000 S 22223333 425566 43
J5555 55555555 RAMON ARBOLEYA GARCIA C/LANGREO, 9 1º AVILES 33400 03/04/1995 4000 S 85002222 4343 12
J6666 66666666 DOLORES MORENO RODRIGUEZ C/OVIEDO, 23 6º AVILES 33400 03/03/1998 S 22223333 6675 21
J7777 77777777 PABLO RODRIGUEZ ARIAS C/LA FLORIDA, 3 6º AVILES 33400 06/09/1997 4000 S 33334444 6775 12
J8888 88888888 MARTA ARRIEN GONZALEZ PLAZA SAN JUAN, 9 MIERES 33600 06/09/1997 7000 S 33334444 9975 11
J9999 99999999 LUIS BULNES BALBIN C/LA VEGA, 49 2º MIERES 33600 14/11/1996 7000 S 33334444 39975 22
J1010 10101010 JOSE ALVAREZ CASTRO C/OÑON, 23 2º MIERES 33600 01/04/1995 6000 S 33334444 93375 42
J0011 11011011 PELAYO ESLA CASARIEGO C/LA PISTA, 14 1º MIERES 33600 01/05/1997 8000 N
J0012 12121212 VICTOR ALBA PRIETO C/LA LILA, 49 2º AVILES 33400 01/05/1998 8000 S 85002222 54679 32
J003 13131313 LUZ CUETO ARROYO C/MAYOR, 91 5º AVILES 33400 01/06/1995 7000 S 22223333 66785 32
J0014 14141414 MARIO FERNANDEZ VEGA C/PEZ, 19 2º AVILES 33400 01/04/1998 3000 S 33334444 3354679 53
3. ARIKETA –SQL-

En este ejercicio trabajaremos con 5 tablas: PRODUCTOS, OFICINAS, CLIENTES,


TRABAJADORES, PEDIDOS.

La información que tenemos en cada tabla es la siguiente:

a) Tabla OFICINAS.

Nombre Columna Null? Tipo


OFICINA NOT NULL NUMBER(2)
CIUDAD VARCHAR2(15)
REGION VARCHAR2(10)
DIR NUMBER(3)
OBJETIVO NUMBER(10)
VENTAS NUMBER(10)

CLAVE PRIMARIA: OFICINA

b) Tabla CLIENTES.

Nombre Columna Null? Tipo


NUMCLIE NOT NULL NUMBER(4)
NOMBRE VARCHAR2(20)
NUMEMP NUMBER(3)
LIMITECREDITO NUMBER(10)

CLAVE PRIMARIA: NUMCLIE


CLAVE FORÁNEA: NUMEMP  TRABAJADORES

c) Tabla PEDIDOS.

Nombre Columna Null? Tipo


CODIGO NOT NULL NUMBER(3)
NUMPEDIDO NOT NULL NUMBER(9)
FECHAPEDIDO DATE
NUMCLIE NOT NULL NUMBER(4)
NUMEMP NOT NULL NUMBER(3)
IDFAB NOT NULL VARCHAR2(10)
IDPRODUCTO NOT NULL VARCHAR2(15)
CANT NUMBER(4)

CLAVE PRIMARIA: CODIGO


CLAVE FORÁNEA: NUMCLIE  Tabla CLIENTES
NUMEMP  Tabla TRABAJADORES
IDFAB + IDPRODUCTO  Tabla PRODUCTOS
d) Tabla TRABAJADORES - EMPLEADOS

Nombre Columna Null? Tipo


NUMEMP NOT NULL NUMBER(3)
NOMBRE VARCHAR2(20)
EDAD NUMBER(2)
OFICINA NUMBER(2)
TITULO VARCHAR2(15)
CONTRATO DATE
JEFE NUMBER(3)
CUOTA NUMBER(10)
VENTAS NUMBER(10)

CLAVE PRIMARIA: NUMEMP


CLAVE FORÁNEA: OFICINA  OFICINAS
18 <= EDAD <=70

e) Tabla PRODUCTOS.

Nombre Columna Null? Tipo


IDFAB NOT NULL VARCHAR2(10)
IDPRODUCTO NOT NULL VARCHAR2(15)
DESCRIPCION VARCHAR2(20)
PRECIO NUMBER(10)
EXISTENCIAS NUMBER(5)

CLAVE PRIMARIA: IDFAB + IDPRODUCTO

1. Con toda la información necesaria para crear estas 5 tablas, crea un fichero SQL, con el
nombre [Link].

CREATE TABLE PRODUCTOS


(
IDFAB VARCHAR2(10) NOT NULL,
IDPRODUCTO VARCHAR2(15) NOT NULL,
DESCRIPCION VARCHAR2(20),
PRECIO NUMBER(10),
EXISTENCIAS NUMBER(5),
CONSTRAINT PK_IDFAB_IDPRODUCTO PRIMARY KEY (IDFAB, IDPRODUCTO)
);
CREATE TABLE OFICINAS
(
OFICINA NUMBER(2) NOT NULL,
CIUDAD VARCHAR2(15) ,
REGION VARCHAR2(10),
DIR NUMBER(3),
OBJETIVO NUMBER(10),
VENTAS NUMBER(10),
CONSTRAINT PK_OFICINA PRIMARY KEY (OFICINA)
);

CREATE TABLE EMPLEADOS


(
NUMEMP NUMBER(3) NOT NULL,
NOMBRE VARCHAR2(20) ,
EDAD NUMBER(2),
OFICINA NUMBER(2),
TITULO VARCHAR2(15),
CONTRATO DATE,
JEFE NUMBER(3),
CUOTA NUMBER(10),
VENTAS NUMBER(10),
CONSTRAINT PK_NUMEMP PRIMARY KEY (NUMEMP),
CONSTRAINT FK_OFICINA FOREIGN KEY (OFICINA) REFERENCES OFICINAS ON
DELETE CASCADE,
CONSTRAINT MARGENEDAD CHECK (EDAD BETWEEN 18 AND 70)
);

CREATE TABLE CLIENTES


(
NUMCLIE NUMBER(4) NOT NULL,
NOMBRE VARCHAR2(20),
NUMEMP NUMBER(3),
LIMITECREDITO NUMBER(10),
CONSTRAINT PK_NUMCLIE PRIMARY KEY (NUMCLIE),
CONSTRAINT FK_NUMEMP1 FOREIGN KEY (NUMEMP) REFERENCES EMPLEADOS ON
DELETE CASCADE
);
CREATE TABLE PEDIDOS
(
CODIGO NUMBER(3) NOT NULL,
NUMPEDIDO NUMBER(9) NOT NULL,
FECHAPEDIDO DATE,
NUMCLIE NUMBER(4) NOT NULL,
NUMEMP NUMBER(3) NOT NULL,
IDFAB VARCHAR2(10) NOT NULL,
IDPRODUCTO VARCHAR2(15) NOT NULL,
CANT NUMBER(4),
CONSTRAINT PK_CODIGO PRIMARY KEY (CODIGO),
CONSTRAINT FK_NUMCLIE FOREIGN KEY (NUMCLIE) REFERENCES CLIENTES ON
DELETE CASCADE,
CONSTRAINT FK_NUMEMP2 FOREIGN KEY (NUMEMP) REFERENCES EMPLEADOS ON
DELETE CASCADE,
CONSTRAINT FK_IDFAB_IDPRODUCTO FOREIGN KEY (IDFAB, IDPRODUCTO)
REFERENCES PRODUCTOS ON DELETE CASCADE
);

2. En el disquete tenemos un fichero llamado [Link]. Ejecuta este fichero para meter
filas en las tablas anteriores.
Se tiene el fichero [Link], con las instrucciones de introducción de datos, se le agrega la
información anterior de creación de tablas y se ejecuta:
CONNECT HR/HR
START [Link]

3. Comprueba si todas las restricciones se han creado correctamente.


INSERT INTO EMPLEADOS
VALUES (101,'Antonio Viguer',17,12,'representante','20/10/86',104,300000,305000) ;

INSERT INTO EMPLEADOS


VALUES (101,'Antonio Viguer',71,12,'representante','20/10/86',104,300000,305000) ;
4. Mira la información que tiene cada una de las tablas.

SELECT * FROM OFICINAS ;

SELECT * FROM CLIENTES ;


SELECT * FROM PEDIDOS ;
SELECT * FROM EMPLEADOS ;

SELECT * FROM PRODUCTOS ;


5. Obtener una lista de todos los productos indicando para cada uno su idfab, idproducto,
descripción, precio y precio con I.V.A. incluido.

SELECT IDFAB, IDPRODUCTO, DESCRIPCION, PRECIO, PRECIO*0.18+PRECIO


"PRECIO CON IVA"
FROM PRODUCTOS ;

6. De cada pedido queremos saber su número de pedido, idfab, idproducto, cantidad, precio
unitario e importe.
SELECT NUMPEDIDO,[Link], [Link], CANT, PRECIO, CANT*PRECIO
"IMPORTE"
FROM PEDIDOS P, PRODUCTOS PD
WHERE [Link]=[Link]
AND [Link]=[Link] ;
7. De cada empleado, listar su nombre y los años que lleva trabajando.
SELECT NOMBRE, CONTRATO, TRUNC((SYSDATE-CONTRATO)/365) "Años
Trabajados"
FROM EMPLEADOS ;

SELECT NOMBRE, CONTRATO, TRUNC (MONTHS_BETWEEN (SYSDATE,


CONTRATO)/12) "AÑOS TRABAJADOS"
FROM EMPLEADOS;

8. Obtener la lista de los clientes ordenados por código de empleado asignado. Visualizar
todas las columnas de la tabla.
SELECT * FROM CLIENTES ORDER BY NUMEMP ;
9. Obtener las oficinas ordenadas por orden alfabético de región y dentro de cada región por
ciudad.
SELECT OFICINA, REGION, CIUDAD
FROM OFICINAS
ORDER BY REGION, CIUDAD ;

10. Obtener los pedidos ordenados por fecha de pedido.


SELECT NUMPEDIDO, FECHAPEDIDO
FROM PEDIDOS
ORDER BY FECHAPEDIDO ;

11. Listar toda la información de los pedidos de marzo.


Dos maneras de hacerlo:
1ª SELECT * FROM PEDIDOS
WHERE TO_CHAR ( FECHAPEDIDO, 'month') LIKE 'marzo%' ;
2ª SELECT * FROM PEDIDOS
WHERE TO_CHAR ( FECHAPEDIDO, 'mm') = 3 ;

12. Listar los datos de las oficinas de las regiones del norte y del este (tienen que aparecer
primero las del norte y después las del este).
SELECT * FROM OFICINAS
WHERE REGION LIKE 'norte'
OR REGION LIKE 'este'
ORDER BY REGION DESC ;
Otra forma de hacerlo:
SELECT * FROM OFICINAS
WHERE REGION IN ('norte' , 'este')
ORDER BY REGION DESC ;

13. Listar los empleados de nombre Alvaro.


SELECT * FROM EMPLEADOS WHERE NOMBRE LIKE 'Alvaro %' ;

14. Listar los productos cuyo idproducto acabe en x..


SELECT * FROM PRODUCTOS
WHERE IDPRODUCTO
LIKE '%x' ;

15. Listar las oficinas del este indicando para cada una de ellas su número, ciudad, números y
nombre de sus trabajadores. Hacer una versión en la que aparezcan sólo las que tienen
trabajadores, y hacer otra en las que aparezcan las oficinas del este que no tienen
trabajadores.
SELECT [Link], [Link], [Link], [Link]
FROM OFICINAS O, EMPLEADOS E
WHERE [Link]=[Link]
AND REGION='este'
ORDER BY [Link] ;

si se pone en el WHERE [Link] (+) lista también las que no tienen empleados.
SELECT OFICINA FROM OFICINAS
WHERE OFICINA NOT IN (SELECT OFICINA FROM EMPLEADOS)
AND REGION='este';

16. Listar los pedidos mostrando su número, importe, nombre del cliente y el límite de crédito
del cliente correspondiente.
SELECT NUMPEDIDO,SUM ([Link]*[Link])"Importe", [Link],
[Link]
FROM PEDIDOS P, CLIENTES C, PRODUCTOS PR
WHERE [Link]=[Link] AND [Link]=[Link]
GROUP BY [Link], [Link], [Link]
ORDER BY NUMPEDIDO, [Link] ;
Esta otra sentencia da el mismo resultado:
SELECT [Link], ([Link]*[Link]) "IMPORTE", [Link] "CLIENTE",
[Link]
FROM PEDIDOS P, PRODUCTOS PR, CLIENTES C
WHERE [Link]=[Link]
AND [Link]=[Link]
AND [Link]=[Link]
ORDER BY [Link], [Link] ;

17. Listar el número, nombre, ciudad y región de cada trabajador.


SELECT NUMEMP "Nº Empleado", NOMBRE, [Link], [Link]
FROM EMPLEADOS E, OFICINAS O
WHERE [Link]=[Link] ;

18. Listar el número de las oficinas con objetivo superior a 600.000 pts, indicando para cada
una de ellas el nombre de su director.
SELECT [Link], OBJETIVO, NOMBRE "Director"
FROM EMPLEADOS E, OFICINAS O
WHERE [Link]=[Link](+)
AND OBJETIVO>600000
ORDER BY OFICINA ;

19. Listar los pedidos superiores a 25.000 pts, incluyendo el nombre del empleado que tomó el
pedido y el nombre del cliente que lo solicitó.
Varias formas de hacerlo:
SELECT [Link], ([Link]*[Link]) "Importe", [Link] "Cliente",
[Link] "Empleado"
FROM PEDIDOS P, EMPLEADOS E, CLIENTES C, PRODUCTOS PR
WHERE [Link]=[Link]
AND [Link]=[Link]
AND [Link]=[Link]
AND [Link]=[Link]
AND ([Link]*[Link])>25000 ;

SELECT NUMPEDIDO,SUM ([Link]*[Link])"Importe", [Link] "Cliente",


[Link] "Empleado"
FROM PEDIDOS P, CLIENTES C, PRODUCTOS PR, EMPLEADOS E
WHERE [Link]=[Link]
AND [Link]=[Link]
AND [Link]=[Link]
GROUP BY [Link], [Link], [Link]
HAVING SUM ([Link]*[Link])>25000
ORDER BY NUMPEDIDO, [Link] ;

[Link] los trabajadores que realizaron su primer pedido el mismo día en que fueron
contratados.
SELECT NOMBRE, CONTRATO "Fecha Contrato", FECHAPEDIDO "Fecha Pedido"
FROM EMPLEADOS E, PEDIDOS P
WHERE [Link]=[Link]
AND [Link]=[Link] ;

21. Listar los empleados con una cuota superior a la de su jefe; para cada empleado sacar sus
datos y el número, nombre y cuota de su jefe.
Se crea una vista con los empleados y sus cuotas:
CREATE VIEW EMPLECUOTA
AS SELECT NUMEMP, NOMBRE, CUOTA
FROM EMPLEADOS ;

SELECT [Link], [Link], [Link], [Link] "Jefe", [Link], [Link]


"Cuota Jefe"
FROM EMPLEADOS E, EMPLECUOTA C
WHERE [Link]>[Link]
AND [Link]=[Link] ;

[Link] los códigos de los trabajadores que tengan una cuota inferior a 10.000 pts.
SELECT NUMEMP "Codigo Empleado"
FROM EMPLEADOS
WHERE CUOTA<10000 ;

23.¿Cuál es la cuota media y las ventas medias de todos los empleados?


SELECT TO_CHAR(AVG(CUOTA), '999G990') "Cuota media",
TO_CHAR(AVG(VENTAS), '999G990') "Ventas medias"
FROM EMPLEADOS ;

[Link] el importe medio de pedidos, el importe total de pedidos y el precio medio de venta
(el precio de venta es el precio unitario en cada pedido).
SELECT TRUNC(AVG([Link]*[Link])) "Importe medio", SUM([Link]*[Link])
"Importe total", TRUNC (AVG ([Link])) "Importe medio venta"
FROM PEDIDOS P, PRODUCTOS PR
WHERE [Link]=[Link]
AND [Link]=[Link] ;

[Link] el pedido medio de los productos del fabricante ACI.


SELECT TRUNC(AVG ([Link]*[Link])) "Importe"
FROM PEDIDOS P, PRODUCTOS PR
WHERE [Link]=[Link]
AND [Link] LIKE 'aci' ;
[Link] en qué fecha se realizó el primer pedido.
SELECT * FROM PEDIDOS
WHERE FECHAPEDIDO= (SELECT MIN(FECHAPEDIDO) FROM PEDIDOS) ;

o mas escueto:
SELECT MIN(FECHAPEDIDO) "Fecha primer Pedido"
FROM PEDIDOS ;

[Link] cuántos pedidos hay de más de 25.000 pts..


Varias maneras de hacerlo:
SELECT COUNT(*) "Nº Pedidos" FROM PEDIDOS P, PRODUCTOS PR
WHERE [Link]=[Link]
AND [Link]=[Link]
AND ([Link]*[Link])>25000 ;

SELECT COUNT (SUM (PRECIO*CANT)) "Nº Pedidos"


FROM PEDIDOS P, PRODUCTOS PR
WHERE [Link]=[Link]
AND [Link]=[Link]
GROUP BY NUMPEDIDO
HAVING SUM (PRECIO*CANT)>25000 ;

[Link] el número de la oficina y el total del importe vendido por cada oficina.
SELECT [Link], SUM([Link]*[Link])
FROM OFICINAS O, PEDIDOS P, PRODUCTOS PR, EMPLEADOS E
WHERE [Link]=[Link]
AND [Link]=[Link]
AND [Link]=[Link]
AND [Link]=[Link]
GROUP BY [Link]
ORDER BY [Link] ;
[Link] cada empleado cuyos pedidos suman más de 30.000 pts, hallar su importe medio de
pedidos. En el resultado indicar el número de empleado y su importe medio de pedidos.
SELECT [Link], ROUND(AVG([Link]*[Link]), 2) "Importe medio"
FROM PEDIDOS P, PRODUCTOS PR
WHERE [Link]=[Link]
AND [Link]=[Link]
GROUP BY [Link]
HAVING SUM([Link]*[Link])>30000
ORDER BY [Link] ;

[Link] los nombres de los clientes que tienen asignado el representante Alvaro Jaumes.
Varias formas de hacerlo:
SELECT [Link] "Cliente", [Link] "Representante"
FROM CLIENTES C, EMPLEADOS E
WHERE [Link]=[Link]
AND [Link]=(SELECT NUMEMP FROM EMPLEADOS WHERE NOMBRE LIKE 'Alvaro
Jaumes') ;

SELECT [Link] "Cliente", [Link] "Representante"


FROM CLIENTES C, EMPLEADOS E
WHERE [Link]=[Link]
AND UPPER([Link]) LIKE 'ALVARO JAUMES' ;

31. Listar los empleados (numemp, nombre y nº de oficina) que trabajan en oficinas “buenas”
(las que tienen ventas superiores a su objetivo).
Se crea una vista con los datos de objetivo y ventas realizadas por las oficinas:
CREATE VIEW VENTASOFICINAS
AS SELECT [Link], [Link], SUM([Link]*[Link]) "VENTAS"
FROM OFICINAS O, PEDIDOS P, PRODUCTOS PR, EMPLEADOS E
WHERE [Link]=[Link]
AND [Link]=[Link]
AND [Link]=[Link]
AND [Link]=[Link]
GROUP BY [Link], [Link]
ORDER BY [Link] ;

Se hace la consulta tomando como referencia la vista creada:


SELECT [Link], [Link], [Link]
FROM EMPLEADOS E, OFICINAS O
WHERE [Link]=[Link]
AND [Link] IN (SELECT OFICINA FROM VENTASOFICINAS
WHERE VENTAS>OBJETIVO) ;

[Link] los empleados que no trabajan en oficinas dirigidas por el empleado 108.
SELECT NOMBRE, OFICINA, JEFE
FROM EMPLEADOS
WHERE OFICINA NOT IN (SELECT OFICINA FROM OFICINAS WHERE DIR=108)
ORDER BY OFICINA ;

[Link] los productos (idfab, idproducto y descripción) para los cuales no se ha recibido
ningún pedido de 25000 ó más.
SELECT [Link], [Link], [Link]
FROM PEDIDOS P, PRODUCTOS PR
WHERE [Link]=[Link]
AND ([Link]*[Link])<25000
GROUP BY [Link], [Link], [Link]
ORDER BY IDPRODUCTO;

[Link] los clientes asignados a Ana Bustamante que no han remitido un pedido superior a
3.000 pts.
Varias formas de hacerlo:
SELECT [Link], [Link], [Link], [Link], [Link]
FROM PEDIDOS P, PRODUCTOS PR
WHERE [Link]=[Link]
AND ([Link]*[Link])<3000
GROUP BY [Link], [Link], [Link], [Link], [Link]
HAVING [Link] IN (SELECT NUMCLIE FROM CLIENTES WHERE
NUMEMP=(SELECT NUMEMP FROM EMPLEADOS WHERE NOMBRE LIKE 'Ana
Bustamante'))
ORDER BY [Link] ;

SELECT [Link], [Link], [Link], [Link], [Link],


[Link]
FROM CLIENTES C, PEDIDOS P, PRODUCTOS PR
WHERE [Link]=[Link]
AND [Link]=[Link]
AND [Link]=(SELECT NUMEMP FROM EMPLEADOS WHERE UPPER(NOMBRE)
LIKE 'ANA BUSTAMANTE')
AND ([Link]*[Link])<3000
ORDER BY [Link] ;
[Link] las oficinas en donde haya un vendedor cuyas ventas representen más del 55% del
objetivo de su oficina
Esto es calculando las ventas por empleado de la tabla PEDIDOS:
SELECT [Link],[Link], [Link], SUM([Link]*[Link]) "VENTAS"
FROM OFICINAS O, PEDIDOS P, PRODUCTOS PR, EMPLEADOS E
WHERE [Link]=[Link]
AND [Link]=[Link]
AND [Link]=[Link]
AND [Link]=[Link]
GROUP BY [Link],[Link], [Link]
HAVING SUM([Link]*[Link])> [Link]*0.55
ORDER BY [Link] ;

Si nos fijamos en la columna VENTAS de la tabla EMPLEADOS seria:


SELECT [Link], [Link], [Link] "Objetivo Oficina", [Link]
"VENTAS Empleado"
FROM OFICINAS O, EMPLEADOS E
WHERE [Link]=[Link]
GROUP BY [Link],[Link], [Link], [Link]
HAVING [Link]> [Link]*0.55
ORDER BY [Link] ;
otra manera:
SELECT [Link], [Link], [Link] "Objetivo oficina", [Link] "Ventas
empleado"
FROM OFICINAS O, EMPLEADOS E
WHERE [Link]>[Link]*0.55
AND [Link]=[Link]
ORDER BY [Link] ;

[Link] las oficinas en donde todos los vendedores tienen ventas que superan el 50% del
objetivo de la oficina.
Se crea una vista con los empleados, ventas, oficinas y objetivos.
CREATE VIEW VENTASOBJETIVO
AS SELECT [Link], [Link], [Link], [Link]
FROM EMPLEADOS E, OFICINAS O
WHERE [Link]=[Link]
ORDER BY [Link] ;
Con esta sentencia listo las oficinas y el numero de empleados que cumplen la condición:
SELECT OFICINA, COUNT(*) FROM VENTASOBJETIVO V
WHERE VENTAS>(SELECT OBJETIVO*.50 FROM VENTASOBJETIVO WHERE
[Link]=NUMEMP)
GROUP BY OFICINA ;

Con esta sentencia listo las oficinas y el numero de empleados que tienen:
SELECT OFICINA, COUNT(*) FROM VENTASOBJETIVO
GROUP BY OFICINA ;

Con esta sentencia saco las oficinas que todos sus empleados cumplen la condición:
SELECT OFICINA, COUNT(*) FROM VENTASOBJETIVO V
WHERE VENTAS>(SELECT OBJETIVO*.50 FROM VENTASOBJETIVO WHERE
[Link]=NUMEMP)
GROUP BY OFICINA
INTERSECT
SELECT OFICINA, COUNT(*)
FROM VENTASOBJETIVO
GROUP BY OFICINA ;
[Link] las oficinas que tengan un objetivo mayor que la suma de las cuotas de sus
trabajadores.
SELECT [Link], [Link], SUM(CUOTA)"Suma cuotas empleados"
FROM OFICINAS O, EMPLEADOS E
WHERE [Link]=[Link]
GROUP BY [Link], [Link]
HAVING OBJETIVO>SUM(CUOTA) ;

[Link] una tabla (llamarla nuevatrabajadores) que contenga las filas de la tabla
trabajadores.
CREATE VIEW NUEVATRABAJADORES
AS SELECT * FROM EMPLEADOS ;

se crea la tabla:
CREATE TABLE NUEVATRABAJADORES
AS SELECT * FROM EMPLEADOS ;

[Link] una tabla (llamarla nuevaoficinas) que contenga las filas de la tabla oficinas.
CREATE VIEW NUEVAOFICINAS
AS SELECT * FROM OFICINAS ;

se crea la tabla:
CREATE TABLE NUEVAOFICINAS
AS SELECT * FROM OFICINAS ;

[Link] una tabla (llamarla nuevaproductos) que contenga las filas de la tabla productos.
CREATE VIEW NUEVAPRODUCTOS
AS SELECT * FROM PRODUCTOS ;

se crea la tabla:
CREATE TABLE NUEVAPRODUCTOS
AS SELECT * FROM PRODUCTOS ;

41. Crear una tabla (llamarla nuevapedidos) que contenga las filas de la tabla pedidos.
CREATE VIEW NUEVAPEDIDOS
AS SELECT * FROM PEDIDOS ;
se crea la tabla:
CREATE TABLE NUEVAPEDIDOS
AS SELECT * FROM PEDIDOS ;

[Link] un 5% el precio de todos los productos del fabricante ACI.


UPDATE PRODUCTOS
SET PRECIO=PRECIO+PRECIO*0.05
WHERE IDFAB='aci' ;

43.Añadir una nueva oficina para la ciudad de Madrid, con el número de oficina 30, con un
objetivo de 100.000 y región Centro.
1º Forma
INSERT INTO OFICINAS
SELECT DISTINCT 30, CIUDAD, REGION, '', 100000,
FROM OFICINAS
WHERE CIUDAD='Madrid' ;
2º Forma
INSERT INTO OFICINAS (OFICINA, CIUDAD, REGION, DIR, OBJETIVO, VENTAS)
VALUES (30, 'Madrid', 'centro', '', 100000, '') ;
[Link] los empleados de la oficina 21 a la oficina 31.
UPDATE EMPLEADOS
SET OFICINA=31
WHERE OFICINA=21 ;

Da error porque la oficina no existe, habria que insertarlas en la tabla OFICINAS

45. Eliminar los pedidos del empleado 105.


DELETE FROM PEDIDOS
WHERE NUMEMP=105 ;

[Link] las oficinas que no tengan empleados.


DELETE FROM OFICINAS
WHERE OFICINA NOT IN (SELECT OFICINA FROM EMPLEADOS) ;

[Link] los precios originales de los productos a partir de la tabla nuevaproductos.


No se puede hacer porque anteriormente se ha creado una vista.

Tras crear la tabla esta seria la sentencia para recuperar los precios:
UPDATE PRODUCTOS
SET PRECIO=(SELECT PRECIO FROM NUEVAPRODUCTOS WHERE IDFAB='aci')
WHERE IDFAB='aci' ;

[Link] los pedidos borrados en el ejercicio 45, a partir de la tabla nuevapedidos.


No se puede hacer porque anteriormente se ha creado una vista.

Tras crear la tabla esta seria la sentencia para recuperar los pedidos:
INSERT INTO PEDIDOS
SELECT * FROM NUEVAPEDIDOS WHERE NUMEMP=105 ;

Ejercicios SQL (Capitulo 3):
➢1. Obtener la descripción de la tabla DEPART
DESC DEPART;
➢2. Seleccionar nombre, localidad y N
➢5. Consulta los empleados cuyo oficio sea empleado, clasificado por numero de empleado en 
ascendente y apellido en descende
➢9. Sacar todos los alumnos y sus notas medias de aquellos que tengan una nota media menor que 6 y 
clarificarlos con alias d
➢14. Sacar los Vendedores cuya comisión es superior a 40.000€.
SELECT * FROM EMPLE 
WHERE COMISION>40000;
La comisión mas alt
➢17. De la tabla empleados sacar el apellido de los empleados del Departamento 20 o 30 cuyo oficio 
sea vendedor.
SELECT APEL
Ejercicios SQL del Libro (Capitulo 3 pagina 127)
Tablas EMPLE y DEPART

1. Selecciona el apellido, el oficio y la localidad

4. Obtén los datos de los departamentos que NO tengan empleados.
SELECT * FROM DEPART 
WHERE DEPT_NO NOT IN (SELECT DISTINC

8. Visualiza las columnas TEMA, ESTANTE y EJEMPLARES de las filas cuyo ESTANTE no este 
comprendido entre la “B” y la “D”.
Tablas ALUMNOS, ASIGNATURAS y NOTAS

11. Visualiza todas las asignaturas que contengan tres letras “o” en su interior y teng

15. Obtén el nombre y apellido de los alumnos que tengan nota en la asignatura con código 1.
SELECT APENOM FROM NOTAS, ALUM

También podría gustarte