FICHEROS Y BASES DE DATOS

EXAMEN

2º ITIG

12/2/2001

RESUELTO

1. ¿Qué tienen en común los índices secundarios y los árboles B+?
(A) Nada, ya que sus estructuras son distintas (lineal frente a árbol).
(B) Que ambos permiten almacenar los datos de modo que su acceso sea eficiente.
(C) Que ambos son índices.
2. Cuando se crea un esquema de dispersión (hashing) sobre un fichero de datos ...
(A) ... los registros del fichero se deben reorganizar.
(B) ... los registros del fichero no cambian de posición pero sí pueden cambiar de tamaño.
(C) ... los registros del fichero no cambian de posición ni de tamaño.
3. Cuando se crea un índice secundario sobre un fichero de datos ...
(A) ... los registros del fichero se deben reorganizar.
(B) ... los registros del fichero no cambian de posición pero sí pueden cambiar de tamaño.
(C) ... los registros del fichero no cambian de posición ni de tamaño.
4. ¿Cuántas filas obtiene la expresión VEHÍCULO JOIN SALIDA?
(A) Tantas como vehículos han realizado alguna salida.
(B) Tantas como salidas se hayan realizado con y sin vehículo.
(C) Tantas como salidas se hayan realizado con vehículo.
5. Sabiendo que las dos claves ajenas que hay en SAL_PER no aceptan nulos por formar parte de su clave primaria
¿es posible insertar una persona que no haya realizado ninguna salida?
(A) Sí, siempre.
(B) No, nunca.
(C) Depende de si la persona ya existe en otra categoría.
6. ¿Cuándo es posible borrar los datos de una salida?
(A) Siempre.
(B) Sólo si antes se elimina la información sobre las personas que han participado en ella.
(C) Sólo si en la salida no consta vehículo ni personal.

