64 - Varias tablas (left join) |
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 codigo,p.nombre from provincias as p left join clientes as c on c.codigoProvincia=p.codigo where c.codigoprovincia is not null;
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','2005','s'); insert into inscriptos values ('22333444','natacion','2006','n'); insert into inscriptos values ('23333444','natacion','2005','s'); insert into inscriptos values ('23333444','tenis','2006','s'); insert into inscriptos values ('23333444','natacion','2006','s'); insert into inscriptos values ('25333444','tenis','2006','n'); insert into inscriptos values ('25333444','basquet','2006','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(20), 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 Pentium',205); insert into premios values(2,'Televisor 21 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;