En la clase anterior estuvimos hablando de dos tipos de joins que podemos usar cuando estemos trabajando con consultas a nuestras bases de datos.
Existen diferentes formas en las que se pueden unir las tablas en nuestras consultas y de acuerdo con esta unión se va a mostrar información, y es importante siempre tener clara esta relación. En esta clase te voy a mostrar gráficamente 7 diferentes tipos de uniones que puedes realizar.
Usar correctamente estas uniones puede reducir el tiempo de ejecución de tus consultas y mejorar el rendimiento de tus aplicaciones.
Como yo lo veo cuando hacemos uniones en las consultas para seleccionar información, estamos trabajando con tablas, estas tablas podemos verlas como conjuntos de información, de forma que podemos asimilar los joins entre tablas como uniones e intersecciones entre conjuntos.
Supongamos que contamos con dos conjuntos, el conjunto A y el conjunto B, o, la tabla A y la tabla B. Sobre estos conjuntos veamos cuál es el resultado si aplicamos diferentes tipos de join.
1. Inner Join
Esta es la forma mas fácil de seleccionar información de diferentes tablas, es tal vez la que mas usas a diario en tu trabajo con bases de datos. Esta union retorna todas las filas de la tabla A que coinciden en la tabla B. Es decir aquellas que están en la tabla A Y en la tabla B, si lo vemos en conjuntos la intersección entre la tabla A y la B.
Esto lo podemos implementar de esta forma cuando estemos escribiendo las consultas:
SELECT <columna_1> , <columna_2>, <columna_3> ... <columna_n>
FROM Tabla_AA
INNER JOIN Tabla_B B
ON A.pk = B.pk
2. Left Join
Esta consulta retorna todas las filas que están en la tabla A y ademas si hay coincidencias de filas en la tabla B también va a traer esas filas.
Esto lo podemos implementar de esta forma cuando estemos escribiendo las consultas:
SELECT <columna_1> , <columna_2>, <columna_3> ... <columna_n>
FROM Tabla_AA
LEFT JOIN Tabla_B B
ON A.pk = B.pk
3. Right Join
Esta consulta retorna todas las filas de la tabla B y ademas si hay filas en la tabla A que coinciden también va a traer estas filas de la tabla A.
Esto lo podemos implementar de esta forma cuando estemos escribiendo las consultas:
SELECT <columna_1> , <columna_2>, <columna_3> ... <columna_n>
FROM Tabla_AA
RIGHT JOIN Tabla_B B
ON A.pk = B.pk
4. Outer Join
Este join retorna TODAS las filas de las dos tablas. Hace la union entre las filas que coinciden entre la tabla A y la tabla B.
Esto lo podemos implementar de esta forma cuando estemos escribiendo las consultas:
SELECT <columna_1> , <columna_2>, <columna_3> ... <columna_n>
FROM Tabla_AA
FULL OUTER JOIN Tabla_B B
ON A.pk = B.pk
5. Left excluding join
Esta consulta retorna todas las filas de la tabla de la izquierda, es decir la tabla A que no tienen ninguna coincidencia con la tabla de la derecha, es decir la tabla B.
Esto lo podemos implementar de esta forma cuando estemos escribiendo las consultas:
SELECT <columna_1> , <columna_2>, <columna_3> ... <columna_n>
FROM Tabla_A A
LEFTJOIN Tabla_B B
ON A.pk = B.pk
WHERE B.pk ISNULL
6. Right Excluding join
Esta consulta retorna todas las filas de la tabla de la derecha, es decir la tabla B que no tienen coincidencias en la tabla de la izquierda, es decir la tabla A.
Esto lo podemos implementar de esta forma cuando estemos escribiendo las consultas:
SELECT <columna_1> , <columna_2>, <columna_3> ... <columna_n>
FROM Tabla_A A
RIGHTJOIN Tabla_B B
ON A.pk = B.pk
WHERE A.pk ISNULL
7. Outer excluding join
Esta consulta retorna todas las filas de la tabla de la izquierda, tabla A, y todas las filas de la tabla de la derecha, tabla B que no coinciden.
Esto lo podemos implementar de esta forma cuando estemos escribiendo las consultas:
SELECT <select_list>
FROM Table_A A
FULLOUTERJOIN Table_B B
ON A.Key = B.KeyWHERE A.KeyISNULLOR B.KeyISNULL
Respecto a “FULL OUTER JOIN”, esta sintaxis no es soportada por MySQL y arroja el Error 1046.
Para obtener un “FULL OUTER JOIN”, se pueden unir un “LEFT JOIN” y un “RIGHT JOIN” usando la palabra clave “UNION”.
Por ejemplo, la siguiente consulta muestra los autores sin libros (LEFT JOIN) y los libros sin autores (RIGHT JOIN), obteniendo los mismos resultados que un “FULL OUTER JOIN”:
SELECT *
FROMauthorsas a
LEFTJOIN books as b
ON a.author_id = b.author_id
WHERE b.author_id ISNULLUNIONSELECT *
FROMauthorsas a
RIGHTJOIN books as b
ON a.author_id = b.author_id
WHERE a.author_id ISNULL;
JOINS con books como A y authors como B
Inner Join
196 Rows en intersección A con B
SELECT b.title, a.nameFROM books as b INNERJOINauthorsas a ON a.author_id=b.author_id;
Left Join
197 Rows un Elemento en el conjunto A que no esta en A intersección B
SELECT b.title, a.nameFROM books as b LEFTJOINauthorsas a ON a.author_id=b.author_id;
Right Join
198 Rows 2 elementos en el conjunto B que no esta en B intersección A
SELECT b.title, a.nameFROM books as b RIGHTJOINauthorsas a ON a.author_id=b.author_id;
Outer Join
198 rows en total
SELECT b.title,a.name FROM books AS b LEFT OUTER JOIN authors AS a ON b.author_id = a.author_id UNION SELECT b.title,a.name FROM books AS b RIGHT OUTER JOIN authors AS a ON b.author_id = a.author_id
Left excluding join
1 Row en el conjunto A
SELECT b.title, a.nameFROM books as b LEFTJOINauthorsas a ON a.author_id=b.author_id WHERE a.author_id ISNULL;```
Right excluding join
2 Row en el conjunto B
SELECT b.title, a.nameFROM books as b RIGHTJOINauthorsas a ON a.author_id=b.author_id WHERE b.author_id ISNULL;```
Outer excluding join
3 rows en A,B
SELECT b.title, a.nameFROM books as b LEFTJOINauthorsas a ON a.author_id=b.author_id WHERE a.author_id ISNULLUNIONSELECT b.title, a.nameFROM books as b RIGHTJOINauthorsas a ON a.author_id=b.author_id WHERE b.author_id ISNULL;
En que casos usamos el LEFT JOIN? Básicamente es trabajar solo con la información de la tabla A? No me queda claro cual es su finalidad, igualmente para el RIGHT JOIN
Para finalizar la seccion de los JOIN cree un query (con otro adentro, es decir un query anidado) que me devuelve una tabla con dos columnas:
La de la derecha se llama CANTIDAD_LIBROS_ESCRITOS y enumera cantidades.
La de la izquierda se llama CANTIDAD_AUTORES y nos muestra la cantidad de autores que han escrito la cantidad de libros que muestra la columna de la derecha.
SELECTCOUNT(ID) AS CANTIDAD_AUTORES, CANTIDAD AS CANTIDAD_LIBROS_ESCRITOS
FROM (SELECT a.author_id ASID, a.nameAS NOMBRE, COUNT(b.book_id) AS CANTIDAD
FROMauthorsAS a
LEFTJOIN books AS b
ON a.author_id = b.author_id
GROUPBY a.author_id
ORDERBY a.author_id) AS TABLA_SECUNDARIA
GROUPBY CANTIDAD_LIBROS_ESCRITOS
ORDERBY CANTIDAD_LIBROS_ESCRITOS
Súper interesante y mucho más fácil de apreciar con los diagramas, gracias! Aunque me parece que el FULL OUTER JOIN no está soportado en algunas versiones de MySQL, por lo menos la que yos estoy usando, pero en este caso podemos simplemente hacer la suma de un LEFT JOIN y un RIGHT JOIN para obtener el mismo resultado.
Jajaja justo lo que pensé, el éxito para tener buenos queries es hacer diagramas de venn, asi que a la hora de programar los query hoja y lápiz para poder dibujar los circulos
😮Wow no sabia que existían tantos tipos de JOIN siempre había usado inner join, left join y muy pocas veces right join pero tratare de encontrar aplicaciones a los otros join a la hora de desarrollar
Este tipo de de majo de base datos es muy util cuando se quiere tomar decisiones y entender futuros comportamientos no solo de los servicios o productos, si no tambien en aspectos de comportamiento en un uturo en las personas,
En Right Excluding join (sans I’intersection de A) esta escrito ( WHERE B.key IS NULL) debería ser de la intersección de la tabla A (WHERE A.key IS NULL) como indica en la clase 17
SELECT a.author_id, a.name as author_name,
a.nationality as author_nationality, b.titleas book_title
FROM
authors as a
LEFTJOIN
books as b
ON a.author_id = b.author_id
WHERE b.author_id ISNULLUNIONSELECT a.author_id, a.name as author_name,
a.nationality as author_nationality, b.titleas book_title
FROM
authors as a
RIGHTJOIN
books as b
ON a.author_id = b.author_id
WHERE a.author_id ISNULL;
SELECT a.author_id, a.name as author_name,
a.nationality as author_nationality, b.titleas book_title
FROM
authors as a
LEFTJOIN
books as b
ON a.author_id = b.author_id
WHERE a.author_id between1and5UNIONSELECT a.author_id, a.name as author_name,
a.nationality as author_nationality, b.titleas book_title
FROM
authors as a
RIGHTJOIN
books as b
ON a.author_id = b.author_id
WHERE a.author_id ISNULL;
SELECT <columna_1> , <columna_2>, <columna_3> ... <columna_n>
FROM Tabla_A A
INNER JOIN Tabla_B B
ON A.pk = B.pk
Aunque de esta manera corre sin ningún problema se nos explico una clase anterior es una buena practica para una lectura mas fácil de un tercero que no sea quien haya estructurado el código el poner el
Excelentes imágenes ilustrativas sobre los diferentes JOINS. He visto malísimas explicaciones sobre cómo funcionan los JOINS en muchos cursos; éste curso ha sido el mejor que he tomado sobre SQL, específicamente, sobre lo básico de MySQL.
Esta genial ver una importante aplicación de las matemáticas en base de datos. Para los que saben teoría de conjuntos este tema se les facilitara mucho.
Creo que es importante saber que o cual es a información que se quiere mostrar por ejemplo en la clase anterior vimos que con el INNER no mostraba el autor el cual no tenia libros registrados; Al aplicar el LEFT JOIN observamos como mostro al autor; pero en este caso nos llenaba el dato de cantidad de libros con null.
Hola, me gusta mucho la explicacion, pero el comando Full Outer Join no me funciona. Me arroja un error de sintex.
Se puede hacer con un UNION de un left y un right join, en el curso de “fundamentos de bases de datos” se explica como hacerlo
¿Quieres ver más aportes, preguntas y respuestas de la comunidad? Crea una cuenta o inicia sesión.