You are on page 1of 3

La intencin de esta publicacin es hacer un breve resumen de los distintos tipos de JOINs disponibles en SQL y para finalizar, un ejemplo

prctico de cada uno de ellos.

INNER JOIN: es el caso de unin interna clsico, combina dos o ms tablas descartando todas las filas resultados que no se correspondan en ambas. LEFT OUTER JOIN (o LEFT JOIN): combina dos tablas con la diferencia que selecciona todas las filas de la primer tabla sin importar tengan o no coincidencia en la segunda. RIGHT OUTER JOIN (o RIGHT OUTER): es la opcin inversa a la anterior. En la mayora de las bases de datos actuales se puede omitir OUTER. FULL OUTER JOIN: combina los resultados de dos o ms tablas, tengan o no coincidencia entre s. CROSS JOIN: retorna el producto cartesiano de dos o ms tablas, es decir, combina cada fila de una tabla con cada fila de otra tabla. CROSS JOIN no debera llevar la clausula ON. NATURAL JOIN: Es un caso especial de INNER JOIN que compara por cuenta propia la equivalencia de columnas con el mismo nombre y tipo de dato entre dos o ms tablas para hacer la combinacin de ambas. Hay que tener especial cuidado con su uso, pues puede producir resultados ambiguos o generar problemas si se aaden, quitan, o renombran las columnas.

A continuacin veremos un ejemplo bien comentado, donde se ponen en prctica algunos de los distintos tipos de JOIN. El ejemplo fue escrito para MySQL, pero no deberan ser muchas las lneas a modificar para portar el cdigo a otra base de datos. Esquema de la base de datos y datos de prueba:

CREATE DATABASE administracion; USE administracion;


CREATE TABLE empleados ( id_empleado SMALLINT PRIMARY KEY, nombre VARCHAR(64), id_funcion INT, id_sector INT, id_localidad INT ); CREATE TABLE funciones ( id_funcion INT PRIMARY KEY, nombre VARCHAR(128) ); CREATE TABLE sectores ( id_sector INT PRIMARY KEY, nombre VARCHAR(128) ); CREATE TABLE localidades ( id_localidad INT PRIMARY KEY, nombre VARCHAR(128) ); INSERT INSERT INSERT INSERT INSERT INTO INTO INTO INTO INTO empleados empleados empleados empleados empleados VALUES VALUES VALUES VALUES VALUES ( ( ( ( ( 1, 2, 3, 4, 5, 'Marcos Aguirre', 1, 1 , 3); 'Esteban Quito', 2, 4 , 2); 'Daniel Perez', 1, 2 , 1); 'Carlos Molina', 1, 1 , 3); 'Marcos Aguirre', 4, 1 , 1);

INSERT INTO sectores VALUES ( 1, 'Mantenimiento' ); INSERT INTO sectores VALUES ( 2, 'Ingenieria' ); INSERT INTO sectores VALUES ( 3, 'Costos' ); INSERT INTO funciones VALUES ( 1, 'Programador' ); INSERT INTO funciones VALUES ( 2, 'Analista funcional' ); INSERT INTO funciones VALUES ( 3, 'Administracin' ); INSERT INTO localidades VALUES ( 1, 'Maldonado' ); INSERT INTO localidades VALUES ( 2, 'Salto' ); INSERT INTO localidades VALUES ( 3, 'Federacin' ); Ejemplos JOIN:

-- INNER JOIN SELECT e.nombre, f.nombre, s.nombre, l.nombre FROM empleados e INNER JOIN funciones f USING (id_funcion) INNER JOIN sectores s USING (id_sector) INNER JOIN localidades l USING (id_localidad);
-----nombre nombre nombre nombre -------------- ----------- ------------- ----------Marcos Aguirre Programador Mantenimiento Federacin Daniel Perez Programador Ingenieria Maldonado Carlos Molina Programador Mantenimiento Federacin

-- CROSS JOIN: SELECT empleados.id_empleado, funciones.id_funcion, sectores.id_sector, localidades.id_localidad FROM empleados CROSS JOIN funciones CROSS JOIN sectores CROSS JOIN localidades ----No voy a mostrar el resultado pues son bastantes filas (135 filas) empleados CROSS JOIN funciones = 15 filas empleados CROSS JOIN funciones CROSS JOIN sectores = 45 filas empleados CROSS JOIN funciones CROSS JOIN sectores CROSS JOIN localidades= 135 filas

-- LEFT OUTER JOIN (o LEFT JOIN) SELECT e.nombre, f.nombre, s.nombre, l.nombre FROM empleados e LEFT JOIN funciones f USING (id_funcion) LEFT JOIN sectores s USING (id_sector) LEFT JOIN localidades l USING (id_localidad); -------nombre nombre nombre nombre -------------- ------------------ ------------- ----------Marcos Aguirre Programador Mantenimiento Federacin Esteban Quito Analista funcional (NULL) Salto Daniel Perez Programador Ingenieria Maldonado Carlos Molina Programador Mantenimiento Federacin Marcos Aguirre (NULL) Mantenimiento Maldonado

-- NATURAL JOIN -- -----------SELECT e.nombre,l.nombre FROM empleados e NATURAL JOIN localidades l; -- No tenemos resultados, pues la base de datos intenta hacer la combinacin utilizando los campos id_localidad y nombre -- Les avis que era peligroso el uso de NATURAL JOIN -- Para evitar esto, deberiamos cambiar el nombre del campo 'nombre' de la tabla 'localidades' ALTER TABLE localidades CHANGE nombre nombre_localidad VARCHAR(128); SELECT e.nombre,l.nombre_localidad FROM empleados e NATURAL JOIN localidades l; -------nombre nombre_localidad -------------- ---------------Marcos Aguirre Federacin Esteban Quito Salto Daniel Perez Maldonado Carlos Molina Federacin Marcos Aguirre Maldonado

You might also like