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.

  • ๐Ÿ”— Principio bรกsico: Una operaciรณn JOIN compara filas de diferentes tablas utilizando relaciones de clave primaria y clave externa.
  • โšก Por quรฉ importa: Una sola consulta JOIN utiliza la indexaciรณn y reduce los viajes de ida y vuelta al servidor en comparaciรณn con varias consultas separadas.
  • โœ–๏ธ Comportamiento de Cross JOIN: Cada fila de la primera tabla se corresponde con cada fila de la segunda, produciendo un producto cartesiano.
  • ๐ŸŽฏ Comportamiento interno de JOIN: Solo se devuelven las filas que cumplen la condiciรณn de coincidencia en ambas tablas.
  • โ†”๏ธ Comportamiento de JOIN externo: Las operaciones LEFT y RIGHT JOIN tambiรฉn devuelven filas sin coincidencia y rellenan las columnas que faltan con NULL.
  • ๐Ÿงฉ ENCENDIDO versus USANDO: USING requiere nombres de columna idรฉnticos, mientras que ON admite cualquier expresiรณn coincidente.

MySQL Se une

ยฟ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.

Tipos de uniones

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.

INNER JOIN

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.

UNIONES externas

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
Note: Null is returned for non-matching rows on right

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.

UNIRSE A LA DERECHA

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
Note: Null is returned for non-matching rows on left

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.

Preguntas Frecuentes

Una operaciรณn JOIN combina columnas de dos tablas una al lado de la otra, haciendo coincidir las filas mediante una clave. Una operaciรณn UNION apila verticalmente los resultados de dos consultas y requiere que las columnas tengan el mismo nรบmero y tipo.

Sรญ. Encadena clรกusulas JOIN adicionales, cada una con su propia condiciรณn ON. MySQL une las dos primeras tablas, luego une ese resultado intermedio a la siguiente tabla, y asรญ sucesivamente.

Una operaciรณn SELF JOIN une una tabla consigo misma utilizando dos alias. Compara filas dentro de una misma tabla, por ejemplo, comparando la fila de un empleado con la fila del gerente de ese empleado.

Sรญ. Asistentes de IA integrados en editores como MySQL Banco de trabajo Se pueden redactar consultas JOIN a partir de una solicitud en lenguaje natural. Siempre revise las condiciones ON generadas, ya que una clave incorrecta produce resultados errรณneos que pasan desapercibidos.

En parte. Los asesores de IA sugieren รญndices y mejores รณrdenes de uniรณn, lo que suele reducir el tiempo de ejecuciรณn. El optimizador sigue siendo quien elige el plan final, por lo que la correcta indexaciรณn de las claves de uniรณn sigue siendo el factor mรกs importante.

Resumir este post con: