JOIN SQL: combinaciones y relaciones entre tablas

Aprende a combinar datos de tablas relacionadas en SQL. Sigue las claves primarias y foráneas de una tabla a otra, escribe combinaciones internas (INNER JOIN) y conserva las filas sin coincidencia con combinaciones externas izquierdas, derechas y completas (LEFT, RIGHT y FULL OUTER JOIN). Combina una tabla consigo misma, genera todas las combinaciones mediante una combinación cruzada (CROSS JOIN) y responde preguntas sobre relaciones muchos a muchos mediante tablas intermedias y cadenas de tres o más tablas. Por último, aprende a detectar filas duplicadas, totales inflados y filas perdidas, y a comprobar el resultado de una combinación antes de darlo por válido. La mayoría de los ejemplos utilizan una pequeña base de datos de una tienda, con pequeñas tablas adicionales para jerarquías, relaciones muchos a muchos y combinaciones, y cada ejemplo muestra sus filas de resultado reales.

PrincipianteUnidad 5 de 6 del curso Curso de Fundamentos de SQL

Lo que aprenderás

  1. 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 esquema
      Utiliza 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 filas
      Describe 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.
  2. 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 ON
      Combina 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 intervalo
      Reconoce 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.
  3. 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 JOIN
      Escribe 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 JOIN
      Conserva 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 WHERE
      Explica 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.
  4. 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ón
      Combina 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 cruzada
      Utiliza 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.
  5. 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 intermedia
      Explica 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 consulta
      Planifica 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 combinaciones
      Combina operaciones externas e internas en una cadena sin perder las filas que querías conservar y comprueba cada paso de la cadena.
  6. 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 inflados
      Explica 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álido
      Predice 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.

Guía de estudio de JOIN SQL

6 capítulos

1

Claves 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_idnamecity
1AnaDenver
2BenAustin
3ChloeDenver
4DevBoston
order_idcustomer_idorder_datetotal
10112026-03-0222,00
10212026-03-1525,50
10322026-03-2060,00
104NULL2026-03-2115,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ónQué significaDónde se encuentra el vínculo
Uno a unoCada 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 muchosUna 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 muchosLas 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 WHERE las filtre y SELECT elija las columnas.
  • Utiliza ORDER BY cuando importe el orden de las filas.
2

Escribir 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:

nameorder_idtotal
Ana10122,00
Ana10225,50
Ben10360,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

  • JOIN significa INNER JOIN: se excluyen las filas sin coincidencia de ambos lados.
  • Coloca la relación en ON y 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

  • USING compara las columnas enumeradas con el mismo nombre y muestra cada clave compartida una sola vez.
  • NATURAL JOIN depende 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 sintaxis USING ni NATURAL JOIN.
3

Conservar 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;
nameorder_idtotal
Ana10122,00
Ana10225,50
Ben10360,00
ChloeNULLNULL
DevNULLNULL

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 NULL sobre una clave que no pueda ser NULL en una coincidencia.
  • Una combinación izquierda no conserva una fila derecha sin coincidencia.
  • COALESCE puede 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ónFilas sin coincidencia conservadas
LEFT JOINSolo las de la entrada izquierda
RIGHT JOINSolo las de la entrada derecha
FULL OUTER JOINLas 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ónLugar habitual en una combinación izquierda
Limitar las coincidencias válidas del lado derecho conservando todas las filas izquierdasON
Limitar qué filas izquierdas pertenecen al informeWHERE
Encontrar filas cuya pareja derecha está ausenteWHERE 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

  • ON decide las coincidencias; WHERE filtra las filas del resultado terminado.
  • Coloca una restricción del lado derecho en ON para 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 WHERE elimina las filas completadas con NULL cuando su resultado es desconocido.
  • La prueba IS NULL de una anticombinación se ejecuta deliberadamente después de la combinación.
4

Autocombinaciones 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_idnamemanager_id
1GraceNULL
2Hassan1
3Iris1
4Jamal2
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_id de un empleado con el emp_id del 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.
  • DISTINCT no elimina los emparejamientos incorrectos.
5

Tablas 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_idcourse_id
110
120
210

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_idnameprice
1Mug8,00
2Pen1,50
3Notebook4,25
4Stapler12,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:

nameorder_idproductquantityline_total
Ana101Mug216,00
Ana101Pen46,00
Ana102Notebook625,50
Ben103Mug648,00
Ben103Pen812,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 ON puede 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 WHERE posterior todavía puede eliminar filas conservadas por combinaciones izquierdas.
  • Examina el recuento y las claves conservadas después de cada paso.
6

Recuentos 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
IndicioQué examinar
Cada fila izquierda se empareja con cada fila derechaUna condición ausente o siempre verdadera
No hay coincidencias o se emparejan entidades sin relaciónColumnas incorrectas o valores de clave incompatibles
Un registro lógico tiene varias parejasUna clave incompleta, una clave de búsqueda duplicada o un vínculo uno a muchos esperado
Desaparecen las filas padre sin hijasUna 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

6 Lecciones Interactivas

1

De los vínculos del esquema a las filas combinadas

10 pasos
Lee las claves de la tienda, predice los pares coincidentes y aclara el origen de cada columna.
  1. 1
    Introducció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.

  2. 2
    EjemploLee 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.

  3. 3
    ExplicaciónColoca la referencia en el lado muchos

    Un cliente puede realizar varios pedidos. Cada pedido almacena una referencia de cliente, por lo que orders es 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.

  4. 4
    Desafí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.

  5. 5
    EjemploForma 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.

  6. 6
    Idea 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.

  7. 7
    ConsejoIndica de dónde procede una columna

    Asigna alias a las referencias de tabla, como customers c y orders o. Escribe c.name para el nombre del cliente y o.total para el total del pedido.

    Ambas entradas tienen customer_id. Con JOIN ... ON, seleccionar solo ese nombre es ambiguo; cualifícalo como c.customer_id u o.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.

  8. 8
    ExplicaciónLa búsqueda de coincidencias precede al filtrado

    Lee el orden lógico como combinaciones, después WHERE, después SELECT y después ORDER 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.

  9. 9
    Desafí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.

  10. 10
    RepasoLee 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.

2

Construye e interpreta combinaciones internas

11 pasos
Escribe una consulta completa de coincidencias y después compara abreviaturas y condiciones de intervalo.

