Tipos de SQL JOIN comparados: inner, outer, cross, self, lateral, natural — o que cada um devolve e um exemplo de uma linha.
Os joins combinam linhas de duas tabelas através de uma chave partilhada. O tipo de join decide quais linhas sobrevivem quando as chaves coincidem, falham ou se repetem.
Tabela de referência · 8 entradas
SQL JoinsExplained
8 of 8 rows
Inner e outer
Apenas linhas em que a condição ON coincide nas duas tabelas. As linhas sem correspondência de qualquer dos lados são descartadas.
SELECT u.name, o.total FROM users u INNER JOIN orders o ON u.id = o.user_id;
Todas as linhas da tabela da esquerda. As colunas da direita ficam NULL onde não existe correspondência.
SELECT u.name, o.total FROM users u LEFT OUTER JOIN orders o ON u.id = o.user_id;
Todas as linhas da tabela da direita. As colunas da esquerda ficam NULL onde não existe correspondência.
SELECT u.name, o.total FROM users u RIGHT OUTER JOIN orders o ON u.id = o.user_id;
Todas as linhas das duas tabelas. Os lados sem correspondência ficam preenchidos com NULL.
SELECT u.name, o.total FROM users u FULL OUTER JOIN orders o ON u.id = o.user_id;
Cross e self
Produto cartesiano. Cada linha da esquerda emparelha com cada linha da direita. Sem cláusula ON.
SELECT u.name, o.total FROM users u CROSS JOIN orders o;
Uma tabela ligada a si própria através de aliases. Compara linhas dentro de uma só tabela.
SELECT a.id AS o1, b.id AS o2 FROM orders a JOIN orders b ON a.user_id = b.user_id WHERE a.id < b.id;
Avançados
Uma subquery em FROM avaliada por cada linha exterior. A subquery pode referenciar as colunas da tabela exterior.
SELECT u.name, o.total FROM users u, LATERAL (SELECT total FROM orders WHERE user_id = u.id LIMIT 1) o;
Liga pelas colunas que partilham o nome. Sem cláusula ON. Atenção a colisões de chaves não intencionais.
SELECT u.name, o.total FROM users u NATURAL JOIN orders o;