Volver a la lista de artículos Artículos
Lectura de 24 minutos

SQL Joins: 12 Preguntas Prácticas con Respuestas Detalladas

En este artículo, profundizamos en nuestro curso de JOINS SQL y te damos 12 ejercicios de join para resolver. Pero no te preocupes - todos los ejercicios tienen soluciones y explicaciones. Si te quedas atascado, ¡la ayuda está ahí! Después de todo, esto está hecho para practicar y aprender.

Las uniones SQL pueden ser complicadas. No se trata sólo de la sintaxis, sino también de saber qué uniones utilizar y en qué situaciones.

Las uniones se utilizan cuando se combinan datos de dos o más tablas en SQL. Las tablas se pueden unir de varias formas y, dependiendo de las tablas, cada forma de unirlas puede dar lugar a un resultado completamente diferente. No hay otra forma de aprender esto que la práctica. Sí, puedes leer explicaciones y usos típicos de las uniones SQL. Eso ayuda, sin duda. Pero la práctica se basa en eso a través de la resolución de problemas y la repetición, lo que hace que tu conocimiento se fije. Cuanto más practiques, mayor será la posibilidad de que los problemas de datos de la vida real que tengas que resolver sean similares o completamente iguales a lo que ya has hecho.

Y practicar es lo que haremos en este artículo. Te mostraremos ejercicios para usos básicos y más avanzados de uniones SQL. Si te gustan, disfrutarás aún más de nuestro Tipos de JOIN en SQL ya que todos los ejercicios están tomados de allí. En total, el curso te ofrece 93 ejercicios de SQL joins. Cubren temas que van desde los tipos de uniones en SQL hasta el filtrado de datos, la unión de más de dos tablas, la auto-unión de una tabla y el uso de uniones no equitativas.

Bien, presentemos los conjuntos de datos y comencemos los ejercicios. Siéntase libre de ayudarse con la hoja de trucos de SQL JOIN a medida que avanza.

Lista de Ejercicios

Aquí tienes una lista de todos los ejercicios del artículo:

INNER JOIN

INNER JOIN es un tipo de unión SQL que devuelve sólo las filas coincidentes de las tablas unidas.

Para mostrarle cómo funciona, utilizaremos el Conjunto de Datos 1 del curso.

Conjunto de datos 1

El conjunto de datos consta de cuatro tablas: author, book, adaptationy book_review.

La primera tabla muestra los datos del autor en las siguientes columnas:

  • id - ID único del autor en la base de datos.
  • name - El nombre del autor.
  • birth_year - Año de nacimiento del autor.
  • death_year - Año de fallecimiento del autor (el campo está vacío si sigue vivo).

Estas son las primeras filas de la tabla:

idnamebirth_yeardeath_year
1Marcella Cole1983NULL
2Lisa Mullins18911950
3Dennis Stokes19351994
4Randolph Vasquez19572004
5Daniel Branson19651990

La segunda tabla, bookmuestra detalles sobre los libros. Las columnas son:

  • id - ID del libro.
  • author_id - El ID del autor que escribió ese libro.
  • title - El título del libro.
  • publish_year - El año de publicación del libro.
  • publishing_house - El nombre de la editorial que imprimió el libro.
  • Valoración - La valoración media del libro.

Estas son las cinco primeras filas:

idauthor_idtitlepublish_yearpublishing_houserating
1NULLSoulless girl2008Golden Albatros4.3
2NULLWeak Heart1980Diarmud Inc.3.8
34Faith Of Light1995White Cloud Press4.3
4NULLMemory Of Hope2000Rutis Enterprises2.7
56Warrior Of Wind2005Maverick4.6

La tabla adaptation tiene las siguientes columnas:

  • book_id - El ID del libro adaptado.
  • type - El tipo de adaptación (por ejemplo, película, juego, obra de teatro, musical).
  • title - El nombre de la adaptación.
  • release_year - El año de creación de la adaptación.
  • rating - La calificación media de la adaptación.

He aquí una instantánea de los datos de esta tabla:

book_idtypetitlerelease_yearrating
1movieGone With The Wolves: The Beginning20083
3movieCompanions Of Tomorrow20014.2
5movieHomeless Warrior20084
2movieBlacksmith With Silver20144.3
4moviePatrons And Bearers20043.2

La tabla final es book_review. Consta de las siguientes columnas:

  • book_id - El ID del libro reseñado.
  • review - El resumen de la reseña.
  • author - El nombre del autor de la reseña.

Estos son los datos:

book_idreviewauthor
1An incredible bookSylvia Jones
1Great, although it has some flawsJessica Parker
2Dennis Stokes takes the reader for a ride full of emotionsThomas Green
3Incredible craftsmanship of the authorMartin Freeman
4Not the best book by this authorJude Falth
5Claudia Johnson at her best!Joe Marqiz
6I cannot recall more captivating plotAlexander Durham

Ejercicio 1: Lista de todos los libros y sus autores

Ejercicio: Mostrar el nombre de cada autor junto con el título del libro que escribió y el año en que se publicó.

Solución:

SELECT
  name,
  title,
  publish_year
FROM author
JOIN book
  ON author.id = book.author_id;

Explicación de la solución: La consulta selecciona el nombre del autor, el título del libro y su año de publicación. Son datos de las dos tablas author y book. Podemos acceder a ambas tablas utilizando INNER JOIN. Devuelve sólo las filas con valores coincidentes (valores que satisfacen la condición de unión) de ambas tablas.

Primero hacemos referencia a la tabla author en la cláusula FROM. A continuación, añadimos la cláusula JOIN (que también puede escribirse como INNER JOIN en SQL) y hacemos referencia a la tabla book.

Las tablas se unen en la columna común. En este caso, es id de la tabla author y author_id de la tabla book. Queremos unir las filas en las que estas columnas comparten el mismo valor. Para ello utilizamos la cláusula ON y especificamos los nombres de las columnas. También ponemos el nombre de la tabla antes de cada columna para que la base de datos sepa dónde buscar. Esto se debe principalmente a que hay una columna id en ambas tablas, pero queremos la columna id sólo de la tabla author de la tabla. Al hacer referencia al nombre de la tabla, la base de datos sabrá de qué tabla necesitamos esa columna.

Salida de la solución:

Aquí está la instantánea de salida. Hemos obtenido todos estos datos uniendo dos tablas:

nametitlepublish_year
Marcella ColeGone With The Wolves2005
Lisa MullinsCompanions And Officers1930
Dennis StokesBlacksmith With Silver1984
Randolph VasquezFaith Of Light1995
Michael RostkovskyWarrior Of Wind2005

Ejercicio 2: Lista de autores y libros publicados después de 2005

Ejercicio: Mostrar el nombre de cada autor junto con el título del libro que escribió y el año en que se publicó. Muestra sólo los libros publicados después de 2005.

Solución:

SELECT
  name,
  title,
  publish_year
FROM author
JOIN book
  ON author.id = book.author_id
WHERE publish_year > 2005;

Explicación de la solución: Este ejercicio y su solución son prácticamente iguales al anterior. Esto se refleja en que la consulta selecciona las mismas columnas y une las tablas de la misma forma que antes.

La diferencia es que ahora el ejercicio nos pide que mostremos sólo los libros publicados después de 2005. Para ello es necesario filtrar el resultado, lo que se hace mediante la cláusula WHERE.

WHERE es una cláusula que acepta condiciones utilizadas para filtrar los datos. Se escribe después de unir las tablas. En nuestro ejemplo, filtramos haciendo referencia a la columna publish_year después de WHERE y utilizando el operador de comparación 'mayor que' (>) para encontrar los años posteriores a 2005.

Solución:

La salida muestra sólo un libro publicado después de 2005.

nametitlepublish_year
Darlene LyonsTemptations In Nature2007

Ejercicio 3: Mostrar libros adaptados en un plazo de 4 años y clasificados por debajo de la adaptación

Ejercicio: Para cada libro, muestre su título, título de la adaptación, año de adaptación y año de publicación.

Incluya sólo los libros con una calificación inferior a la de su correspondiente adaptación. Además, muestre sólo los libros cuya adaptación se publicó en los cuatro años siguientes a la publicación del libro.

Cambie el nombre de la columna title de la book a book_title y la columna title de la tabla a adaptation tabla a adaptation_title.

Solución:

SELECT
  book.title AS book_title,
  adaptation.title AS adaptation_title,
  book.publish_year,
  adaptation.release_year
FROM book
JOIN adaptation
  ON book.id = adaptation.book_id
WHERE adaptation.release_year - book.publish_year <= 4
  AND book.rating < adaptation.rating;

Explicación de la solución: Empecemos a explicar la solución a partir de las cláusulas FROM y JOIN. Las columnas que tenemos que mostrar son de las tablas book y adaptation. Hacemos referencia a la primera tabla en FROM y a la segunda en JOIN.

En la cláusula ON, igualamos las dos columnas de ID de libro y especificamos la tabla de cada columna. Esto es igual que antes, sólo que con diferentes nombres de tabla y columna.

Ahora, tenemos que seleccionar las columnas necesarias. La cuestión aquí es que hay una columna title en ambas tablas. Para evitar ambigüedades, una buena práctica es hacer referencia al nombre de la tabla antes de cada columna en SELECT.

Nota: Lo anterior sólo es obligatorio para las columnas ambiguas. Sin embargo, es una buena idea hacerlo con todas las columnas; mejora la legibilidad del código y el enfoque sigue siendo coherente.

Después de seleccionar las columnas, necesitamos renombrar algunas de ellas. Lo hacemos utilizando la palabra clave AS y escribiendo después un nuevo nombre de columna. De este modo, una columna title se convierte en book_title y la otra en adaptation_title. Poner alias a los nombres de las columnas también ayuda a evitar ambigüedades.

Ahora tenemos que filtrar la salida. La primera condición es que la adaptación se haya publicado cuatro años o menos después del libro. Volvemos a utilizar WHERE y simplemente deducimos el año de publicación del libro del año de publicación de la adaptación. Entonces decimos que la diferencia tiene que ser menor o igual que (<=) 4.

También tenemos que añadir la segunda condición, en la que el libro tiene una calificación inferior a la adaptación. Es muy sencillo. La pregunta implica que deben cumplirse tanto la primera como la segunda condición. La pista está en AND, un operador lógico que utilizamos para añadir la segunda condición. Aquí, utiliza el operador 'menor que' (<) para comparar las dos calificaciones.

Salida de la solución:

La salida muestra tres pares libro-adaptación que satisfacen las condiciones.

book_titleadaptation_titlepublish_yearrelease_year
Memory Of HopePatrons And Bearers20002004
Music At The LakeMusic At The Lake20042007
Companion Of TomorrowLighting Faith19491952

JOIN IZQUIERDO

Ahora que ya conoce INNER JOIN, pasemos a LEFT JOIN. Es un tipo de unión externa que devuelve todas las columnas de la tabla izquierda (la primera) y sólo las filas coincidentes de la tabla derecha (la segunda). Si hay datos no coincidentes, se muestran como NULL.

Puede obtener más información en nuestro artículo sobre LEFT JOIN.

Ejercicio 4: Mostrar todos los libros y sus adaptaciones (si las hay)

Ejercicio: Mostrar el título de cada libro junto con el título de su adaptación y la fecha de lanzamiento. Muestre todos los libros, independientemente de si tuvieron o no adaptaciones.

Solución:

SELECT
  book.title,
  adaptation.title,
  adaptation.release_year
FROM book
LEFT JOIN adaptation
  ON book.id = adaptation.book_id;

Explicación de la solución: Primero seleccionamos las columnas necesarias de las dos tablas. Luego unimos book (la tabla izquierda) con adaptation (la tabla de la derecha) con LEFT JOIN. Verás que la sintaxis de unión SQL es la misma para INNER JOIN. Lo único que cambia es la palabra clave join.

Nota: SQL acepta tanto LEFT JOIN como LEFT OUTER JOIN. Son el mismo comando.

Salida de la solución:

La instantánea de salida muestra los datos requeridos, con algunos de los datos mostrados como NULL. Estos son los libros sin la adaptación.

titletitle-2release_year
Soulless girlGone With The Wolves: The Beginning2008
Faith Of LightCompanions Of Tomorrow2001
Warrior Of WindHomeless Warrior2008
Guarding The EmperorNULLNULL
Blacksmith With SilverNULLNULL

Ejercicio 5: Mostrar todos los libros y sus adaptaciones cinematográficas