Guarda esta unidad para seguir cada Lección Interactiva paso a paso.

  1. 1
    IntroducciónExige una pareja en ambos lados
  2. 2
    EjemploEscribe la condición de clave
  3. 3
    EjemploLee las tres filas de salida
  4. 4
    DesafíoAñade un filtro de clientes
  5. 5
    ConsejoCompara la identidad completa
  6. 6
    ExplicaciónUtiliza una abreviatura para nombres compartidos
  7. 7
    DesafíoObserva qué cambia NATURAL
  8. 8
    ConexiónLee una combinación antigua mediante comas
  9. 9
    EjemploRelaciona los precios con intervalos
  10. 10
    DesafíoPredice un solapamiento y un hueco
  11. 11
    RepasoLee la condición que hay tras la sintaxis
3

Conserva las filas sin coincidencia sin perderlas por los filtros

14 pasos
Elige el lado conservado y sigue ON y WHERE a través de los resultados de combinaciones externas.

Guarda esta unidad para seguir cada Lección Interactiva paso a paso.

  1. 1
    IntroducciónDecide qué registros deben permanecer
  2. 2
    EjemploConserva todos los clientes
  3. 3
    DesafíoCambia el lado que debe conservarse
  4. 4
    ConsejoComprueba la clave de la pareja ausente
  5. 5
    ExplicaciónLee una combinación derecha como una izquierda invertida
  6. 6
    EjemploConserva los registros sin coincidencia de ambos lados
  7. 7
    DesafíoConcilia dos nuevas listas de claves
  8. 8
    ConsejoComprueba la compatibilidad de las combinaciones externas
  9. 9
    EjemploRestringe los pedidos coincidentes en ON
  10. 10
    EjemploMueve la prueba de fecha a WHERE
  11. 11
    DesafíoFiltra deliberadamente la tabla izquierda
  12. 12
    ConexiónDecide qué significa un cero mostrado
  13. 13
    DesafíoConserva todos los departamentos con solo su actividad reciente
  14. 14
    RepasoMantén separadas la búsqueda de coincidencias y el filtrado
4

Sigue a los responsables y genera combinaciones

11 pasos
Utiliza alias de papeles en autocombinaciones y después distingue productos cartesianos intencionados y accidentales.

Guarda esta unidad para seguir cada Lección Interactiva paso a paso.

  1. 1
    IntroducciónElige papeles o posibilidades
  2. 2
    EjemploLee las relaciones de supervisión
  3. 3
    DesafíoConserva a la persona de la parte superior
  4. 4
    ConexiónSube un nivel más
  5. 5
    EjemploForma los pares de compañeros una sola vez
  6. 6
    EjemploGenera seis posibilidades de camiseta
  7. 7
    DesafíoPredice el efecto de otra entrada
  8. 8
    Idea claveCrea una cuadrícula completa para informes
  9. 9
    ConsejoCorrige la condición ausente
  10. 10
    DesafíoRelaciona las reglas de pares con el tamaño del producto
  11. 11
    RepasoDa un propósito claro a cada emparejamiento
5

Sigue una tabla intermedia y conserva una ruta más larga

14 pasos
Sigue las inscripciones y las líneas de compra y conserva las parejas ausentes a través de vínculos dependientes.

Guarda esta unidad para seguir cada Lección Interactiva paso a paso.

  1. 1
    IntroducciónPlanifica la ruta hasta los datos
  2. 2
    EjemploLee los vínculos de inscripción
  3. 3
    EjemploAtraviesa la tabla intermedia en dos pasos
  4. 4
    DesafíoEncuentra un curso sin estudiantes
  5. 5
    ExplicaciónAmplía la ruta de la tienda
  6. 6
    EjemploDesglosa el pedido 101 en líneas
  7. 7
    EjemploLee las filas de compra restantes
  8. 8
    DesafíoElige el vínculo con productos
  9. 9
    EjemploObserva cómo una combinación posterior elimina clientes
  10. 10
    EjemploConserva la fila ausente en el siguiente paso
  11. 11
    DesafíoConserva al estudiante sin inscripción
  12. 12
    ConexiónForma un grupo opcional explícitamente
  13. 13
    DesafíoComprueba el filtro del informe terminado
  14. 14
    RepasoExamina toda la ruta
6

Corrige los totales inflados y comprueba el resultado

12 pasos
Elige el registro adecuado para contar o sumar y después diagnostica problemas de claves y recuentos de filas.

Guarda esta unidad para seguir cada Lección Interactiva paso a paso.

  1. 1
    IntroducciónIdentifica qué se está midiendo
  2. 2
    EjemploObserva cómo se repite un total de pedido
  3. 3
    ConsejoSuma un dato en su propio nivel
  4. 4
    DesafíoDescarta una corrección basada en el importe
  5. 5
    EjemploCuenta una identidad o una fila de relleno
  6. 6
    Idea claveDos listas hijas se multiplican
  7. 7
    ExplicaciónPredice el tamaño antes de ejecutar
  8. 8
    DesafíoLocaliza una clave incompleta
  9. 9
    ConsejoComprueba la tabla de búsqueda y el formato de la clave
  10. 10
    EjemploNo relaciones claves ausentes por igualdad
  11. 11
    DesafíoElige una medida correcta para el informe
  12. 12
    RepasoComprueba el significado además de los recuentos

Ejercicios de JOIN SQL

50 Preguntas de Práctica en 5 sets

Set 1: Conserva las filas sin coincidencia y sigue las rutas entre tablas10 Preguntas de Práctica

Pregunta 1 de 10

Cada activo puede tener como máximo una etiqueta activa y cada etiqueta pertenece como máximo a un activo. ¿Qué relación describe las dos tablas?
  1. Uno a muchos
  2. Muchos a muchos
  3. Uno a uno
  4. Todos los emparejamientos
Mostrar respuestaOcultar respuesta
Respuesta: C
Cada lado permite como máximo una pareja, lo que hace que el vínculo sea uno a uno. Una referencia única al activo en la tabla de etiquetas puede imponer ese límite. Una clave foránea sin unicidad permitiría varias filas de etiqueta para el mismo activo y admitiría un vínculo uno a muchos.

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?
  1. 301 y 303
  2. 301, 302 y 303
  3. Solo 302
  4. Solo 301
Mostrar respuestaOcultar respuesta
Respuesta: A
Las facturas 301 y 303 tienen referencias de cliente con claves de cliente coincidentes, por lo que ambas se conservan. La factura 302 tiene una referencia NULL, y la igualdad con cualquiera de las claves de cliente es desconocida. La presencia de la fila de factura no hace que una combinación interna la conserve sin pareja.

Pregunta 3 de 10