dni=PERSONALX. T0:= (SAL_PER WHERE función='responsable')[dni] (han salido como resp. Sobre la base de datos se debe cumplir la siguiente restricción: ‘en todas las salidas realizadas por ambulancias debe haber por lo menos un médico que actúe como responsable’. 8.’YYYY’))-TO_NUMBER(TO_CHAR(fecha_nacim. . (C) Las expresiones E2 y E3. (B) Las expresiones E1 y E3. ¿Cuáles de las siguientes expresiones responden a la consulta ‘personal sanitario que ha realizado su primera salida antes de los 21 años’? E1: SAL_PER [dni] MINUS ((PERSONAL JOIN SAL_PER JOIN SALIDA) WHERE TO_NUMBER(TO_CHAR(fecha.dni=PERSONALX.’YYYY’))>=21)[dni] E2: (((SUMMARIZE (SALIDA JOIN SAL_PER) GROUPBY(dni) ADD MIN(fecha) AS fecha) JOIN PERSONAL) WHERE TO_NUMBER(TO_CHAR(fecha.) RDO:= (T0 MINUS T1) JOIN PERSONAL (siempre han salido como resp.’YYYY’))-TO_NUMBER(TO_CHAR(fecha_nacim.) T1:= (SAL_PER WHERE función<>'responsable')[dni] (han salido como no resp.función<>’conductor’) (C) PERSONALX WHERE ∀ SAL_PERX (IF SAL_PERX.dni THEN SAL_PERX.dni AND SAL_PERX. ¿Cuál de las siguientes expresiones obtiene los datos del personal sanitario que nunca ha sido conductor en las salidas que ha realizado? (A) PERSONALX WHERE ∀ SAL_PERX (IF SAL_PERX.dni=PERSONALX.función=’responsable’) 11.7.función<>’conductor’) 9.) 10.dni=PERSONALX.’YYYY’))-TO_NUMBER(TO_CHAR(fecha_nacim.codsal THEN SAL_PERX.codsal=SAL_PERX. Violan la restricción las salidas realizadas por ambulancias en donde no ha habido responsable o en donde ha habido responsable y éste no era médico. PERSONALX WHERE ∀ SAL_PERX (IF SAL_PERX.dni) (B) PERSONALX WHERE ∀ SALIDAX ∃ SAL_PERX (IF SALIDAX.’YYYY’))<21)[dni] (A) Las expresiones E1 y E2.dni THEN SAL_PERX. Escribir una expresión del cálculo relacional que encuentre las salidas realizadas que violan esta restricción. Escribe una expresión del cálculo relacional que obtenga los datos de las personas que sólo han realizado salidas siendo responsables de las mismas.’YYYY’))<21)[dni] E3: ((PERSONAL JOIN SAL_PER JOIN SALIDA) WHERE TO_NUMBER(TO_CHAR(fecha.función<>’conductor’ THEN SAL_PERX. Escribe una expresión del álgebra relacional que obtenga los datos de las personas que sólo han realizado salidas siendo responsables de las mismas.

matrícula=VEHÍCULOX.matricula)..función=’responsable’ AND PERSONALX.dni.0)).coste_mat).dni. (C) La sentencia S2 responde a la consulta.. (A) Las dos sentencias responden a la consulta. Para cada médico que ha actuado como responsable se quiere saber el número de salidas que ha realizado con y sin vehículo y el número de salidas que ha realizado con y sin coste de material.tipo='ambulancia' AND (NOT ∃ SAL_PERX (SAL_PERX.’N’).categoria).coste_mat). COUNT(S.codsal AND SAL_PERX.coste_mat.P1.nombre HAVING .1.0)) (C) DECODE(NVL(S..nombre. S2: SELECT P1.dni AND S.codsal AND SP. P.codsal AND P.1.matrícula AND VEHÍCULOX.COUNT(NVL(S. P.0.matricula AND SP.coste_mat. COUNT(DECODE(SIGN(S.categoria=’medico’ AND SP. COUNT(NVL(S.fecha_nac) FROM PERSONAL P2 WHERE P2. Dada la siguiente sentencia SQL: SELECT P.0)).1.’N’)).categoria FROM PERSONAL P1 WHERE P1. ¿Qué se debe hacer con la sentencia anterior para que obtenga los datos de los conductores que han realizado salidas conduciendo todos los vehículos? .funcion=’responsable’ GROUP BY P.dni AND SAL_PERX.codsal=SALIDAX..fecha_nac>= ALL(SELECT MAX(P2.matricula.dni.0)) (B) SUM(DECODE(NVL(S. SAL_PER SP.codsal=S.0)). SALIDA S WHERE P.categoria).’N’.coste_mat.matricula=V. 14.1..dni=SP.funcion=P. COUNT(S.dni=PERSONALX. P. (B) La sentencia S1 responde a la consulta. PERSONAL P.’N’). COUNT(DECODE(SIGN(S. Dada la consulta ‘obtener el nombre de la persona más jóven de cada categoría’ y las sentencias S1 y S2: S1: SELECT P1.matricula.categoria GROUP BY P.1. ¿Qué expresiones se deben añadir en el SELECT de la siguiente consulta para obtener el resultado que se desea? SELECT P. . (A) COUNT(NVL(S.nombre. COUNT(S.codsal=SP.COUNT(NVL(S.codsal=SALIDAX.0).1.1.nombre FROM SALIDA S.fecha_nac) FROM PERSONAL P2 GROUP BY P2.0).matricula.1.dni=P.coste_mat)) 13.’N’)).nombre. DECODE(NVL(S..categoria= P1.codsal AND SAL_PERX.nombre.categoria FROM PERSONAL P1 WHERE P1.0. SUM(DECODE(SIGN(S.P1. P.matricula)).fecha_nac>= (SELECT MAX(P2.dni.función='responsable')) OR ∃ SAL_PERX ∃ PERSONALX (SAL_PERX.categoría<>'médico'))) 12. FROM PERSONAL P.dni AND SP. mientras que la sentencia S1 no lo hace.matricula. VEHICULO V WHERE S. SAL_PER SP.0)).matricula).coste_mat. mientras que la sentencia S2 no lo hace.’N’.SALIDAX WHERE ∃ VEHÍCULOX (SALIDAX. SUM(DECODE(NVL(S.0)).

nombre FROM PERSONAL P.).categoria GROUP BY SS..nombre FROM PERSONAL P WHERE EXISTS (SELECT S.motivo GROUP BY S.codsal AND SSP. S2: SELECT P. SALIDA S WHERE P. ¿Qué se debe añadir en la siguiente sentencia para obtener el motivo por el que realiza más salidas el personal de cada categoría? SELECT S.motivo..categoria=P. P.dni .P.dni GROUP BY S.matricula FROM SAL_PER SP. P.matricula)=1.dni AND SP. PERSONAL P WHERE S.motivo.codsal=S. (C) La sentencia S2 obtiene un subconjunto de las filas que obtiene la sentencia S1.codsal=S. SELECT dni.P. (B) La sentencia S1 obtiene un subconjunto de las filas que obtiene la sentencia S2.matricula)=COUNT(DISTINCT S.SAL_PER SP. .dni=P. 16. (A) Ambas sentencias obtienen las mismas filas.SALIDA S WHERE P.matricula) y además se debe eliminar VEHICULO del FROM y el WHERE de la consulta principal.codsal GROUP BY P. MAX(funcion) FROM SAL_PER GROUP BY dni HAVING COUNT(DISTINCT funcion)=1.categoria HAVING COUNT(*) >= ALL(SELECT COUNT(*) FROM SALIDA SS. (B) En el HAVING se debe añadir: COUNT(DISTINCT S.codsal AND SP.codsal).matricula=S.categoria 17.motivo=S. SAL_PER SP.dni=SP.matricula). 15. PERSONA PP WHERE SS. Indica cómo debe modificarse la sentencia anterior para que además muestre dicha función. P.motivo GROUP BY SS.categoria (C) AND PP.categoria FROM SALIDA S.nombre HAVING COUNT(DISTINCT S.codsal=SP.dni AND SP. La siguiente sentencia SQL responde a la consulta ‘DNI de las personas que siempre han realizado sus salidas cumpliendo la misma función (conductor o responsable): SELECT dni FROM SAL_PER GROUP BY dni HAVING COUNT(DISTINCT funcion)=1.categoria AND SS.(A) En el HAVING se debe añadir: COUNT(DISTINCT V.dni.motivo (B) AND SS. Dadas las sentencias S1 y S2: S1: SELECT P. (A) AND PP.P.motivo.matricula)=(SELECT COUNT(*) FROM VEHICULO) y además se puede eliminar VEHICULO del FROM y el WHERE de la consulta principal.dni=PP.codsal=SPP.motivo=S. (C) En el HAVING se debe añadir: COUNT(DISTINCT S.. SAL_PER SPP.dni.dni=SP.matricula)=(SELECT COUNT(*) FROM VEHICULO V WHERE V.dni.categoria=P.. .

P.fecha_nacim FROM PERSONAL P.codsal. TAREA(descripción.importe_tot aceptan nulos PROYECTO_LARGO(número).fecha_inicio. NVL(S.nif. ¿Qué relaciones (tablas) en 3FN se obtienen a partir de la jerarquía PROYECTO y sus atributos simples? Para este apartado no se deben tener en cuenta las relaciones que la jerarquía tiene con el resto de entidades.descripción.telefono. descripción es clave ajena a TAREA.fecha_nacim HAVING MIN(TO_NUMBER(TO_CHAR(S. OPERARIO(dni. S. PARA CONTESTAR LAS PREGUNTAS DE LA 20 A LA 25 NECESITAS CONSULTAR LA HOJA – B – 20. Incluye en el esquema lógico los atributos compuestos de PROYECTO: empresa y tarea. número es clave ajena a PROYECTO. no acepta nulos y la regla de borrado es restringir. PROYECTO(número.codsal=S.número). SALIDA S WHERE P.contacto) PROYECTO(número. 19. Representa la relación asignado en el esquema lógico que se está obteniendo. P.'N'. P.importe_tot) fecha_inicio.'SI').codsal GROUP BY P.fecha.fecha.0).presupuesto).estado.estado.matricula.dni AND SP.fecha_fin.nombre.telefono.fecha_inicio.fecha. S.estado. Representa la relación trabaja en el esquema lógico que se está obteniendo. EMPRESA(nif. 23.0)/166. Escribe una sentencia SQL que para cada salida realizada obtenga su fecha y el número de personas que han participado. P.categoria. número es clave ajena a PROYECTO.dni=SP. PROYECTO_CORTO(número).'N').nombre.fecha_fin.nombre. 21. SAL_PER SP WHERE S.386 FROM SALIDA S. número es clave ajena a PROYECTO. no acepta nulos y la regla de borrado es propagar. Escribe una sentencia SQL que obtenga los datos de las personas que sólo realizan salidas en fin de semana. SAL_PER SP.coste_material. número es clave ajena a PROYECTO. COUNT(*) personas.18.importe_base) PRESUPUESTO(número. no acepta nulos y la regla de borrado es restringir . no acepta nulos y la regla de borrado es propagar.nif) nif es clave ajena a EMPRESA.especialidad. P. acepta nulos y la regla de borrado es anular o restringir. PROYECTO(número.fecha_inicio.codsal GROUP BY S.coste_material.importe_tot. además se debe indicar si ha utilizado o no vehículo (mostrar los valores SI/NO) y el coste del material en euros SELECT S. S. DECODE(NVL(S.codsal. P. NVL(S.categoria.'d')))>=6.nombre.importe_tot. 22.estado.fecha_fin.dni.'NO'.fecha_fin.dni) dni es clave ajena a INGENIERO. SELECT P. P.matricula. no acepta nulos y la regla de borrado es restringir.dni.dirección. no acepta nulos y la regla de borrado es propagar. P.codsal = SP.

Representa la relación revisión en el esquema lógico que se está obteniendo. REVISIÓN(número. finalizados o no.dni.nombre.grado_ejec) supongo que un proyecto puede ser revisado en una misma fecha por varios ingenieros número es clave ajena a PROYECTO_LARGO.especialidad) TRABAJA(número. no acepta nulos y la regla de borrado es propagar.24. ¿Cómo se debe modificar el esquema lógico relacional obtenido hasta el momento para que se pueda mantener la información sobre en qué proyectos. . dni es clave ajena a INGENIERO. 25.dni) número es clave ajena a PROYECTO. Tal y como se especifica en los requerimientos. no acepta nulos y la regla de borrado es restringir. no acepta nulos y la regla de borrado es restringir o propagar.fecha. en el esquema conceptual se refleja que cada operario sólo puede estar asignado a un proyecto (que además estará en ejecución). no acepta nulos y la regla de borrado es propagar. dni es clave ajena a OPERARIO. ha trabajado cada operario? OPERARIO(dni.