lunes, 13 de abril de 2015

Solución repaso entera del año pasado

EJERCICIO 1
1) A los trabajadores que han estado asignados a edificios de oficinas, disminuirles su TARIFA EN 2 euros.

update trabajador
set tarifa=tarifa-2
 where id_t in (select   t.id_t
from trabajador t, asignacion a, edificio e
where e.ID_E=a.ID_E and
      t.ID_T=a.ID_T and
     UPPER(e.TIPO)='OFICINA')


2)  A cada supervisor que supervisa a más de un trabajador, actualizar su TARIFA   la mayor TARIFA de los que dependen de él..

UPDATE TRABAJADOR T0
SET T0.TARIFA = (SELECT MAX(TARIFA) FROM TRABAJADOR WHERE TRABAJADOR.ID_SUPV=T0.ID_T)
WHERE ID_T IN
( SELECT S.ID_T
 FROM TRABAJADOR T, TRABAJADOR  S
 WHERE T.ID_SUPV=S.ID_T
 GROUP BY S.ID_T
 having  count(t.ID_T) > 1)
       
3) Incrementar un 5% la tarifa de todos los trabajadores que tienen una tarifa por hora menor que la del promedio de todos los trabajadores que dependen del mismo supervisor que él.


UPDATE TRABAJADOR
SET TRABAJADOR.TARIFA=TRABAJADOR.TARIFA*1.05
WHERE TRABAJADOR.TARIFA < ( SELECT AVG(T2.TARIFA) FROM TRABAJADOR T2
                                       WHERE TRABAJADOR.ID_SUPV=T2.ID_SUPV)


4) Insertar un nuevo trabajador , su ID_T será 4000, su nombre será G.ALVAREZ,
   su supervisor  nadie, el oficio será el mismo de los supervisados por C.COULOMB y su tarifa la media de las tarifas de los empleados supervisados por C. COULOMB.

---una forma, usando subconsulta en la cláusula FROM

INSERT INTO TRABAJADOR
SELECT  DISTINCT 4000,'G_ALVAREZ',
 ( SELECT AVG(TARIFA) FROM TRABAJADOR
 WHERE ID_SUPV=
         (SELECT ID_T FROM TRABAJADOR WHERE
         NOMBRE LIKE '%COULOMB%') ),
 OFICIO,NULL FROM TRABAJADOR
 WHERE ID_SUPV =
 (SELECT ID_T FROM TRABAJADOR WHERE
 NOMBRE LIKE '%COULOMB%')


-----otra forma (Con GROUB BY)
INSERT INTO TRABAJADOR(ID_T,NOMBRE, TARIFA,OFICIO)
(SELECT 4000,'F.ALVAREZ',AVG(TARIFA),OFICIO FROM TRABAJADOR WHERE
ID_T IN
(SELECT ID_T FROM TRABAJADOR WHERE ID_SUPV =
(SELECT ID_T FROM TRABAJADOR WHERE NOMBRE = 'C.COULOMB')
)
GROUP BY OFICIO);

5) a) Crea una vista  que contenga los nombres de los electricistas, la dirección de los edificios a los que están asignados y cuántas veces han estado asignados a esos edificios.


CREATE OR REPLACE VIEW (TRABAJADOR,DIRECCION,NUM_DESTINOS) AS
SELECT T.NOMBRE,E.DIR,COUNT(A.ID_T)
FROM TRABAJADOR T, EDIFICIO E, ASIGNACION A
WHERE T.ID_T=A.ID_T AND E.ID_E=A.ID_E AND UPPER(T.OFICIO) LIKE 'ELECTRI%'
GROUP BY T.NOMBRE,E.DIR

b)Crea una secuencia de nombre SEQ_EXAMEN, con valor inicial 4500 y valor final 4600 e incremento de 1 en 1. Usa esa secuencia para la columna ID_T de la tabla TRABAJADOR y añade una fila en dicha tabla con los valores que quieras en las demás columnas.

c) Usa dicha secuencia para añadir una fila en la vista VISTA4 comentando lo que ocurre y por qué

 6) Se quiere borrar toda la información que se tiene del trabajador P.MASON. Indica las instrucciones que debes ejecutar para ello.

