Soluciones

English version (when available)

P04.001- Muestra toda la información de AREA.

select * from area;


P04.002- Muestra toda la información de HABITACION.

select * from habitacion;


P04.003- Prueba la siguiente orden: select * from habitacion h, area a
¿Tienen algún sentido los resultados? ¿Cuántas filas han salido?

select * from habitacion h, area a;
No, no tienen apenas sentido. Has cruzado todas las habitaciones con todas las áreas. Eso NO relaciona las habitaciones con el área a la que pertenecen.
Has obtenido 4800 filas (600 habitaciones por 8 áreas)


P04.004- Muestra toda la información de área e id y dimensión de las habitaciones que pertenecen a cada una de las anteriores, ordenado por identificador de área y número de habitación.

select a.*,h.id habitacion, dimension 
from habitacion h, area a
where h.idArea = a.id
order by a.id,h.id;
Hemos relacionado las habitaciones con el área a la que pertenecen. El resultado son 600 filas, 600 habitaciones, todas pertenecen a algún área.

P04.005- Muestra toda la información de las habitaciones del área 5, ordenado por identificador de área y número de habitación.

select *
from habitacion 
where idArea = 5
order by idArea,id;
Fíjate en que no hemos utilizado la tabla AREA para nada, toda la información requerida se encuentra en HABITACION

P04.006- Muestra toda la información de las habitaciones del área de "traumatología", ordenado por número de habitación.

select h.*
from habitacion h, area a
where h.idArea = a.id
  and tipo = 'traumatología'
order by h.id;
Ahora sí necesitamos la tabla AREA, tenemos que comprobar un dato que solo está en ella. Puedes ejecutar "select * from habitacion h, area a where h.idArea = a.id and tipo = 'traumatología' order by h.id" para ver qué, efectivamente, son las habitaciones correctas.

P04.007- Muestra el número de colegiado, apellidos, nombre, dirección y ciudad de los trabajadores de la provincia de Alicante que son médicos, ordenado por ciudad y apellidos.

select t.colegiado,apellidos,nombre,direccion,ciudad
from trabajador t, medico m
where m.colegiado = t.colegiado
  and provincia = 'Alicante'
order by ciudad,apellidos;
Solución alternativa:
select colegiado,apellidos,nombre,direccion,ciudad
from trabajador
where colegiado IN (select colegiado from medico)
  and provincia = 'Alicante'
order by ciudad,apellidos;
La tabla MEDICO solo la necesitamos para comprobar que el trabajador lo es. De ahí la solución alternativa que es más eficiente en MySQL —aunque esto no nos preocupa de momento—.

P04.008- Muestra el id y tipo de especialidad, número de colegiado, apellidos, nombre, dirección y ciudad de los médicos de la provincia de Alicante, ordenado por tipo de especialidad y apellidos.

select e.id, e.tipo, t.colegiado,apellidos,nombre,direccion,ciudad
from trabajador t, medico m, especialidad e
where m.colegiado = t.colegiado
  and provincia = 'Alicante'
  and m.idEspecialidad = e.id
order by e.tipo,apellidos;
Ahora necesitamos 3 tabla. Al añadir ESPECIALIDAD igualmente la tenemos que enlazar con alguna de las otras dos. En este caso, el único enlace posible es con MEDICO.

P04.009- Toda la información de los diagnósticos y de los historiales a los que pertenecen.

select * 
from historial h, diagnostico d
where h.id = d.idH;
El propósito de este ejercicio es que te des cuenta de que NO es obligatorio seguir la cadena de claves ajenas en algunas consultas. Aquí la tabla LINEA_HISTORIAL no hace falta para nada.
Si la utilizaras, lo que te sería penalizado en nuestra asignatura, habría que enlazarla debidamente con alguna de las otras tablas.


P04.010- Toda la información de los diagnósticos, fecha, y número de colegiado del médico que firma ese diagnóstico.

