66 - Varias tablas (cross join)


Problema:
Una empresa de seguridad almacena los datos de sus guardias de seguridad en una tabla 
llamada "guardias". también almacena los distintos sitios que solicitaron sus servicios en una 
tabla llamada "tareas".

1- Elimine las tablas "guardias" y "tareas" si existen.

2- Cree las siguientes tablas:
 create table guardias(
  documento char(8),
  nombre varchar(30),
  sexo char(1), /* 'f' o 'm' */
  domicilio varchar(30),
  primary key (documento)
 );

 create table tareas(
  codigo tinyint unsigned auto_increment,
  domicilio varchar(30),
  descripcion varchar(30),
  horario char(2), /* 'AM' o 'PM'*/
  primary key (codigo)
 );

3- Ingrese los siguientes registros:
 insert into guardias values('22333444','Juan Perez','m','Colon 123');
 insert into guardias values('23333444','Lorena Viale','f','Sarmiento 988');
 insert into guardias values('24333444','Alberto Torres','m','San Martin 567');
 insert into guardias values('25333444','Luis Ferreyra','m','Chacabuco 235');
 insert into guardias values('26333444','Irma Gonzalez','f','Mariano Moreno 111');

 insert into tareas (domicilio,descripcion,horario)
  values('Colon 1111','vigilancia exterior','AM');
 insert into tareas (domicilio,descripcion,horario)
  values('Urquiza 234','vigilancia exterior','PM');
 insert into tareas (domicilio,descripcion,horario)
  values('Peru 345','vigilancia interior','AM');
 insert into tareas (domicilio,descripcion,horario)
  values('Avellaneda 890','vigilancia interior','PM');

4- La empresa quiere que todos sus empleados realicen todas las tareas. Realice una "cross join":
 select nombre,t.domicilio,descripcion
  from guardias
  cross join tareas as t;
Devuelve el producto cartesiano de ambas tablas, combina todos los registros de una tabla con todos 
los registros de la otra.

5- Obtenga la misma salida realizando un simple "join" sin parte "on":
 select nombre,t.domicilio,descripcion
  from guardias
  join tareas as t;



 

Otros problemas:
A) Varios clubes de barrio se organizaron para realizar campeonatos entre ellos. La tabla 
llamada "equipos" guarda la información de los distintos equipos que jugarán.

1- Elimine la tabla, si existe.

2- Cree la tabla:
  create table equipos(
  nombre varchar(30),
  barrio varchar(20),
  domicilio varchar(30),
  entrenador varchar(30)
 );

3- Ingrese los siguientes registros:
 insert into equipos values('Los tigres','Gral. Paz','Sarmiento 234','Juan Lopez');
 insert into equipos values('Los leones','Centro','Colon 123','Gustavo Fuentes');
 insert into equipos values('Campeones','Pueyrredon','Guemes 346','Carlos Moreno');
 insert into equipos values('Cebollitas','Alberdi','Colon 1234','Luis Duarte');

4- Cada equipo jugará con todos los demás 2 veces, una vez en cada sede. Realice un "cross join" 
para combinar los equipos teniendo en cuenta que un equipo no juega consigo mismo:
 select e1.nombre,e2.nombre,e1.barrio as 'sede'
  from equipos as e1
  cross join equipos as e2
  where e1.nombre<>e2.nombre;

5- Obtenga el mismo resultado empleando un "join" sin parte "on":
 select e1.nombre,e2.nombre,e1.barrio as 'sede'
  from equipos as e1
  join equipos as e2
  where e1.nombre<>e2.nombre;


B) Una agencia matrimonial almacena la información de sus clientes en una tabla llamada "clientes".

1- Elimine la tabla si existe:

2- Cree la tabla:
 create table clientes(
  nombre varchar(30),
  domicilio varchar(30),
  sexo char(1),
  edad tinyint
 );

3- Ingrese los siguientes registros:
 insert into clientes (nombre,sexo,edad) values('Juan Perez','m',45);
 insert into clientes (nombre,sexo,edad) values('Ana Lopez','f',50);
 insert into clientes (nombre,sexo,edad) values('Federico Herrero','m',30);
 insert into clientes (nombre,sexo,edad) values('Mariano Juarez','m',35);
 insert into clientes (nombre,sexo,edad) values('Maria Torres','f',36);
 insert into clientes (nombre,sexo,edad) values('Ines Duarte','f',55);
 insert into clientes (nombre,sexo,edad) values('Alejandra Figueroa','f',40);

4- La agencia necesita la combinación de todas las personas de sexo femenino con las de sexo 
masculino. Use un "join" sin parte "on" y establezca como condición que las personas de la primera 
tabla sean de sexo femenino y las de la segunda tabla de sexo masculino:
 select c1.nombre,c1.edad,c1.sexo, c2.nombre,c2.edad,c2.sexo
  from clientes as c1
  join clientes as c2
  where c1.sexo='f' and c2.sexo='m';

5- Obtenga la misma salida usando "cross join":
select c1.nombre,c1.edad,c1.sexo, c2.nombre,c2.edad,c2.sexo
 from clientes as c1
 cross join clientes as c2
 where c1.sexo='f' and c2.sexo='m';

6- Se pide, además, que las edades de las posibles parejas no tengan una diferencia superior a 10 
años:
 select c1.nombre,c1.edad,c1.sexo, c2.nombre,c2.edad,c2.sexo
  from clientes as c1
  cross join clientes as c2
  where c1.sexo='f' and c2.sexo='m' and
  c2.edad - c1.edad between -10 and 10;

Retornar