Sunteți pe pagina 1din 9

DIT-ETSIT-UPM

Bases de Datos
# Asignatura: BSDT-090000552

Curso 2010/11

2 Prctica de Laboratorio

SQL con TOAD y Oracle para Bases de Datos Relacionales. Ejercicios con DDL, DML y QL

Curso 2010-11

Carmen Costilla

Noviembre-2010

http://sinbad.dit.upm.esPrcticaSQLenBDR:DDL,DMLyQLBSDT(5curso)

Nota Previa: Esta prctica, con total ubicuidad, se realiza de manera individual por el alumno en: el PC de su casa, su porttil, o un puesto del Laboratorio de Bases de Datos (previo aviso). Transcurrida una o dos semana de tutoras, se celebra una sesin conjunta de Laboratorio, para asentar las principales ideas de SQL en BDR durante unos 45 m. Marina Bayn, becaria del Laboratorio de Bases de Datos, se hace cargo de la operativa de los puestos de trabajo del Laboratorio.
SQL EN LA BDR: EMPLEADO-DEPARTAMENTO DEL USUARIO CARMEN DDL. Creacin de tablas: Tabla Departamento:
CREATE TABLE DEPARTAMENTO ( ID NUMBER(10) NOT NULL, NOMBRE VARCHAR2(50), LOCALIDAD VARCHAR2(50), PRESUPUESTO NUMBER(5,2), DIRECTOR_ID NUMBER(10) CONSTRAINT DEPARTAMENTO_PK PRIMARY KEY (ID) USING INDEX);

En Departamento se declara la FK para: DIRECTOR_ID


ALTER TABLE CARMEN.DEPARTAMENTO ADD CONSTRAINT DEPARTAMENTO_DIRECTOR_ID FOREIGN KEY (DIRECTOR_ID) REFERENCES CARMEN.EMPLEADO (ID);

Tabla Empleado:
CREATE TABLE EMPLEADO ( ID NUMBER(10) NOT NULL, NOMBRE VARCHAR2(30), APELLIDOS VARCHAR2(60), DEPARTAMENTO_ID NUMBER(10), CARGO VARCHAR2(20), GRADO NUMBER(2) NOT NULL, JEFE_ID NUMBER(10), FECHA_ALTA DATE, SUELDO NUMBER(9,2), COMISION NUMBER(9,2), CONSTRAINT EMPLEADO_PK PRIMARY KEY (ID) USING INDEX);

DITETSITUPM

Por:CarmenCostilla,Curso201011

http://sinbad.dit.upm.esPrcticaSQLenBDR:DDL,DMLyQLBSDT(5curso)

En Empleado se declara la FK para: GRADO


ALTER TABLE CARMEN.EMPLEADO ADD CONSTRAINT EMPLEADO_GRADO FOREIGN KEY (GRADO) REFERENCES CARMEN.RANGO_SUELDO (GRADO);

En Empleado se declara la FK para: JEFE_ID


ALTER TABLE CARMEN.EMPLEADO ADD CONSTRAINT EMPLEADO_JEFE_ID FOREIGN KEY (JEFE_ID) REFERENCES CARMEN.EMPLEADO(ID);

En Empleado se declara la FK para: DEPARTAMENTO_ID


ALTER TABLE CARMEN.EMPLEADO ADD CONSTRAINT EMPLEADO_DEPARTAMENTO_ID FOREIGN KEY (DEPARTAMENTO_ID) REFERENCES CARMEN.DEPARTAMENTO(ID);

Tabla Rango_Sueldo:
CREATE TABLE CARMEN.RANGO_SUELDO ( GRADO NUMBER(2) NOT NULL, SUELDO_MIN NUMBER(9,2), SUELDO_MAX NUMBER(9,2), CONSTRAINT RANGO_SUELDO_PK PRIMARY KEY (GRADO));

DITETSITUPM

Por:CarmenCostilla,Curso201011

http://sinbad.dit.upm.esPrcticaSQLenBDR:DDL,DMLyQLBSDT(5curso) Esquema de la BD CARMEN y su grafo de joins RANGO_SUELDO (Grado, Sueldo_Min, Sueldo_Max) FK2 EMPLEADO (ID, Nombre, Apellidos, Departamento_ID, Cargo, Grado, Jefe_ID, Fecha_Alta, Sueldo, Comisin) FK3 FK1 FK1 DEPARTAMENTO (ID, Nombre, Localidad, Presupuesto, Director_ID) DML. Insercin de datos: Inserciones en la Tabla Rango_Sueldo:
INSERT INTO RANGO_SUELDO VALUES (1, 700, 1200); INSERT INTO RANGO_SUELDO VALUES (2, 1201, 1400); INSERT INTO RANGO_SUELDO VALUES (3, 1401, 2000); INSERT INTO RANGO_SUELDO VALUES (4, 2001, 2500); INSERT INTO RANGO_SUELDO VALUES (5, 2501, 3999); commit; (GRADO, SUELDO_MIN, SUELDO_MAX) (GRADO, SUELDO_MIN, SUELDO_MAX) (GRADO, SUELDO_MIN, SUELDO_MAX) (GRADO, SUELDO_MIN, SUELDO_MAX) (GRADO, SUELDO_MIN, SUELDO_MAX)