Un escritorio puede tener varias reservas. Los identificadores de reserva no pueden ser NULL, pero note puede ser NULL. Después de escritorios LEFT JOIN reservas, ¿qué prueba WHERE encuentra solo escritorios sin reserva?
  1. r.note IS NULL
  2. r.reservation_id = NULL
  3. r.note IS NOT NULL
  4. r.reservation_id IS NULL
Mostrar respuestaOcultar respuesta
Respuesta: D
Una reserva real siempre tiene un identificador, por lo que un identificador de reserva combinado NULL señala la pareja ausente. Una reserva real puede tener una nota NULL, así que la prueba sobre la nota incluiría también escritorios ocupados. La igualdad con NULL es desconocida, por lo que = NULL no puede seleccionar reservas ausentes.

Pregunta 4 de 10

Un informe debe mostrar todos los departamentos e incorporar solo empleados activos. Empieza con departments d LEFT JOIN employees e ON e.department_id = d.department_id. ¿Dónde debe ir e.active = 1?
  1. Como una condición en WHERE
  2. Como una condición AND adicional en ON
  3. Como la expresión de ORDER BY
  4. Como sustitución de la comparación de claves
Mostrar respuestaOcultar respuesta
Respuesta: B
La prueba de actividad debe limitar las coincidencias válidas de empleados conservando todos los departamentos, por lo que pertenece a ON junto a la condición de clave. Una prueba WHERE eliminaría los departamentos con NULL en las columnas de empleado. Conserva también la comparación de claves, o los empleados activos podrían asociarse a departamentos sin relación.

Pregunta 5 de 10

Un CROSS JOIN combina una tabla de 8 filas con una tabla vacía. ¿Cuántas filas devuelve?
  1. 8
  2. 1
  3. 9
  4. 0
Mostrar respuestaOcultar respuesta
Respuesta: D
No hay ninguna fila de la tabla vacía que pueda emparejarse con cualquiera de las ocho filas, por lo que no existe ningún par completo. Una combinación cruzada multiplica los números de filas de entrada y aquí da cero. Conservar las ocho filas con valores ausentes sería un comportamiento de combinación externa, no de combinación cruzada.

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?
  1. En memberships
  2. En members
  3. En clubs
  4. En una lista de clubes separados por comas
Mostrar respuestaOcultar respuesta
Respuesta: A
La fecha describe el vínculo de un socio con un club, por lo que pertenece a esa fila de afiliación. Un socio puede incorporarse a distintos clubes en fechas distintas. Almacenar un valor joined_on en members no describiría esas relaciones separadas.

Pregunta 7 de 10

Un informe sigue 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?
  1. Un cliente
  2. Una factura
  3. Una línea de factura
  4. Un servicio del catálogo
Mostrar respuestaOcultar respuesta
Respuesta: C
La tabla de líneas proporciona los elementos individuales de una factura, y la tabla de búsqueda de servicios únicos añade datos a cada línea. Un cliente o una factura pueden repetirse en varias líneas. Por tanto, contar las filas de resultado como facturas contaría de más las facturas que contienen más de una línea.

Pregunta 8 de 10

Las sucursales son 1 y 2. La sucursal 1 tiene un trabajo con dos filas de tareas; la sucursal 2 no tiene trabajos. Una cadena utiliza sucursales LEFT JOIN trabajos y después INNER JOIN tareas mediante la clave de trabajo. ¿Cómo cambia el número de filas al convertir la combinación de tareas en LEFT?
  1. Se mantiene en 2.
  2. Aumenta de 2 a 3.
  3. Aumenta de 2 a 4.
  4. Disminuye de 3 a 2.
Mostrar respuestaOcultar respuesta
Respuesta: B
La combinación interna con tareas conserva los dos pares trabajo–tarea, pero elimina la fila de trabajo NULL de la sucursal 2. Una combinación izquierda con tareas conserva esos dos pares y añade una fila completada con NULL para la sucursal 2. No crea dos tareas de relleno para el trabajo ausente; una fila izquierda sin coincidencia obtiene una fila de relleno.

Pregunta 9 de 10

Un proyecto tiene dos facturas, cada una por 40,00. La primera factura tiene dos líneas y la segunda tiene tres. Después de combinar facturas con líneas, ¿cuáles son los valores de SUM(total) y SUM(DISTINCT total)?
  1. 80,00 y 80,00
  2. 200,00 y 80,00
  3. 200,00 y 40,00
  4. 80,00 y 40,00
Mostrar respuestaOcultar respuesta
Respuesta: C
La combinación con líneas repite 40,00 cinco veces, dando 200,00. DISTINCT solo ve un valor de importe, 40,00, aunque dos facturas distintas tengan ese importe. Ninguna suma devuelve el total real de facturas de 80,00; suma los dos registros de factura antes de añadir el detalle de líneas.

Pregunta 10 de 10

Una tabla de búsqueda de regiones debe tener una fila por code. Algunos clientes combinados aparecen dos veces. ¿Qué consulta de diagnóstico encuentra los códigos de búsqueda repetidos?
  1. SELECT code, COUNT(*) FROM regions GROUP BY code HAVING COUNT(*) > 1;
  2. SELECT DISTINCT code FROM regions;
  3. SELECT code, COUNT(*) FROM regions GROUP BY code HAVING COUNT(*) = 1;
  4. SELECT code FROM regions WHERE code IS NULL;
Mostrar respuestaOcultar respuesta
Respuesta: A
Agrupar por código cuenta las filas de búsqueda para cada valor, y HAVING conserva los códigos que aparecen más de una vez. Esas claves pueden proporcionar parejas adicionales a los clientes coincidentes. SELECT DISTINCT ocultaría los valores de búsqueda repetidos en su salida en lugar de identificar qué códigos están duplicados.
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

Dos filas de la tabla 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?
  1. 2
  2. 3
  3. 5
  4. 6
Mostrar respuestaOcultar respuesta

Guarda esta unidad para ver esta respuesta.

Pregunta 2 de 10

Un socio de una biblioteca puede tener muchos préstamos y cada préstamo pertenece a un socio. ¿Dónde debe almacenarse la clave foránea del socio?
  1. En la tabla de socios
  2. En la tabla de préstamos
  3. En ambas tablas
  4. En una tabla separada
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?
  1. r.customer_ref = c.customer_id
  2. r.rental_id = c.customer_id
  3. r.customer_ref = r.rental_id
  4. c.customer_id = c.customer_id
Mostrar respuestaOcultar respuesta

