DBAtlas · Atlas de operações de banco de dados

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;

Um JOIN combina duas tabelas de acordo com a condição informada. INNER retorna apenas as correspondências; LEFT/RIGHT retornam todas as linhas de um lado (NULL onde não há correspondência); FULL retorna as linhas dos dois lados; CROSS retorna todas as combinações. Além dos JOINs ANSI padrão, o Oracle também suporta a antiga sintaxe 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;

O PostgreSQL suporta totalmente todos os tipos de JOIN padrão (INNER, LEFT/RIGHT/FULL OUTER, CROSS). USING(my_column) é uma abreviação para colunas com nomes comuns, enquanto NATURAL JOIN une automaticamente por todas as colunas de mesmo nome (use com 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;

O MySQL/MariaDB suportam INNER, LEFT, RIGHT e CROSS JOIN, mas não oferecem FULL OUTER JOIN diretamente; ele é emulado combinando os resultados de LEFT e RIGHT com UNION. O antigo join com vírgula gera um produto cartesiano e deve ser restringido com 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;

O SQL Server suporta todos os tipos de JOIN padrão. Os antigos operadores de outer join *= / =* foram removidos; deve-se usar a sintaxe ANSI JOIN. APPLY (CROSS/OUTER APPLY) é uma forma adicional de join para subconsultas correlacionadas linha a linha.

MongoDB

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

O MongoDB não tem JOIN clássico; o estágio de agregação $lookup obtém os documentos correspondentes de outra coleção como um array (semelhante a um left outer join). Para um resultado semelhante a INNER, filtre depois os arrays vazios com $match e expanda o array em linhas com $unwind.

Redis

# Not applicable: Redis has no tables or JOINs.

O Redis não oferece joins relacionais; os dados geralmente são desnormalizados, ou as relações são montadas no lado do cliente lendo várias chaves. O RediSearch (FT.AGGREGATE) pode ser usado para consultas limitadas semelhantes a join; o suporte ao módulo RedisGraph terminou em 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.

Devido à sua arquitetura distribuída, o Elasticsearch não oferece JOINs arbitrários entre tabelas. Para relações limitadas, existem o tipo de campo 'nested' dentro de um único índice e o tipo de campo 'join' (parent/child) no mesmo shard. A solução mais comum é desnormalizar os dados no momento da indexação.

Abrir no DBAtlas →