Ejercicio: Mostrar todos los libros con sus adaptaciones cinematográficas. Seleccione el título de cada libro, el nombre de su editorial, el título de su adaptación y el tipo de adaptación. Mantenga en el resultado los libros sin adaptaciones.

Solución:

SELECT
  book.title,
  publishing_house,
  adaptation.title,
  adaptation.type
FROM book
LEFT JOIN adaptation
  ON book.id = adaptation.book_id
WHERE type = 'movie'
  OR type IS NULL;

Explicación de la solución:

La pregunta pide mostrar todas las filas, incluso las que no tienen ninguna adaptación. Es posible que haya libros sin adaptaciones, por lo que utilizamos LEFT JOIN.

Primero seleccionamos el título del libro, su editorial, el título de su adaptación y su tipo.

A continuación, unimos book (la tabla de la izquierda) con adaptation (la tabla de la derecha) con LEFT JOIN. Unimos las tablas por el ID del libro. Todos los libros que no cumplan las condiciones tendrán NULLs como título de adaptación y tipo.

Filtramos los datos utilizando WHERE. La primera condición es que el tipo de adaptación tiene que ser una película, por lo que igualamos la columna de tipo con una película utilizando el signo igual (=). Nota: Cuando se utilizan datos de texto en la condición WHERE, deben ir entre comillas simples ('').

La segunda condición de filtrado se añade utilizando el operador lógico OR. Dice que el tipo también puede ser NULL si no es una película. El ejercicio nos pide que mantengamos en los resultados los libros sin adaptaciones.

Salida de la solución:

Esta es la captura de salida. Se puede ver que sólo muestra los libros adaptados como películas o no adaptados.

titlepublishing_housetitle-2type
Soulless girlGolden AlbatrosGone With The Wolves: The Beginningmovie
Faith Of LightWhite Cloud PressCompanions Of Tomorrowmovie
Warrior Of WindMaverickHomeless Warriormovie
Guarding The EmperorFlying Pen MediaNULLNULL
Blacksmith With SilverDiarmud Inc.NULLNULL

UNIÓN A LA DERECHA

Donde hay LEFT JOIN, también hay RIGHT JOIN, ¿verdad? A pesar de ser la imagen reflejada del LEFT JOIN, sigue siendo una parte de la práctica de las uniones SQL.

Es un tipo de unión que devuelve todas las columnas de la tabla derecha (la segunda) y sólo las filas coincidentes de la tabla izquierda (la primera). Si hay datos no coincidentes, se muestran como NULL.

Ejercicio 6: Mostrar todos los libros con sus reseñas (si las hay)

Ejercicio: Unir las tablas book_review y book utilizando RIGHT JOIN. Muestre el título del libro, la reseña correspondiente y el nombre del autor de la reseña. Considere todos los libros, incluso los que no han sido reseñados.

Solución:

SELECT
  book.title,
  book_review.review,
  book_review.author
FROM book_review
RIGHT JOIN book
  ON book.id = book_review.book_id;

Explicación de la solución:

Primero seleccionamos las columnas necesarias. A continuación, hacemos lo que se nos indica: unimos las tablas mediante RIGHT JOIN. Unimos las tablas por el ID del libro. La tabla book es la tabla correcta; queremos todos los datos de ella, independientemente de las reseñas.

Como puede ver, la sintaxis es la misma que en INNER JOIN y LEFT JOIN.

Nota: SQL acepta tanto RIGHT JOIN como RIGHT OUTER JOIN.

Resultado de la solución:

La consulta devuelve todos los títulos de libros, sus reseñas y autores. Cuando no hay información sobre reseñas o autores, se muestra NULL.

titlereviewauthor
Soulless girlAn incredible bookSylvia Jones
Soulless girlGreat, although it has some flawsJessica Parker
Guarding The EmperorNULLNULL
Companions And OfficersNULLNULL
Blacksmith With SilverNULLNULL

UNIÓN COMPLETA

Aquí hay otro tipo de unión que es útil en algunos escenarios: el FULL JOIN. Se trata de una unión de LEFT JOIN y RIGHT JOIN. Muestra las filas coincidentes de ambas tablas, las filas que no coinciden de la tabla izquierda y las filas que no coinciden de la tabla derecha. En resumen, muestra todos los datos de ambas tablas.