DELETE ASIGNACION WHERE ASIGNACION.ID_T =
(SELECT TRABAJADOR.ID_T FROM TRABAJADOR WHERE
 TRABAJADOR.NOMBRE ='P.MASON');

UPDATE TRABAJADOR
SET TRABAJADOR.ID_SUPV=NULL
WHERE ID_SUPV =
(SELECT TRABAJADOR.ID_T FROM TRABAJADOR WHERE
 TRABAJADOR.NOMBRE ='P.MASON');

DELETE  TRABAJADOR WHERE
 TRABAJADOR.NOMBRE ='P.MASON';



7) a) A  partir de tu situación actual, conectado como EJER1, enumera los pasos necesarios para que el usuario usuarioxx  pueda realizar las operaciones siguientes:
- Pueda ver los datos a través de la vista creada en el ejercicio 5 a)  y además pueda otorgar este derecho.
- Pueda actualizar las columnas TARIFA de TRABAJADOR y la columna NUM_DIAS de ASIGNACION.
- Pueda insertar filas nuevas en las tabla ASIGNACION.

SQL> GRANT SELECT ON  TO USUARIO00 WITH GRANT OPTION;

Concesión terminada correctamente.

SQL> GRANT UPDATE(TARIFA) ON TRABAJADOR TO USUARIO00;

Concesión terminada correctamente.

SQL> GRANT UPDATE(NUM_DIAS) ON ASIGNACION TO USUARIO00;

Concesión terminada correctamente.

SQL> GRANT INSERT ON ASIGNACION TO USUARIO00;

Concesión terminada correctamente.
b)      Entra como USUARIOXX y comprueba los privilegios adquiridos.

SQL> CONN USUARIO00/USUARIO00;
Conectado.
SQL> SELECT * FROM EJER1.VISTA5;

TRABAJADOR           DIRECCION       NUM_DESTINOS
-------------------- --------------- ------------
C.COULOMB            456 MAPLE                  1
C.COULOMB            1415 BEACH                 1
M.FARADAY            123 ELM                    2
M.FARADAY            789 OAK                    1


SQL> UPDATE EJER1.TRABAJADOR
  2  SET TARIFA=TARIFA+1;

6 filas actualizadas.

SQL> UPDATE EJER1.ASIGNACION
  2  SET NUM_DIAS=NUM_DIAS+1;

19 filas actualizadas.


SQL> ED
Escrito archivo afiedt.buf

  1  INSERT INTO EJER1.ASIGNACION
  2* VALUES (1235,312,SYSDATE,3)
SQL> /

1 fila creada.

EJERCICIO 2
1)
a)      Modifica la tabla profesores añadiéndole una columna NUM_CURSOS NUMBER(3).
b)      Esta columna está destinada a guardar el nº de cursos impartido por cada profesor.  Escribe la sentencia
UPDATE que lleve a cabo esta misión.
rem a)
alter table profesores
add (num_cursos number(3));
rem b)
update profesores
            set num_cursos=(select count(cursos.dni_profesor)  from cursos
      where dni_profesor=profesores.dni);


2) Hay que dar de alta una fila en la tabla TIPOS_CURSO, el COD_CURSO es SGBDR012, el  título Oracle Forms 10g   y la duración de 10 horas menos que la máxima duración de los cursos que no sean ni electricidad ni soldadura.
insert into tipos_curso
select 'SGBDR012','Oracle Forms 10g',max(duracion-10) from tipos_curso
where upper(titulo) NOT IN ('SOLDADURA','ELECTRICIDAD')

3) Se ha asignado al profesor de apellido “Algete” que imparta el curso 534 , de “Introducción a Oracle”. Haz el correspondiente UPDATE  en la tabla CURSOS.
update cursos set
 cod_curso =(select cod_curso  from tipos_curso
                      where upper(titulo) like '%ORACLE%'),
                   DNI_PROFESOR=(select dni from profesores
                         where upper(apellido1)='ALGETE')
WHERE N_CURSO=534;


4) Tras repasar los datos nos hemos dado cuenta que se cometió un error al introducir el DNI del alumno Pedro García García, se tecleo 43734348 cuando en realidad su DNI  es 43734384. Escribe las instrucciones que creas necesarias para arreglar dicho error en las tablas ALUMNOS y ASISTIR.


