16th Oct 2023 Lectura de 24 minutos SQL Joins: 12 Preguntas Prácticas con Respuestas Detalladas Tihomir Babic JOIN de SQL JOIN JOIN ejercicio de SQL Índice Lista de Ejercicios INNER JOIN Conjunto de datos 1 Ejercicio 1: Lista de todos los libros y sus autores Ejercicio 2: Lista de autores y libros publicados después de 2005 Ejercicio 3: Mostrar libros adaptados en un plazo de 4 años y clasificados por debajo de la adaptación JOIN IZQUIERDO Ejercicio 4: Mostrar todos los libros y sus adaptaciones (si las hay) Ejercicio 5: Mostrar todos los libros y sus adaptaciones cinematográficas UNIÓN A LA DERECHA Ejercicio 6: Mostrar todos los libros con sus reseñas (si las hay) UNIÓN COMPLETA Ejercicio 7: Listar Todos los Libros y Todos los Autores Unir 3 o Más Tablas Conjunto de datos 2 Ejercicio 8: Mostrar productos de menos de 150 calorías y su departamento Ejercicio 9: Listar todos los productos con sus productores, departamentos y carbohidratos Ejercicio 10: Mostrar Todos los Productos, Precios, Productores y Departamentos Autounión Conjunto de datos 3 Ejercicio 11: Listar todos los trabajadores y sus supervisores directos Uniones no equitativas Conjunto de datos 4 Ejercicio 12: Mostrar coches con mayor kilometraje que un coche específico Tipos de JOIN en SQL La práctica hace al maestro. ¿Más práctica? ¡Más perfección! 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: Ejercicio 1: Listar todos los libros y sus autores Ejercicio 2: Listar autores y libros publicados después de 2005 Ejercicio 3: Mostrar libros adaptados en un plazo de 4 años y clasificados por debajo de la adaptación Ejercicio 4: Mostrar todos los libros y sus adaptaciones (si las hay) Ejercicio 5: Mostrar todos los libros y sus adaptaciones cinematográficas Ejercicio 6: Mostrar todos los libros con sus reseñas (si las hay) Ejercicio 7: Enumerar todos los libros y todos los autores Ejercicio 8: Mostrar productos de menos de 150 calorías y su departamento Ejercicio 9: Listar Todos los Productos con sus Productores, Departamentos y Carbohidratos Ejercicio 10: Mostrar todos los Productos, Precios, Productores y Departamentos Ejercicio 11: Listar todos los Trabajadores y sus Supervisores Directos Ejercicio 12: Mostrar los Coches con Mayor Kilometraje que un Coche Específico 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í. Tags: JOIN de SQL JOIN JOIN ejercicio de SQL