Puede leer más sobre cómo y cuándo usar FULL JOIN.

Ejercicio 7: Listar Todos los Libros y Todos los Autores

Ejercicio: Mostrar el título de cada libro junto con el nombre de su autor. Mostrar todos los libros, incluso los que no tienen autor. Mostrar todos los autores, incluso los que aún no han publicado ningún libro. Utilice FULL JOIN.

Solución:

SELECT
  title,
  name
FROM book
FULL JOIN author
  ON book.author_id = author.id;

Explicación de la solución: La pregunta requiere mostrar todos los libros, pero también todos los autores - FULL JOIN es perfecto para hacer esto con elegancia.

Seleccionamos el título del libro y el nombre del autor. A continuación, FULL JOIN la tabla book con la tabla author. La condición de unión es que el ID del autor debe ser el mismo en ambas tablas. De nuevo, la sintaxis es la misma que en los tipos de unión anteriores.

Nota: SQL acepta tanto FULL JOIN como FULL OUTER JOIN.

Solución:

La salida muestra todos los libros y todos los autores, tanto si los autores o libros existen en ambas tablas como si no.

titlename
Gone With The WolvesMarcella Cole
Companions And OfficersLisa Mullins
NULLDaniel Branson
Weep Of The WestNULL

Unir 3 o Más Tablas

Sí, las uniones SQL permiten unir más de dos tablas. Veremos como hacerlo en esta parte de la práctica de uniones SQL. Puedes encontrar una explicación más detallada de las uniones múltiples aquí.

También necesitamos un nuevo conjunto de datos, así que vamos a introducirlo.

Conjunto de datos 2

La primera tabla del conjunto de datos es department. Sus columnas son:

  • id - El identificador único del departamento.
  • name - El nombre del departamento, es decir, dónde se vende un determinado tipo de producto.

Estos son los datos de la tabla.

idname
1fruits
2vegetables
3seafood
4deli
5bakery
6meat
7dairy

La segunda tabla es producty consta de las siguientes columnas

  • id - El ID de un producto determinado.
  • name - El nombre del producto.
  • department_id - El ID del departamento donde se encuentra el producto.
  • shelf_id - El ID de la estantería de ese departamento donde se encuentra el producto.
  • producer_id - ID de la empresa que fabrica el producto.
  • price - El precio del producto.

Esta es la instantánea de los datos:

idnamedepartment_idshelf_idproducer_idprice
1Apple11NULL0.5
2Avocado1171
3Banana1170.5
4GrapefruitNULL110.5
5Grapes1142

La siguiente tabla es nutrition_data. Sus columnas y datos se indican a continuación:

  • product_id - El ID de un producto.
  • calories - El valor calorífico de ese producto.
  • fat - La cantidad de grasa de ese producto.
  • carbohydrate - La cantidad de hidratos de carbono de ese producto.
  • protein - La cantidad de proteínas de ese producto.
product_idcaloriesfatcarbohydrateprotein
1130051
2504.531
31100301
4600151
NULL900230

La cuarta tabla se denomina producer. Tiene las siguientes columnas

  • id - El ID de un determinado productor de alimentos.
  • name - El nombre del productor.

A continuación se muestran los datos de esta tabla:

idname
1BeHealthy
2HealthyFood Inc.
3SupremeFoods
4Foodie
5Gusto
6Baker n Sons
7GoodFoods
8Tasty n Healthy

La última tabla del conjunto de datos es sales_history. Tiene las siguientes columnas:

  • date - La fecha de venta.
  • product_id - El ID del producto vendido.
  • amount - La cantidad de ese producto vendida en un día concreto.

Aquí también están los datos:

dateproduct_idamount
2015-01-14114
2015-01-14113
2015-01-1522
2015-01-1626
2015-01-1738

Ejercicio 8: Mostrar productos de menos de 150 calorías y su departamento

Ejercicio: Enumere todos los productos que tienen menos de 150 calorías. Para cada producto, muestre su nombre (renombre la columna product) y el nombre del departamento donde se puede encontrar (nombre la columna department).

Solución:

SELECT
  p.name AS product,
  d.name AS department
