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.