Soluciones

English version (when available)

P03.001- Ejecuta lo siguiente:

create table T1(a int,b int,c int,
primary key(a)) engine=innodb;
create table T2(a int,d int,e int,
primary key(d),foreign key(a) references T1(a)) engine=innodb;

y comprueba, buscando el porqué en caso de fallo, el resultado de cada una de las órdenes de la siguiente secuencia:

a) insertar en T1(1,10,100)
b) insertar en T1(NULO,20,NULO)
c) insertar en T1(2,20,NULO)
d) insertar en T1(3,NULO,300)
e) insertar en T2(2,NULO,NULO)
f) insertar en T2(2,20,NULO)
g) insertar en T1(1,20,200)
h) insertar en T2(4,10,100)
i) insertar en T2(2,30,230)

insert into T1 values (1,10,100); -- a
insert into T1 values (NULL,20,NULL); -- b falla
insert into T1 values (2,20,NULL); -- c
insert into T1 values (3,NULL,300); -- d
insert into T2 values (2,NULL,NULL); -- e falla
insert into T2 values (2,20,NULL); -- f
insert into T1 values (1,20,200); -- g falla
insert into T2 values (4,10,100); -- h falla
insert into T2 values (2,30,230);-- i


P03.002- Continúa el anterior

j) modificar T1(1,10,100) a (2,10,100)
k) modificar T1(1,10,100) a (5,10,100)
l) modificar T2(2,20,NULO) a (2,20,220)
m) modificar T2(2,20,220) a (5,20,220)
n) modificar T2(5,20,220) a (2,10,100)
o) modificar T1(2,20,NULO) a (6,60,600)
p) modificar T1(3,NULO,300) a (7,70,700)
q) modificar T2(2,10,100) a (7,10,100)
r) modificar T2(2,30,230) a (7,30,230)
s) modificar T1(2,20,NULO) a (6,60,600)

update T1 set a=2 where a=1; -- j falla
update T1 set a=5 where a=1; -- k
update T2 set e=220 where d=20; -- l
update T2 set a=5 where d=20; -- m
update T2 set a=2,d=10,e=100 where d=20; -- n
update T1 set a=6,b=60,c=600 where a=2; -- o falla
update T1 set a=7,b=70,c=700 where a=3; -- p
update T2 set a=7 where d=10; -- q
update T2 set a=7 where d=30; -- r
update T1 set a=6,b=60,c=600 where a=2; -- s


P03.003- Continúa el anterior

t) borrar T2(7,30,230)
u) borrar T1(7,70,700)
v) borrar T1(5,10,100)
w) borrar T2(7,10,100)
x) borrar T1(7,70,700)
y) borrar T1(6,60,600)

delete from T2 where d=30; -- t
delete from T1 where a=7; -- u falla
delete from T1 where a=5; -- v 
delete from T2 where d=10; -- w
delete from T1 where a=7; -- x ahora sí
delete from T1 where a=6; -- y
El resultado final debe ser las 2 tablas vacías de filas.

P03.004- Ejecuta

create table T1(a int,b int,c int, primary key(a)) engine=innodb;
create table T2(a int,d int,e int,
primary key(d),
foreign key(a) references T1(a)) engine=innodb;

insert into T1 values (1,10,100);
insert into T1 values (2,20,NULL);
insert into T1 values (3,NULL,300);
insert into T2 values (2,20,NULL);
insert into T2 values (2,30,230);

a) Borra de T1 las filas con a = 3; ¿han desaparecido esas filas?
b) Borra de T1 las filas con a = 2; No ha hecho nada ¿verdad? ¿Cómo conseguirías eliminar esa fila? Hazlo.

a) delete from T1 where a = 3; -- sin problema
b) delete from T1 where a = 2; -- no ha hecho nada, en T2 hay 2 filas que hacen referencia a la que pretendemos borrar

-- la solución es, si realmente queremos borrar esa fila:
delete from T2 where a = 2;
delete from T1 where a = 2;

-- Es decir, eliminar antes las filas de T2 enlazadas.


P03.005- Muestra el SIP, apellidos, nombre y fecha de nacimiento de los pacientes que han nacido entre '1978-03-03' y '1978-04-30', ordenado por fecha de nacimiento.

select sip, apellidos, nombre, fecha_nacimiento
from paciente
where fecha_nacimiento between '1978-03-03' and '1978-04-30'
order by fecha_nacimiento;
Solución alternativa:
select sip, apellidos, nombre, fecha_nacimiento
from paciente
where fecha_nacimiento >= '1978-03-03' and fecha_nacimiento <= '1978-04-30'
order by 4;


P03.006- Muestra el SIP, apellidos, nombre y fecha de nacimiento de los pacientes que NO hayan nacido entre '1978-03-03' y '1978-04-30', ordenado por fecha de nacimiento.

select sip, apellidos, nombre, fecha_nacimiento
from paciente
where fecha_nacimiento NOT between '1978-03-03' and '1978-04-30'
order by fecha_nacimiento;
Solución alternativa:
select sip, apellidos, nombre, fecha_nacimiento
from paciente
where fecha_nacimiento < '1978-03-03' or fecha_nacimiento > '1978-04-30'
order by 4;


P03.007- Apellidos, nombre y provincia de los pacientes que tienen como primer apellido Martínez.

select apellidos, nombre, provincia
from paciente
where apellidos like 'Martínez %'


P03.008- Apellidos, nombre y provincia de los pacientes cuyo nombre comienza por 'Jos'

select apellidos, nombre, provincia
from paciente
where nombre like 'Jos%'


P03.009- Apellidos, nombre y provincia de los pacientes cuyo nombre es compuesto y comienza por JOSE —como José María—.

select apellidos, nombre, provincia
from paciente
where nombre like 'JOSE %'
Hemos dejado un espacio al final de "JOSE" para eliminar a los JOSEP y similares. No obstante, dependiendo de cómo se hayan almacenado estos valores, la solución puede ser más o menos precisa.

P03.010- Provincias de los pacientes que contienen 'CA' o contienen 'ON'. Elimina duplicados.

select distinct provincia
from paciente
where provincia like '%CA%' or provincia like '%ON%'


P03.011- Provincias de los pacientes que contienen 'CA' y contienen 'ER'. Elimina duplicados.

select distinct provincia
from paciente
where provincia like '%CA%' and provincia like '%ER%'


P03.012- Provincias de los pacientes que contienen alguna 'AL' e 'I'. Elimina duplicados.

select distinct provincia
from paciente
where provincia like '%AL%' and provincia like '%I%'
Solución alternativa:
select distinct provincia
from paciente
where provincia like '%AL%I%' or provincia like '%I%AL%'


P03.013- Provincias de los pacientes que contienen 'AL' antes que alguna 'I'. Elimina duplicados.

select distinct provincia
from paciente
where provincia like '%AL%I%'


P03.014- Provincias de los pacientes que contienen 'A*I', siendo '*' cualquier caracter. Elimina duplicados.

select distinct provincia
from paciente
where provincia like '%A_I%'


P03.015- Provincias de los pacientes que cuyo nombre no empieza por 'A'. Ordena y elimina duplicados.

select distinct provincia
from paciente
where provincia not like 'A%'
order by provincia;