FROM department d
JOIN product p
  ON d.id = p.department_id
JOIN nutrition_data nd
  ON nd.product_id = p.id
WHERE nd.calories < 150;

Explicación de la solución: El principio general de cómo se une la tercera (cuarta, quinta...) tabla es que simplemente se añade otra JOIN. Puedes ver cómo se hace en este artículo que explica las uniones múltiples. Aquí lo haremos de la misma manera.

Primero unimos la tabla department con la tabla product en el ID del departamento usando JOIN. Pero también necesitamos la tercera tabla. Para obtener los datos de ella, simplemente añadimos otro JOIN, que unirá la tabla product con la tabla nutrition_data tabla. La sintaxis es la misma que en la primera unión. En este caso, la consulta une las tablas por el ID del producto.

A continuación, utilizamos WHERE para encontrar los productos con menos de 150 calorías. Finalmente, seleccionamos los nombres de producto y departamento y renombramos las columnas según las instrucciones del ejercicio.

Nota: Probablemente hayas notado que ambas columnas seleccionadas tienen el mismo nombre original. Y también se habrá dado cuenta de que hemos resuelto esta ambigüedad poniendo unos extraños nombres abreviados de tabla delante de todas las columnas de la consulta. Estos nombres abreviados son alias de tablas, que se asignan simplemente escribiéndolos después del nombre de la tabla en FROM o JOIN. Al asignar alias a las tablas, puede acortar sus nombres. Por lo tanto, no tienes que escribir sus nombres completos (¡a veces pueden ser realmente largos!), sino los alias cortos en su lugar. Esto ahorra tiempo y espacio.

Salida de la solución:

La salida muestra una lista de los productos y el departamento al que pertenecen. Incluye sólo los productos con menos de 150 calorías.

productdepartment
Applefruits
Avocadofruits
Bananafruits
Kiwifruits
Lemonfruits

Ejercicio 9: Listar todos los productos con sus productores, departamentos y carbohidratos

Ejercicio: Para cada producto, muestra el:

  • Nombre de la empresa que lo ha producido (nombre de la columna producer_name).
  • Nombre del departamento donde se encuentra el producto (nómbrelo department_name).
  • Nombre del producto (nómbralo product_name).
  • Número total de carbohidratos en el producto.

Su consulta debe seguir considerando los productos sin información sobre producer_id o department_id.

Solución:


SELECT
  prod.name AS producer_name,
  d.name AS department_name,
  p.name AS product_name,
  nd.carbohydrate
FROM product p
LEFT JOIN producer prod
  ON prod.id = p.producer_id
LEFT JOIN department d
  ON d.id = p.department_id
LEFT JOIN nutrition_data nd
  ON nd.product_id = p.id;

Explicación de la solución: La consulta selecciona las columnas necesarias. A continuación, une la tabla product con la tabla producer en el ID del productor utilizando LEFT JOIN. Elegimos este tipo de unión porque tenemos que incluir productos sin datos de productor.

A continuación, añadimos otro LEFT JOIN. Este añade la tabla department y la une con la tabla product tabla. De nuevo, elegimos LEFT JOIN porque necesitamos mostrar los productos que no tienen departamento.

También hay una tercera unión. Simplemente la añadimos a la cadena de las uniones anteriores. De nuevo es LEFT JOIN, ya que añadimos la tabla nutrition_data y la unimos con la tabla product tabla.

Este es un tema interesante para explorar, así que aquí hay un artículo que explica los LEFT JOINs múltiples para ayudarte con ello.

Salida de la solución:

La salida muestra todos los productos con sus nombres de productor y departamento y las cantidades de carbohidratos:

producer_namedepartment_nameproduct_namecarbohydrate
BeHealthyfruitsKiwi20
BeHealthyvegetablesBroccoli8
BeHealthymeatChickenNULL
BeHealthyNULLGrapefruit15
HealthyFood Inc.vegetablesCelery4

Si necesita más detalles, por favor lea cómo LEFT JOIN múltiples tablas en SQL.

Ejercicio 10: Mostrar Todos los Productos, Precios, Productores y Departamentos

Ejercicio: Para cada producto, muestre su nombre, precio, nombre del productor y nombre del departamento.