Estado tabla Rango_Sueldo

Inserciones en la Tabla Departamento:


INSERT VALUES INSERT VALUES INSERT VALUES INTO DEPARTAMENTO (ID, NOMBRE, LOCALIDAD, PRESUPUESTO, DIRECTOR_ID) (1, 'TECNOLOGAS DE LA INFORMACIN','MADRID', '99000,55', null); INTO DEPARTAMENTO (ID, NOMBRE, LOCALIDAD, PRESUPUESTO, DIRECTOR_ID) (2, 'INVESTIGACION', 'BILBAO', '79000,55', null); INTO DEPARTAMENTO (ID, NOMBRE, LOCALIDAD, PRESUPUESTO, DIRECTOR_ID) (3, 'VENTAS', 'BARCELONA', '89000,55', null);

INSERT INTO DEPARTAMENTO (ID, NOMBRE, LOCALIDAD, PRESUPUESTO, DIRECTOR_ID) VALUES (4, 'PRODUCCION', 'VALENCIA', '90000,55', null); commit;

Estado tabla Departamento

Inserciones en la Tabla Empleado:


INSERT INTO EMPLEADO (ID, NOMBRE, APELLIDOS, DEPARTAMENTO_ID, CARGO, Grado, JEFE_ID, FECHA_ALTA, SUELDO,COMISION) VALUES (6, 'INES', 'FERNANDEZ SANCHEZ','1', 'PRESIDENTA', 5, 6,

DITETSITUPM

Por:CarmenCostilla,Curso201011

http://sinbad.dit.upm.esPrcticaSQLenBDR:DDL,DMLyQLBSDT(5curso)
TO_Date('17/11/1991', 'DD/MM/YYYY'), 3500, 25); INSERT INTO EMPLEADO (ID, NOMBRE, APELLIDOS, DEPARTAMENTO_ID, CARGO, JEFE_ID, FECHA_ALTA,SUELDO, COMISION) VALUES (4, 'ESTHER', 'PEA MATA', 1,'DIRECTORA', 5, 6, TO_Date('01/05/1991', 'DD/MM/YYYY'), 2850, 5); INSERT INTO EMPLEADO (ID, NOMBRE, APELLIDOS, DEPARTAMENTO_ID, CARGO, JEFE_ID, FECHA_ALTA,SUELDO, COMISION) VALUES (5,'DANIEL', 'LOPEZ LIRON', 2, 'DIRECTOR', 4, 4, TO_Date('29/06/1992', 'DD/MM/YYYY'), 2500, 25); INSERT INTO EMPLEADO (ID, NOMBRE, APELLIDOS, DEPARTAMENTO_ID, CARGO, JEFE_ID, FECHA_ALTA,SUELDO, COMISION) VALUES (1, 'CARLOS', 'ALONSO GARCIA', 2,'COMERCIAL', 1, 5, TO_Date('20/02/2010','DD/MM/YYYY'), 1100, 15); INSERT INTO EMPLEADO (ID, NOMBRE, APELLIDOS, DEPARTAMENTO_ID, CARGO, JEFE_ID, FECHA_ALTA,SUELDO, COMISION) VALUES (2, 'ANDRES', 'CREMADES MOLINERO', 1,'DIRECTOR',5, 6, TO_Date('22/02/1998','DD/MM/YYYY'), 3990, 10); INSERT INTO EMPLEADO (ID, NOMBRE, APELLIDOS, DEPARTAMENTO_ID, CARGO, JEFE_ID, FECHA_ALTA,SUELDO, COMISION) VALUES (3, 'RAUL', 'FERNANDEZ HERRANZ', 1,'DIRECTOR',5, 6, TO_Date('22/02/1998', 'DD/MM/YYYY'), 3990, 20); INSERT INTO EMPLEADO (ID, NOMBRE, APELLIDOS, DEPARTAMENTO_ID, CARGO, JEFE_ID, FECHA_ALTA,SUELDO, COMISION) VALUES (7, 'JOAQUIN', 'CALLEJA ARCAZ', 1,'DIRECTOR',5, 6, TO_Date( '22/02/1998', 'DD/MM/YYYY'), 3990, 25); commit; Grado,

