Soluciones

English version (when available)

P07.001- Número de colegiado, nif, apellidos, nombre e identificador de área de los trabajadores de la provincia de Álava.

select t.colegiado,nif,apellidos,nombre,idArea
from trabajador t 
where provincia = 'Álava';


P07.002- Número de colegiado, nif, apellidos, nombre e identificador de área de los médicos de la provincia de Álava.

select t.colegiado,nif,apellidos,nombre,idArea 
from trabajador t 
join medico m on (t.colegiado=m.colegiado) 
where provincia = 'Álava';
Solución alternativa:
select t.colegiado,nif,apellidos,nombre,idArea 
from trabajador t 
where provincia = 'Álava'
  and colegiado in (select colegiado from medico);


P07.003- Número de colegiado, nif, apellidos y nombre de los médicos de la provincia de Álava, e identificador y tipo de area en la que trabajan.

select t.colegiado,nif,apellidos,nombre,idArea,tipo 
from trabajador t 
join medico m on (t.colegiado=m.colegiado) 
join area a on (t.idArea=a.id) 
where provincia = 'Álava';
Solución alternativa:
select t.colegiado,nif,apellidos,nombre,idArea,tipo 
from trabajador t 
join area a on (t.idArea=a.id) 
where provincia = 'Álava'
  and colegiado in (select colegiado from medico);


P07.004- Número de colegiado, nif, apellidos y nombre de los médicos de la provincia de Álava y, si trabajan en algún área, identificador y tipo de area.

select t.colegiado,nif,apellidos,nombre,idArea,tipo 
from trabajador t 
join medico m on (t.colegiado=m.colegiado) 
left join area a on (t.idArea=a.id) 
where provincia = 'Álava';
Solución alternativa:
select t.colegiado,nif,apellidos,nombre,idArea,tipo 
from trabajador t 
left join area a on (t.idArea=a.id) 
where provincia = 'Álava'
  and colegiado in (select colegiado from medico);
El outer join —left, en este caso— muestra todos los médicos de la provincia, tengan o no área asignada; si la tienen, muestra la información de su área.

P07.005- Número de colegiado, nif, apellidos y nombre de los médicos de la provincia de Álava y, si trabajan en algún área, identificador y tipo de area. Utiliza right join.

select t.colegiado,nif,apellidos,nombre,idArea,tipo 
from area a 
right join trabajador t on (t.idArea=a.id) 
join medico m on (t.colegiado=m.colegiado) 
where provincia = 'Álava';
Solución alternativa:
select t.colegiado,nif,apellidos,nombre,idArea,tipo 
from area a
right join trabajador t on (t.idArea=a.id) 
where provincia = 'Álava'
  and colegiado in (select colegiado from medico);
Aquí puede que esté más claro en la solución alternativa. El right join muestra "todo lo de la derecha y aquello de la izquierda que esté relacionado". Por eso hemos tenido que cambiar el orden de las tablas para obtener el mismo resultado que en ejercicios anteriores.

P07.006- Si ejecutamos

select t.colegiado,nif,apellidos,nombre,idArea,tipo
from trabajador t
right join area a on (t.idArea=a.id)
where provincia = 'Álava'
and colegiado in (select colegiado from medico)


¿por qué parece que el right join no está haciendo nada?

select t.colegiado,nif,apellidos,nombre,idArea,tipo 
from trabajador t 
right join area a on (t.idArea=a.id) 
where provincia = 'Álava'
  and colegiado in (select colegiado from medico);
Le hemos pedido que muestre todas las áreas y, si encuentra algún médico de Álava que trabaje en ella, la información de este último. Da la casualidad de que todas las áreas tienen algún médico y, por eso, parece que no hace nada comparado con los ejercicios anteriores.
Dicho de otra forma, si hubiera un área 8 sin médicos, tendríamos una fila adicional con idArea y tipo pero con toda la información de médico a nulos.


P07.007- SIP y provincia de todos los pacientes de Huelva y, si tienen historial médico, id del historial y grupo sanguíneo.

select sip,provincia,h.id,grupo_sanguineo 
from paciente p 
left join tiene_un t on (p.sip=t.idpaciente)
left join historial h on (t.idhistorial = h.id)
where provincia = 'Huelva';
Son "todos los pacientes de la izquierda y si...". En este tipo de ejercicios tenemos que poner left join en todas las tablas de "la derecha". Prueba a quiter el left del join con historial.

Otra cosa a estudiar es el funcionamiento de esta ligera variación:
select sip,provincia,h.id,grupo_sanguineo
from paciente p
left join tiene_un t on (p.sip=t.idpaciente and provincia = 'Huelva')
left join historial h on (t.idhistorial = h.id)


P07.008- ¿Cuántos pacientes tenemos?

select count(*) from paciente ;


P07.009- ¿Cuántos pacientes tenemos de la provincia de Huelva?

select count(*) from paciente 
where provincia = 'Huelva';


P07.010- ¿De cuántas ciudades vienen los pacientes que tenemos de la provincia de Huelva?

select count(ciudad) from paciente 
where provincia = 'Huelva';


P07.011- ¿De cuántas ciudades distintas vienen los pacientes que tenemos de la provincia de Huelva?

select count(distinct ciudad) from paciente 
where provincia = 'Huelva';
Compruébalo ejecutando select ciudad from paciente where provincia = 'Huelva';

P07.012- ¿Cuántas son 2 y 2?

select 2+2;


P07.013- Halla la dimensión media de las habitaciones del hospital.

select avg(dimension) m2 from habitacion;


P07.014- Calcula la dimensión media de las habitaciones del hospital sin utilizar la función AVG().

select sum(dimension)/count(*) m2 from habitacion;


P07.015- Calcula la dimensión media de las habitaciones del hospital sin utilizar la función AVG() y eliminando del cálculo las habitaciones sin dimensiones.

select sum(dimension)/count(*) m2 from habitacion where dimension is not null;


P07.016- ¿Cuál es la dimensión máxima y mínima de las habitaciones del hospital?

select max(dimension) max,min(dimension) min from habitacion;


P07.017- ¿Cuál es la dimensión máxima y mínima entre todas las habitaciones del hospital en las áreas 0,1 y 2?

select max(dimension) max,min(dimension) min 
from habitacion 
where idarea in (0,1,2);
Solución alternativa:
select max(dimension) max,min(dimension) min 
from habitacion 
where idarea = 0 or idarea = 1 or idarea = 2;


P07.018- ¿Cuál es la diferencia entre la dimensión máxima y mínima de todas las habitaciones del hospital en las áreas 0,1 y 2?

select max(dimension) - min(dimension) m2 
from habitacion 
where idarea in (0,1,2);


P07.019- ¿Cuántas habitaciones suman las áreas 1 y 2?

select count(*) habitaciones 
from habitacion 
where idarea in (1,2);