Alias las columnas como product_name, product_price, producer_name, y department_name, respectivamente. Incluya todos los productos, incluso aquellos sin productor o departamento. Incluya también los productores y departamentos sin producto.

Solución:

SELECT
  p.name AS product_name,
  p.price AS product_price,
  prod.name AS producer_name,
  d.name AS department_name
FROM product p
FULL JOIN producer prod
  ON p.producer_id = prod.id
FULL JOIN department d
  ON d.id = p.department_id;

Explicación de la solución: Este ejercicio requiere utilizar FULL JOIN, ya que necesitamos todos los datos de las tablas que utilizaremos: product, producery department.

La sintaxis es la misma que en los ejemplos anteriores. Simplemente unimos las diferentes tablas (product y producer) en el ID del productor y utilizamos un tipo de unión diferente: FULL JOIN.

El segundo FULL JOIN une la tabla product con la tabla department tabla.

Tras seleccionar las columnas necesarias y cambiarles el nombre, obtenemos el siguiente resultado.

Salida de la solución:

La solución muestra todos los datos de las tablas y columnas seleccionadas:

product_nameproduct_priceproducer_namedepartment_name
Chicken5.5BeHealthymeat
Broccoli2.5BeHealthyvegetables
Kiwi0.3BeHealthyfruits
Grapefruit0.5BeHealthyNULL
Cucumber0.7HealthyFood Inc.vegetables

Autounión

Una auto-unión no es un tipo distinto de SQL JOIN - cualquier unión se puede utilizar para auto-unir una tabla. Es simplemente un join usado para unir la tabla consigo misma. Al dar diferentes alias a la misma tabla, se trata como dos tablas diferentes cuando se auto-unen.

Para obtener más información, consulte nuestra guía ilustrada sobre la autounión SQL.

Conjunto de datos 3

El conjunto de datos de este ejemplo consta de una sola tabla: workshop_workers. Tiene las siguientes columnas

  • id - ID del trabajador.
  • name - Nombre y apellidos del trabajador.
  • specialization - Especialización del trabajador.
  • master_id - ID del supervisor del trabajador.
  • experience - Años de experiencia del trabajador.
  • project_id - El ID del proyecto al que está asignado el trabajador.

Estos son los datos:

idnamespecializationmaster_idexperienceproject_id
1Mathew ConnwoodworkingNULL201
2Kate Brownwoodworking141
3John Doeincrusting531
4John Kowalskywatchmaking723
5Suzan GregowitchincrustingNULL154

Ejercicio 11: Listar todos los trabajadores y sus supervisores directos

Ejercicio: Mostrar los nombres de todos los trabajadores junto con los nombres de sus supervisores directos. Renombre las columnas apprentice_name y master_name, respectivamente. Considere sólo los trabajadores que tienen un supervisor (es decir, un maestro).

Solución:

SELECT
  apprentice.name AS apprentice_name,
  master.name AS master_name
FROM workshop_workers apprentice
JOIN workshop_workers master
  ON apprentice.master_id = master.id;

Explicación de la solución: Empecemos por explicar la autounión. El principio general es el mismo que el de las uniones normales. Hacemos referencia a la tabla en FROM y le damos un alias, apprentice. A continuación, utilizamos JOIN y hacemos referencia a la misma tabla en él. Esta vez, le damos a la tabla el alias master. Básicamente estamos fingiendo que una tabla tiene los datos de los aprendices y la otra los datos de los maestros.

Las tablas se unen con el ID de maestro de la tabla apprentice y el ID de la tabla master de la tabla.

Este ejemplo es un uso típico de una autounión: la tabla tiene una columna (master_id) que hace referencia a otra columna de la misma tabla (id). Ambas columnas muestran el ID del trabajador. Cuando hay NULL en master_id, significa que el trabajador no tiene un maestro. En otras palabras, es el maestro.

Después del auto-joining, simplemente seleccionamos las columnas requeridas y les cambiamos el nombre.

Salida de la solución:

La salida muestra todos los aprendices y sus supervisores directos.

apprentice_namemaster_name
Kate BrownMathew Conn
John DoeSuzan Gregowitch
John KowalskyJoe Darrington
Peter ParkerJoe Darrington
Mary SmithMathew Conn
Carlos BellSuzan Gregowitch
Dennis WrightJoe Darrington

