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.
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;
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;
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;
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%";
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;
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%";
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.