Consultas multitabla: la cláusula JOIN

Consultas multitabla

En los artículos anteriores solo trabajábamos con una única tabla de la base de datos. En la práctica, sin embargo, muy a menudo tienes que obtener datos de varias tablas y combinarlas de alguna manera. En este artículo conocerás las formas principales de combinar tablas.

Por ejemplo, si queremos obtener información sobre los gastos en compras, podemos hacerlo así:

MySQL 8.4
SELECT family_member, amount * unit_price AS price FROM Payments
family_memberprice
12000
22100
3100
4350
4300
5100
2120
25500
5230
32200
266000
140
3100
31200

En la columna family_member del resultado aparecen los identificadores de los registros de la tabla Payments, pero para nosotros no dicen gran cosa.

En lugar de esos identificadores, sería mucho más claro mostrar los nombres de quienes hicieron las compras (la columna member_name de la tabla FamilyMember). Precisamente para eso existen la combinación de tablas y la cláusula JOIN.

Estructura general de una consulta multitabla

MySQL 8.4
SELECT campos_tablas
FROM tabla_1
[INNER | {LEFT | RIGHT | FULL} [OUTER]] JOIN tabla_2
    ON condicion_combinacion
[...]
  • [ ]parte opcional
  • { a | b }una de las opciones
  • ...se puede repetir
campos_tablas

Las columnas de cualquiera de las tablas combinadas que aparecerán en el resultado.

tabla_1
La primera tabla, a la que se unen las demás.
INNER

Combinación interna: en el resultado solo aparecen las filas para las que se ha encontrado coincidencia. Es el tipo de combinación por defecto, así que puedes omitir INNER.

Palabra claveOpcional
LEFT | RIGHT | FULL

Combinación externa: izquierda, derecha o completa. Además de las filas con coincidencia, en el resultado aparecen las filas sin coincidencia de la tabla izquierda, de la derecha o de ambas.

Palabra claveOpcional
OUTER

Solo subraya que la combinación es externa. Se escribe después de LEFT, RIGHT o FULL y no cambia el resultado.

Palabra claveOpcional
tabla_2

La tabla que se une. Para unir más tablas, añade para cada una su propio JOIN ... ON ....

condicion_combinacion

La regla por la que las filas de las dos tablas se encuentran entre sí, por ejemplo Payments.family_member = FamilyMembers.member_id.

Veremos con más detalle en qué se diferencia la combinación interna de la externa y cómo funcionan en los siguientes artículos.

Por ahora basta con saber que, para el ejemplo de las compras, necesitamos una consulta con combinación interna, que tiene este aspecto:

MySQL 8.4
SELECT family_member, member_name, amount * unit_price AS price FROM Payments
INNER JOIN FamilyMembers
    ON Payments.family_member = FamilyMembers.member_id
family_membermember_nameprice
1Headley Quincey2000
2Flavia Quincey2100
3Andie Quincey100
4Lela Quincey350
4Lela Quincey300
5Annie Quincey100
2Flavia Quincey120
2Flavia Quincey5500
5Annie Quincey230
3Andie Quincey2200
2Flavia Quincey66000
1Headley Quincey40
3Andie Quincey100
3Andie Quincey1200

En esta consulta relacionamos los registros de la tabla Payments con los registros de la tabla FamilyMembers.

Para que esa relación funcione, indicamos cómo deben encontrarse entre sí los registros de las dos tablas. Esta condición se indica después de ON:

MySQL 8.4
ON Payments.family_member = FamilyMembers.member_id

En nuestro caso, la columna family_member apunta al identificador de la tabla FamilyMembers y así permite relacionar los registros de forma unívoca.

Mostrar todas las columnas de una tabla en una consulta multitabla

Antes, cuando todas las consultas se hacían sobre una sola tabla, bastaba con indicar el símbolo * para mostrar todas sus columnas. Ahora que puede haber varias tablas, * significa «mostrar todas las columnas de las tablas indicadas en FROM».

A veces necesitamos mostrar solo las columnas de una tabla concreta. Por ejemplo, tenemos una combinación de las tablas Payments y FamilyMembers, y en el resultado solo queremos las columnas de FamilyMembers. ¿Cómo se hace? ¡Muy fácil! Basta con poner el nombre de la tabla delante del símbolo *:

MySQL 8.4
SELECT FamilyMembers.* FROM Payments
INNER JOIN FamilyMembers
    ON Payments.family_member = FamilyMembers.member_id

Del mismo modo puedes mostrar todas las columnas de varias tablas:

MySQL 8.4
SELECT Payments.*, FamilyMembers.* FROM Payments
INNER JOIN FamilyMembers
    ON Payments.family_member = FamilyMembers.member_id

¿Y si necesitas mostrar algunas columnas de una tabla y todas las de otra? ¡También se puede! Vamos a mostrar las columnas payment_id y family_member de Payments y todas las columnas de FamilyMembers:

MySQL 8.4
SELECT payment_id, family_member, FamilyMembers.* FROM Payments
INNER JOIN FamilyMembers
    ON Payments.family_member = FamilyMembers.member_id

Alias de tablas

Cuando trabajas con consultas multitabla grandes, conviene usar alias para las tablas. No solo mejora la legibilidad del código, sino que también ayuda a evitar errores en consultas complejas.

Los alias se indican después del nombre de la tabla con la palabra clave AS:

MySQL 8.4
SELECT id, name
FROM Passenger AS pass

Ahora puedes referirte a las columnas de la tabla a través del alias:

MySQL 8.4
SELECT pass.id, pass.name
FROM Passenger AS pass

Veamos un ejemplo con varias tablas. Supongamos que queremos mostrar los identificadores y los nombres de los pasajeros que han volado al menos una vez:

MySQL 8.4
SELECT
    pass.id,
    pass.name
FROM Passenger AS pass
INNER JOIN Pass_in_trip AS pit
    ON pit.passenger = pass.id

En este ejemplo, a las tablas Passenger y Pass_in_trip se les asignan los alias pass y pit, respectivamente, que luego se usan para mostrar las columnas de esas tablas. Fíjate en que ambas tablas tienen una columna con el mismo nombre: id. Si no indicas de qué tabla hay que tomarla, el SGBD lo decidirá por ti y devolverá el valor de la última tabla de la cadena de JOIN. En este caso, Pass_in_trip.

Compáralo con la versión sin alias. La diferencia salta a la vista, ¿verdad?

MySQL 8.4
SELECT
    Passenger.id,
    Passenger.name
FROM Passenger
INNER JOIN Pass_in_trip
    ON Pass_in_trip.passenger = Passenger.id

Al usar alias, sigue siempre estas reglas sencillas y tus consultas serán concisas y fáciles de entender:

  • Usa abreviaturas lógicas (por ejemplo, las primeras letras del nombre de la tabla).
  • Evita los alias demasiado cortos (de una sola letra) o poco claros.