English version (when available)
select t.colegiado,nif,apellidos,nombre,idArea from trabajador t where provincia = 'Á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);
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);
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: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.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);
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: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.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);
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.
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)
select count(*) from paciente ;
select count(*) from paciente where provincia = 'Huelva';
select count(ciudad) from paciente where provincia = 'Huelva';
select count(distinct ciudad) from paciente where provincia = 'Huelva';Compruébalo ejecutando select ciudad from paciente where provincia = 'Huelva';
select 2+2;
select avg(dimension) m2 from habitacion;
select sum(dimension)/count(*) m2 from habitacion;
select sum(dimension)/count(*) m2 from habitacion where dimension is not null;Solución alternativa:select sum(dimension)/count(dimension) m2 from habitacion;
select max(dimension) max,min(dimension) min from habitacion;
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;
select max(dimension) - min(dimension) m2 from habitacion where idarea in (0,1,2);
select count(*) habitaciones from habitacion where idarea in (1,2);