DBAtlas · Atlas de operaciones de bases de datos

Tipos de JOIN (INNER/LEFT/RIGHT/FULL/CROSS)

Oracle

-- INNER: matching rows
SELECT m.name, s.amount
FROM customer m JOIN orders s ON m.id = s.customer_id;
-- LEFT: customers without orders are included too
SELECT m.name, s.amount
FROM customer m LEFT JOIN orders s ON m.id = s.customer_id;
-- CROSS: Cartesian product
SELECT r.name, u.name FROM color r CROSS JOIN product u;

Un JOIN combina dos tablas según la condición indicada. INNER devuelve solo las coincidencias; LEFT/RIGHT devuelven todas las filas de un lado (NULL donde no hay coincidencia); FULL devuelve las filas de ambos lados; CROSS devuelve todas las combinaciones. Además de los JOIN ANSI estándar, Oracle también admite la antigua sintaxis de outer join (+).

PostgreSQL

SELECT m.name, s.amount
FROM customer m INNER JOIN orders s ON m.id = s.customer_id;

SELECT m.name, s.amount
FROM customer m LEFT JOIN orders s ON m.id = s.customer_id;

SELECT m.name, s.amount
FROM customer m FULL OUTER JOIN orders s ON m.id = s.customer_id;

PostgreSQL admite plenamente todos los tipos de JOIN estándar (INNER, LEFT/RIGHT/FULL OUTER, CROSS). USING(my_column) es una abreviatura para columnas con el mismo nombre, mientras que NATURAL JOIN une automáticamente por todas las columnas homónimas (úselo con cuidado).

MySQL

SELECT m.name, s.amount
FROM customer m INNER JOIN orders s ON m.id = s.customer_id;

SELECT m.name, s.amount
FROM customer m LEFT JOIN orders s ON m.id = s.customer_id;

-- MySQL has no FULL OUTER JOIN:
SELECT m.name, s.amount FROM customer m LEFT JOIN orders s ON m.id = s.customer_id
UNION
SELECT m.name, s.amount FROM customer m RIGHT JOIN orders s ON m.id = s.customer_id;

MySQL/MariaDB admiten INNER, LEFT, RIGHT y CROSS JOIN, pero no ofrecen FULL OUTER JOIN directamente; se emula combinando los resultados de LEFT y RIGHT con UNION. El antiguo join con comas produce un producto cartesiano y debe restringirse con ON/WHERE.

SQL Server

SELECT m.name, s.amount
FROM customer m INNER JOIN orders s ON m.id = s.customer_id;

SELECT m.name, s.amount
FROM customer m LEFT JOIN orders s ON m.id = s.customer_id;

SELECT m.name, s.amount
FROM customer m FULL OUTER JOIN orders s ON m.id = s.customer_id;

SQL Server admite todos los tipos de JOIN estándar. Los antiguos operadores de outer join *= / =* se han eliminado; debe usarse la sintaxis JOIN ANSI. APPLY (CROSS/OUTER APPLY) es una forma de join adicional para subconsultas correlacionadas fila a fila.

MongoDB

// Closest equivalent: $lookup (left outer join)
db.customer.aggregate([
  { $lookup: {
      from: "orders",
      localField: "id",
      foreignField: "customer_id",
      as: "orders"
  } }
])

MongoDB no tiene JOIN clásico; la etapa de agregación $lookup obtiene como array los documentos coincidentes de otra colección (similar a un left outer join). Para un resultado tipo INNER, filtre después los arrays vacíos con $match y expanda el array en filas con $unwind.

Redis

# Not applicable: Redis has no tables or JOINs.

Redis no ofrece joins relacionales; los datos suelen desnormalizarse, o las relaciones se construyen en el lado del cliente leyendo varias claves. RediSearch (FT.AGGREGATE) puede usarse para consultas limitadas de tipo join; el soporte del módulo RedisGraph terminó en 2023.

Elasticsearch

# Not applicable: there is no general JOIN in a distributed design.
# Limited options: nested, parent/child (join field),
# terms lookup. Data is usually denormalized at indexing time.

Por su arquitectura distribuida, Elasticsearch no ofrece JOIN arbitrarios entre tablas. Para relaciones limitadas existen el tipo de campo 'nested' dentro de un único índice y el tipo de campo 'join' (parent/child) en el mismo shard. La solución más habitual es desnormalizar los datos en el momento de la indexación.

Abrir en DBAtlas →