Tema SQL

INNER JOIN

Combina dos conjuntos de filas conservando solo las que cumplen la condición de unión; el resto se descarta. Es el tipo de JOIN más estricto y el habitual cuando solo te interesan relaciones «existentes» entre tablas.

Todos los temas

129 tema(s) · elige uno para abrirlo

SELECT básico INNER JOIN LEFT JOIN Filtro sobre agregados (HAVING) Subconsulta escalar en WHERE INSERT: nuevas filas UPDATE: modificar filas existentes DELETE UNION / UNION ALL CTE (WITH) DISTINCT EXISTS (subconsulta) CASE (expresión condicional) GROUP BY ORDER BY RIGHT JOIN CROSS JOIN CREATE TABLE CREATE INDEX CREATE VIEW ALTER TABLE TRUNCATE TABLE MERGE / UPSERT Tipos de datos SQL WHERE: predicados y filtros LIMIT, OFFSET y FETCH LIKE y comodines IN y BETWEEN ANY, SOME y ALL Funciones de agregación Funciones escalares (texto, número,... COALESCE, NULLIF e IFNULL/ISNULL FULL OUTER JOIN SELF JOIN Subconsulta correlacionada INTERSECT y EXCEPT / MINUS CTE recursiva (WITH RECURSIVE) Funciones de ventana (OVER) DROP VIEW DROP INDEX DROP TABLE CREATE DATABASE Restricciones: NOT NULL, UNIQUE, PRI... FOREIGN KEY (clave foránea) Secuencias e identidad (AUTO_INCREME... Tablas temporales GRANT y REVOKE (DCL) Transacciones (BEGIN, COMMIT, ROLLBA... Triggers (disparadores) Procedimientos almacenados Funciones definidas por el usuario JSON en SQL LATERAL y APPLY (CROSS / OUTER) PIVOT y UNPIVOT RETURNING y OUTPUT FETCH … WITH TIES y OFFSET/FETCH DISTINCT ON (PostgreSQL) TABLESAMPLE FOR UPDATE, SKIP LOCKED y NOWAIT FIND_IN_SET() (MySQL / MariaDB) GROUP_CONCAT() (MySQL / MariaDB) IF() (MySQL / MariaDB) IFNULL() (MySQL / MariaDB) NULLIF() (MySQL / MariaDB) FIELD() (MySQL / MariaDB) ELT() (MySQL / MariaDB) STR_TO_DATE() (MySQL / MariaDB) DATE_FORMAT() (MySQL / MariaDB) TIMESTAMPDIFF() (MySQL / MariaDB) UUID() (MySQL / MariaDB) RAND() (MySQL / MariaDB) CONCAT_WS() (MySQL / MariaDB) SUBSTRING_INDEX() (MySQL / MariaDB) JSON_EXTRACT() (MySQL / MariaDB) JSON_UNQUOTE() (MySQL / MariaDB) MAKE_SET() (MySQL / MariaDB) EXPORT_SET() (MySQL / MariaDB) SLEEP() (MySQL / MariaDB) BENCHMARK() (MySQL / MariaDB) STRING_AGG() (SQL Server) ISNULL() (SQL Server) GETDATE() (SQL Server) SYSDATETIME() (SQL Server) DATEDIFF() (SQL Server) DATEADD() (SQL Server) IIF() (SQL Server) CHOOSE() (SQL Server) TRY_CAST / TRY_CONVERT (SQL Server) NEWID() (SQL Server) generate_series() (PostgreSQL) unnest() (PostgreSQL) array_agg() (PostgreSQL) jsonb_build_object() (PostgreSQL) jsonb_each() (PostgreSQL) to_tsvector() (PostgreSQL) to_tsquery() (PostgreSQL) set_config() (PostgreSQL) current_setting() (PostgreSQL) pg_sleep() (PostgreSQL) LAST_INSERT_ID() (MySQL / MariaDB) MATCH() … AGAINST() (MySQL / MariaDB... INSERT … ON DUPLICATE KEY UPDATE (My... UNIX_TIMESTAMP() / FROM_UNIXTIME() (... JSON_TABLE() (MySQL / MariaDB) REGEXP / RLIKE (MySQL / MariaDB) CONV() (MySQL / MariaDB) QUOTE() (MySQL / MariaDB) INSERT IGNORE (MySQL / MariaDB) ANY_VALUE() (MySQL / MariaDB) FOR JSON (SQL Server) CROSS APPLY / OUTER APPLY (SQL Serve... STUFF() (SQL Server) FORMAT() (SQL Server) TRY_PARSE() (SQL Server) EOMONTH() (SQL Server) STRING_SPLIT() (SQL Server) PIVOT (SQL Server) AT TIME ZONE (SQL Server) OPENJSON (SQL Server) date_trunc() (PostgreSQL) age() (PostgreSQL) jsonb_path_query / SQL/JSON (Postgre... Operadores de array (PostgreSQL) COPY (PostgreSQL) row_to_json / to_jsonb (PostgreSQL) Tipos rango (PostgreSQL) INTERVAL (PostgreSQL) FILTER en agregados (PostgreSQL) GENERATED … AS IDENTITY (PostgreSQL)

Descripción

INNER JOIN enlaza cada fila de la tabla izquierda con las de la derecha que satisfacen ON. Si una fila de un lado no tiene pareja, no aparece en el resultado. Úsalo cuando la lógica de negocio exige que exista relación (por ejemplo solo pedidos con cliente válido). La condición ON suele igualar clave foránea con primaria, pero puede incluir filtros adicionales con AND. Diferencia ON de WHERE cuando uses OUTER JOIN; con INNER JOIN muchos planes son equivalentes, pero ON documenta la intención de unión.

Estructura general

Forma habitual de la sentencia: orden de cláusulas, qué parte filtra, agrupa o proyecta columnas, y qué devuelve el motor. Cópiala como plantilla y sustituye nombres por tus tablas reales.

SQL
SELECT columnas
  FROM tabla_a AS alias_a
  INNER JOIN tabla_b AS alias_b
    ON condición_de_unión
  [ WHERE ... ];

Componentes

Cada componente tiene un papel concreto en la ejecución lógica de la sentencia. Léelos en orden: así entiendes qué puedes omitir, qué es obligatorio y qué expresiones son válidas en cada sitio según tu motor.

INNER JOIN
Palabra clave que indica unión interna: solo filas con coincidencia en ambos lados según ON. Puedes encadenar varios JOIN en el mismo FROM.
ON
Condición de emparejamiento (típicamente claves); puede llevar varias comparaciones unidas con AND. Se evalúa en el contexto del join antes de aplicar filtros posteriores en WHERE si los separas por legibilidad.
Alias (AS)
Nombre corto para cada tabla (u.nombre, p.id) que evita ambigüedad y aligera la consulta. Recomendado incluso con una sola tabla si hay subconsultas repetidas.

Ejemplos

Ejemplo 1

SQL
SELECT u.nombre, p.titulo
FROM usuarios AS u
INNER JOIN posts AS p ON p.usuario_id = u.id
WHERE u.activo = 1;

Ejemplo 2

SQL
SELECT COUNT(p.id)
FROM usuarios u
INNER JOIN posts p ON p.usuario_id = u.id
WHERE u.id = 1;

Enlaces internos para seguir leyendo: SELECT, WHERE, JOIN, GROUP BY y el resto de la referencia SQL.

Los ejemplos son ilustrativos. En producción usa consultas parametrizadas (prepared statements), revisa índices y aplica el principio de menor privilegio en cuentas de base de datos.