En el mundo de las bases de datos, rara vez la información se encuentra en una sola tabla. Generalmente, los datos están organizados en tablas relacionadas. Para analizar esta información de manera eficiente, necesitas aprender a combinar tablas.
Una de las formas más comunes de hacerlo es mediante la cláusula INNER JOIN.
En este artículo aprenderás:
- Qué es un
INNER JOINy para qué se utiliza. - Sintaxis básica y ejemplos prácticos.
- Diferencias entre motores de base de datos como SQL Server, MySQL, PostgreSQL y SQLite.
- Buenas prácticas al usar
INNER JOIN. - Cómo practicar directamente en db-fiddle.com con datos ficticios.
¿Qué es INNER JOIN en SQL?
Un INNER JOIN es una instrucción de SQL que combina registros de dos tablas diferentes.
El resultado incluirá solo las filas donde exista coincidencia en ambas tablas según la condición establecida.
Piensa en el INNER JOIN como una intersección:
- Si un registro existe en la tabla A y tiene una relación válida en la tabla B, aparecerá en el resultado.
- Si no existe coincidencia, ese registro no será mostrado.
Esto es fundamental cuando necesitas analizar información que está relacionada, por ejemplo:
- Empleados y los departamentos donde trabajan.
- Pedidos y los clientes que los realizaron.
- Productos y sus categorías.
Sintaxis básica de INNER JOIN
La sintaxis general es:
SELECT columnas
FROM tabla1
INNER JOIN tabla2
ON tabla1.columna_relacionada = tabla2.columna_relacionada; Explicación:
tabla1 y tabla2: son las tablas que deseas unir.ON: define la condición que determina cómo se relacionan los registros.columna_relacionada: es la clave usada para hacer la relación (generalmente una clave primaria y una clave foránea).
Ejemplo práctico: empleados y departamentos
Imaginemos que tenemos dos tablas:
- empleados: contiene información de cada empleado.
- departamentos: contiene la lista de departamentos.
Queremos obtener el nombre del empleado junto con el nombre de su departamento.
Estructura de tablas
Puedes crear estas tablas y poblarlas con datos ficticios en db-fiddle.com:
-- Tabla de departamentos
CREATE TABLE departamentos (
departamento_id INTEGER PRIMARY KEY,
nombre_departamento VARCHAR(50) NOT NULL
);
-- Tabla de empleados
CREATE TABLE empleados (
empleado_id INTEGER PRIMARY KEY,
nombre VARCHAR(50) NOT NULL,
salario DECIMAL(10,2) NOT NULL,
departamento_id INTEGER,
FOREIGN KEY (departamento_id) REFERENCES departamentos(departamento_id)
);
-- Insertar datos en departamentos
INSERT INTO departamentos (departamento_id, nombre_departamento) VALUES
(1, 'Recursos Humanos'),
(2, 'Ventas'),
(3, 'Tecnología'),
(4, 'Finanzas');
-- Insertar datos en empleados
INSERT INTO empleados (empleado_id, nombre, salario, departamento_id) VALUES
(1, 'Ana López', 50000, 1),
(2, 'Carlos Pérez', 60000, 2),
(3, 'Laura Martínez', 55000, 2),
(4, 'Miguel Torres', 70000, 3),
(5, 'Sofía Gómez', 48000, NULL); -- empleado sin departamento asignado
Consulta con INNER JOIN
SELECT e.nombre AS empleado,
d.nombre_departamento
FROM empleados AS e
INNER JOIN departamentos AS d
ON e.departamento_id = d.departamento_id;
Resultado esperado:
| empleado | nombre_departamento |
|---|---|
| Ana López | Recursos Humanos |
| Carlos Pérez | Ventas |
| Laura Martínez | Ventas |
| Miguel Torres | Tecnología |
Sofía Gómez no aparece en el resultado porque no tiene asignado un departamento (
departamento_id es NULL).
Diferencias entre motores de base de datos
Aunque la sintaxis de INNER JOIN es estándar en SQL, algunos motores tienen diferencias sutiles:
| Motor de base de datos | Particularidad |
|---|---|
| SQL Server | Soporta INNER JOIN estándar y la sintaxis antigua con coma, aunque la recomendación es usar JOIN. |
| MySQL / PostgreSQL / SQLite | Sintaxis idéntica a la estándar. |
| MySQL | Tiene opciones adicionales como STRAIGHT_JOIN para optimización específica. |
⚠️ Recomendación: Siempre utiliza la sintaxis moderna (
INNER JOIN ... ON) porque es más clara y funciona en todos los motores.
Buenas prácticas al usar INNER JOIN
- Usa alias en tablas:
Esto mejora la legibilidad y hace más claras las consultas.
SELECT e.nombre, d.nombre_departamento
FROM empleados AS e
INNER JOIN departamentos AS d
ON e.departamento_id = d.departamento_id; - Selecciona solo las columnas necesarias:
EvitaSELECT *para mejorar el rendimiento y la claridad.
-- Menos recomendable
SELECT * FROM empleados e INNER JOIN departamentos d ON e.departamento_id = d.departamento_id;
-- Mejor práctica
SELECT e.nombre, e.salario, d.nombre_departamento
FROM empleados AS e
INNER JOIN departamentos AS d
ON e.departamento_id = d.departamento_id; - Verifica la existencia de claves foráneas:
Asegúrate de que las columnas usadas para la relación estén correctamente indexadas. - Considera el rendimiento con grandes volúmenes de datos:
- Crea índices en las columnas usadas en el
JOIN. - Evita condiciones complejas dentro del
ONcuando no sean necesarias.
- Crea índices en las columnas usadas en el
INNER JOIN vs otros tipos de JOIN
| Tipo de JOIN | Qué muestra |
|---|---|
| INNER JOIN | Solo filas con coincidencia en ambas tablas. |
| LEFT JOIN | Todas las filas de la tabla izquierda, incluso si no hay coincidencia. |
| RIGHT JOIN | Todas las filas de la tabla derecha, incluso si no hay coincidencia. |
| FULL OUTER JOIN | Todas las filas de ambas tablas (SQL Server y PostgreSQL). |
Practica en línea con db-fiddle.com
Puedes probar todos estos ejemplos directamente en db-fiddle.com:
- Copia y pega el código de creación de tablas y datos.
- Ejecuta las consultas de ejemplo.
- Modifica condiciones o agrega nuevos datos para reforzar tu aprendizaje.
Esta herramienta es gratuita y no requiere instalación, ideal para practicar desde cualquier lugar.
Conclusión
INNER JOINte permite combinar información de dos tablas mostrando solo los registros con coincidencia.- Es esencial para trabajar con bases de datos normalizadas.
- Aunque existen ligeras diferencias entre motores, la sintaxis estándar funciona en todos ellos.
- Buenas prácticas como el uso de alias, seleccionar columnas específicas y crear índices pueden mejorar el rendimiento de tus consultas.
- Practicar en db-fiddle.com es una excelente forma de afianzar tus conocimientos.