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