select d.*,l.fecha,l.idMedico 
from diagnostico d, linea_historial l
where l.idHistorial = d.idH and l.id = d.idL;
¡Cuidado! La clave ajena que va desde DIAGNOSTICO hasta LINEA_HISTORIAL es compuesta, se define con 2 columnas.

P04.011- Toda la información de los diagnósticos, fecha, y número de colegiado, apellidos y nombre del médico que firma ese diagnóstico.

select d.*,l.fecha,l.idMedico,apellidos,nombre 
from diagnostico d, linea_historial l,trabajador t
where l.idHistorial = d.idH and l.id = d.idL
  and l.idMedico = t.colegiado;
Nuevamente, la tabla MEDICO no es necesaria, ya tenemos toda la información útil en esas 3 tablas

P04.012- Toda la información de los diagnósticos, fecha, y número de colegiado, apellidos y nombre del médico que firma ese diagnóstico, y SIP, apellidos y nombre del paciente.

select d.*,l.fecha,l.idMedico,t.apellidos,t.nombre,
       sip "sip paciente", p.apellidos, p.nombre 
from diagnostico d, linea_historial l,trabajador t,
     tiene_un tu, 
     paciente p
where l.idHistorial = d.idH and l.id = d.idL
  and l.idMedico = t.colegiado
  and tu.idhistorial = l.idHistorial
  and tu.idpaciente = p.sip;
NO hacen falta las tablas MEDICO e HISTORIAL.

P04.013- SIP, apellidos y nombre de paciente, y medicación prescrita en cualquier tratamiento que haya tenido.

select sip,apellidos,nombre,medicacion
from paciente p,
tiene_un tu,
tratamiento t
where p.sip = tu.idpaciente and tu.idhistorial = t.idH;


P04.014- SIP, apellidos y nombre de paciente, fecha y medicación prescrita en cualquier tratamiento que haya tenido.

select sip,apellidos,nombre,medicacion, fecha
from paciente p,
tiene_un tu,
tratamiento t,
linea_historial l
where p.sip = tu.idpaciente and tu.idhistorial = t.idH
  and l.idhistorial = t.idH and l.id = t.idL;


P04.015- Número de colegiado,nif,apellidos y nombre de los trabajadores de la ciudad de Benidorm.

select colegiado,nif,apellidos,nombre 
from trabajador 
where ciudad = 'Benidorm';


P04.016- Número de colegiado,nif,apellidos y nombre de los trabajadores de la ciudad de Benidorm, e identificador del turno que tengan asignado.

select colegiado,nif,apellidos,nombre, idturno
from trabajador t,
     asignado a
where ciudad = 'Benidorm'
  and a.idtrabajador = t.colegiado;


P04.017- Número de colegiado,nif,apellidos y nombre de los trabajadores de la ciudad de Benidorm, e identificador y tipo del turno que tengan asignado.

select colegiado,nif,apellidos,nombre, idturno,tipo
from trabajador t,
     asignado a,
     turno tr
where ciudad = 'Benidorm'
  and a.idtrabajador = t.colegiado
  and tr.id = a.idturno;


P04.018- Número de colegiado,nif,apellidos y nombre de los enfermeros de la ciudad de Benidorm, e identificador y tipo del turno que tengan asignado.

select t.colegiado,nif,apellidos,nombre, idturno,tipo
from trabajador t,
     asignado a,
     turno tr,
     enfermero e
where ciudad = 'Benidorm'
  and a.idtrabajador = t.colegiado
  and tr.id = a.idturno
  and t.colegiado = e.colegiado;
Solución alternativa:
select colegiado,nif,apellidos,nombre, idturno,tipo
from trabajador t,
     asignado a,
     turno tr
where ciudad = 'Benidorm'
  and a.idtrabajador = t.colegiado
  and tr.id = a.idturno
  and colegiado in (select colegiado from enfermero);