Saltar a contenido

En una base de datos relacional, los datos suelen estar distribuidos en varias tablas. Para recuperar datos completos, a menudo es necesario consultarlos desde múltiples tablas.

En este tutorial, nos centraremos en cómo recuperar datos de múltiples tablas utilizando la cláusula INNER JOIN.

Esta es la sintaxis genérica para la cláusula INNER JOIN que une dos tablas:

SELECT 
  select_list 
FROM 
  table1
INNER JOIN table2 
  ON table1.column_name = table2.column_name;

En esta sintaxis:

  • Primero, especifique las columnas de ambas tablas en la lista de selección de la cláusula SELECT.
  • En segundo lugar, especifique la tabla principal (table1) de la que desea seleccionar los datos en la cláusula FROM.
  • En tercer lugar, especifique la segunda tabla (table2) a la que desea unirse utilizando la palabra clave INNER JOIN.
  • Por último, defina una condición para la unión. Esta condición indica qué columna (nombre_columna) de cada tabla debe tener valores coincidentes para la unión.

Para acortar la consulta, puede utilizar alias de tablas:

SELECT 
  select_list 
FROM 
  table1 t1
INNER JOIN table2 t2 
    ON t1.column_name = t2.column_name;

En esta sintaxis, primero asignamos t1 y t2 como alias de tabla para table1 y table2. A continuación, utilizamos los alias de tabla para calificar las columnas de cada tabla.

Si las columnas a comparar comparten el mismo nombre, puede utilizar la sintaxis USING:

SELECT 
  select_list 
FROM 
  table1 t1
INNER JOIN table2 t2 USING(column_name);

Cómo funciona el INNER JOIN

Para cada fila de la tabla1, la unión interna compara el valor de nombre_columna con el valor de la columna correspondiente de cada fila de la tabla2.

Cuando estos valores son iguales, el join interno crea una nueva fila que incluye todas las columnas de ambas tablas y la añade al conjunto de resultados.

Por el contrario, si estos valores no son iguales, la unión interna ignora el par actual y pasa a la fila siguiente, repitiendo el proceso de coincidencia.

El siguiente diagrama de Venn ilustra el funcionamiento de la cláusula INNER JOIN.

PostgreSQL Join - Inner Join

Ejemplos de INNER JOIN en PostgreSQL

Veamos algunos ejemplos de uso de la cláusula INNER JOIN.

Usando PostgreSQL INNER JOIN para unir dos tablas

Veamos las tablas customer y payment en la base de datos de ejemplo.

customer and payment tables

En este esquema, cada vez que un cliente realiza un pago, se inserta una nueva fila en la tabla payment. Aunque cada cliente puede tener cero o muchos pagos, cada pago pertenece a un solo cliente. La columna customer_id sirve de enlace para establecer la relación entre las dos tablas.

La siguiente sentencia utiliza la cláusula INNER JOIN para seleccionar datos de ambas tablas:

SELECT 
  customer.customer_id, 
  customer.first_name, 
  customer.last_name, 
  payment.amount, 
  payment.payment_date 
FROM 
  customer 
  INNER JOIN payment ON payment.customer_id = customer.customer_id 
ORDER BY 
  payment.payment_date;

Salida:

 customer_id | first_name  |  last_name   | amount |        payment_date
-------------+-------------+--------------+--------+----------------------------
         416 | Jeffery     | Pinson       |   2.99 | 2007-02-14 21:21:59.996577
         516 | Elmer       | Noe          |   4.99 | 2007-02-14 21:23:39.996577
         239 | Minnie      | Romero       |   4.99 | 2007-02-14 21:29:00.996577
         592 | Terrance    | Roush        |   6.99 | 2007-02-14 21:41:12.996577
          49 | Joyce       | Edwards      |   0.99 | 2007-02-14 21:44:52.996577
...

Para acortar la consulta, puede utilizar los alias de tabla:

SELECT 
  c.customer_id, 
  c.first_name, 
  c.last_name, 
  p.amount, 
  p.payment_date 
FROM 
  customer c 
  INNER JOIN payment p ON p.customer_id = c.customer_id 
ORDER BY 
  p.payment_date;

Como ambas tablas tienen la misma columna customer_id, puede utilizar la sintaxis USING:

SELECT 
  customer_id, 
  first_name, 
  last_name, 
  amount, 
  payment_date 
FROM 
  customer 
  INNER JOIN payment USING(customer_id) 
ORDER BY 
  payment_date;

Uso de INNER JOIN de PostgreSQL para unir tres tablas

El siguiente diagrama ilustra la relación entre tres tablas: staff, payment, y customer:

customer, payment and staff tables

Cada miembro del personal puede gestionar cero o múltiples pagos, y cada pago es procesado por uno y sólo un miembro del personal.

Del mismo modo, cada cliente puede realizar cero o varios pagos, y cada pago está asociado a un único cliente.

El siguiente ejemplo utiliza cláusulas INNER JOIN para recuperar datos de tres tablas

SELECT 
  c.customer_id, 
  c.first_name || ' ' || c.last_name customer_name, 
  s.first_name || ' ' || s.last_name staff_name, 
  p.amount, 
  p.payment_date 
FROM 
  customer c 
  INNER JOIN payment p USING (customer_id) 
  INNER JOIN staff s using(staff_id) 
ORDER BY 
  payment_date;

Salida:

 customer_id |     customer_name     |  staff_name  | amount |        payment_date
-------------+-----------------------+--------------+--------+----------------------------
         416 | Jeffery Pinson        | Jon Stephens |   2.99 | 2007-02-14 21:21:59.996577
         516 | Elmer Noe             | Jon Stephens |   4.99 | 2007-02-14 21:23:39.996577
         239 | Minnie Romero         | Mike Hillyer |   4.99 | 2007-02-14 21:29:00.996577
         592 | Terrance Roush        | Jon Stephens |   6.99 | 2007-02-14 21:41:12.996577
          49 | Joyce Edwards         | Mike Hillyer |   0.99 | 2007-02-14 21:44:52.996577
...

Resumen

  • Utilice las cláusulas INNER JOIN para seleccionar datos de dos o más tablas relacionadas y devolver filas que tengan valores coincidentes en todas las tablas.