Grado,

Grado,

Grado,

Grado,

Grado,

Estado tabla Empleado

DML. Consultas: 1. Obtener los apellidos del empleado


SELECT APELLIDOS FROM EMPLEADO;

2. Obtener los apellidos del empleado sin repeticin


SELECT DISTINCT APELLIDOS FROM EMPLEADO;

3. Obtener todos los datos de los empleados apellidados Lpez


SELECT * FROM EMPLEADO WHERE APELLIDOS LIKE 'LOPEZ%';

4. Obtener todos los datos del empleado con apellido Lpez o Pea
SELECT * FROM EMPLEADO WHERE APELLIDOS LIKE 'LOPEZ%' OR APELLIDOS LIKE 'PEA%';

5. Obtener los datos del empleado que trabaja en el departamento de tecnologas de la informacin.
SELECT * FROM EMPLEADO EMP, DEPARTAMENTO DEP WHERE EMP.DEPARTAMENTO_ID = DEP.ID

DITETSITUPM

Por:CarmenCostilla,Curso201011

http://sinbad.dit.upm.esPrcticaSQLenBDR:DDL,DMLyQLBSDT(5curso)
AND DEP.NOMBRE = 'TECNOLOGAS DE LA INFORMACION';

6. Obtener los datos del empleado cuyo nombre comience por I


SELECT * FROM EMPLEADO WHERE NOMBRE LIKE 'I%';

7. Obtener el nombre del departamento y el nmero de empleados que tiene.


SELECT DEP.NOMBRE, COUNT(EMP.ID) FROM EMPLEADO EMP, DEPARTAMENTO DEP WHERE EMP.DEPARTAMENTO_ID = DEP.ID GROUP BY DEP.NOMBRE;

8. Listar los empleados como sigue: LOPEZ PEREZ, JUAN: es PRESIDENTE


SELECT APELLIDOS||', '||NOMBRE||': es '||CARGO "Empleados" FROM EMPLEADO;

9. Consultar los diferentes cargos desempeados en la empresa.


SELECT DISTINCT CARGO FROM EMPLEADO;

SELECT DISTINCT CARGO FROM EMPLEADO ORDER BY CARGO;

10. Mostrar el nombre, apellidos, que tiene jefe, y su comisin es superior a 150 .

sueldo y comisin del empleado

SELECT NOMBRE, APELLIDOS, SUELDO, COMISION FROM EMPLEADO WHERE (JEFE_ID IS NOT NULL) AND (COMISION > 150);

11. Obtener el nombre, sueldo y sueldo anual del empleado cuyo sueldo anual es mayor que 12.000.
SELECT NOMBRE, SUELDO, 12*SUELDO "SUELDO ANUAL" FROM EMPLEADO WHERE (12*SUELDO) > 12000;

DITETSITUPM

Por:CarmenCostilla,Curso201011

http://sinbad.dit.upm.esPrcticaSQLenBDR:DDL,DMLyQLBSDT(5curso)

12. Mostrar la lista de nombres de los comerciales y su sueldo.


SELECT NOMBRE, SUELDO FROM EMPLEADO WHERE CARGO = 'COMERCIAL';

13. Obtener los empleados que no ejercen de comercial y sus nombres tienen la letra N.
SELECT NOMBRE, CARGO FROM EMPLEADO WHERE (CARGO <> 'COMERCIAL') AND (NOMBRE LIKE '%N%');

14. De los empleados que tienen comisin, obtener el nombre, sueldo y comisin, ordenados por sueldo de mayor a menor.
SELECT NOMBRE, SUELDO, COMISION FROM EMPLEADO WHERE COMISION IS NOT NULL ORDER BY SUELDO DESC;

15. Ordenar a los empleados por sus apellidos y nombres.


SELECT APELLIDOS, NOMBRE FROM EMPLEADO ORDER BY APELLIDOS, NOMBRE;

o tambin:
SELECT APELLIDOS, NOMBRE FROM EMPLEADO ORDER BY APELLIDOS ASC, NOMBRE ASC;

16. Obtener el nombre, sueldo anual y fecha de alta de los empleados que no tienen comisin, ordenados por fecha de alta en la empresa.
SELECT NOMBRE, 12*SUELDO "SUELDO ANUAL", FECHA_ALTA FROM EMPLEADO WHERE COMISION IS NULL ORDER BY FECHA_ALTA;

