MySQL Unir: Interior, Exterior, Izquierda, Derecha, Cruz
⚡ Resumen inteligente
MySQL Las operaciones JOIN combinan filas de dos o más tablas relacionadas en un único conjunto de resultados. Este recurso explica las operaciones CROSS, INNER, LEFT, RIGHT y OUTER JOIN con consultas ejecutables, datos de ejemplo y tablas de salida claras para facilitar el trabajo práctico con bases de datos.

¿Qué son las UNIONES?
Las uniones ayudan a recuperar datos de dos o más tablas de bases de datos.
Las tablas están relacionadas entre sí mediante claves primarias y externas.
Nota: JOIN es el tema que más malentiende quienes aprenden SQL. Para simplificar y facilitar la comprensión, utilizaremos una nueva base de datos para practicar con un ejemplo. Como se muestra a continuación
Todos los ejemplos que aparecen a continuación utilizan estas dos tablas. id_película columna en miembros apunta a la id columna en películas — la relación en la que coincide cada JOIN.
miembros
| id | nombre de pila | apellido | id_película |
|---|---|---|---|
| 1 | Adam | Smith | 1 |
| 2 | Ravi | Kumar | 2 |
| 3 | Susan | Davidson | 5 |
| 4 | Jenny | Adrianna | 8 |
| 5 | Lee | Pong | 10 |
películas
| id | título | categoría |
|---|---|---|
| 1 | ASSASSIN'S CREED: BRAZAS | Animaciones |
| 2 | Acero real (2012) | Animaciones |
| 3 | Alvin y las Ardillas | Animaciones |
| 4 | Las aventuras de Tintin | Animaciones |
| 5 | Seguro (2012) | Acción: |
| 6 | Casa segura (2012) | Acción: |
| 7 | GIA | 18+ |
| 8 | Fecha límite 2009 | 18+ |
| 9 | La imagen sucia | 18+ |
| 10 | marley y yo | Romance |
¿Por qué deberíamos usar JOINS?
Antes de analizar cada tipo de JOIN, conviene saber por qué se prefiere un JOIN a ejecutar varias consultas.
Ahora puede pensar por qué usamos JOIN cuando podemos realizar la misma tarea ejecutando consultas. Especialmente si tiene algo de experiencia en programación de bases de datos, sabe que podemos ejecutar consultas una por una y utilizar la salida de cada una en consultas sucesivas. Por supuesto, eso es posible. Pero al utilizar JOIN, puede realizar el trabajo utilizando solo una consulta con cualquier parámetro de búsqueda. Por otro lado MySQL puede lograr un mejor rendimiento con JOIN ya que puede usar Indexación. El simple uso de una única consulta JOIN en lugar de ejecutar varias consultas reduce la sobrecarga del servidor. Usar múltiples consultas en su lugar genera más transferencias de datos entre MySQL y aplicaciones (software). Además, también requiere más manipulaciones de datos al final de la aplicación.
Está claro que podemos lograr mejores MySQL y el rendimiento de las aplicaciones mediante el uso de JOIN.
Tipos de JOIN
MySQL Admite varios tipos de JOIN, cada uno de los cuales responde a una pregunta diferente sobre las mismas dos tablas. La tabla siguiente los compara; a continuación, se muestra cada tipo con una consulta y su resultado.
| Tipo de unión | Las filas regresaron | ¿Resultados nulos? | Uso típico |
|---|---|---|---|
| UNIÓN CRUZADA | Cada fila de la tabla A emparejada con cada fila de la tabla B. | No | Generando todas las combinaciones posibles |
| INNER JOIN | Solo las filas que coincidan con la condición en ambas tablas. | No | Miembros que realmente alquilaron una película |
| LEFT JOIN | Todas las filas de la tabla de la izquierda, más los partidos de la derecha. | Sí, en el lado derecho. | Todas las películas, incluso aquellas que nunca se han alquilado. |
| UNIRSE A LA DERECHA | Todas las filas de la tabla de la derecha, más los partidos de la izquierda. | Sí, en el lado izquierdo. | Todas las películas, incluso sin ningún miembro asociado |
UNIÓN CRUZADA
Cross JOIN es la forma más simple de JOIN que hace coincidir cada fila de una tabla de base de datos con todas las filas de otra.
En otras palabras, nos da combinaciones de cada fila de la primera tabla con todos los registros de la segunda tabla.
Supongamos que queremos comparar todos los registros de miembros con todos los registros de películas, podemos usar el script que se muestra a continuación para obtener los resultados deseados.
SELECT * FROM `movies` CROSS JOIN `members`
Ejecutando el script anterior en MySQL banco de trabajo nos da los siguientes resultados.
| id | title | id | first_name | last_name | movie_id | |
|---|---|---|---|---|---|---|
| 1 | ASSASSIN'S CREED: EMBERS | Animations | 1 | Adam | Smith | 1 |
| 1 | ASSASSIN'S CREED: EMBERS | Animations | 2 | Ravi | Kumar | 2 |
| 1 | ASSASSIN'S CREED: EMBERS | Animations | 3 | Susan | Davidson | 5 |
| 1 | ASSASSIN'S CREED: EMBERS | Animations | 4 | Jenny | Adrianna | 8 |
| 1 | ASSASSIN'S CREED: EMBERS | Animations | 6 | Lee | Pong | 10 |
| 2 | Real Steel(2012) | Animations | 1 | Adam | Smith | 1 |
| 2 | Real Steel(2012) | Animations | 2 | Ravi | Kumar | 2 |
| 2 | Real Steel(2012) | Animations | 3 | Susan | Davidson | 5 |
| 2 | Real Steel(2012) | Animations | 4 | Jenny | Adrianna | 8 |
| 2 | Real Steel(2012) | Animations | 6 | Lee | Pong | 10 |
| 3 | Alvin and the Chipmunks | Animations | 1 | Adam | Smith | 1 |
| 3 | Alvin and the Chipmunks | Animations | 2 | Ravi | Kumar | 2 |
| 3 | Alvin and the Chipmunks | Animations | 3 | Susan | Davidson | 5 |
| 3 | Alvin and the Chipmunks | Animations | 4 | Jenny | Adrianna | 8 |
| 3 | Alvin and the Chipmunks | Animations | 6 | Lee | Pong | 10 |
| 4 | The Adventures of Tin Tin | Animations | 1 | Adam | Smith | 1 |
| 4 | The Adventures of Tin Tin | Animations | 2 | Ravi | Kumar | 2 |
| 4 | The Adventures of Tin Tin | Animations | 3 | Susan | Davidson | 5 |
| 4 | The Adventures of Tin Tin | Animations | 4 | Jenny | Adrianna | 8 |
| 4 | The Adventures of Tin Tin | Animations | 6 | Lee | Pong | 10 |
| 5 | Safe (2012) | Action | 1 | Adam | Smith | 1 |
| 5 | Safe (2012) | Action | 2 | Ravi | Kumar | 2 |
| 5 | Safe (2012) | Action | 3 | Susan | Davidson | 5 |
| 5 | Safe (2012) | Action | 4 | Jenny | Adrianna | 8 |
| 5 | Safe (2012) | Action | 6 | Lee | Pong | 10 |
| 6 | Safe House(2012) | Action | 1 | Adam | Smith | 1 |
| 6 | Safe House(2012) | Action | 2 | Ravi | Kumar | 2 |
| 6 | Safe House(2012) | Action | 3 | Susan | Davidson | 5 |
| 6 | Safe House(2012) | Action | 4 | Jenny | Adrianna | 8 |
| 6 | Safe House(2012) | Action | 6 | Lee | Pong | 10 |
| 7 | GIA | 18+ | 1 | Adam | Smith | 1 |
| 7 | GIA | 18+ | 2 | Ravi | Kumar | 2 |
| 7 | GIA | 18+ | 3 | Susan | Davidson | 5 |
| 7 | GIA | 18+ | 4 | Jenny | Adrianna | 8 |
| 7 | GIA | 18+ | 6 | Lee | Pong | 10 |
| 8 | Deadline(2009) | 18+ | 1 | Adam | Smith | 1 |
| 8 | Deadline(2009) | 18+ | 2 | Ravi | Kumar | 2 |
| 8 | Deadline(2009) | 18+ | 3 | Susan | Davidson | 5 |
| 8 | Deadline(2009) | 18+ | 4 | Jenny | Adrianna | 8 |
| 8 | Deadline(2009) | 18+ | 6 | Lee | Pong | 10 |
| 9 | The Dirty Picture | 18+ | 1 | Adam | Smith | 1 |
| 9 | The Dirty Picture | 18+ | 2 | Ravi | Kumar | 2 |
| 9 | The Dirty Picture | 18+ | 3 | Susan | Davidson | 5 |
| 9 | The Dirty Picture | 18+ | 4 | Jenny | Adrianna | 8 |
| 9 | The Dirty Picture | 18+ | 6 | Lee | Pong | 10 |
| 10 | Marley and me | Romance | 1 | Adam | Smith | 1 |
| 10 | Marley and me | Romance | 2 | Ravi | Kumar | 2 |
| 10 | Marley and me | Romance | 3 | Susan | Davidson | 5 |
| 10 | Marley and me | Romance | 4 | Jenny | Adrianna | 8 |
| 10 | Marley and me | Romance | 6 | Lee | Pong | 10 |
INNER JOIN
Una combinación cruzada (CROSS JOIN) devuelve todos los emparejamientos posibles, lo cual rara vez es lo que se busca. Una combinación interna (INNER JOIN) reduce el resultado a los pares que realmente están relacionados.
El JOIN interno se utiliza para devolver filas de ambas tablas que satisfacen la condición dada.
Supongamos que quieres obtener una lista de los miembros que han alquilado películas, junto con los títulos de las películas que han alquilado. Para ello, puedes usar una unión interna (INNER JOIN), que devuelve las filas de ambas tablas que cumplen con las condiciones dadas.
SELECT members.`first_name` , members.`last_name` , movies.`title` FROM members ,movies WHERE movies.`id` = members.`movie_id`
Al ejecutar el script anterior, dé
| first_name | last_name | title |
|---|---|---|
| Adam | Smith | ASSASSIN'S CREED: EMBERS |
| Ravi | Kumar | Real Steel(2012) |
| Susan | Davidson | Safe (2012) |
| Jenny | Adrianna | Deadline(2009) |
| Lee | Pong | Marley and me |
Tenga en cuenta que el script de resultados anterior también se puede escribir de la siguiente manera para lograr los mismos resultados.
SELECT A.`first_name` , A.`last_name` , B.`title` FROM `members` AS A INNER JOIN `movies` AS B ON B.`id` = A.`movie_id`
UNIONES externas
Una unión interna (INNER JOIN) descarta silenciosamente las filas que no tienen pareja. Cuando esas filas sin pareja son importantes, una unión externa (OUTER JOIN) es la opción correcta.
MySQL Las uniones externas (Outer JOIN) devuelven todos los registros coincidentes de ambas tablas.
Puede detectar registros que no coinciden en la tabla unida. Vuelve NULL valores para los registros de la tabla unida si no se encuentra ninguna coincidencia.
¿Suena confuso? Veamos un ejemplo:
LEFT JOIN
Supongamos que ahora desea obtener los títulos de todas las películas junto con los nombres de los miembros que las alquilaron. Está claro que algunas películas no han sido alquiladas por nadie. Simplemente podemos usar LEFT JOIN con el propósito.
LEFT JOIN devuelve todas las filas de la tabla de la izquierda incluso si no se han encontrado filas coincidentes en la tabla de la derecha. Cuando no se han encontrado coincidencias en la tabla de la derecha, se devuelve NULL.
SELECT A.`title` , B.`first_name` , B.`last_name` FROM `movies` AS A LEFT JOIN `members` AS B ON B.`movie_id` = A.`id`
Ejecutando el script anterior en MySQL El entorno de trabajo proporciona lo siguiente: Como puede ver en el resultado devuelto, que se muestra a continuación, para las películas que no se alquilaron, los campos de nombre de miembro tienen valores NULL. Esto significa que no se encontró ningún miembro coincidente en la tabla de miembros para esa película en particular.
| title | first_name | last_name |
|---|---|---|
| ASSASSIN'S CREED: EMBERS | Adam | Smith |
| Real Steel(2012) | Ravi | Kumar |
| Safe (2012) | Susan | Davidson |
| Deadline(2009) | Jenny | Adrianna |
| Marley and me | Lee | Pong |
| Alvin and the Chipmunks | NULL | NULL |
| The Adventures of Tin Tin | NULL | NULL |
| Safe House(2012) | NULL | NULL |
| GIA | NULL | NULL |
| The Dirty Picture | NULL | NULL |
UNIRSE A LA DERECHA
UNIRSE DERECHA es obviamente lo opuesto a UNIRSE IZQUIERDA. RIGHT JOIN devuelve todas las columnas de la tabla de la derecha incluso si no se han encontrado filas coincidentes en la tabla de la izquierda. Cuando no se han encontrado coincidencias en la tabla de la izquierda, se devuelve NULL.
En nuestro ejemplo, supongamos que necesita obtener los nombres de los miembros y las películas que alquilaron. Ahora tenemos un nuevo miembro que aún no ha alquilado ninguna película.
SELECT A.`first_name` , A.`last_name`, B.`title` FROM `members` AS A RIGHT JOIN `movies` AS B ON B.`id` = A.`movie_id`
Ejecutando el script anterior en MySQL El banco de trabajo arroja los siguientes resultados.
| first_name | last_name | title |
|---|---|---|
| Adam | Smith | ASSASSIN'S CREED: EMBERS |
| Ravi | Kumar | Real Steel(2012) |
| Susan | Davidson | Safe (2012) |
| Jenny | Adrianna | Deadline(2009) |
| Lee | Pong | Marley and me |
| NULL | NULL | Alvin and the Chipmunks |
| NULL | NULL | The Adventures of Tin Tin |
| NULL | NULL | Safe House(2012) |
| NULL | NULL | GIA |
| NULL | NULL | The Dirty Picture |
Cláusulas “ON” y “USING”
Hasta ahora, todas las consultas han coincidido con filas que contienen una cláusula ON. MySQL Ofrece una alternativa más corta cuando las columnas coincidentes comparten el mismo nombre.
En los ejemplos de consulta JOIN anteriores, hemos utilizado la cláusula ON para hacer coincidir los registros entre las tablas.
La cláusula USING también se puede utilizar para el mismo propósito. la diferencia con USO es lo debe tener nombres idénticos para las columnas coincidentes en ambas tablas.
En la tabla "películas" hasta ahora usamos su clave principal con el nombre "id". Nos referimos a lo mismo en la tabla "miembros" con el nombre "movie_id".
Cambiemos el nombre del campo "id" de las tablas "películas" para que tenga el nombre "movie_id". Hacemos esto para tener nombres de campos coincidentes idénticos.
ALTER TABLE `movies` CHANGE `id` `movie_id` INT( 11 ) NOT NULL AUTO_INCREMENT;
A continuación, usemos USING con el ejemplo de UNIÓN IZQUIERDA anterior.
SELECT A.`title` , B.`first_name` , B.`last_name` FROM `movies` AS A LEFT JOIN `members` AS B USING ( `movie_id` )
Aparte de usar ON y USANDO con JOINs puedes usar muchos otros MySQL cláusulas como GRUPO POR, DÓNDE e incluso funciona como SUM, AVG, etc.




