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.