-- METO LA FILA EN ALUMNOS

INSERT INTO ALUMNOS  SELECT 43734384,ALUMNOS.NOMBRE,ALUMNOS.APELLIDO1,ALUMNOS.APELLIDO2,  ALUMNOS.DIRECCION,  ALUMNOS.TELEFONO,ALUMNOS.EDAD,ALUMNOS.CIF
FROM ALUMNOS WHERE DNI=43734348

-- METO LAS FILAS EN ASISTIR

insert into asistir select 43734384, asistir.N_CURSO, asistir.NOTA from asistir WHERE dni=43734348

 -- borro en asistir

delete from asistir WHERE dni=43734348

--borro en alumnos

delete from alumnos WHERE dni=43734348


5) Crea la vista ASISTENCIA_CURSOS  que tendrá todas las columnas de la tabla ASISTIR, todas las de la tabla TIPOS_CURSO, y las columnas FECHA_INICIO, FECHA_FIN y   DNI_PROFESOR. de la tabla CURSOS. Joins por columnas comunes.

CREATE OR REPLACE VIEW ASISTENCIA_CURSOS
(DNI, N_CURSO, NOTA, COD_CURSO, TITULO,
 DURACION, FECHA_INICIO, FECHA_FIN, DNI_PROFESOR)
AS
select asistir.*,tipos_curso.*,cursos.fecha_inicio,cursos.fecha_fin,cursos.dni_profesor
from asistir,cursos,tipos_curso
where asistir.n_curso=cursos.n_curso and
cursos.cod_curso=tipos_curso.cod_curso;



Intenta hacer un UPDATE en ASISTENCIA-CURSOS  actualizando N_CURSO  a 522  en aquellas filas en las que N_CURSO es igual a  521. Comenta lo que ocurre y por qué.


6) Crea una secuencia denominada SEQ_EXAMEN  que comienza por 600, incrementando de 1 en 1, y con valor máximo 700. Utiliza esa secuencia con la columna  N_CURSOS de la tabla CURSOS para insertar 2 filas con los valores que quieras para las demás columnas.

CREATE SEQUENCE SEQ_EXAMEN
START WITH 10020
MAXVALUE 11000
INCREMENT BY 1
NOCYCLE
NOCACHE;

INSERT INTO ESTUDIANTES VALUES (SEQ_EXAMEN.NEXTVAL,'PEPE','GÓMEZ','Historia',0);
INSERT INTO ESTUDIANTES VALUES (SEQ_EXAMEN.NEXTVAL,'ana','pérez','Económicas',0);

EJERCICIO 3

1)      Eliminar los módulos que no tengan estudiantes registrados.

 delete from modulos
where (departamento,curso) NOT IN
(SELECT departamento,curso FROM estudiantes_registrados)




2)      Actualizar la columna NUM_ESTUDIANTES de la tabla MÓDULOS. Para ello debe usarse la tabla ESTUDIANTES_REGISTRADOS  donde tenemos la información de los módulos en los que está matriculado cada estudiante.

update modulos
set NUM_ESTUDIANTES=
(SELECT COUNT(*) FROM ESTUDIANTES_REGISTRADOS R
WHERE MODULOS.CURSO=R.CURSO AND MODULOS.DEPARTAMENTO=R.DEPARTAMENTO)

3)Actualizar la columna CREDITOS_ACTUALES de la tabla ESTUDIANTES. Para ello deben usarse la tabla ESTUDIANTES_REGISTRADOS  donde tenemos la información de los módulos en los que está matriculado cada estudiante y la tabla MODULOS donde tenemos cuantos créditos le corresponden a cada módulo.

UPDATE estudiantes
SET creditos_actuales=
(SELECT SUM(M.num_creditos) FROM modulos M,estudiantes_registrados E
WHERE M.departamento=E.departamento AND M.curso=E.curso
GROUP BY e.estudiante_id
HAVING estudiantes.id=e.estudiante_id)

      

No hay comentarios:

Publicar un comentario

Nota: solo los miembros de este blog pueden publicar comentarios.