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.4SELECT family_member, amount * unit_price AS price FROM Payments
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
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.4SELECT family_member, member_name, amount * unit_price AS price FROM Payments INNER JOIN FamilyMembers ON Payments.family_member = FamilyMembers.member_id
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.4ON 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.4SELECT 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.4SELECT 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.4SELECT 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.4SELECT id, name FROM Passenger AS pass
Ahora puedes referirte a las columnas de la tabla a través del alias:
MySQL 8.4SELECT 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.4SELECT 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.4SELECT 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.