17. Mostrar el nombre y sueldo de los empleados incrementados en un 10% y ordenados por nombre y apellidos.
SELECT NOMBRE, SUELDO, 1.1*SUELDO "SUELDO + 10%" FROM EMPLEADO ORDER BY NOMBRE, APELLIDOS;

18. Mostrar el nombre y fecha de alta de cada empleado, ordenado por fecha de entrada como sigue:

DITETSITUPM

Por:CarmenCostilla,Curso201011

http://sinbad.dit.upm.esPrcticaSQLenBDR:DDL,DMLyQLBSDT(5curso) Fecha de entrada (como ttulo) Carlos Alonso Garca empez a trabajar el 20 de febrero de 2010
SELECT INITCAP(LOWER(NOMBRE))||' '||INITCAP(LOWER(APELLIDOS))||' empez a trabajar el '|| TO_CHAR(FECHA_ALTA, 'fmDD "de "')|| TO_CHAR(FECHA_ALTA, 'fmmonth "de" YYYY') "Fecha de entrada" FROM EMPLEADO ORDER BY FECHA_ALTA;

19. Obtener el nombre de los comerciales, la comisin, el sueldo mensual y el sueldo incrementado como sigue: si la comisin es menor que 50 , aumentar un 25%; y si es igual o superior, aumentar un 12%.
SELECT NOMBRE, COMISION, SUELDO, DECODE(TRUNC(COMISION/50), 0, 1.25, 1.12)*SUELDO FROM EMPLEADO WHERE COMISION IS NOT NULL AND CARGO = 'COMERCIAL'; -- DECODE funciona como un CASE

20. Mostrar la localidad, nombre y sueldo del empleado cuyo grado es 2 o 3.


SELECT DISTINCT DEP.LOCALIDAD "Localidad", EMP.NOMBRE "Empleado", EMP.SUELDO "Sueldo" FROM DEPARTAMENTO DEP, EMPLEADO EMP, RANGO_SUELDO RAN WHERE (DEP.ID = EMP.DEPARTAMENTO_ID) AND (RAN.GRADO IN (2, 3));

21. Mostrar el nombre de los departamentos cuyos empleados tienen comisin o su sueldo anual es superior a 18.000 .
SELECT DEP.NOMBRE "Departamento", EMP.NOMBRE "Empleado", EMP.SUELDO*12 "Sueldo anual", EMP.COMISION "Comisin" FROM DEPARTAMENTO DEP, EMPLEADO EMP WHERE (DEP.ID = EMP.DEPARTAMENTO_ID) AND ((EMP.COMISION IS NOT NULL) OR (EMP.SUELDO*12 > 18000));

DITETSITUPM

Por:CarmenCostilla,Curso201011

http://sinbad.dit.upm.esPrcticaSQLenBDR:DDL,DMLyQLBSDT(5curso)

22. Calcular el nmero de empleados del departamento de VENTAS.


SELECT COUNT(*) FROM EMPLEADO EMP, DEPARTAMENTO DEP WHERE (EMP.DEPARTAMENTO_ID = DEP.ID) AND (DEP.NOMBRE = 'VENTAS');

23. Calcular el salario medio de cada cargo de la empresa.


SELECT CARGO, AVG(SUELDO) FROM EMPLEADO GROUP BY CARGO;

24. Calcular la comisin media de los empleados, excluyendo al presidente y suponiendo que todos los empleados cobran al menos una comisin de o .
SELECT AVG(NVL(COMISION, 0)) FROM EMPLEADO WHERE CARGO <> 'PRESIDENTE';

25. Calcular el sueldo mximo de los empleados de cada departamento siempre que el mnimo sueldo del departamento sea superior a 780 .
SELECT DEP.NOMBRE "DEPARTAMENTO", MAX(EMP.SUELDO) FROM DEPARTAMENTO DEP, EMPLEADO EMP WHERE DEP.ID = EMP.DEPARTAMENTO_ID GROUP BY DEP.NOMBRE HAVING MIN(SUELDO) > 780;

26. Mostrar el nombre y fecha de entrada de todos los empleados que trabajan en el mismo departamento que ESTHER.
SELECT NOMBRE, FECHA_ALTA FROM EMPLEADO WHERE DEPARTAMENTO_ID IN ( SELECT DEPARTAMENTO_ID FROM EMPLEADO WHERE NOMBRE= 'ESTHER');

27. Calcular el nmero de empleados que estn en BILBAO.


SELECT COUNT(*) FROM EMPLEADO EMP, DEPARTAMENTO DEP WHERE (EMP.DEPARTAMENTO_ID = DEP.ID) AND (DEP.LOCALIDAD = 'BILBAO');

DITETSITUPM

Por:CarmenCostilla,Curso201011

S-ar putea să vă placă și