Consultas en más de una tabla II – JOIN

Si queremos visualizar datos que están almacenados en distintas tablas podemos utilizar JOIN.

Como existen distintas clases de JOIN vamos a revisar algunas variaciones como:

NATURAL JOIN
JOIN / CROSS JOIN / INNER JOIN / COMMA JOIN
LEFT OUTER JOIN / RIGHT OUTER JOIN – en la siguiente entrada -.

NATURAL JOIN

Este tipo de JOIN utiliza el nombre de las columnas de las tablas.
Asocia los registros que tienen el mismo valor asignado en las columnas que tienen el mismo nombre.

Para probarlo voy a modificar los nombres de las columnas de la tabla niveles con los siguientes valores:

id => nivel_id
creado => creacion
actualizado => actualizacion

De esta manera, al asociar los niveles con las publicaciones únicamente va a tomar en cuenta la columna nivel_id.

Modificar el nombre de las columnas en la tabla niveles

La consulta sería:

-- Las columnas nivel_id de las tablas
-- de niveles y publicaciones van a ser 
-- utilizadas para asociar los registros.

SELECT * FROM niveles NATURAL JOIN publicaciones;

NATURAL

También se pueden agregar operadores y condiciones para filtrar los resultados:

-- Es posible filtrar los registros si se agregan 
-- condiciones a la consulta.

SELECT * FROM niveles NATURAL JOIN publicaciones WHERE nivel_id > 2;

NATURAL con condiciones

La sintaxis es fácil de utilizar porque no es necesario especificar las columnas que se van a utilizar para asociar los registros.

De manera personal no lo utilizo porque hay que asegurar que el nombre de las columnas que se van a utilizar para la asociación sea el mismo y que otros atributos comunes que tengan las tablas asociadas – por ejemplo fecha de creación / actualización – tengan un nombre distinto para que no sean tomados en cuenta al momento de asociar los datos.

JOIN / CROSS JOIN / INNER JOIN

En MySQL son equivalentes, es decir, se pueden utilizar indistintamente y el resultado que se obtiene es el mismo.

«In MySQL, JOIN, CROSS JOIN, and INNER JOIN are syntactic equivalents (they can replace each other).»MySQL Join

En este tipo de consultas es necesario especificar las columnas que se van a utilizar para asociar los datos – generalmente son una llave primaria con una llave foránea -.

Estas consultas van a devolver los registros que tienen valores iguales en las columnas especificadas.

-- Asociar cada publicación con el nivel
-- con el cuál está clasificada.
-- La llave primaria de niveles - nivel.id
-- está como llave foránea en publicaciones - 
-- publicaciones.nivel_id

-- Utilizando JOIN
SELECT niveles.nombre, publicaciones.titulo 
FROM niveles JOIN publicaciones 
ON niveles.id = publicaciones.nivel_id;

-- Utilizando CROSS JOIN
SELECT niveles.nombre, publicaciones.titulo 
FROM niveles CROSS JOIN publicaciones 
ON niveles.id = publicaciones.nivel_id;

-- Utilizando INNER JOIN
SELECT niveles.nombre, publicaciones.titulo 
FROM niveles INNER JOIN publicaciones 
ON niveles.id = publicaciones.nivel_id;

JOIN

CROSS

INNER

También es posible agregar más condiciones utilizando WHERE y si es necesario los operadores AND / OR.

-- Asociar cada publicación con el nivel
-- con el cuál está clasificada.
-- La llave primaria de niveles - nivel.id
-- está como llave foránea en publicaciones - 
-- publicaciones.nivel_id
-- Además de eso queremos mostrar
-- solo las publicaciones que en el título
-- tengan el término css

-- Utilizando JOIN
SELECT niveles.nombre, publicaciones.titulo 
FROM niveles JOIN publicaciones 
ON niveles.id = publicaciones.nivel_id 
WHERE publicaciones.titulo LIKE "%css%";

-- Utilizando CROSS JOIN
SELECT niveles.nombre, publicaciones.titulo 
FROM niveles CROSS JOIN publicaciones 
ON niveles.id = publicaciones.nivel_id 
WHERE publicaciones.titulo LIKE "%css%";

-- Utilizando INNER JOIN
SELECT niveles.nombre, publicaciones.titulo 
FROM niveles INNER JOIN publicaciones 
ON niveles.id = publicaciones.nivel_id 
WHERE publicaciones.titulo LIKE "%css%";

JOIN con condiciones

CROSS con condiciones

INNER con condiciones

Este tipo de consultas nos permite obtener los registros asociados de las tablas especificadas sin necesidad de modificar o establecer nombres de columnas distintos.

COMMA JOIN

La funcionalidad de este tipo de consultas es parecida a los «JOINS» anteriores pero la sintaxis nos puede resultar más familiar.

Funciona de manera similar en el sentido que es necesario especificar las columnas que se van a utilizar para asociar los datos y se van a devolver los registros que tienen valores iguales en las columnas especificadas.

-- Asociar cada publicación con el nivel
-- con el cuál está clasificada.
-- La llave primaria de niveles - nivel.id
-- está como llave foránea en publicaciones - 
-- publicaciones.nivel_id

-- La sintaxis es más parecida 
-- a las consultas que hemos hecho.

SELECT niveles.nombre, publicaciones.titulo 
FROM niveles, publicaciones 
WHERE niveles.id = publicaciones.nivel_id;

COMMA

Al igual que los «JOINS» también acepta más operadores y condiciones para filtrar los resultados.

-- Asociar cada publicación con el nivel
-- con el cuál está clasificada.
-- La llave primaria de niveles - nivel.id
-- está como llave foránea en publicaciones - 
-- publicaciones.nivel_id
-- Además de eso queremos mostrar
-- solo las publicaciones que en el título
-- tengan el término css

SELECT niveles.nombre, publicaciones.titulo 
FROM niveles, publicaciones 
WHERE niveles.id = publicaciones.nivel_id 
AND niveles.nombre LIKE "%fácil%";

COMMA con condiciones

Recordar
Al obtener datos de distintas tablas, además de especificar las columnas que se utilizan para asociar los registros podemos:

Utilizar AND / OR para agregar condiciones.
Utilizar el operador de comparación apropiado.
Ordenar los registros obtenidos.
Limitar el número de resultados obtenidos.
Utilizar funciones.
Utilizar alias para cambiar el nombre del encabezado de una columna.