64 - Varias tablas (left join)


Problema:
Una empresa tiene registrados sus clientes en una tabla llamada "clientes", también tiene una 
tabla "provincias" donde registra los nombres de las provincias.

1- Elimine las tablas "clientes" y "provincias", si existen:
 drop table if exists clientes, provincias;

2- Créelas con las siguientes estructuras:
 create table clientes (
  codigo int unsigned auto_increment,
  nombre varchar(30) not null,
  domicilio varchar(30),
  ciudad varchar(20),
  codigoProvincia tinyint unsigned,
  telefono varchar(11),
  primary key(codigo)
 );

 create table provincias(
  codigo tinyint unsigned auto_increment,
  nombre varchar(20),
  primary key (codigo)
 );

3- Ingrese algunos registros para ambas tablas:
 insert into provincias (nombre) values('Cordoba');
 insert into provincias (nombre) values('Santa Fe');
 insert into provincias (nombre) values('Corrientes');
 insert into provincias (nombre) values('Misiones');
 insert into provincias (nombre) values('Salta');
 insert into provincias (nombre) values('Buenos Aires');
 insert into provincias (nombre) values('Neuquen');

 insert into clientes (nombre,domicilio,ciudad,codigoProvincia,telefono)
  values ('Lopez Marcos', 'Colon 111', 'Córdoba',1,'null');
 insert into clientes (nombre,domicilio,ciudad,codigoProvincia,telefono)
  values ('Perez Ana', 'San Martin 222', 'Cruz del Eje',1,'4578585');
 insert into clientes (nombre,domicilio,ciudad,codigoProvincia,telefono)
  values ('Garcia Juan', 'Rivadavia 333', 'Villa Maria',1,'4578445');
 insert into clientes (nombre,domicilio,ciudad,codigoProvincia,telefono)
  values ('Perez Luis', 'Sarmiento 444', 'Rosario',2,null);
 insert into clientes (nombre,domicilio,ciudad,codigoProvincia,telefono)
  values ('Pereyra Lucas', 'San Martin 555', 'Cruz del Eje',1,'4253685');
 insert into clientes (nombre,domicilio,ciudad,codigoProvincia,telefono)
  values ('Gomez Ines', 'San Martin 666', 'Santa Fe',2,'0345252525');
 insert into clientes (nombre,domicilio,ciudad,codigoProvincia,telefono)
  values ('Torres Fabiola', 'Alem 777', 'Villa del Rosario',1,'4554455');
 insert into clientes (nombre,domicilio,ciudad,codigoProvincia,telefono)
  values ('Lopez Carlos', 'Irigoyen 888', 'Cruz del Eje',1,null);
 insert into clientes (nombre,domicilio,ciudad,codigoProvincia,telefono)
  values ('Ramos Betina', 'San Martin 999', 'Cordoba',1,'4223366');
 insert into clientes (nombre,domicilio,ciudad,codigoProvincia,telefono)
  values ('Lopez Lucas', 'San Martin 1010', 'Posadas',4,'0457858745');

4- Queremos saber de qué provincias no tenemos clientes:
 select p.codigo,p.nombre from provincias as p
  left join clientes as c
  on c.codigoProvincia=p.codigo
  where c.codigoprovincia is null;

5- Queremos saber de qué provincias si tenemos clientes, sin repetir el nombre de la provincia:
 select distinct p.codigo,p.nombre from provincias as p
  left join clientes as c
  on c.codigoProvincia=p.codigo
  where c.codigoprovincia is not null;

6- Omita la referencia a las tablas en la condición "on" para verificar que la sentencia no se 
ejecuta porque el nombre del campo "codigo" es ambiguo (ambas tablas lo tienen):
 select distinct p.codigo,p.nombre from provincias as p
  left join clientes as c
  on c.codigoProvincia=p.codigo
  where c.codigoprovincia is not null;



 

Otros problemas:
A) Un club dicta clases de distintos deportes. En una tabla llamada "socios" guarda los datos de 
sus socios y en una tabla denominada "inscriptos" almacena la información necesaria para las 
inscripciones de los socios a los distintos deportes.

1- Elimine las tablas si existen.

2- Cree las tablas:
 create table socios(
  documento char(8) not null,
  nombre varchar(30),
  domicilio varchar(30),
  primary key(documento)
 );

 create table inscriptos(
  documento char(8) not null, 
  deporte varchar(15) not null,
  año year,
  matricula char(1), /*si esta paga ='s' sino 'n'*/
  primary key(documento,deporte,año)
 );

