Código SQL copiado para a área de transferência
RU EN FR

Lição 5.6: CROSS JOIN - O Produto Cartesiano

Enquanto a maioria das junções exige uma condição de correspondência específica (a cláusula ON), o CROSS JOIN é diferente. Ele retorna todas as combinações possíveis de linhas das tabelas unidas. Esse resultado é conhecido matematicamente como um Produto Cartesiano.

O que é um CROSS JOIN?

Um CROSS JOIN produz um conjunto de resultados onde o número de linhas é o resultado da multiplicação do número de linhas na primeira tabela pelo número de linhas na segunda tabela. Nenhuma condição é usada para corresponder às linhas; cada linha na Tabela A simplesmente encontra cada linha na Tabela B.

Visualização:

   Tabela A (Cores)             Tabela B (Tamanhos)
   +-----------+                +-----------+
   | cor       |                | tamanho   |
   +-----------+                +-----------+
   | Vermelho  |  --\           | Pequeno   |
   | Azul      |  ---|------>   | Médio     |
   +-----------+  --/           | Grande    |
                                +-----------+

   Resultado (Combinações):
   Vermelho, Pequeno
   Vermelho, Médio
   Vermelho, Grande
   Azul, Pequeno
   Azul, Médio
   Azul, Grande

Se a Tabela A tiver 2 linhas e a Tabela B tiver 3 linhas, o resultado terá 2 x 3 = 6 linhas.

Sintaxe do CROSS JOIN

Existem duas formas de escrever um produto cartesiano:

-- Sintaxe explícita
SELECT
    table1.column,
    table2.column
FROM
    table1
CROSS JOIN
    table2;

-- Sintaxe implícita com vírgula
SELECT
    table1.column,
    table2.column
FROM
    table1,
    table2;

É importante entender que essas formas diferem não apenas em estilo, mas também na prioridade das operações.

  • Um JOIN explícito tem prioridade mais alta e é processado junto com os outros JOINs na ordem do texto da consulta.
  • A sintaxe com vírgula tem prioridade mais baixa e, na prática, é processada somente depois dos JOINs explícitos.

Por isso, misturar vírgula e JOIN explícito dentro do mesmo FROM pode mudar o significado da consulta ou até gerar erro.

Por exemplo, a consulta abaixo é incorreta:

FROM a, b JOIN c ON (a.x = c.y AND b.z = c.t)

Por que isso é um erro:

  • primeiro será processado o b JOIN c explícito;
  • nesse ponto, a tabela a ainda não está no escopo dessa junção;
  • portanto, a referência a a.x dentro da cláusula ON é inválida.

É por isso que o CROSS JOIN explícito geralmente é preferível: não apenas porque parece mais claro, mas porque se integra melhor com os demais JOINs e evita problemas ocultos de precedência.

Aviso: Seja extremamente cuidadoso ao usar CROSS JOIN em tabelas grandes. Unir duas tabelas com 1.000 linhas cada produzirá 1.000.000 de linhas!

Exemplos Práticos (Banco de Dados Sakila)

1. Gerando Todas as Combinações Possíveis

Imagine que queiramos criar um relatório ou uma grade que mostre todas as categorias de filmes para cada loja, mesmo que essa loja não tenha filmes nessa categoria no momento.

SELECT
    s.store_id,
    c.name AS nome_categoria
FROM
    store AS s
CROSS JOIN
    category AS c;

Isso produz uma lista de todas as categorias para a Loja 1, seguida de todas as categorias para a Loja 2.

2. Criando Dados de Teste ou Matrizes

O CROSS JOIN é frequentemente usado para gerar grandes conjuntos de permutações para testes ou para construir calendários/agendas onde você precisa ver todos os intervalos de tempo para todos os usuários.

Quando Usar CROSS JOIN

  • Gerando Permutações: Quando você precisa de uma lista de todas as combinações possíveis (ex: todas as cores de produtos vs. todos os tamanhos de produtos).
  • Preenchendo Lacunas: Quando usado com LEFT JOIN, pode ajudar a identificar combinações ausentes em seus dados.
  • Relatórios: Para criar o "esqueleto" de um relatório que deve incluir todas as categorias, mesmo aquelas com valores zero.

Principais Conclusões desta Lição

  • CROSS JOIN retorna o Produto Cartesiano de duas tabelas.
  • Ele não usa uma cláusula ON (sem condição de correspondência).
  • O número de linhas no resultado é o produto da contagem de linhas de ambas as tabelas.
  • Use-o com cautela em grandes conjuntos de dados para evitar problemas de desempenho.