1. 1
-- Base de datos: `multitablas`
--
-- --------------------------------------------------------
--
-- Estructura de tabla para la tabla `departamento`
--
CREATE TABLE IF NOT EXISTS `departamento` (
`iddepto` int(11) NOT NULL,
`Depto` varchar(15) NOT NULL,
PRIMARY KEY (`iddepto`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
--
-- Volcar la base de datos para la tabla `departamento`
--
INSERT INTO `departamento` (`iddepto`, `Depto`) VALUES
(31, 'Ventas'),
(33, 'Ingeniería'),
(34, 'Producción'),
(35, 'Mercadotecnia');
-- --------------------------------------------------------
--
-- Estructura de tabla para la tabla `empleado`
--
CREATE TABLE IF NOT EXISTS `empleado` (
`Apellido` varchar(20) NOT NULL,
`Iddepto` int(11) NOT NULL,
KEY `Depto` (`Iddepto`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
--
-- Volcar la base de datos para la tabla `empleado`
--
INSERT INTO `empleado` (`Apellido`, `Iddepto`) VALUES
('Andrade', 31),
('Jordan', 33),
('Hernández', 34),
('Osorio', 33),
('Rodríguez', 34);
2. 2
CONSULTAS MULTITABLAS
1. Listado de la tabla empleados y el listado general de la tabla departamentos
SELECT * FROM empleado
UNION
( Select * from departamentos)
2. Listado de empleados y nombre del departamento que le corresponde
SELECT * FROM empleado
INNER JOIN departamento
ON empleado.iddepto= departamento.IDdepto
3. Listado de los empleados con el nombre del departamento que les corresponde sin
duplicar el campo que los une.
SELECT * FROM empleado NATURAL JOIN departamento
Como se observa, la Unión nos devolverá en
una tabla lógica todos los registros
seleccionados tengan o no relación. En el
ejemplo, vemos los registros apellido y
número de departamento en una sola
columna.
Nota: Para hacer este tipo de consultas es
preferible seleccionar campos con la misma
información.
La operación Inner Join devolverá los
registros coincidentes en ambas tablas de
acuerdo a lo establecido en la condición (ON
empleado.iddepto= departamento.IDdepto)
Es similar a la operación Inner Join; la
diferencia estriba en que los campos
relacionados no se duplica (solo hay un
Iddepto).
Nota: Para este efecto los campos
coincidentes deben llamarse igual (iddepto)
3. 3
4. Listado que muestre la combinación de todos los registros ambas
SELECT * FROM empleado CROSS JOIN departamento
5. Listado de empleados con departamento asociado
SELECT * FROM empleado LEFT JOIN departamento ON empleado.iddepto =
departamento.IDdepto
6. Listado los departamentos con / sin empleados asociados
SELECT * FROM empleado Right JOIN departamento ON empleado.iddepto =
departamento.IDdepto
Romero 0 null null
El Cross Join es el equivalente al producto
cartesiano, es decir, multiplica de cada
registro. Por ejemplo, el empleado Andrade
por cada departamento (ventas, Ingenieria,
etc)
Left Join vincula las tablas dando prioridad a
los registros contenidos en la tabla izquierda
(empleado).
Si en empleado existiese, Romero sin iddepto;
al final de la tabla lógica se vería:
Similar a Left Join, solo que la prioridad la
otorga a la tabla derecha (departamento).
Se observa al final de la tabla lógica que para
el departamento de Mercadotecnia no existe
empleado asociado.
4. 4
7. Listar los datos de los empleados cuyo id del departamento sea mayor al promedio
de estos.
Select * from empleado where iddepto > (select avg(iddepto) from departamento)
Las subconsultas se emplean cuando la condición
inicial es a su vez otra consulta.
En el ejemplo la condición principal el WHERE
iddepto >.
Consulta secundaria necesita solo aquellos
superiores al promedio (Selec avg(…..))