3- Ingrese algunos registros para ambas tablas:
 insert into socios values('22333444','Juan Perez','Colon 234');
 insert into socios values('23333444','Maria Lopez','Sarmiento 465');
 insert into socios values('24333444','Antonio Juarez','Caseros 980');
 insert into socios values('25333444','Ana Juarez','Sucre 134');
 insert into socios values('26333444','Sofia Herrero','Avellaneda 1234');

 insert into inscriptos values ('22333444','natacion','2015','s');
 insert into inscriptos values ('22333444','natacion','2016','n');
 insert into inscriptos values ('23333444','natacion','2015','s');
 insert into inscriptos values ('23333444','tenis','2016','s');
 insert into inscriptos values ('23333444','natacion','2016','s');
 insert into inscriptos values ('25333444','tenis','2016','n');
 insert into inscriptos values ('25333444','basquet','2016','n');
 
4- Muestre el nombre del socio, deporte y año realizando un join:
 select s.nombre,i.deporte,i.año
  from socios as s
  left join inscriptos as i
  on s.documento=i.documento;

5- Muestre los nombres de los socios que no se han inscripto nunca en un deporte:
 select s.nombre
  from socios as s
  left join inscriptos as i
  on s.documento=i.documento
  where i.documento is null;

6- Omita la referencia a las tablas en la condición "on" para verificar que la sentencia no se 
ejecuta porque el nombre del campo "documento" es ambiguo (ambas tablas lo tienen):
 select s.nombre
  from socios as s
  left join inscriptos as i
  on documento=documento;


B) Un club de barrio realiza una rifa anual y guarda los datos de las rifas en dos tablas, una 
denominada "premios" y otra llamada "numerosrifa".

1- Elimine las tablas si existen.

2- Cree las tablas:
 create table premios(
  posicion tinyint unsigned auto_increment,
  premio varchar(40),
  numeroganador tinyint unsigned,
  primary key(posicion)
 );
 
 create table numerosrifa(
  numero tinyint unsigned not null,
  documento char(8) not null,
  primary key(numero)
 );

3- Ingrese algunos registros:
 insert into premios values(1,'PC I7',205);
 insert into premios values(2,'Televisor 75 pulgadas',29);
 insert into premios values(3,'Microondas',5);
 insert into premios values(4,'Multiprocesadora',15);
 insert into premios values(5,'Cafetera',33);

 insert into numerosrifa values(205,'22333444');
 insert into numerosrifa values(200,'23333444');
 insert into numerosrifa values(5,'23333444');
 insert into numerosrifa values(8,'23333444');
 insert into numerosrifa values(1,'24333444');
 insert into numerosrifa values(109,'28333444');
 insert into numerosrifa values(15,'30333444');
 insert into numerosrifa values(29,'29333444');
 insert into numerosrifa values(28,'32333444');

4- Muestre todos los números de rifas vendidos ("numerosrifas") y realice un "left join" mostrando 
la posición y el premio:
 select nr.numero,p.posicion,p.premio
  from numerosrifa as nr
  left join premios as p
  on p.numeroganador=nr.numero;
note que la posición "5" no aparece en la lista porque el número ganador de esa posición no fue 
vendido, no se encuentra en la tabla "premios". Y note que los números vendidos que no ganaron 
tiene la fila seteada a "null".

5- Muestre los mismos datos anteriores pero teniendo en cuenta los números ganadores solamente:
 select nr.numero,p.posicion,p.premio
  from numerosrifa as nr
  left join premios as p
  on p.numeroganador=nr.numero
  where p.numeroganador is not null;

6- Realice un "left join" pero en esta ocasión busque los números ganadores de la tabla "premios" 
en la tabla "numerosrifa":
 select nr.numero,p.posicion,p.premio
  from premios as p
  left join numerosrifa as nr
  on p.numeroganador=nr.numero;
Note que el premio de la posición "5" no encuentra coincidencia en la tabla "numerosrifa" (porque 
no fue vendido) y el campo está seteado a "null".

7- Realice el mismo "join" anterior pero sin considerar los valores de "premios" que no encuentren 
coincidencia en "numerosrifa".
 select nr.numero,p.posicion,p.premio
  from premios as p
  left join numerosrifa as nr
  on p.numeroganador=nr.numero
  where nr.numero is not null;

Retornar