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áusulaFROM. - En tercer lugar, especifique la segunda tabla (
table2) a la que desea unirse utilizando la palabra claveINNER 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.

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.

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:

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 JOINpara seleccionar datos de dos o más tablas relacionadas y devolver filas que tengan valores coincidentes en todas las tablas.