JOIN SQL: combinaciones y relaciones entre tablas
PrincipianteUnidad 5 de 6 del curso Curso de Fundamentos de SQL
Lo que aprenderás
- Lee cómo se vinculan las tablas mediante claves y explica qué hace una combinación con sus filas antes de escribirla.
- Encuentra los vínculos entre tablas en un esquemaUtiliza las claves primarias y foráneas para ver cómo se relacionan las tablas, identifica cada relación como uno a uno, uno a muchos o muchos a muchos, y planifica qué columnas debe comparar una combinación.
- Explica qué hace una combinación con las filasDescribe una combinación como el emparejamiento de filas que cumplen una condición, predice la anchura y longitud del resultado, y utiliza alias de tabla y nombres de columna cualificados.
- Encuentra los vínculos entre tablas en un esquema
- Escribe combinaciones internas que devuelvan solo filas con una coincidencia en ambas tablas, utilizando ON, USING y condiciones de intervalo, y filtra y ordena las filas combinadas.
- Escribe una combinación interna con ONCombina dos tablas por sus columnas clave con JOIN ... ON, predice exactamente qué filas se devuelven y añade filtros, ordenación y nombres de columna claros.
- Utiliza USING, NATURAL JOIN, combinaciones mediante comas y condiciones de intervaloReconoce otras formas de escribir una combinación interna, explica el riesgo de cada una y combina filas según un intervalo en lugar de una clave igual.
- Escribe una combinación interna con ON
- Utiliza combinaciones externas izquierdas, derechas y completas para conservar filas sin coincidencia, encontrar datos ausentes y colocar cada condición donde filtre lo que quieres.
- Conserva todas las filas de una tabla con LEFT JOINEscribe una combinación externa izquierda, predice sus filas completadas con valores NULL y utilízala para encontrar filas que no tienen coincidencia en otra tabla.
- Utiliza RIGHT JOIN y FULL OUTER JOINConserva las filas sin coincidencia de la tabla derecha o de ambas tablas, reescribe una combinación derecha como izquierda y utiliza una combinación completa para comparar dos listas.
- Coloca correctamente las condiciones en ON o WHEREExplica por qué una condición se comporta de forma distinta en ON y en WHERE de una combinación externa, y elige el lugar adecuado para cada condición.
- Conserva todas las filas de una tabla con LEFT JOIN
- Utiliza autocombinaciones para relacionar filas de una misma tabla, utiliza combinaciones cruzadas para generar todas las combinaciones y reconoce una combinación cruzada accidental.
- Relaciona filas de la misma tabla mediante una autocombinaciónCombina una tabla consigo misma utilizando dos alias para seguir referencias internas, como las de empleados y sus responsables, y para emparejar filas de la misma tabla.
- Genera todas las combinaciones mediante una combinación cruzadaUtiliza CROSS JOIN para emparejar cada fila de una tabla con cada fila de otra, predice el tamaño del resultado y detecta productos cartesianos accidentales.
- Relaciona filas de la misma tabla mediante una autocombinación
- Utiliza tablas intermedias para responder preguntas sobre relaciones muchos a muchos y combina tres o más tablas en una consulta conservando las filas adecuadas en cada paso.
- Consulta relaciones muchos a muchos mediante una tabla intermediaExplica cómo una tabla intermedia vincula dos tablas y combina a través de ella para responder preguntas en ambas direcciones, incluidas las filas sin pareja.
- Combina tres o más tablas en una consultaPlanifica una ruta de claves entre varias tablas, escribe una combinación por vínculo e interpreta qué representa cada fila de un resultado de varias tablas.
- Conserva las filas sin coincidencia a lo largo de una cadena de combinacionesCombina operaciones externas e internas en una cadena sin perder las filas que querías conservar y comprueba cada paso de la cadena.
- Consulta relaciones muchos a muchos mediante una tabla intermedia
- Reconoce cuándo una combinación multiplica o pierde filas, corrige los recuentos y totales inflados, y comprueba el resultado de una combinación antes de darlo por válido.
- Corrige las filas duplicadas y los totales infladosExplica por qué las combinaciones mediante vínculos uno a muchos repiten filas, y cuenta y suma valores en el nivel adecuado para que los totales sigan siendo correctos.
- Comprueba el resultado de una combinación antes de darlo por válidoPredice cuántas filas debe devolver una combinación, reconoce los indicios de errores habituales y repasa una breve lista de comprobación para cada consulta con combinaciones.
- Corrige las filas duplicadas y los totales inflados
Guía de estudio de JOIN SQL
1Claves y filas combinadas
Una combinación empieza con una relación entre filas. Los datos de los clientes y de los pedidos se guardan en tablas separadas, y las claves indican cómo reunirlos. Lee el pequeño esquema de la tienda, distingue los vínculos uno a uno, uno a muchos y muchos a muchos, y traza una ruta para un informe. Después, observa cómo los pares coincidentes se convierten en filas de resultado, por qué pueden repetirse los nombres y cómo los alias aclaran el origen de cada columna seleccionada.
1.1 Claves y rutas entre tablas
La dirección de un cliente pertenece a los datos del cliente. La fecha de un pedido pertenece a los datos del pedido. Guardar estos datos en tablas separadas reduce la repetición, pero un informe suele necesitar datos de ambas. Una combinación une sus filas dentro de una consulta.
Lee las claves
Una clave primaria identifica una fila. Puede ser una columna o varias columnas juntas. Una clave foránea hace referencia a una clave primaria u otra clave única, ya sea de otra tabla o de la misma tabla. En la base de datos de la tienda, orders.customer_id apunta a customers.customer_id.
| customer_id | name | city |
|---|---|---|
| 1 | Ana | Denver |
| 2 | Ben | Austin |
| 3 | Chloe | Denver |
| 4 | Dev | Boston |
| order_id | customer_id | order_date | total |
|---|---|---|---|
| 101 | 1 | 2026-03-02 | 22,00 |
| 102 | 1 | 2026-03-15 | 25,50 |
| 103 | 2 | 2026-03-20 | 60,00 |
| 104 | NULL | 2026-03-21 | 15,00 |
Los pedidos 101 y 102 hacen referencia al cliente 1, Ana. El pedido 103 hace referencia a Ben. El pedido 104 es una compra como invitado: su clave de cliente es NULL, por lo que no hace referencia a ningún cliente. El número de pedido identifica el pedido; no identifica al cliente. Combinar order_id con customer_id compararía identificadores sin relación.
Identifica la relación
| Relación | Qué significa | Dónde se encuentra el vínculo |
|---|---|---|
| Uno a uno | Cada fila tiene como máximo una pareja al otro lado. | Una clave foránea también es única, como en el caso de una credencial por empleado. |
| Uno a muchos | Una fila padre puede tener varias filas hijas; cada hija tiene como máximo una fila padre. | La clave foránea está en el lado muchos, como en orders. |
| Muchos a muchos | Las filas de ambos lados pueden tener varias parejas. | Una tabla intermedia contiene una clave foránea hacia cada lado. |
La relación cliente–pedido es uno a muchos. Un cliente puede no tener pedidos, tener uno o tener varios. Eso no significa que la tabla de clientes almacene un identificador de pedido por cada compra. Cada pedido almacena su propia referencia al cliente.
Para estudiantes y cursos, ninguno de los lados puede contener una sola referencia que describa todos los vínculos. Una fila de enrollments registra un par estudiante–curso. Varias filas de inscripción pueden hacer referencia al mismo estudiante, y varias pueden hacer referencia al mismo curso.
Traza una ruta antes de escribir SQL
Para enumerar los productos comprados por cada cliente, sigue customers → orders → order_items → products. Los vínculos utilizan customer_id, después order_id y después product_id. Cada vínculo necesita su propia condición. Una línea de pedido proporciona la conexión que falta entre un pedido y un producto.
Interpreta el significado del esquema, no solo cómo se escriben las columnas. employees.manager_id puede hacer referencia a employees.emp_id, aunque sus nombres difieran. En cambio, customers.name y products.name nombran cosas de distinto tipo y no deben compararse solo porque ambas se llamen name.
Una clave foránea declarada es una guía útil, pero SQL también puede combinar tablas sin una restricción declarada. Un precio puede coincidir con un intervalo de precios, y dos empleados pueden coincidir porque comparten responsable. La condición debe expresar la relación que necesita la pregunta.
Puntos clave
- Una clave primaria identifica una fila; una clave foránea hace referencia a una clave primaria o única.
- La clave foránea se encuentra en el lado muchos de una relación uno a muchos.
- Una tabla intermedia registra los pares de una relación muchos a muchos.
- Sigue los vínculos del esquema y asigna a cada uno una condición con sentido.
1.2 Cómo las filas coincidentes se convierten en un resultado
Una combinación construye filas nuevas al combinar filas de entrada. Empieza por la regla de coincidencia y después pregúntate cuántas parejas tiene cada fila. La respuesta determina tanto qué filas aparecen como cuántas veces se repiten sus valores.
Piensa en pares
Para una combinación interna, imagina cada cliente junto a cada pedido. Conserva un par solo cuando o.customer_id = c.customer_id sea verdadero. El pedido 101 se empareja con Ana; no se empareja con Ben, Chloe ni Dev. El pedido 102 también se empareja con Ana. Por tanto, un cliente puede aportar varias filas al resultado.
La condición puede ser verdadera, falsa o desconocida. Una igualdad en la que interviene NULL es desconocida, por lo que el pedido de invitado 104 no encuentra ningún cliente coincidente. Una combinación externa también conserva las filas sin coincidencia del lado elegido y rellena las columnas de la pareja ausente con NULL.
Esta representación par a par explica las combinaciones mejor que los círculos superpuestos. Una combinación no se limita a reunir elementos compartidos: construye filas combinadas, y las claves repetidas pueden generar más filas de salida de las que contiene cualquiera de las entradas. Si dos filas de un lado y tres del otro comparten una clave, esa clave produce seis pares coincidentes.
Elige las columnas independientemente de las coincidencias
La tabla de clientes de la tienda tiene tres columnas y la de pedidos tiene cuatro. Con JOIN ... ON, SELECT * devuelve las siete, incluidas ambas copias de customer_id. En su lugar, puedes seleccionar solo los campos que necesita el informe:
SELECT c.name, o.order_id, o.total
FROM customers c
JOIN orders o ON o.customer_id = c.customer_id
ORDER BY o.order_id;
El resultado es (Ana; 101; 22,00), (Ana; 102; 25,50) y (Ben; 103; 60,00). Las columnas clave realizan su función de comparación sin tener que aparecer en la salida seleccionada. Seleccionar menos columnas cambia la anchura del resultado, no los pares de entrada que coinciden.
Asigna a las tablas nombres cortos y claros
En FROM customers c, c es un alias de tabla. Haz referencia a las columnas de esa tabla como c.name y c.customer_id. La expresión c.name es un nombre de columna cualificado: la parte anterior al punto indica qué papel de tabla proporciona el valor.
Ambas tablas combinadas contienen customer_id. Escribir solo SELECT customer_id con la forma ON impide que la base de datos elija entre ellas y provoca un error por referencia de columna ambigua. Escribe c.customer_id u o.customer_id según el valor que necesites. Cualificar las demás columnas seleccionadas también facilita ver su origen.
AS antes de un alias de tabla es opcional en PostgreSQL, SQLite, MySQL y SQL Server. Oracle no lo acepta, por lo que FROM customers c es una forma común útil. Después de asignar un alias a una tabla, utilízalo de forma coherente.
Lee el orden lógico de la consulta
FROM y sus combinaciones construyen las filas combinadas. WHERE filtra esas filas. SELECT elige las columnas de salida y ORDER BY ordena el resultado. Un filtro puede utilizar una columna combinada aunque esa columna no esté seleccionada. Por ejemplo, WHERE c.city = 'Denver' puede filtrar un informe que solo muestra nombres y totales de pedidos.
Sin ORDER BY, la base de datos no garantiza ningún orden concreto de filas. Una consulta que hoy muestra primero a Ana puede mostrar otra fila primero más adelante; ordenar es una instrucción independiente de buscar coincidencias.
Puntos clave
- Una combinación interna conserva cada par cuya condición es verdadera.
- Los valores de clave repetidos pueden producir varias filas para una fila de entrada.
- Los alias y los nombres cualificados identifican qué tabla proporciona una columna.
- Las combinaciones construyen filas antes de que
WHERElas filtre ySELECTelija las columnas. - Utiliza
ORDER BYcuando importe el orden de las filas.
2Escribir combinaciones internas
Las combinaciones internas responden preguntas que requieren datos coincidentes en ambos lados, como el nombre de un cliente junto a un pedido. Construye una condición explícita, examina sus filas de resultado reales y añade filtros y ordenación. Después, lee las formas abreviadas y antiguas que puedes encontrar en consultas existentes. Las coincidencias por intervalos introducen otro tipo de condición, en el que los solapamientos o huecos pueden cambiar cuántas filas produce cada valor.
2.1 Buscar filas coincidentes con JOIN y ON
Utiliza una combinación interna cuando una fila de resultado necesite una coincidencia en ambas tablas. JOIN e INNER JOIN significan lo mismo. Ninguna de las dos formas conserva una fila que no encuentra pareja.
Construye la consulta en tres partes
Primero nombra las tablas y sus papeles. Después expresa la relación en ON. Por último, elige las columnas que quieres mostrar.
SELECT c.name, o.order_id, o.total
FROM customers c
JOIN orders o ON o.customer_id = c.customer_id
ORDER BY o.order_id;
Lee la condición como «la referencia al cliente del pedido es igual al identificador de este cliente». Para el pedido 101, la referencia es 1, por lo que se empareja con Ana. El pedido 102 también tiene la referencia 1, y el pedido 103 tiene la referencia 2. El resultado completo es:
| name | order_id | total |
|---|---|---|
| Ana | 101 | 22,00 |
| Ana | 102 | 25,50 |
| Ben | 103 | 60,00 |
Ana aparece dos veces porque tiene dos pedidos coincidentes. Chloe y Dev no tienen ninguno, por lo que no aparecen. El pedido de invitado 104 tiene una referencia de cliente NULL, que no satisface ninguna igualdad con una clave de cliente.
Filtra y ordena las filas combinadas
Para mostrar solo los clientes de Denver, coloca WHERE c.city = 'Denver' después de la combinación y antes de ORDER BY. El resultado pasa a ser (Ana; 101; 22,00) y (Ana; 102; 25,50). Chloe también vive en Denver, pero la combinación interna nunca produjo una fila para ella.
En una combinación interna, colocar este filtro en ON da los mismos pares. Una convención que facilita la lectura es mantener las condiciones de coincidencia entre tablas en ON y los filtros del informe en WHERE. Esta equivalencia no se extiende a las combinaciones externas.
Puedes ordenar por una columna combinada que no aparezca en la salida seleccionada. También puedes omitir las claves de combinación de la salida: la consulta anterior compara por customer_id mientras muestra un nombre, un número de pedido y un total. La función de una columna en la coincidencia es independiente de su función en el informe.
Compara todas las partes de una clave
Algunos registros se identifican mediante un par de columnas. Una línea de envío que hace referencia a una línea de pedido puede necesitar tanto el identificador del pedido como el del producto:
SELECT s.order_id, s.product_id, oi.quantity
FROM shipment_lines s
JOIN order_items oi
ON s.order_id = oi.order_id
AND s.product_id = oi.product_id;
Ambas comparaciones deben ser verdaderas para que haya coincidencia. Comparar solo order_id asociaría cada línea de envío con cada línea de producto de ese pedido. La consulta podría ejecutarse correctamente y, aun así, describir cantidades de producto incorrectas.
Cambia el orden sin cambiar el significado
Escribir FROM orders o JOIN customers c ON c.customer_id = o.customer_id da los mismos pares cliente–pedido. Invertir los dos lados de = también conserva una igualdad. SELECT * puede disponer las columnas de otra forma después de intercambiar las tablas, y el orden de las filas sigue sin especificarse salvo que se ordenen.
Un cambio mucho más grave es ON o.order_id = c.customer_id. Ambas columnas contienen números, por lo que es SQL válido, pero identifican cosas distintas. En los datos de la tienda no devuelve ninguna fila: los identificadores de pedido 101–104 nunca son iguales a los identificadores de cliente 1–4. Comprueba la relación del esquema aunque la base de datos no indique ningún error de sintaxis.
Puntos clave
JOINsignificaINNER JOIN: se excluyen las filas sin coincidencia de ambos lados.- Coloca la relación en
ONy después añade los filtros y la ordenación del informe. - Compara todas las partes de una clave compuesta con
AND. - Un SQL válido puede comparar las columnas incorrectas.
2.2 Otras formas de expresar una coincidencia
ON hace explícita una condición, pero el SQL existente puede utilizar formas más cortas o antiguas. Lee cada forma preguntándote qué pares conserva. Algunas también cambian cómo aparecen las columnas compartidas en la salida.
USING nombra la clave compartida
Cuando las columnas clave tienen el mismo nombre, esta consulta utiliza una igualdad abreviada:
SELECT c.name, o.order_id
FROM customers c
JOIN orders o USING (customer_id)
ORDER BY o.order_id;
Devuelve (Ana, 101), (Ana, 102) y (Ben, 103). USING (customer_id) significa comparar las dos columnas customer_id. Con SELECT *, devuelve seis columnas y muestra la clave compartida una sola vez; JOIN ... ON incluye ambas columnas clave de entrada.
Para una clave compuesta, enumera ambos nombres: USING (order_id, product_id). Cada columna de la lista debe existir con ese nombre en ambas entradas.
PostgreSQL, SQLite, MySQL y Oracle admiten USING; SQL Server no. En Oracle, una columna nombrada en USING debe referenciarse sin cualificar, así que escribe SELECT customer_id, no SELECT c.customer_id. Las demás columnas pueden seguir utilizando sus alias de tabla.
NATURAL JOIN elige las columnas por ti
Un NATURAL JOIN compara todas las columnas cuyos nombres comparten las entradas, une esas pruebas de igualdad con AND y muestra las columnas compartidas una sola vez. Lo admiten PostgreSQL, SQLite, MySQL y Oracle, pero no SQL Server.
Esa elección automática puede cambiar una consulta sin avisar. Actualmente, clientes y pedidos solo comparten customer_id. Añadir una columna city a pedidos hace que una combinación natural exija que coincidan tanto el identificador del cliente como la ciudad. Una ciudad de entrega distinta de la del cliente puede entonces eliminar un pedido que antes coincidía.
Clientes y productos tienen name, pero una columna nombra una persona y la otra un producto. Su combinación natural compararía esos nombres sin relación y no devuelve filas en los datos de la tienda. Si no hay nombres de columna compartidos, una combinación natural devuelve todas las combinaciones. Utiliza ON o una lista USING elegida deliberadamente para mantener visible la regla de coincidencia.
Lee las combinaciones antiguas mediante comas
SELECT c.name, o.order_id
FROM customers c, orders o
WHERE o.customer_id = c.customer_id;
Esto devuelve los mismos tres pares que la combinación interna. La condición está ahora en WHERE. Si la olvidas, los cuatro clientes se emparejan con los cuatro pedidos y producen 16 filas. JOIN ... ON mantiene cada tabla junto a su propia condición, lo que facilita comprobar consultas más largas.
Relaciona un valor con un intervalo
Una equicombinación utiliza la igualdad. Una combinación por desigualdad utiliza otra comparación, como una prueba de intervalo:
SELECT p.name, b.band
FROM products p
JOIN price_bands b
ON p.price BETWEEN b.min_price AND b.max_price;
Los intervalos son Budget 0,00–4,99, Standard 5,00–19,99 y Premium 20,00–999,99. Mug a 8,00 y Stapler a 12,00 coinciden con Standard; Pen a 1,50 y Notebook a 4,25 coinciden con Budget. Premium no tiene ningún producto coincidente y no aporta ninguna fila.
BETWEEN incluye ambos extremos. Un nuevo intervalo Gift de 8,00 a 15,00 daría a Mug y Stapler una segunda coincidencia a cada uno. El hueco entre 4,99 y 5,00 dejaría un precio de 4,995 sin coincidencia. Los intervalos determinan el resultado igual que las claves: un valor puede tener cero, una o varias coincidencias.
Puntos clave
USINGcompara las columnas enumeradas con el mismo nombre y muestra cada clave compartida una sola vez.NATURAL JOINdepende de todos los nombres de columna compartidos, por lo que los cambios de esquema pueden alterar su resultado.- Una combinación mediante comas necesita su condición de coincidencia en
WHERE. - Una combinación por desigualdad puede comparar con intervalos; los solapamientos crean coincidencias adicionales y los huecos dejan valores sin coincidencia.
- SQL Server utiliza
ON, sin sintaxisUSINGniNATURAL JOIN.
3Conservar las filas sin coincidencia
Los informes suelen necesitar que las relaciones ausentes sigan visibles: clientes sin pedidos, productos sin vender o registros que faltan en una de dos listas. Las combinaciones externas conservan esas filas y marcan la pareja ausente con valores NULL. Elige qué lado debe conservarse y después observa cómo cambian el resultado las condiciones cuando se aplican durante la búsqueda de coincidencias o después. La ubicación de una prueba de fecha puede decidir si un cliente desaparece por completo.
3.1 Todas las filas de la izquierda, incluidas las que no tienen coincidencia
Un informe que pide «todos los clientes, incluidos los clientes sin pedidos» necesita una combinación externa izquierda. LEFT JOIN conserva todas las filas izquierdas. Incorpora cada fila derecha coincidente o proporciona una fila de valores NULL cuando no hay coincidencia. La palabra OUTER es opcional.
Sigue la tabla conservada
SELECT c.name, o.order_id, o.total
FROM customers c
LEFT JOIN orders o ON o.customer_id = c.customer_id
ORDER BY c.customer_id, o.order_id;
| name | order_id | total |
|---|---|---|
| Ana | 101 | 22,00 |
| Ana | 102 | 25,50 |
| Ben | 103 | 60,00 |
| Chloe | NULL | NULL |
| Dev | NULL | NULL |
Ana sigue aportando dos filas. Una combinación izquierda no reduce los pedidos de un cliente a uno. Chloe y Dev aportan exactamente una fila cada uno porque ninguno tiene coincidencia. Hay cinco filas en total: tres pares coincidentes y dos clientes sin coincidencia.
La combinación devuelve al menos tantas filas como su entrada izquierda antes de aplicar filtros posteriores. Para cada fila izquierda, cuenta sus coincidencias; si no tiene ninguna, cuenta una fila completada con NULL. Esto explica por qué cuatro clientes pueden producir cinco filas.
El pedido de invitado 104 no aparece. Conservar todos los clientes no conserva también los pedidos sin coincidencia. Para conservar todos los pedidos, empieza con orders o LEFT JOIN customers c ON c.customer_id = o.customer_id. Seleccionar después o.order_id, c.name da (101, Ana), (102, Ana), (103, Ben) y (104, NULL). Chloe y Dev ya no aparecen.
Encuentra filas sin pareja
Una anticombinación izquierda conserva solo las filas que no encontraron coincidencia:
SELECT c.name
FROM customers c
LEFT JOIN orders o ON o.customer_id = c.customer_id
WHERE o.order_id IS NULL;
La combinación izquierda crea primero las cinco filas. Después, WHERE conserva a Chloe y Dev, cuyas claves de pedido son NULL. Su pareja ausente es exactamente lo que busca la consulta.
Elige una columna del lado derecho que no pueda ser NULL en una coincidencia real. La clave primaria de un pedido es una buena prueba. Comprobar un coupon_code opcional también conservaría pedidos reales coincidentes sin cupón, por lo que no significaría «sin pedido». Utiliza IS NULL: = NULL se evalúa como desconocido y no conserva ninguna fila en WHERE.
El mismo patrón encuentra productos sin vender:
SELECT p.name
FROM products p
LEFT JOIN order_items oi ON oi.product_id = p.product_id
WHERE oi.order_id IS NULL;
Devuelve (Stapler), el único producto sin línea de pedido. Aquí, una línea coincidente real tiene necesariamente un identificador de pedido, por lo que la prueba detecta la línea ausente.
Interpreta un valor ausente antes de sustituirlo
Una fila de combinación externa completada con NULL significa que no coincidió ninguna pareja. En cambio, un NULL almacenado en un pedido real puede significar que no se proporcionó un campo. Son situaciones distintas aunque ambas se muestren como NULL.
COALESCE(o.total, 0) elige el primer argumento que no sea NULL. Mostraría 0 para Chloe y Dev. Eso puede ser útil para un informe de gasto, pero un cero en una columna titulada «total del pedido» puede sugerir un pedido real de valor cero. Mantén el encabezado y el significado del informe en consonancia.
Puntos clave
- Una combinación izquierda conserva las filas izquierdas y proporciona NULL para las parejas derechas ausentes.
- Cuenta cada par coincidente y añade una fila por cada fila izquierda sin coincidencia.
- Para una anticombinación, utiliza
WHERE right_key IS NULLsobre una clave que no pueda ser NULL en una coincidencia. - Una combinación izquierda no conserva una fila derecha sin coincidencia.
COALESCEpuede cambiar cómo se muestran los valores ausentes; elige un encabezado que mantenga claro su significado.
3.2 Conservar el lado derecho o ambos lados
A veces, las filas necesarias están a la derecha de una combinación. A veces, deben conservarse ambas entradas para poder comparar los registros ausentes. Las combinaciones externas derechas y las completas hacen explícitas estas elecciones.
Reescribe una combinación derecha como una izquierda
SELECT c.name, o.order_id
FROM customers c
RIGHT JOIN orders o ON o.customer_id = c.customer_id;
Esto conserva todos los pedidos: (Ana, 101), (Ana, 102), (Ben, 103) y (NULL, 104). La tabla derecha es orders, por lo que el pedido de invitado se conserva. Chloe y Dev son filas izquierdas sin coincidencia y no se conservan.
Intercambiar las entradas da la forma equivalente orders o LEFT JOIN customers c ON o.customer_id = c.customer_id. Mantener la misma lista explícita de selección da los mismos valores. Con SELECT *, puede cambiar el orden predeterminado de las columnas. Utilizar combinaciones izquierdas en todo un informe suele facilitar el seguimiento del lado que debe conservarse.
Conserva las filas sin coincidencia de ambas entradas
SELECT c.name, o.order_id
FROM customers c
FULL OUTER JOIN orders o ON o.customer_id = c.customer_id;
El resultado contiene (Ana, 101), (Ana, 102), (Ben, 103), (Chloe, NULL), (Dev, NULL) y (NULL, 104). Son tres pares coincidentes, dos clientes sin coincidencia y un pedido sin coincidencia: seis filas. Las columnas de cliente son NULL para el pedido de invitado 104; las columnas de pedido son NULL para Chloe y Dev.
| Combinación | Filas sin coincidencia conservadas |
|---|---|
| LEFT JOIN | Solo las de la entrada izquierda |
| RIGHT JOIN | Solo las de la entrada derecha |
| FULL OUTER JOIN | Las de ambas entradas |
Una combinación completa es útil para la conciliación de resultados, como comprobar una lista de existencias de almacén frente a un recuento físico. Las claves coincidentes aparecen juntas; las que solo se encuentran en un lado permanecen visibles. En la consulta de la tienda, añadir WHERE c.customer_id IS NULL OR o.order_id IS NULL conserva solo a Chloe, Dev y el pedido 104.
Al conciliar dos listas con el mismo tipo de clave, cualquiera de las claves de entrada puede ser NULL en la salida. COALESCE(w.sku, k.sku) AS sku selecciona el SKU disponible del alias de almacén w o del alias de lista de recuento k. Una columna clave combinada permite que el informe identifique los registros ausentes de cualquiera de las listas.
Comprueba la compatibilidad de la sintaxis
PostgreSQL, SQL Server y Oracle admiten combinaciones externas derechas y completas. SQLite admite ambas a partir de la versión 3.39.0, publicada en 2022. Las versiones anteriores de SQLite las rechazan. MySQL admite combinaciones derechas, pero no tiene FULL OUTER JOIN; una alternativa combina los resultados de combinaciones izquierdas y derechas con UNION.
El SQL antiguo de Oracle puede marcar el lado opcional con (+) en WHERE. Por ejemplo, WHERE c.customer_id = o.customer_id(+) conserva los clientes y rellena las columnas de pedido ausentes con NULL, como una combinación izquierda desde clientes. El marcador pertenece al lado que puede estar ausente. Utiliza las formas de combinación con nombre LEFT, RIGHT y FULL al escribir consultas nuevas.
Puntos clave
- Una combinación derecha se convierte en una izquierda al intercambiar las tablas.
- Las filas de una combinación completa son los pares coincidentes más las filas sin coincidencia de ambos lados.
- Una combinación completa puede revelar discrepancias durante la conciliación de resultados.
- SQLite necesita la versión 3.39.0 o posterior para combinaciones derechas y completas; MySQL no tiene una palabra clave para la combinación completa.
3.3 Decidir si una condición va en ON o en WHERE
Una combinación externa separa dos decisiones: qué pares cuentan como coincidencias y qué filas del resultado terminado conserva el informe. ON toma la primera decisión. WHERE toma la segunda, después de que las filas sin coincidencia hayan recibido valores NULL.
Conserva a todos, pero limita sus pedidos coincidentes
Supón que un informe necesita todos los clientes y solo sus pedidos a partir del 10 de marzo:
SELECT c.name, o.order_id
FROM customers c
LEFT JOIN orders o
ON o.customer_id = c.customer_id
AND o.order_date >= '2026-03-10';
La prueba de fecha forma parte de la coincidencia. El pedido 101 de Ana es demasiado temprano, pero el pedido 102 cumple la condición. El pedido 103 de Ben también la cumple. Chloe y Dev no tienen ninguna pareja que la cumpla, por lo que cada uno recibe una fila completada con NULL. El resultado es (Ana, 102), (Ben, 103), (Chloe, NULL) y (Dev, NULL).
Filtra las filas después de la combinación
Mueve la misma prueba de fecha a WHERE:
SELECT c.name, o.order_id
FROM customers c
LEFT JOIN orders o ON o.customer_id = c.customer_id
WHERE o.order_date >= '2026-03-10';
Ahora la combinación crea primero cinco filas, incluidas las filas completadas con NULL para Chloe y Dev. La comparación de fecha es desconocida para esos valores NULL, por lo que WHERE las elimina. También elimina el pedido temprano de Ana. Solo quedan (Ana, 102) y (Ben, 103).
La versión con WHERE produce las mismas filas coincidentes que una combinación interna con ese filtro de fecha.
Filtra deliberadamente la tabla conservada
Una condición del lado izquierdo en ON tampoco puede eliminar filas izquierdas. Considera ON o.customer_id = c.customer_id AND c.city = 'Denver'. Ana puede coincidir con ambos pedidos, Chloe no tiene ninguno, y Ben y Dev no cumplen la parte de ciudad de ninguna coincidencia posible. Los cuatro clientes permanecen, con NULL en las columnas de pedido para Ben, Chloe y Dev.
Para pedir solo los clientes de Denver, coloca WHERE c.city = 'Denver' después de la condición de clave habitual. El resultado es (Ana, 101), (Ana, 102) y (Chloe, NULL). Chloe se conserva porque el filtro comprueba su propia ciudad, no un campo de pedido ausente.
| Qué debe hacer la condición | Lugar habitual en una combinación izquierda |
|---|---|
| Limitar las coincidencias válidas del lado derecho conservando todas las filas izquierdas | ON |
| Limitar qué filas izquierdas pertenecen al informe | WHERE |
| Encontrar filas cuya pareja derecha está ausente | WHERE con right_key IS NULL |
La prueba de anticombinación va después de la combinación porque examina el resultado completado con NULL. Las combinaciones internas no tienen filas sin coincidencia conservadas, por lo que mover un filtro entre ON y WHERE no cambia sus pares coincidentes. Al revisar una combinación externa, lee cada prueba WHERE del lado opcional y comprueba qué hace con una fila completada con NULL.
Puntos clave
ONdecide las coincidencias;WHEREfiltra las filas del resultado terminado.- Coloca una restricción del lado derecho en
ONpara conservar las filas izquierdas sin coincidencias que cumplan la condición. - Coloca las restricciones del informe sobre el lado izquierdo en
WHERE. - Una comparación del lado derecho en
WHEREelimina las filas completadas con NULL cuando su resultado es desconocido. - La prueba
IS NULLde una anticombinación se ejecuta deliberadamente después de la combinación.
4Autocombinaciones y combinaciones cruzadas
El mismo mecanismo de combinación puede conectar dos papeles de una tabla o generar todas las combinaciones de dos tablas. Las consultas de empleado–responsable necesitan alias que aclaren los papeles; los pares de compañeros también necesitan una regla para los emparejamientos de una fila consigo misma y los duplicados en orden inverso. Las combinaciones cruzadas generan deliberadamente todas las posibilidades, como tallas y colores. Predecir su tamaño te ayuda a reconocer cuándo esa multiplicación era intencionada y cuándo falta una condición.
4.1 Dos papeles para una tabla
El responsable de un empleado también es un empleado. Una autocombinación lee la misma tabla con distintos alias para que una fila pueda representar al empleado y otra al responsable. Utiliza la sintaxis de combinación habitual; no existe una palabra clave SELF JOIN.
Nombra los papeles antes que las columnas
Los datos de empleados son:
| emp_id | name | manager_id |
|---|---|---|
| 1 | Grace | NULL |
| 2 | Hassan | 1 |
| 3 | Iris | 1 |
| 4 | Jamal | 2 |
SELECT e.name AS employee, m.name AS manager
FROM employees e
JOIN employees m ON e.manager_id = m.emp_id;
e proporciona la fila del empleado. Su manager_id apunta al emp_id del responsable en el papel m. Hassan apunta a 1, por lo que se empareja con Grace; Iris también se empareja con Grace. Jamal apunta a 2 y se empareja con Hassan. El resultado es (Hassan, Grace), (Iris, Grace) y (Jamal, Hassan).
Grace no tiene responsable. Su manager_id es NULL, por lo que la combinación interna la excluye. Sustituir JOIN por LEFT JOIN añade (Grace, NULL) y produce cuatro filas. Los alias distintos permiten que la base de datos distinga los papeles aunque ambas entradas procedan de la misma tabla almacenada.
Formula la pregunta en la otra dirección
Para encontrar personas que no tienen a nadie a su cargo, empieza por el papel de responsable y busca un empleado ausente:
SELECT m.name
FROM employees m
LEFT JOIN employees e ON e.manager_id = m.emp_id
WHERE e.emp_id IS NULL;
Esto devuelve (Iris) y (Jamal). Grace coincide con Hassan e Iris; Hassan coincide con Jamal. Iris y Jamal no tienen empleados directamente a su cargo. Comprobar la clave del empleado después de la combinación encuentra su pareja ausente.
Un tercer alias sigue un nivel más. employees e JOIN employees m ON e.manager_id = m.emp_id JOIN employees g ON m.manager_id = g.emp_id, seleccionando sus nombres, devuelve (Jamal, Hassan, Grace). Cada papel adicional sigue un vínculo más. Una consulta fija alcanza un número fijo de niveles; una jerarquía de profundidad arbitraria necesita una consulta recursiva.
Empareja a los compañeros una sola vez
La misma tabla también puede proporcionar pares de compañeros de trabajo:
SELECT a.name, b.name
FROM employees a
JOIN employees b
ON a.manager_id = b.manager_id
AND a.emp_id < b.emp_id;
Hassan e Iris comparten el responsable 1. La prueba de menor que excluye a una persona emparejada consigo misma y conserva solo un orden de cada par. El resultado es (Hassan, Iris).
Con solo la igualdad de responsable, el resultado tiene cinco filas: Hassan–Hassan, Hassan–Iris, Iris–Hassan, Iris–Iris y Jamal–Jamal. La clave de responsable NULL de Grace no coincide con nada, ni siquiera con otro NULL. Sustituir < por <> excluye los emparejamientos de una persona consigo misma, pero conserva tanto (Hassan, Iris) como (Iris, Hassan). Elige < cuando la pregunta necesite cada par no ordenado una sola vez.
Puntos clave
- Utiliza alias distintos para los diferentes papeles de una autocombinación.
- Compara el
manager_idde un empleado con elemp_iddel papel de responsable. - Una autocombinación izquierda puede conservar la parte superior de una jerarquía.
- Cada autocombinación adicional sigue otro nivel fijo.
- En pares del mismo grupo,
<elimina los emparejamientos de una fila consigo misma y los duplicados en orden inverso;<>solo elimina los primeros.
4.2 Todas las combinaciones posibles
Una combinación cruzada construye todos los pares de filas, sin condición de coincidencia. Esto resulta útil cuando la pregunta pide posibilidades, como todas las combinaciones de talla y color que una tienda podría tener en existencias.
Construye la lista de combinaciones
sizes contiene S, M y L. colors contiene Red y Blue.
SELECT s.size, c.color
FROM sizes s
CROSS JOIN colors c;
Los seis pares son (S, Red), (S, Blue), (M, Red), (M, Blue), (L, Red) y (L, Blue). Cada talla aparece junto a ambos colores. Estas son las filas del resultado; su orden de presentación no está garantizado sin ORDER BY.
Para dos entradas, multiplica sus números de filas. Tres tallas y dos colores dan seis filas. Con una tercera tabla que contiene cuatro opciones, el resultado tiene 24 filas. Si alguna entrada está vacía, no puede formarse ninguna combinación completa y el resultado tiene cero filas.
Empieza con una cuadrícula completa para informes
Los registros de ventas solo muestran las combinaciones que se produjeron. Para mostrar cada tienda en cada mes, forma primero una cuadrícula con stores CROSS JOIN months. Después, utiliza una combinación izquierda para incorporar los registros de ventas coincidentes:
SELECT s.store_id, m.month, x.total
FROM stores s
CROSS JOIN months m
LEFT JOIN sales x
ON x.store_id = s.store_id
AND x.month = m.month;
La cuadrícula conserva un par tienda–mes aunque no haya ventas, con NULL en x.total. Ambas partes de la clave importan: comparar solo la tienda incorporaría también las ventas de esa tienda de otros meses. La combinación cruzada define qué combinaciones debe mostrar el informe, y la combinación izquierda proporciona los datos disponibles sobre ellas.
Detecta una combinación cruzada no intencionada
FROM customers, orders sin una condición de combinación genera 16 pares a partir de los cuatro clientes y los cuatro pedidos. Ana se empareja con sus propios pedidos, con el pedido de Ben y con el pedido de invitado. Lo mismo sucede con cada cliente. Eso solo resulta útil si realmente se desean todas las combinaciones cliente–pedido.
Un número elevado de filas es una pista, pero examina también los emparejamientos. Con 1000 clientes y 1000 productos, una combinación cruzada intencionada genera 1 000 000 de filas. Una combinación con una condición incorrecta pero selectiva también puede devolver un resultado menor e incorrecto. Compara el recuento y el significado de cada par con la pregunta.
Reconoce las formas equivalentes
CROSS JOIN, una combinación mediante comas sin condición de coincidencia y una combinación interna con ON 1 = 1 conservan todos los pares. SQLite y MySQL también aceptan un JOIN simple sin ON y lo tratan como una combinación cruzada; PostgreSQL exige ON o USING para una combinación simple. Escribe CROSS JOIN cuando quieras todas las combinaciones.
DISTINCT elimina las filas seleccionadas idénticas, no las relaciones incorrectas. Si una combinación cruzada accidental empareja a Ana con el pedido de Ben, esos valores siguen formando una fila distinta. Corrige la condición ausente en lugar de ocultar parte de la salida repetida.
Puntos clave
- Una combinación cruzada devuelve todas las combinaciones; multiplica los números de filas de entrada.
- Una entrada vacía hace que el producto cartesiano esté vacío.
- Una combinación cruzada puede crear una cuadrícula completa para una combinación izquierda posterior.
- Una condición de coincidencia ausente puede crear una combinación cruzada accidental.
DISTINCTno elimina los emparejamientos incorrectos.
5Tablas intermedias y rutas más largas
Algunos informes necesitan una ruta por varias tablas para reunir los datos solicitados. Las filas de inscripción vinculan estudiantes con cursos, y las líneas de pedido vinculan pedidos con productos. Sigue una clave cada vez, lleva la cuenta de lo que representa cada fila de salida y elige qué vínculos son obligatorios. Una combinación izquierda al principio de una cadena puede perder sus filas sin coincidencia en un paso posterior, por lo que toda la ruta debe conservar los registros que necesita el informe.
5.1 Seguir un vínculo muchos a muchos
Un estudiante puede cursar varios cursos y un curso puede tener varios estudiantes. Una tabla intermedia registra estos vínculos muchos a muchos como pares individuales. También se llama tabla puente, de enlace o de asociación.
Lee un vínculo por fila
Los datos de ejemplo contienen los estudiantes 1 Mia, 2 Noah y 3 Omar; los cursos 10 Algebra, 20 Biology y 30 Chemistry; y los pares de inscripción (1, 10), (1, 20) y (2, 10).
| student_id | course_id |
|---|---|
| 1 | 10 |
| 1 | 20 |
| 2 | 10 |
El estudiante 1 aparece dos veces porque Mia cursa dos cursos. El curso 10 aparece dos veces porque Algebra tiene dos estudiantes. Ninguna columna tiene que ser única por sí sola. El par puede formar una clave primaria compuesta, PRIMARY KEY (student_id, course_id), que impide inscribir al mismo estudiante dos veces en el mismo curso.
Un vínculo puede tener sus propios datos. enrolled_on pertenece a la inscripción porque describe cuándo un estudiante concreto se incorporó a un curso concreto. Del mismo modo, order_items.quantity describe qué cantidad de un producto concreto pertenece a un pedido concreto.
Atraviesa la tabla intermedia con dos combinaciones
SELECT s.name, c.title
FROM students s
JOIN enrollments e ON e.student_id = s.student_id
JOIN courses c ON c.course_id = e.course_id;
La primera condición incorpora las filas de inscripción de cada estudiante. La segunda sustituye la referencia al curso de cada inscripción por datos de la tabla de cursos. El resultado completo es (Mia, Algebra), (Mia, Biology) y (Noah, Algebra). Cada fila representa una inscripción.
No hay ninguna clave que vincule estudiantes con cursos en las tablas de los extremos. Comparar s.student_id = c.course_id compararía identificadores sin relación y omitiría los datos de inscripción. La tabla intermedia proporciona la relación.
La misma ruta funciona en ambas direcciones. Añade WHERE c.title = 'Algebra' para obtener (Mia, Algebra) y (Noah, Algebra). Añade en su lugar WHERE s.name = 'Mia' para obtener (Mia, Algebra) y (Mia, Biology). Los vínculos siguen siendo los mismos; el filtro selecciona cuáles responden a la pregunta.
Incluye personas o cursos sin vínculos
Empieza por el lado que debe conservarse. students s LEFT JOIN enrollments e ON e.student_id = s.student_id conserva a Omar con NULL en las columnas de inscripción. Para mostrar los títulos de los cursos y conservarlo, la combinación posterior de inscripciones con cursos también debe conservar la inscripción ausente.
Para encontrar cursos que nadie cursa, utiliza el lado de cursos y una anticombinación:
SELECT c.title
FROM courses c
LEFT JOIN enrollments e ON e.course_id = c.course_id
WHERE e.student_id IS NULL;
Esto devuelve (Chemistry). En una inscripción coincidente real, student_id forma parte de la clave primaria y no puede ser NULL, por lo que la prueba identifica el vínculo ausente.
Almacena una relación por fila de la tabla intermedia. Una lista de texto como «10,20» en un campo de estudiante no puede compararse por igualdad con los identificadores individuales de curso 10 y 20. Los pares separados permiten que cada condición de combinación compare una referencia con una clave.
Puntos clave
- Una fila de la tabla intermedia registra un par y puede contener datos sobre esa relación.
- Las dos claves foráneas pueden formar una clave compuesta que impida los pares duplicados.
- Dos combinaciones conectan las tablas de los extremos a través de la tabla intermedia.
- Empieza por el extremo que debe conservarse al buscar relaciones ausentes.
5.2 Una ruta por cuatro tablas
Una combinación más larga sigue la misma regla que una de dos tablas: incorpora la siguiente tabla mediante una condición con sentido. Antes de escribir la consulta, traza las claves y decide qué debe representar una fila de resultado.
Añade los datos detallados de la tienda
| product_id | name | price |
|---|---|---|
| 1 | Mug | 8,00 |
| 2 | Pen | 1,50 |
| 3 | Notebook | 4,25 |
| 4 | Stapler | 12,00 |
Las líneas de pedido (order_id, product_id, quantity) son (101, 1, 2), (101, 2, 4), (102, 3, 6), (103, 1, 6), (103, 2, 8) y (104, 2, 10). Cada línea vincula un pedido con un producto y registra una cantidad.
Para la pregunta «¿Qué compró cada cliente?», sigue customers → orders → order_items → products. Las claves de la ruta son el identificador del cliente, el del pedido y el del producto. Cuatro tablas en esta cadena requieren tres vínculos.
Incorpora una tabla nueva cada vez
SELECT c.name, o.order_id, p.name AS product,
oi.quantity, oi.quantity * p.price AS line_total
FROM customers c
JOIN orders o ON o.customer_id = c.customer_id
JOIN order_items oi ON oi.order_id = o.order_id
JOIN products p ON p.product_id = oi.product_id
ORDER BY o.order_id, p.product_id;
Cada ON hace referencia a la tabla recién introducida y a otra que ya está disponible. Los productos se incorporan a través de las líneas de pedido, no directamente a través de los clientes. El resultado es:
| name | order_id | product | quantity | line_total |
|---|---|---|---|---|
| Ana | 101 | Mug | 2 | 16,00 |
| Ana | 101 | Pen | 4 | 6,00 |
| Ana | 102 | Notebook | 6 | 25,50 |
| Ben | 103 | Mug | 6 | 48,00 |
| Ben | 103 | Pen | 8 | 12,00 |
La primera combinación excluye el pedido de invitado 104 porque su referencia de cliente es NULL. Los tres pedidos restantes contienen cinco líneas, por lo que el resultado final tiene cinco filas. Para el pedido 101, dos tazas cuestan 16,00 y cuatro bolígrafos cuestan 6,00, lo que coincide con su total de pedido de 22,00.
Comprende qué cuenta una fila
Una fila de resultado representa una línea de pedido. Ana y el pedido 101 aparecen dos veces porque ese pedido tiene dos productos. Por tanto, es normal que se repitan los nombres de los clientes. Contar estas filas cuenta líneas, no clientes ni pedidos distintos.
Un filtro puede hacer referencia a cualquier tabla combinada. Añadir WHERE p.name = 'Pen' antes de ORDER BY conserva (Ana; 101; Pen; 4; 6,00) y (Ben; 103; Pen; 8; 12,00). Ningún filtro de producto puede recuperar el pedido de invitado ya excluido en el vínculo con el cliente.
Mantén visible cada vínculo
En una cadena de combinaciones internas, puede cambiar el orden escrito de las tablas sin cambiar las combinaciones coincidentes, siempre que cada condición haga referencia únicamente a tablas ya introducidas. Empezar por el tema del informe y seguir sus claves suele ser lo más fácil de leer.
Una condición ausente puede multiplicar un resultado intermedio en SQLite o MySQL, que aceptan un JOIN simple sin ON. PostgreSQL y SQL Server rechazan esa sintaxis. Una condición ausente en una consulta mediante comas también puede generar todas las combinaciones en ese paso.
A veces, una tabla desempeña dos papeles. Un informe de vuelos puede combinar airports como dep mediante dep.code = f.from_code y de nuevo como arr mediante arr.code = f.to_code. Los alias distintos dan a los datos de salida y llegada lugares separados en el resultado.
Puntos clave
- Añade una condición de combinación por cada vínculo de la ruta entre tablas.
- Cada
ONpuede utilizar la tabla nueva y las tablas ya introducidas. - Identifica qué representa una fila de salida antes de contar o sumar valores.
- Una tabla puede aparecer con distintos alias cuando el informe necesita diferentes papeles.
5.3 Conservar las filas opcionales a lo largo de una cadena
Una combinación izquierda conserva filas en un paso. Las combinaciones y los filtros posteriores siguen actuando sobre el resultado de ese paso. Para conservar una fila padre sin coincidencia a lo largo de una ruta más larga, sigue lo que sucede con sus columnas completadas con NULL en cada etapa.
Observa dónde desaparece una fila conservada
SELECT c.name, o.order_id, oi.product_id
FROM customers c
LEFT JOIN orders o ON o.customer_id = c.customer_id
JOIN order_items oi ON oi.order_id = o.order_id;
El primer paso genera cinco filas: los dos pedidos de Ana, el pedido de Ben y una fila completada con NULL para Chloe y otra para Dev. En el siguiente paso, los valores de o.order_id de Chloe y Dev son NULL. No pueden satisfacer la igualdad con una clave de línea de pedido, por lo que la combinación interna los elimina. La consulta devuelve cinco filas de líneas de pedido y pierde a ambos clientes sin pedidos.
Conserva la ruta opcional
SELECT c.name, o.order_id, oi.product_id
FROM customers c
LEFT JOIN orders o ON o.customer_id = c.customer_id
LEFT JOIN order_items oi ON oi.order_id = o.order_id;
Ahora la segunda combinación conserva también esas filas completadas con NULL. El resultado contiene (Ana, 101, 1), (Ana, 101, 2), (Ana, 102, 3), (Ben, 103, 1), (Ben, 103, 2), (Chloe, NULL, NULL) y (Dev, NULL, NULL): siete filas.
Cuando las combinaciones posteriores dependen de las columnas de una tabla opcional, normalmente deben seguir siendo izquierdas para conservar las parejas ausentes. Una combinación interna posterior sobre las columnas de una tabla obligatoria tiene otra función, así que examina la dependencia real de cada condición.
Sigue la misma regla a través de una tabla intermedia
SELECT s.name, c.title
FROM students s
LEFT JOIN enrollments e ON e.student_id = s.student_id
LEFT JOIN courses c ON c.course_id = e.course_id;
Esto devuelve (Mia, Algebra), (Mia, Biology), (Noah, Algebra) y (Omar, NULL). Convertir la última combinación en interna elimina a Omar porque su inscripción ausente no puede coincidir con ningún curso.
Los paréntesis ofrecen otra forma de expresar la agrupación: students s LEFT JOIN (enrollments e JOIN courses c ON c.course_id = e.course_id) ON e.student_id = s.student_id. Las coincidencias inscripción–curso forman el grupo opcional; la combinación externa incorpora ese grupo a cada estudiante y conserva a Omar.
Comprueba los filtros posteriores y la dirección de la combinación
Añadir WHERE c.title = 'Algebra' a la consulta de estudiantes que utiliza solo combinaciones izquierdas deja únicamente a Mia y Noah en Algebra. La comparación es desconocida para el título de curso NULL de Omar. Esto responde a «¿Quién cursa Algebra?», pero ya no responde a «Muestra todos los estudiantes y sus cursos». Una prueba IS NULL se comporta de otra forma porque acepta deliberadamente un valor ausente.
Una combinación derecha posterior vuelve a cambiar el lado conservado: conserva la tabla derecha recién añadida y pueden desaparecer las filas anteriores sin coincidencia. Coloca primero la tabla que debe conservarse e incorpora las rutas opcionales con combinaciones izquierdas cuando eso exprese el informe con claridad.
Construye y examina la consulta añadiendo una combinación cada vez. Anota tanto el número de filas como las claves que permanecen. Una disminución del recuento puede revelar la pérdida de filas sin coincidencia; un aumento inesperado puede revelar que falta una parte de la clave. Algunos recuentos no cambian cuando se pierden y multiplican filas a la vez, así que examina también claves representativas.
Puntos clave
- Cada combinación actúa sobre el resultado construido hasta ese momento.
- Una combinación interna a través de la clave NULL de una tabla opcional elimina las filas sin coincidencia.
- Mantén opcionales los vínculos dependientes posteriores cuando deban conservarse sus filas ausentes.
- Una comparación
WHEREposterior todavía puede eliminar filas conservadas por combinaciones izquierdas. - Examina el recuento y las claves conservadas después de cada paso.
6Recuentos y resultados fiables
Los valores repetidos suelen ser una consecuencia correcta de una combinación, pero pueden hacer que los recuentos y las sumas de un informe sean incorrectos. Sigue un total de pedido mientras las filas de detalle lo repiten, elige la identidad adecuada para contar y distingue un uso útil de DISTINCT de un error de combinación oculto. Después, comprueba el informe frente a las coincidencias previstas, las claves completas, el comportamiento de NULL y la coherencia de los formatos de clave antes de dar por válida una salida que parece plausible.
6.1 Contar y sumar en el nivel adecuado
Una combinación puede ser correcta mientras que una agregación sobre su resultado es incorrecta. La pregunta clave es qué representa una fila después de la combinación. Un valor almacenado una vez por pedido puede aparecer varias veces en una lista de líneas de pedido.
Sigue un total de pedido repetido
Ana tiene el pedido 101 por 22,00 y el pedido 102 por 25,50. Sumar los dos pedidos da 47,50. El pedido 101 tiene dos líneas, por lo que combinar con order_items repite 22,00 dos veces; el pedido 102 tiene una línea. Sumar los valores repetidos da 69,50.
SELECT c.customer_id, c.name, SUM(o.total) AS spent
FROM customers c
JOIN orders o ON o.customer_id = c.customer_id
GROUP BY c.customer_id, c.name;
GROUP BY reúne las filas de cada cliente y SUM suma los valores de ese grupo. Esta consulta devuelve (1; Ana; 47,50) y (2; Ben; 60,00). Añadir la combinación con líneas de pedido antes de agrupar inflaría el total de Ana a 69,50 y el de Ben a 120,00. Los totales de ambos clientes pasarían a ser 189,50 en lugar de 107,50.
Para los cuatro pedidos, incluido el pedido de invitado 104, combinar los pedidos directamente con sus líneas hace que SUM(o.total) devuelva 204,50 en lugar de 122,50. Esta multiplicación de filas por coincidencias múltiples se debe al vínculo uno a muchos, no a un error de sintaxis.
Suma los datos en el nivel en el que se almacenan
Para los totales de pedido, suma los pedidos sin añadir la tabla de detalle. Para un total de importes de línea, calcula el valor de cada línea:
SELECT SUM(oi.quantity * p.price) AS sales
FROM order_items oi
JOIN products p ON p.product_id = oi.product_id;
Los seis importes de línea son 16,00; 6,00; 25,50; 48,00; 12,00 y 15,00. Suman 122,50, el total de los cuatro pedidos. Cada producto de cantidad por precio pertenece a una línea, por lo que se suma una vez.
Cuenta las coincidencias reales
Después de combinar clientes con pedidos y líneas, Ana ocupa tres filas. COUNT(*) cuenta esas líneas; COUNT(DISTINCT o.order_id) cuenta sus dos pedidos distintos.
Después de una sola combinación izquierda de clientes con pedidos, COUNT(*) cuenta una fila completada con NULL para Chloe y otra para Dev. Cuenta en su lugar la clave del pedido opcional:
SELECT c.customer_id, c.name, COUNT(o.order_id) AS orders
FROM customers c
LEFT JOIN orders o ON o.customer_id = c.customer_id
GROUP BY c.customer_id, c.name;
Esto devuelve (1, Ana, 2), (2, Ben, 1), (3, Chloe, 0) y (4, Dev, 0). COUNT(column) ignora los valores NULL; COUNT(*) cuenta filas.
Dos lados muchos se multiplican entre sí
Si un cliente tiene tres pedidos y dos incidencias, combinar ambas tablas hijas de forma independiente con ese cliente genera seis filas. Cada pedido se empareja con cada incidencia. Los recuentos simples de cualquiera de las claves hijas pasan a ser seis. Cuenta las claves hijas distintas para obtener tres y dos, o calcula los totales de las tablas hijas por separado.
DISTINCT c.customer_id, c.name resulta útil para una lista de clientes sin duplicados. Mantener la clave evita fusionar clientes distintos que comparten nombre. No corrige una condición de combinación ausente. SUM(DISTINCT o.total) tampoco es seguro: fusiona dos pedidos distintos que casualmente cuestan el mismo importe.
Puntos clave
- Las combinaciones uno a muchos repiten los valores de la tabla padre; suma cada dato en el nivel en el que se almacena.
COUNT(*)cuenta filas;COUNT(column)omite los NULL.COUNT(DISTINCT key)cuenta identidades distintas que no son NULL después de la multiplicación de filas.- Dos combinaciones independientes con el lado muchos pueden multiplicarse entre sí.
SUM(DISTINCT amount)puede fusionar registros distintos con importes iguales.- Mantén una clave identificadora en una lista de entidades sin duplicados.
6.2 Comprobar las coincidencias antes de dar por válido un informe
Una consulta puede ejecutarse y aun así describir relaciones incorrectas. Antes de utilizar el resultado de una combinación, predice qué debe conservarse, cuántas veces debe aparecer cada clave y qué debe significar una fila de resultado.
Predice el número de filas
Si la referencia de cliente de un pedido coincide con una clave única de cliente, cada pedido tiene como máximo un cliente como pareja. Por tanto, una combinación interna devuelve como máximo una fila por pedido. En los datos de la tienda, tres de los cuatro pedidos tienen cliente, por lo que la combinación interna cliente–pedido devuelve tres filas.
Desde el lado del cliente, una combinación izquierda devuelve los tres pares coincidentes más una fila para Chloe y otra para Dev: cinco filas. Una combinación cruzada de los cuatro clientes y los cuatro pedidos da 16. Estas predicciones proporcionan comprobaciones distintas para cada tipo de combinación; el número de tablas por sí solo no determina el recuento.
Investiga la forma de un resultado incorrecto
| Indicio | Qué examinar |
|---|---|
| Cada fila izquierda se empareja con cada fila derecha | Una condición ausente o siempre verdadera |
| No hay coincidencias o se emparejan entidades sin relación | Columnas incorrectas o valores de clave incompatibles |
| Un registro lógico tiene varias parejas | Una clave incompleta, una clave de búsqueda duplicada o un vínculo uno a muchos esperado |
| Desaparecen las filas padre sin hijas | Una combinación interna o un filtro sobre el lado opcional en un punto posterior de la consulta |
Comparar solo store_id cuando los registros se identifican mediante (store_id, month) mezcla meses distintos. Compara todos los componentes con AND. Una consulta que funciona por casualidad mientras una tienda tiene un mes puede fallar en cuanto se carga un segundo mes.
Distingue los valores ausentes de las claves incorrectas
Con la igualdad habitual, las claves NULL no coinciden, ni siquiera NULL con NULL. Combinar pedidos consigo mismos por customer_id da cuatro pares de los dos pedidos de Ana y uno del pedido de Ben, para un total de cinco filas. El pedido de invitado no aporta ninguna. Se necesita una combinación externa cuando debe conservarse una fila con una referencia ausente.
Los valores de búsqueda duplicados multiplican solo las coincidencias de esos valores. Si un código de país aparece dos veces en una tabla de búsqueda, cada cliente con ese código obtiene dos filas como pareja. Los códigos que aparecen una vez siguen dando una pareja. Examina una tabla de búsqueda que debería ser única con:
SELECT code, COUNT(*) AS copies
FROM countries
GROUP BY code
HAVING COUNT(*) > 1;
GROUP BY reúne las filas de cada código; HAVING conserva los grupos cuyo recuento supera uno. Cargar dos veces toda la tabla de búsqueda duplicaría las filas de cada cliente coincidente.
Examina también los tipos y formatos de las claves. El texto «0042» y el número 42 pueden producir comportamientos distintos según la base de datos: ninguna coincidencia, un error de tipo o una conversión automática. SQLite puede relacionar una columna TEXT que contiene «0042» con una columna INTEGER que contiene 42. Utiliza tipos y formatos de clave coherentes, o una conversión explícita elegida según el significado deseado.
Repasa los requisitos del informe
Pregúntate qué tabla debe conservar todas sus filas. Traza su ruta completa de claves y comprueba cada condición con el esquema. Decide por qué cada vínculo es interno o externo y después comprueba si cada filtro pertenece a la búsqueda de coincidencias o debe aplicarse después. Compara los números de filas tras cada paso y examina una fila coincidente conocida, una sin coincidencia y otra con varias parejas. Por último, comprueba que cada recuento y suma mide el tipo de registro deseado.
Puntos clave
- Predice los recuentos a partir de la relación y del tipo de combinación.
- Comprueba todos los componentes de una clave compuesta.
- La igualdad habitual nunca considera que las claves NULL coincidan.
- Las claves de búsqueda duplicadas multiplican las coincidencias afectadas.
- Mantén tipos y formatos coherentes en las claves vinculadas.
- Comprueba las identidades conservadas, además de los totales y los números de filas.
Ejemplos de JOIN SQL
1De los vínculos del esquema a las filas combinadas
10 pasos
- 1IntroducciónEmpieza por la pregunta del informe
Un informe necesita nombres de clientes junto a totales de pedidos, pero esos datos se guardan en tablas distintas. Una combinación reúne las filas relacionadas.
Primero encuentra el vínculo de claves. Después imagina los pares que permite. Este orden te ayuda a predecir el resultado antes de escribir SQL: un nombre puede repetirse porque tiene varios pedidos coincidentes, y una fila puede desaparecer porque no tiene ninguno.
- 2EjemploLee las claves de clientes y pedidos
Los clientes son 1 Ana, 2 Ben, 3 Chloe y 4 Dev. Los pedidos 101 y 102 hacen referencia al cliente 1; el pedido 103 hace referencia al cliente 2. El pedido 104 es un pedido de invitado con una referencia de cliente NULL.
El vínculo es
orders.customer_id→customers.customer_id. El número de pedido identifica una compra, mientras que la referencia de cliente identifica a quién pertenece. Comparar los dos tipos distintos de identificador no expresaría esa pertenencia. - 3ExplicaciónColoca la referencia en el lado muchos
Un cliente puede realizar varios pedidos. Cada pedido almacena una referencia de cliente, por lo que
orderses el lado muchos del vínculo.En un vínculo uno a uno, esa referencia también es única. En los vínculos muchos a muchos, como los de estudiantes que cursan cursos, una tabla intermedia registra los pares. Estas estructuras te indican qué ruta debe seguir un informe y dónde puede haber varias parejas.
- 4DesafíoEncuentra la ruta que falta
Necesitas los productos que compró cada cliente. El esquema vincula customers con orders, orders con order_items y order_items con products. ¿Puedes omitir order_items y comparar directamente el identificador de pedido con el de producto?
---reveal---
No. Esos identificadores identifican cosas distintas. Sigue customers → orders → order_items → products. Cada fila de order_items registra un producto en un pedido concreto y proporciona el vínculo que falta en la comparación directa.
- 5EjemploForma los primeros pares
Aplica
o.customer_id = c.customer_id. El pedido 101 coincide con Ana porque ambos valores de cliente son 1. El pedido 102 forma otro par con Ana y el pedido 103 coincide con Ben.Los pares del resultado son (Ana, 101), (Ana, 102) y (Ben, 103). Chloe y Dev no tienen parejas. El pedido de invitado 104 tiene una clave de cliente NULL, por lo que su condición de igualdad es desconocida y no proporciona ninguna coincidencia.
- 6Idea claveUna línea por cada coincidencia
Imagina una línea entre cada fila de cliente y cada fila de pedido que coincide con ella. Cada línea se convierte en una fila de resultado. Ana tiene dos líneas, por lo que su nombre aparece dos veces.
Esta representación también funciona cuando las claves se repiten en ambos lados: dos filas izquierdas y tres derechas con una clave generan seis líneas. Los círculos superpuestos no pueden mostrar esos emparejamientos individuales ni explicar cómo una combinación llega a tener más filas que cualquiera de las entradas.
- 7ConsejoIndica de dónde procede una columna
Asigna alias a las referencias de tabla, como
customers cyorders o. Escribec.namepara el nombre del cliente yo.totalpara el total del pedido.Ambas entradas tienen
customer_id. ConJOIN ... ON, seleccionar solo ese nombre es ambiguo; cualifícalo comoc.customer_iduo.customer_id.SELECT *incluye las siete columnas de entrada, incluidas ambas copias de la clave. Seleccionar solo las columnas necesarias reduce la anchura del informe. - 8ExplicaciónLa búsqueda de coincidencias precede al filtrado
Lee el orden lógico como combinaciones, después
WHERE, despuésSELECTy despuésORDER BY. Un filtro puede utilizar una columna combinada que el informe no muestra.Por ejemplo, filtrar los pares cliente–pedido por
c.city = 'Denver'conserva los dos pedidos de Ana. Chloe también vive en Denver, pero una combinación interna no produjo ninguna fila para ella. Un filtro posterior no puede recuperar una fila excluida durante la búsqueda de coincidencias. - 9DesafíoPredice un resultado con claves repetidas
Una tabla de inscripciones tiene dos filas con la clave de ubicación 8. Una tabla de búsqueda de ubicaciones tiene por accidente tres filas con la clave 8. No hay otras claves. ¿Cuántas filas devuelve su combinación interna por igualdad? ¿Seleccionar solo la clave cambia ese recuento?
---reveal---
Devuelve seis filas: cada inscripción coincide con las tres filas de búsqueda. Seleccionar solo la clave reduce la anchura de cada fila, pero mantiene las seis filas salvo que una operación independiente como DISTINCT elimine los valores seleccionados repetidos.
- 10RepasoLee la relación y después las filas
Encuentra la ruta de claves antes de elegir las columnas de salida. Los vínculos uno a muchos pueden repetir valores de la tabla padre; una tabla intermedia contiene un vínculo muchos a muchos.
Para cada par, pregúntate si la condición es verdadera. Después comprueba cuántas parejas tiene cada fila. Utiliza alias para distinguir los orígenes de las columnas y, al explicar el resultado, mantén la búsqueda de coincidencias separada del filtrado y la ordenación posteriores.
2Construye e interpreta combinaciones internas
11 pasos
Guarda esta unidad para seguir cada Lección Interactiva paso a paso.
- 1IntroducciónExige una pareja en ambos lados
- 2EjemploEscribe la condición de clave
- 3EjemploLee las tres filas de salida
- 4DesafíoAñade un filtro de clientes
- 5ConsejoCompara la identidad completa
- 6ExplicaciónUtiliza una abreviatura para nombres compartidos
- 7DesafíoObserva qué cambia NATURAL
- 8ConexiónLee una combinación antigua mediante comas
- 9EjemploRelaciona los precios con intervalos
- 10DesafíoPredice un solapamiento y un hueco
- 11RepasoLee la condición que hay tras la sintaxis
3Conserva las filas sin coincidencia sin perderlas por los filtros
14 pasos
Guarda esta unidad para seguir cada Lección Interactiva paso a paso.
- 1IntroducciónDecide qué registros deben permanecer
- 2EjemploConserva todos los clientes
- 3DesafíoCambia el lado que debe conservarse
- 4ConsejoComprueba la clave de la pareja ausente
- 5ExplicaciónLee una combinación derecha como una izquierda invertida
- 6EjemploConserva los registros sin coincidencia de ambos lados
- 7DesafíoConcilia dos nuevas listas de claves
- 8ConsejoComprueba la compatibilidad de las combinaciones externas
- 9EjemploRestringe los pedidos coincidentes en ON
- 10EjemploMueve la prueba de fecha a WHERE
- 11DesafíoFiltra deliberadamente la tabla izquierda
- 12ConexiónDecide qué significa un cero mostrado
- 13DesafíoConserva todos los departamentos con solo su actividad reciente
- 14RepasoMantén separadas la búsqueda de coincidencias y el filtrado
4Sigue a los responsables y genera combinaciones
11 pasos
Guarda esta unidad para seguir cada Lección Interactiva paso a paso.
- 1IntroducciónElige papeles o posibilidades
- 2EjemploLee las relaciones de supervisión
- 3DesafíoConserva a la persona de la parte superior
- 4ConexiónSube un nivel más
- 5EjemploForma los pares de compañeros una sola vez
- 6EjemploGenera seis posibilidades de camiseta
- 7DesafíoPredice el efecto de otra entrada
- 8Idea claveCrea una cuadrícula completa para informes
- 9ConsejoCorrige la condición ausente
- 10DesafíoRelaciona las reglas de pares con el tamaño del producto
- 11RepasoDa un propósito claro a cada emparejamiento
5Sigue una tabla intermedia y conserva una ruta más larga
14 pasos
Guarda esta unidad para seguir cada Lección Interactiva paso a paso.
- 1IntroducciónPlanifica la ruta hasta los datos
- 2EjemploLee los vínculos de inscripción
- 3EjemploAtraviesa la tabla intermedia en dos pasos
- 4DesafíoEncuentra un curso sin estudiantes
- 5ExplicaciónAmplía la ruta de la tienda
- 6EjemploDesglosa el pedido 101 en líneas
- 7EjemploLee las filas de compra restantes
- 8DesafíoElige el vínculo con productos
- 9EjemploObserva cómo una combinación posterior elimina clientes
- 10EjemploConserva la fila ausente en el siguiente paso
- 11DesafíoConserva al estudiante sin inscripción
- 12ConexiónForma un grupo opcional explícitamente
- 13DesafíoComprueba el filtro del informe terminado
- 14RepasoExamina toda la ruta
6Corrige los totales inflados y comprueba el resultado
12 pasos
Guarda esta unidad para seguir cada Lección Interactiva paso a paso.
- 1IntroducciónIdentifica qué se está midiendo
- 2EjemploObserva cómo se repite un total de pedido
- 3ConsejoSuma un dato en su propio nivel
- 4DesafíoDescarta una corrección basada en el importe
- 5EjemploCuenta una identidad o una fila de relleno
- 6Idea claveDos listas hijas se multiplican
- 7ExplicaciónPredice el tamaño antes de ejecutar
- 8DesafíoLocaliza una clave incompleta
- 9ConsejoComprueba la tabla de búsqueda y el formato de la clave
- 10EjemploNo relaciones claves ausentes por igualdad
- 11DesafíoElige una medida correcta para el informe
- 12RepasoComprueba el significado además de los recuentos
Ejercicios de JOIN SQL
Set 1: Conserva las filas sin coincidencia y sigue las rutas entre tablas10 Preguntas de Práctica
Pregunta 1 de 10
Mostrar respuestaOcultar respuesta
Pregunta 2 de 10
invoices contiene (invoice_id, client_id): (301, 9), (302, NULL), (303, 12). clients tiene los identificadores únicos 9 y 12. ¿Qué identificadores de factura se conservan en una combinación interna por identificador de cliente?Mostrar respuestaOcultar respuesta
Pregunta 3 de 10
note puede ser NULL. Después de escritorios LEFT JOIN reservas, ¿qué prueba WHERE encuentra solo escritorios sin reserva?Mostrar respuestaOcultar respuesta
= NULL no puede seleccionar reservas ausentes.Pregunta 4 de 10
departments d LEFT JOIN employees e ON e.department_id = d.department_id. ¿Dónde debe ir e.active = 1?Mostrar respuestaOcultar respuesta
Pregunta 5 de 10
Mostrar respuestaOcultar respuesta
Pregunta 6 de 10
memberships(member_id, club_id) registra la incorporación de un socio a un club. ¿Dónde pertenece joined_on, la fecha de esa afiliación concreta?Mostrar respuestaOcultar respuesta
Pregunta 7 de 10
clients → invoices → lines → services. Cada flecha es un vínculo de claves y cada fila de servicio es única por su identificador de servicio. ¿Qué representa una fila del resultado detallado cuando todos los vínculos coinciden?Mostrar respuestaOcultar respuesta
Pregunta 8 de 10
Mostrar respuestaOcultar respuesta
Pregunta 9 de 10
SUM(total) y SUM(DISTINCT total)?Mostrar respuestaOcultar respuesta
Pregunta 10 de 10
code. Algunos clientes combinados aparecen dos veces. ¿Qué consulta de diagnóstico encuentra los códigos de búsqueda repetidos?Mostrar respuestaOcultar respuesta
Set 2: Lee las relaciones y elige las filas coincidentes10 Preguntas de Práctica
Guarda esta unidad para ver todas las respuestas y practicar cada set.
Pregunta 1 de 10
a tienen la clave 7. Tres filas de la tabla b tienen la clave 7. Son las únicas filas. ¿Cuántas filas devuelve a JOIN b ON a.k = b.k?Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 2 de 10
Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 3 de 10
rentals.customer_ref hace referencia a customers.customer_id. Los alquileres también tienen su propio rental_id. ¿Qué condición ON vincula cada alquiler r con su cliente c?Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 4 de 10
a y b contienen account_id y region. Una combinación natural antes solo compartía account_id; se acaba de añadir region a b. ¿Por qué puede desaparecer un par que antes coincidía?Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 5 de 10
(1, North) y (2, South). Los partidos (match_id, team_id) son (81, 1) y (82, 1). ¿Qué nombres aparecen en un LEFT JOIN de equipos con partidos antes de filtrar?Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 6 de 10
Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 7 de 10
(id, manager_id): (10, NULL), (11, 10), (12, 10). Una autocombinación utiliza a.manager_id = b.manager_id AND a.id < b.id. ¿Qué par de identificadores devuelve?Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 8 de 10
Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 9 de 10
authors(author_id) y books(book_id) están vinculadas por book_authors(author_id, book_id). ¿Qué ruta encuentra los libros de un autor?Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 10 de 10
sales(store_id, month) tiene (6, March) y (6, April). targets(store_id, month) tiene los mismos dos pares, cada uno una vez. Una consulta combina solo por identificador de tienda y devuelve cuatro filas. ¿Qué corrección da un objetivo por venta?Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Set 3: Sigue los filtros, los emparejamientos y los valores repetidos10 Preguntas de Práctica
Guarda esta unidad para ver todas las respuestas y practicar cada set.
Pregunta 1 de 10
ON une una tabla de 4 columnas con una de 3 columnas. ¿Cuál es la anchura de SELECT * antes de eliminar columnas?Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 2 de 10
BETWEEN low AND high. Los intervalos son (0.00, 25.00) y (25.00, 50.00). ¿Cuántas filas de intervalo coincidentes produce el cargo?Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 3 de 10
suppliers s RIGHT JOIN deliveries d ON d.supplier_id = s.supplier_id y selecciona explícitamente s.name, d.delivery_id. ¿Cómo puede conservar los mismos pares con LEFT JOIN?Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 4 de 10
Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 5 de 10
<>. ¿Cuántas filas devuelve y cuántas devolvería <?Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 6 de 10
from_code y to_code, ambos con referencia a airports.code. ¿Cómo debe obtener un informe los nombres de ambos aeropuertos?Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 7 de 10
Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 8 de 10
COUNT(t.task_id) si los identificadores de tarea no pueden ser NULL?Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 9 de 10
COUNT(article_id) y COUNT(DISTINCT award_id)?Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 10 de 10
shipments s LEFT JOIN carriers c mediante una clave de transportista coincidente. Un envío no tiene transportista coincidente y un transportista no tiene envíos. ¿Qué registro sin coincidencia se conserva?Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Set 4: Diagnostica vínculos incompletos y filas ausentes10 Preguntas de Práctica
Guarda esta unidad para ver todas las respuestas y practicar cada set.
Pregunta 1 de 10
workers.supervisor_ref hace referencia a workers.worker_id. Los trabajadores también tienen una columna name. ¿Qué debe vincular el alias de trabajador w con el alias de supervisor s?Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 2 de 10
Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 3 de 10
p con cuentas a por identificador de cuenta. Solo selecciona a.name, p.amount. ¿Debe seleccionarse también el identificador de cuenta para que funcione la combinación?Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 4 de 10
a(id, label) y b(id, label) tienen las filas (1, red), (2, blue) y (1, red), (2, green), respectivamente. ¿Cuántas filas devuelven JOIN ... USING (id) y NATURAL JOIN?Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 5 de 10
AND r.name = 'East' en ON. ¿Qué filas aparecen al seleccionar región y oficina?Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 6 de 10
(id, boss_id): (31, NULL), (32, 31), (33, 32), (34, 32). ¿Qué ternas de identificadores devuelven las combinaciones internas con e.boss_id = m.id y m.boss_id = g.id?Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 7 de 10
customers → orders → order_lines → products es una ruta de claves. Una combinación interna de cuatro tablas utiliza todos los vínculos. ¿Por qué puede aparecer un identificador de pedido en varias filas aunque todas las claves primarias sean únicas?Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 8 de 10
WHERE service.category = 'Repair'. El servicio de A es Repair. ¿Qué permanece?Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 9 de 10
SELECT DISTINCT name y SELECT DISTINCT subscriber_id, name?Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 10 de 10
Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Set 5: Comprueba informes completos cuando cambian las condiciones10 Preguntas de Práctica
Guarda esta unidad para ver todas las respuestas y practicar cada set.
Pregunta 1 de 10
(7,50), (7,60) y (8,50). Una consulta combina socios por la izquierda con afiliaciones y después con clubes. ¿Cuáles son el número total de filas y el valor de club del socio 9?Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 2 de 10
Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 3 de 10
[0.00, 9.00], [10.00, 20.00] y [8.00, 12.00] mediante pruebas BETWEEN inclusivas. Si se elimina el tercer intervalo, ¿cómo cambia la salida de esta tarifa?Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 4 de 10
WHERE a.k IS NULL OR b.k IS NULL?Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 5 de 10
WHERE o.date >= '2026-09-01' OR o.order_id IS NULL. ¿Qué clientes se conservan?Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 6 de 10
Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 7 de 10
groups LEFT JOIN signups JOIN classes con groups LEFT JOIN (signups JOIN classes), utilizando las claves pertinentes. ¿Qué sucede con H?Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 8 de 10
Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 9 de 10
Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
Pregunta 10 de 10
COUNT(*), COUNT(DISTINCT bill_id) y COUNT(DISTINCT case_id)?Mostrar respuestaOcultar respuesta
Guarda esta unidad para ver esta respuesta.
¿Te atascas con una pregunta tuya? Ayuda con Tareas
Términos Clave
A
Alias de tabla
FROM customers c, el alias c permite que la consulta haga referencia al nombre del cliente como c.name.AND en una condición de combinación
Anticombinación
Atributo de una relación
Autocombinación
manager_id y el alias de responsable proporciona el emp_id coincidente.C
Cadena de combinaciones
Cadena de combinaciones internas y externas
Cláusula ON
Cláusula USING
SELECT *.USING (customer_id) expresa la coincidencia de claves de cliente sin escribir ambas referencias de columna.Clave compuesta
Clave de búsqueda duplicada
Clave foránea
Clave primaria
customer_id distingue el registro de un cliente de todos los demás registros de cliente.COALESCE
COALESCE(o.total, 0) muestra cero cuando el total de pedido combinado es NULL, así que elige con cuidado el encabezado de la columna.Combinación
Combinación cruzada
Combinación cruzada accidental
Combinación entre paréntesis
Combinación externa completa
Combinación externa derecha
Combinación externa izquierda
Combinación interna
Combinación mediante comas
FROM y expresa su condición de coincidencia en la cláusula WHERE de la consulta.Combinación natural
Combinación por desigualdad
Conciliación de resultados
Condición de combinación
o.customer_id = c.customer_id empareja el pedido 101, que contiene el identificador de cliente 1, con la fila de cliente cuyo identificador también es 1.COUNT(*)
COUNT(*).COUNT(column)
COUNT(o.order_id) en el grupo de ese cliente.COUNT(DISTINCT key)
Cuadrícula de combinaciones para informes
D
DISTINCT
E
Emparejamiento de una fila consigo misma
Equicombinación
F
Fila completada con valores NULL
Filtro posterior a la combinación
WHERE a las filas construidas por la combinación y puede eliminar tanto filas coincidentes como filas de combinación externa completadas con NULL.WHERE elimina a un cliente sin pedidos, porque la fecha de pedido combinada de ese cliente es NULL.I
Incompatibilidad de formato entre claves
Inscripción (matrícula)
J
Jerarquía
L
Lado conservado
customers c LEFT JOIN orders o, independientemente del número de pedidos.Lado opcional
Línea de pedido
M
Multiplicación de filas por coincidencias múltiples
N
Nivel de agregación
Nombre de columna cualificado
c.customer_id selecciona la clave del lado del cliente cuando ambas tablas combinadas contienen customer_id.P
Par no ordenado
< lo conserva una sola vez.Predicción del número de filas
Producto cartesiano
Prueba IS NULL
o.order_id IS NULL conserva a los clientes sin pedidos; comprobar o.order_id = NULL no conserva ninguna fila.R
Referencia de columna ambigua
JOIN ... ON, seleccionar customer_id sin cualificar falla cuando tanto clientes como pedidos lo proporcionan.Relación muchos a muchos
Relación uno a muchos
Relación uno a uno
Restricción de coincidencia
ON, mientras una combinación externa sigue conservando las filas de entrada que debe conservar.ON conserva todos los clientes, pero incorpora solo los pedidos que cumplen ese límite.Resultado de comparación desconocido
Ruta de combinación
T
Tabla intermedia
V
Vínculo dependiente
Sobre esta unidad
Crea tus propios Materiales de Estudio
Convierte tus notas, diapositivas y documentos en Guías de Estudio, Preguntas de Práctica, Flashcards y 6 herramientas más.