Guarda esta unidad para ver esta respuesta.

Pregunta 4 de 10

Las tablas 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?
  1. Sus regiones coinciden, pero sus identificadores de cuenta difieren.
  2. Añadir una columna compartida hace que todos los pares coincidan.
  3. Sus identificadores de cuenta coinciden, pero sus regiones difieren.
  4. La nueva columna hace que los identificadores compartidos se muestren dos veces.
Mostrar respuestaOcultar respuesta

Guarda esta unidad para ver esta respuesta.

Pregunta 5 de 10

Los equipos son (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?
  1. North una vez; South una vez
  2. North dos veces; South una vez
  3. North dos veces; South ninguna vez
  4. North dos veces; South dos veces
Mostrar respuestaOcultar respuesta

Guarda esta unidad para ver esta respuesta.

Pregunta 6 de 10

La lista A tiene las claves únicas 2 y 5. La lista B tiene las claves únicas 5 y 8. ¿Qué pares resultan de un FULL OUTER JOIN por igualdad de claves?
  1. (2, NULL), (5, 5)
  2. (5, 5), (NULL, 8)
  3. (2, NULL), (5, 5), (NULL, 8)
  4. (2, 2), (5, 5), (8, 8)
Mostrar respuestaOcultar respuesta

Guarda esta unidad para ver esta respuesta.

Pregunta 7 de 10

Los empleados son (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?
  1. (11, 12)
  2. (10, 11)
  3. (11, 11)
  4. (12, 11)
Mostrar respuestaOcultar respuesta

Guarda esta unidad para ver esta respuesta.

Pregunta 8 de 10

Un estudio enumera 4 salas y 3 horarios de sesión. ¿Cuántas filas produce un CROSS JOIN de las listas?
  1. 7
  2. 4
  3. 3
  4. 12
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?
  1. authors → books mediante identificadores iguales
  2. authors → books con CROSS JOIN
  3. book_authors → authors mediante book_id
  4. authors → book_authors → books
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?
  1. Utilizar DISTINCT solo sobre el identificador de tienda.
  2. Añadir a ON la igualdad de las dos columnas de mes.
  3. Sustituir la combinación interna por una izquierda.
  4. Conservar solo las dos primeras filas con LIMIT 2.
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

Una combinación con ON une una tabla de 4 columnas con una de 3 columnas. ¿Cuál es la anchura de SELECT * antes de eliminar columnas?
  1. 4 columnas
  2. 3 columnas
  3. 12 columnas
  4. 7 columnas
Mostrar respuestaOcultar respuesta

Guarda esta unidad para ver esta respuesta.

Pregunta 2 de 10

Un cargo de 25,00 se combina con intervalos mediante 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?
  1. 0
  2. 1
  3. 2
  4. 3
Mostrar respuestaOcultar respuesta

Guarda esta unidad para ver esta respuesta.

Pregunta 3 de 10

Una consulta utiliza 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?
  1. suppliers s LEFT JOIN deliveries d ON d.supplier_id = s.supplier_id
  2. deliveries d LEFT JOIN suppliers s ON d.supplier_id = s.supplier_id
  3. deliveries d JOIN suppliers s ON d.supplier_id = s.supplier_id
  4. suppliers s FULL JOIN deliveries d ON d.supplier_id = s.supplier_id
Mostrar respuestaOcultar respuesta

Guarda esta unidad para ver esta respuesta.

Pregunta 4 de 10

Las tiendas A y B se conservan en una combinación izquierda con visitas. A tiene una visita anterior a una fecha límite; B no tiene ninguna. ON conserva solo las visitas de la fecha límite o posteriores. Si esa restricción se mueve a WHERE sin otros cambios, ¿qué tiendas permanecen?
  1. Ni A ni B
  2. Solo A
  3. Solo B
  4. Tanto A como B
Mostrar respuestaOcultar respuesta

Guarda esta unidad para ver esta respuesta.

Pregunta 5 de 10

Tres empleados tienen los identificadores distintos 21, 22 y 23, todos con el identificador de responsable 5. Una autocombinación compara identificadores de responsable iguales e identificadores de empleado distintos mediante <>. ¿Cuántas filas devuelve y cuántas devolvería <?
  1. 3 con <>; 3 con <
  2. 6 con <>; 3 con <
  3. 9 con <>; 6 con <
  4. 6 con <>; 6 con <
Mostrar respuestaOcultar respuesta

Guarda esta unidad para ver esta respuesta.

Pregunta 6 de 10

Una fila de vuelo tiene from_code y to_code, ambos con referencia a airports.code. ¿Cómo debe obtener un informe los nombres de ambos aeropuertos?
  1. Combinar airports una vez por from_code y reutilizar su nombre para la llegada.
  2. Combinar airports una vez por ambas igualdades de código con AND.
  3. Combinar airports de forma cruzada y filtrar solo por from_code.
  4. Combinar airports dos veces con alias de salida y llegada.
Mostrar respuestaOcultar respuesta

Guarda esta unidad para ver esta respuesta.

Pregunta 7 de 10

Todos los técnicos deben aparecer con sus asignaciones y ubicaciones opcionales. La consulta combina asignaciones por la izquierda y después ubicaciones internamente mediante el identificador de ubicación de la asignación. ¿Por qué desaparecen los técnicos sin asignación?
  1. Sus claves de asignación NULL no pueden coincidir en la combinación interna con ubicaciones.
  2. Una combinación izquierda solo puede conservar un técnico sin asignación.
  3. Seleccionar una columna de ubicación elimina todas las filas sin coincidencia.
  4. El alias de ubicación oculta la clave primaria del técnico.
Mostrar respuestaOcultar respuesta

Guarda esta unidad para ver esta respuesta.

Pregunta 8 de 10

Un equipo no tiene tareas. Después de equipos LEFT JOIN tareas y de agrupar por equipo, ¿qué devuelve COUNT(t.task_id) si los identificadores de tarea no pueden ser NULL?
  1. 1
  2. NULL
  3. 0
  4. El número de equipos
Mostrar respuestaOcultar respuesta

Guarda esta unidad para ver esta respuesta.

Pregunta 9 de 10

Un escritor tiene 2 artículos y 3 premios, cada uno vinculado de forma independiente al escritor. Una consulta combina internamente ambas tablas hijas por el identificador de escritor y agrupa por escritor. ¿Cuáles son los valores de COUNT(article_id) y COUNT(DISTINCT award_id)?
  1. 2 y 3
  2. 6 y 6
  3. 6 y 3
  4. 3 y 2
Mostrar respuestaOcultar respuesta

Guarda esta unidad para ver esta respuesta.

Pregunta 10 de 10

Un informe empieza por 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?
  1. Solo el transportista
  2. Solo el envío
  3. Ambos registros sin coincidencia
  4. Ningún registro sin coincidencia
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?
  1. w.supervisor_ref = s.worker_id
  2. w.worker_id = s.supervisor_ref
  3. w.name = s.name
  4. w.worker_id = s.worker_id
Mostrar respuestaOcultar respuesta

Guarda esta unidad para ver esta respuesta.

Pregunta 2 de 10

Una condición de combinación es verdadera para 4 pares de filas candidatos, falsa para 3 y desconocida para 2. ¿Cuántas filas devuelve la combinación interna?
  1. 6
  2. 4
  3. 7
  4. 9
Mostrar respuestaOcultar respuesta

Guarda esta unidad para ver esta respuesta.

Pregunta 3 de 10

Una consulta combina internamente pagos 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?
  1. Sí; deben seleccionarse ambas columnas de identificador de cuenta.
  2. Sí; debe seleccionarse al menos una columna de identificador de cuenta.
  3. No; SELECT añade automáticamente ambos identificadores de cuenta.
  4. No; ON puede utilizar columnas que no aparecen en SELECT.
Mostrar respuestaOcultar respuesta

Guarda esta unidad para ver esta respuesta.

Pregunta 4 de 10

Las tablas 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?
  1. 1 con USING; 1 con NATURAL
  2. 2 con USING; 2 con NATURAL
  3. 2 con USING; 1 con NATURAL
  4. 4 con USING; 2 con NATURAL
Mostrar respuestaOcultar respuesta

Guarda esta unidad para ver esta respuesta.

Pregunta 5 de 10

Las regiones East y West tienen una oficina cada una. Un LEFT JOIN de todas las regiones incluye AND r.name = 'East' en ON. ¿Qué filas aparecen al seleccionar región y oficina?
  1. East con su oficina; West con NULL
  2. East con su oficina; West no aparece
  3. East con su oficina; West con su oficina
  4. East con NULL; West con NULL
Mostrar respuestaOcultar respuesta

Guarda esta unidad para ver esta respuesta.

Pregunta 6 de 10

Los trabajadores son (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?
  1. Solo (32, 31, NULL)
  2. (31, 32, 33) y (31, 32, 34)
  3. (32, 31, NULL), (33, 32, 31), (34, 32, 31)
  4. (33, 32, 31) y (34, 32, 31)
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?
  1. La clave primaria de producto debe estar duplicada.
  2. Cada combinación devuelve todos los productos para cada pedido.
  3. El pedido tiene varias filas de línea de pedido coincidentes.
  4. Las claves únicas impiden las relaciones uno a muchos.
Mostrar respuestaOcultar respuesta

Guarda esta unidad para ver esta respuesta.

Pregunta 8 de 10

Deben aparecer las zonas A y B. A tiene una reserva vinculada a un servicio real; B no tiene reservas. La consulta combina reservas y servicios por la izquierda y después añade WHERE service.category = 'Repair'. El servicio de A es Repair. ¿Qué permanece?
  1. A con su servicio; B con NULL
  2. A con su servicio; B desaparece
  3. Ambas zonas con NULL en los campos de servicio
  4. B con NULL; A desaparece
Mostrar respuestaOcultar respuesta

Guarda esta unidad para ver esta respuesta.

Pregunta 9 de 10

Dos suscriptores se llaman Lee, con identificadores 41 y 42. El primero tiene dos pagos y el segundo uno. Después de una combinación interna con pagos, ¿cuántas filas devuelven SELECT DISTINCT name y SELECT DISTINCT subscriber_id, name?
  1. 2 y 2
  2. 1 y 3
  3. 3 y 2
  4. 1 y 2
Mostrar respuestaOcultar respuesta

Guarda esta unidad para ver esta respuesta.

Pregunta 10 de 10

Una tabla de búsqueda tiene el código X dos veces y el código Y una vez. Un evento hace referencia a X y dos eventos hacen referencia a Y. ¿Cuántas filas produce su combinación interna?
  1. 4
  2. 3
  3. 5
  4. 6
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

Los socios son 7, 8 y 9; los clubes son 50 y 60. Los pares de afiliación son (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?
  1. 3 filas; NULL
  2. 4 filas; NULL
  3. 4 filas; 60
  4. 6 filas; NULL
Mostrar respuestaOcultar respuesta

Guarda esta unidad para ver esta respuesta.

Pregunta 2 de 10

La tabla A tiene filas con las claves 1, 1, 2. La tabla B tiene filas con las claves 1, 1, 1, 3. ¿Cuántas filas devuelve una combinación interna por igualdad?
  1. 3
  2. 7
  3. 6
  4. 12
Mostrar respuestaOcultar respuesta

Guarda esta unidad para ver esta respuesta.

Pregunta 3 de 10

Una tarifa de 9,50 se combina internamente con los intervalos [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?
  1. De dos filas a una fila
  2. De una fila a una fila
  3. De tres filas a dos filas
  4. De una fila a cero filas
Mostrar respuestaOcultar respuesta

Guarda esta unidad para ver esta respuesta.

Pregunta 4 de 10

La lista A contiene las claves 4, 4, 9; la lista B contiene las claves 4, 4, 12. Una combinación completa por igualdad selecciona ambas columnas clave. ¿Cuántas filas devuelve y cuántas permanecen después de WHERE a.k IS NULL OR b.k IS NULL?
  1. 4 en total; 2 sin coincidencia
  2. 6 en total; 2 sin coincidencia
  3. 6 en total; 4 sin coincidencia
  4. 9 en total; 2 sin coincidencia
Mostrar respuestaOcultar respuesta

Guarda esta unidad para ver esta respuesta.

Pregunta 5 de 10

Los clientes P y Q tienen un pedido antiguo cada uno y ningún pedido reciente; R no tiene pedidos. Un LEFT JOIN solo por clave va seguido de WHERE o.date >= '2026-09-01' OR o.order_id IS NULL. ¿Qué clientes se conservan?
  1. Solo R
  2. P, Q y R
  3. Solo P y Q
  4. Ningún cliente
Mostrar respuestaOcultar respuesta

Guarda esta unidad para ver esta respuesta.

Pregunta 6 de 10

Un CROSS JOIN combina 2 modalidades, 5 regiones y 4 meses. ¿Cuántas combinaciones produce?
  1. 11
  2. 20
  3. 40
  4. 10
Mostrar respuestaOcultar respuesta

Guarda esta unidad para ver esta respuesta.

Pregunta 7 de 10

Deben aparecer los grupos G y H. G tiene una inscripción vinculada a una clase válida; H no tiene ninguna. Compara groups LEFT JOIN signups JOIN classes con groups LEFT JOIN (signups JOIN classes), utilizando las claves pertinentes. ¿Qué sucede con H?
  1. Solo la ruta opcional agrupada conserva H.
  2. Ambas formas conservan H.
  3. Solo la ruta sin agrupar conserva H.
  4. Ninguna forma conserva H.
Mostrar respuestaOcultar respuesta

Guarda esta unidad para ver esta respuesta.

Pregunta 8 de 10

Un cliente tiene las facturas 501 por 18,00 y 502 por 27,00. La factura 501 tiene 3 líneas; la factura 502 tiene 2. El informe necesita el importe total de facturas y el número de facturas. ¿Qué resultado debe mostrar?
  1. 108,00 y 5
  2. 45,00 y 5
  3. 108,00 y 2
  4. 45,00 y 2
Mostrar respuestaOcultar respuesta

Guarda esta unidad para ver esta respuesta.

Pregunta 9 de 10

Una tabla almacena un identificador en una columna TEXT como «0064»; otra almacena 64 en una columna INTEGER. ¿Qué debes comprobar antes de dar por válida su combinación por igualdad en distintas bases de datos?
  1. Solo si ambas tablas tienen el mismo número de filas
  2. Solo si ambas columnas comparten el mismo nombre
  3. Los tipos y formatos de clave y el comportamiento de conversión
  4. Si DISTINCT puede eliminar todas las filas sin coincidencia
Mostrar respuestaOcultar respuesta

Guarda esta unidad para ver esta respuesta.

Pregunta 10 de 10

Un registro padre tiene 2 facturas y 4 casos, vinculados de forma independiente por el identificador del padre. Una combinación interna con ambas tablas hijas agrupa por el padre. ¿Cuáles son los valores de COUNT(*), COUNT(DISTINCT bill_id) y COUNT(DISTINCT case_id)?
  1. 6, 2 y 4
  2. 8, 2 y 4
  3. 8, 8 y 8
  4. 4, 2 y 4
Mostrar respuestaOcultar respuesta

Guarda esta unidad para ver esta respuesta.

¿Te atascas con una pregunta tuya? Ayuda con Tareas

Términos Clave

58 Términos Clave, cada uno con su definición

A

Alias de tabla
Un alias de tabla es un nombre corto asignado a una referencia de tabla para que su papel y las referencias a sus columnas queden claros dentro de una consulta.
En 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
AND en una condición de combinación exige que todas las pruebas que la componen sean verdaderas para que el par candidato cuente como coincidencia.
Comparar tanto la tienda como el mes impide que la fila de abril de una tienda se combine con sus cifras de marzo.
Anticombinación
Una anticombinación devuelve filas sin pareja coincidente, que pueden encontrarse mediante una combinación izquierda seguida de una prueba de clave derecha ausente.
Combina productos por la izquierda con líneas de pedido y comprueba la clave de línea ausente para encontrar los productos no vendidos, como una grapadora.
Atributo de una relación
Un atributo de una relación es un dato sobre un vínculo concreto entre registros, por lo que pertenece a la fila que representa ese vínculo.
La cantidad se almacena en una fila de línea de pedido porque el mismo producto puede comprarse en cantidades distintas en pedidos distintos.
Autocombinación
Una autocombinación combina una tabla consigo misma mediante alias separados para que sus filas puedan desempeñar papeles distintos o compararse entre sí.
El alias de empleado proporciona manager_id y el alias de responsable proporciona el emp_id coincidente.

C

Cadena de combinaciones
Una cadena de combinaciones incorpora varias tablas en una consulta, y cada nueva combinación actúa sobre las filas construidas por las anteriores.
Cuando una combinación cliente–pedido construye tres pares y esos pedidos tienen cinco líneas, combinar las líneas de pedido los amplía a cinco filas de detalle.
Cadena de combinaciones internas y externas
Una cadena de combinaciones internas y externas mezcla ambos tipos y exige comprobar en cada paso qué filas anteriores puede eliminar.
Una combinación izquierda con pedidos seguida de una interna con líneas de pedido elimina a los clientes cuya clave de pedido es NULL.
Cláusula ON
Una cláusula ON proporciona la expresión de coincidencia de una combinación y puede unir varias comparaciones que deben cumplirse para un par.
Una condición que empareja envíos con líneas de pedido utiliza tanto el identificador de pedido como el de producto para identificar la pareja correcta.
Cláusula USING
Una cláusula USING enumera las columnas con el mismo nombre que deben compararse por igualdad y muestra cada columna compartida de la lista una sola vez en SELECT *.
USING (customer_id) expresa la coincidencia de claves de cliente sin escribir ambas referencias de columna.
Clave compuesta
Una clave compuesta identifica un registro utilizando varias columnas juntas; comparar una referencia con ella requiere todos los componentes de la clave.
El par estudiante–curso impide las inscripciones duplicadas aunque ni el identificador de estudiante ni el de curso sean únicos por sí solos.
Clave de búsqueda duplicada
Una clave de búsqueda duplicada es un valor repetido en un lado que se espera que sea único y que da parejas adicionales a las filas de entrada coincidentes.
Si un código de país aparece dos veces, cada cliente con ese código produce dos coincidencias combinadas con la tabla de búsqueda.
Clave foránea
Una clave foránea es una columna o un grupo de columnas que hace referencia a una clave primaria o única de la misma tabla o de otra tabla.
Varios pedidos pueden contener el identificador de cliente 1, vinculando cada uno de esos pedidos con la única fila de cliente con ese identificador.
Clave primaria
Una clave primaria es una columna o un grupo de columnas cuyo valor identifica de forma única una fila y que no puede contener NULL.
En una tabla de clientes, customer_id distingue el registro de un cliente de todos los demás registros de cliente.
COALESCE
COALESCE devuelve su primer argumento que no sea NULL y permite que un resultado muestre un valor de sustitución o una clave disponible en cualquiera de las entradas.
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
Una combinación une filas de entrada para formar filas de resultado según una regla de coincidencia y puede conservar filas sin coincidencia con valores NULL.
El nombre de un cliente y el total de un pedido pueden aparecer juntos tras combinar sus filas por el identificador de cliente.
Combinación cruzada
Una combinación cruzada devuelve todos los pares de filas de entrada sin una condición de coincidencia y da el producto de los números de filas de las dos entradas.
Tres tallas de camiseta cruzadas con dos colores producen seis posibles filas de talla–color para la tienda.
Combinación cruzada accidental
Una combinación cruzada accidental combina todos los pares de filas porque falta una condición necesaria o esta es siempre verdadera, lo que produce coincidencias sin relación.
Una condición olvidada hace que un cliente aparezca junto a los pedidos de otros clientes además de los suyos, aumentando el resultado.
Combinación entre paréntesis
Una combinación entre paréntesis agrupa explícitamente entradas combinadas y permite que un grupo combinado internamente actúe como un lado opcional de una combinación externa.
Las inscripciones combinadas con cursos pueden formar un grupo que después se combina por la izquierda con todos los estudiantes, incluidos los que no tienen inscripción.
Combinación externa completa
Una combinación externa completa devuelve los pares coincidentes y conserva las filas sin coincidencia de ambas entradas con NULL para cada pareja ausente.
Una combinación completa cliente–pedido conserva a los clientes sin pedidos y los pedidos de invitado sin cliente junto a los pedidos coincidentes.
Combinación externa derecha
Una combinación externa derecha conserva todas las filas derechas y añade NULL en el lado izquierdo cuando una fila derecha no tiene una pareja que cumpla la condición.
Con los pedidos a la derecha, un pedido de invitado 104 con una referencia de cliente NULL se conserva aunque ninguna fila de cliente pueda coincidir con él.
Combinación externa izquierda
Una combinación externa izquierda conserva todas las filas izquierdas y devuelve cada par coincidente o una fila con NULL en el lado derecho cuando no coincide ninguna pareja.
Un cliente que nunca ha hecho un pedido sigue apareciendo en un informe de clientes con combinación izquierda, con NULL en las columnas de pedido.
Combinación interna
Una combinación interna devuelve todos los pares que satisfacen su condición de combinación y excluye las filas de ambas entradas que no encuentran coincidencia.
Si Ana tiene dos pedidos y Ben tiene uno, una combinación interna de clientes y pedidos devuelve esos tres pedidos y deja fuera una compra como invitado.
Combinación mediante comas
Una combinación mediante comas nombra tablas separadas por comas en FROM y expresa su condición de coincidencia en la cláusula WHERE de la consulta.
Eliminar la prueba de clave de cliente de una combinación mediante comas de cuatro clientes y cuatro pedidos hace que cada cliente se empareje con cada pedido.
Combinación natural
Una combinación natural compara automáticamente todas las columnas cuyos nombres comparten las entradas, por lo que los cambios en los nombres compartidos pueden cambiar su resultado.
Añadir una columna de ciudad de entrega a pedidos hace que una combinación natural compare las ciudades además de los identificadores de cliente.
Combinación por desigualdad
Una combinación por desigualdad relaciona filas mediante una comparación distinta de la igualdad, como un precio situado entre los límites inferior y superior de un intervalo.
Una taza con precio de 8,00 está en el intervalo de precios llamado Standard y se combina con la etiqueta de ese intervalo.
Conciliación de resultados
La conciliación de resultados compara registros que deberían concordar, alineando las claves coincidentes y mostrando registros ausentes o valores distintos.
Una combinación completa puede colocar las existencias del almacén junto a un recuento físico y conservar los SKU ausentes de cualquiera de las listas.
Condición de combinación
Una condición de combinación es la expresión que decide si un par coincide; solo un resultado verdadero cuenta como coincidencia.
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(*) cuenta filas de resultado, incluida la fila de relleno con NULL de una combinación externa para una fila padre sin ninguna fila hija coincidente.
Después de una combinación izquierda desde el lado del cliente, un cliente sin pedidos aporta una fila a COUNT(*).
COUNT(column)
COUNT(column) cuenta los valores que no son NULL de una columna seleccionada, por lo que puede contar parejas opcionales reales después de una combinación izquierda.
Un cliente sin pedidos tiene una clave de pedido combinada NULL, que aporta cero a COUNT(o.order_id) en el grupo de ese cliente.
COUNT(DISTINCT key)
COUNT(DISTINCT key) cuenta una vez cada clave distinta que no sea NULL e ignora las repeticiones introducidas al coincidir varias filas de detalle.
Si las tres filas de línea de un cliente solo contienen dos identificadores de pedido, contar los identificadores de pedido distintos devuelve dos.
Cuadrícula de combinaciones para informes
Una cuadrícula de combinaciones para informes es una lista completa de combinaciones necesarias que puede construirse con una combinación cruzada y rellenarse mediante una combinación izquierda.
Cruzar tiendas con meses hace visibles los meses sin ventas al incorporar las ventas reales.

D

DISTINCT
DISTINCT elimina las filas idénticas en todos los valores seleccionados; por sí solo no corrige una relación incorrecta ni elimina entidades duplicadas.
Seleccionar el identificador y el nombre de cliente con DISTINCT mantiene separadas a personas distintas aunque compartan nombre.

E

Emparejamiento de una fila consigo misma
Un emparejamiento de una fila consigo misma relaciona una fila con ella misma cuando una condición de autocombinación permite que ambos alias hagan referencia a la misma clave identificadora.
Una fila de empleado se empareja consigo misma cuando una condición de autocombinación solo comprueba que los identificadores de responsable de ambos alias sean iguales.
Equicombinación
Una equicombinación relaciona filas mediante comparaciones de igualdad, a menudo entre una clave foránea y la clave primaria o única a la que hace referencia.
El identificador de cliente 1 de un pedido es igual al identificador de cliente 1 de la fila de cliente correspondiente, por lo que ese par satisface la equicombinación.

F

Fila completada con valores NULL
Una fila completada con valores NULL es un resultado de combinación externa que conserva una fila de entrada sin coincidencia y proporciona NULL para las columnas de la pareja ausente.
El número de pedido NULL de un cliente en el resultado de una combinación izquierda señala una pareja de pedido ausente; no es un pedido almacenado.
Filtro posterior a la combinación
Un filtro posterior a la combinación se aplica en WHERE a las filas construidas por la combinación y puede eliminar tanto filas coincidentes como filas de combinación externa completadas con NULL.
Una comparación de fecha del lado derecho en WHERE elimina a un cliente sin pedidos, porque la fecha de pedido combinada de ese cliente es NULL.

I

Incompatibilidad de formato entre claves
Una incompatibilidad de formato entre claves se produce cuando los identificadores vinculados utilizan tipos o representaciones distintos, de modo que el comportamiento de la comparación depende de la base de datos.
El texto «0042» y el número 42 pueden coincidir mediante conversión en SQLite, pero necesitan un tratamiento coherente entre sistemas.
Inscripción (matrícula)
Una inscripción vincula un estudiante con un curso y puede representarse mediante una fila intermedia con esas dos claves identificadoras.
Los cursos Algebra y Biology de Mia requieren filas de inscripción separadas; Omar no tiene ninguna fila de inscripción.

J

Jerarquía
Una jerarquía es una estructura de vínculos padre–hijo, como las relaciones de supervisión de empleados, que una autocombinación puede seguir un nivel cada vez.
Jamal tiene como responsable a Hassan, cuyo responsable es Grace; tres papeles de tabla pueden mostrar esta cadena de dos vínculos.

L

Lado conservado
El lado conservado de una combinación externa es la entrada cuyas filas sin coincidencia deben devolverse antes de que actúen combinaciones o filtros posteriores.
Clientes es el lado conservado en customers c LEFT JOIN orders o, independientemente del número de pedidos.
Lado opcional
El lado opcional de una combinación izquierda es la entrada derecha, cuyas columnas se rellenan con NULL cuando una fila conservada no tiene coincidencia.
Los pedidos son opcionales en un informe de todos los clientes, por lo que un pedido ausente no debe eliminar al cliente.
Línea de pedido
Una línea de pedido es un registro de un producto dentro de un pedido que normalmente vincula las claves del pedido y del producto y almacena su cantidad.
El pedido 101 tiene líneas separadas de Mug y Pen, por lo que sus valores de cliente y pedido se repiten en el informe detallado.

M

Multiplicación de filas por coincidencias múltiples
La multiplicación de filas por coincidencias múltiples repite una fila padre por cada fila hija coincidente, lo que resulta útil para listas detalladas, pero puede multiplicar los totales del nivel padre.
Si el pedido 101, con un total de 22,00, tiene dos líneas, aparece dos veces después de combinar sus líneas, por lo que ese total se sumaría dos veces.

N

Nivel de agregación
Un nivel de agregación es el tipo de registro que un recuento o suma pretende medir, como clientes, pedidos o líneas de pedido.
Cuenta identificadores de pedido distintos cuando las filas combinadas representan líneas, pero el informe pregunta cuántos pedidos existen.
Nombre de columna cualificado
Un nombre de columna cualificado incluye un nombre de tabla o alias antes de la columna e identifica qué entrada proporciona el valor.
c.customer_id selecciona la clave del lado del cliente cuando ambas tablas combinadas contienen customer_id.

P

Par no ordenado
Un par no ordenado considera a dos miembros como el mismo emparejamiento en cualquier orden; comparar identificadores distintos con < lo conserva una sola vez.
El par de compañeros Hassan–Iris aparece una vez cuando la condición exige que el primer identificador de empleado sea menor.
Predicción del número de filas
Una predicción del número de filas estima el resultado de una combinación a partir de las relaciones de coincidencia y las filas sin coincidencia que conserva su tipo de combinación.
Tres pedidos coincidentes más dos clientes sin coincidencia predicen cinco filas para la combinación izquierda desde el lado del cliente.
Producto cartesiano
Un producto cartesiano es la colección completa de combinaciones formadas al elegir una fila de cada tabla de entrada.
Colocar cada cliente junto a cada pedido forma todos los pares cliente–pedido posibles, incluidos emparejamientos sin relación.
Prueba IS NULL
Una prueba IS NULL es verdadera cuando un valor es NULL y puede seleccionar parejas ausentes después de una combinación externa si se aplica a una clave adecuada.
Comprobar 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
Una referencia de columna ambigua es una referencia sin cualificar que podría nombrar una columna de más de una entrada, por lo que su origen no queda claro.
Con JOIN ... ON, seleccionar customer_id sin cualificar falla cuando tanto clientes como pedidos lo proporcionan.
Relación muchos a muchos
Una relación muchos a muchos permite que las filas de ambos lados tengan varias parejas y se representa con una tabla de pares vinculados.
Cuando un estudiante cursa dos cursos y un curso incluye a dos estudiantes, una tabla enrollments registra cada par estudiante–curso.
Relación uno a muchos
Una relación uno a muchos permite que una fila padre tenga varias filas hijas, con la clave foránea almacenada en el lado de las hijas.
Cuando un cliente tiene dos pedidos, ambas filas de pedido hacen referencia al identificador de ese cliente sin repetir la dirección.
Relación uno a uno
Una relación uno a uno permite como máximo una pareja por fila en cada lado, normalmente mediante una clave foránea que también es única.
Si cada empleado puede tener como máximo una credencial, una referencia única al empleado en credenciales impone ese vínculo.
Restricción de coincidencia
Una restricción de coincidencia limita qué parejas candidatas son válidas en ON, mientras una combinación externa sigue conservando las filas de entrada que debe conservar.
Una fecha límite de pedido en ON conserva todos los clientes, pero incorpora solo los pedidos que cumplen ese límite.
Resultado de comparación desconocido
Un resultado de comparación desconocido se produce en la igualdad habitual con NULL y no cuenta como verdadero para buscar coincidencias ni para filtrar con WHERE.
El pedido de invitado 104 tiene una referencia de cliente NULL, por lo que no puede coincidir ni siquiera con otro NULL mediante igualdad.
Ruta de combinación
Una ruta de combinación es una secuencia de vínculos con sentido que conecta las tablas necesarias para una consulta, con una condición para cada vínculo.
El informe de compras sigue clientes hasta pedidos, después líneas de pedido y después productos para llegar a los nombres de producto.

T

Tabla intermedia
Una tabla intermedia registra una fila por par de la relación y contiene una clave foránea hacia cada extremo de un vínculo muchos a muchos.
Cada fila de inscripción vincula un estudiante con un curso y permite que tanto estudiantes como cursos se repitan.

V

Vínculo dependiente
Un vínculo dependiente conecta una tabla posterior mediante una columna de una tabla combinada antes, por lo que las parejas anteriores ausentes le afectan.
Una combinación con cursos depende del identificador de curso de la inscripción; un estudiante sin inscripción tiene un identificador de curso NULL que no puede satisfacer esa igualdad.

Sobre esta unidad

Por StudeliInformar de un error

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.

Comenzar