Uniones no equitativas

El último tema que abordaremos en esta práctica de uniones SQL son las uniones no equitativas. Las uniones que hemos usado hasta ahora se llaman uniones equitativas porque usan el signo de igualdad (=) en la condición de unión. No-equi son todas las uniones que usan cualquier otro operador - operadores de comparación (<, >, <=, >=, !=, <>), el operador BETWEEN, o cualquier otra condición lógica - para unir tablas.

Conjunto de datos 4

Utilizaremos un conjunto de datos compuesto por dos tablas. La primera tabla es car. Sus columnas son las siguientes

  • id - ID del coche en la base de datos.
  • model - Modelo del coche.
  • brand - La marca del coche.
  • original_price - El precio original de ese coche cuando era nuevo.
  • mileage - El kilometraje total del coche.
  • prod_year - El año de fabricación del coche.

Los datos tienen este aspecto:

idmodelbrandoriginal_pricemileageprod_year
1SpeedsterTeiko80,000150,0001999
2RoadmasterTeiko110,00030,0001980
3SundryTeiko40,00025,0001991
4FuruDomus50,00010,0002002
5EmperorDomus65,000140,0002005
6KingDomus200,0006,0001981
7EmpressDomus60,0007,6001997
8FuryTatsu150,00013,0001993

La segunda tabla es charity_auction con estas columnas:

  • car_id - ID del coche.
  • initial_price - El precio inicial del coche.
  • final_price - El precio real cuando se vendió el coche.
  • buyer_id - El ID de la persona que compró el coche.

Aquí están los datos:

car_idinitial_pricefinal_pricebuyer_id
165,000NULLNULL
335,00050,0001
550,000120,0003
6350,000410,0004
765,000NULLNULL

Ejercicio 12: Mostrar coches con mayor kilometraje que un coche específico

Ejercicio: Mostrar el modelo, marca y precio final de cada coche vendido en la subasta. Considere sólo los coches vendidos que tienen más kilometraje que el coche con el id = 4.

Solución:

SELECT
  car.model,
  car.brand,
  car.final_price
FROM car
JOIN charity_auction ca
  ON car.id = ca.car_id
JOIN car car2
  ON car.mileage > car2.mileage
WHERE car2.id = 4
  AND final_price IS NOT NULL;

Explicación de la solución: Seleccionamos el modelo de coche, la marca y el precio final.

En la primera JOIN, unimos la tabla car con la tabla charity_auction tabla. Las tablas se unen cuando los ID de los coches son iguales. Este es nuestro equi regular JOIN.

Añadimos la segunda JOIN, que es una autounión. Se añade la tabla car para que podamos filtrar los datos utilizando la condición de unión no equitativa. La condición devolverá todos los coches de la tabla car y todos los coches de la tabla car2 con el kilometraje más bajo. Se trata de una condición no equitativa, ya que utiliza el operador "mayor que" ( > ). La sintaxis es la misma, pero esta vez hay > en lugar de =.

Por último, tenemos que filtrar los datos utilizando WHERE. No nos interesa comparar el kilometraje de todos los coches. Queremos mostrar los coches que tienen un kilometraje superior al del coche con id = 4. Esto es lo que hace la primera condición de filtrado.

Añadimos otra condición de filtrado que dice que el precio final no debe ser NULL, es decir, el coche tiene que haber sido vendido en la subasta.

Resultado de la solución:

El resultado muestra dos coches:

modelbrandfinal_price
SundryTeiko50,000
EmperorDomus120,000

Tipos de JOIN en SQL La práctica hace al maestro. ¿Más práctica? ¡Más perfección!

Doce ejercicios de SQL join es una cantidad sólida de práctica. A través de estos ejercicios, podrás aprender y practicar todos los temas más comunes de join que preocupan a los usuarios principiantes e intermedios.

Ahora, ¡sólo necesitas continuar! Cuando practicas aún más, te vuelves aún más perfecto. Así que si te gustaron nuestros ejercicios, puedes obtener más de lo mismo en nuestro curso SQL JOINS o en el artículo sobre las preguntas de la entrevista SQL JOIN.

Espero que apruebes todos los ejercicios que te esperan allí.