Voltar para a lista de artigos Artigos
5 minutos de leitura

Um Guia Ilustrado para o SQL CROSS JOIN

O que é uma declaração SQL CROSS JOIN? Quando você deve usá-la? Quando você não deve usá-la? Este post lhe dirá o que você precisa saber sobre CROSS JOIN.

Você já sabe que pode usar a instrução SQL JOIN para juntar uma ou mais tabelas que compartilham um registro correspondente. E se você ler o post do LearnSQL Aprendendo Cláusulas JOIN em SQL Utilizando Situações da Vida Real, você sabe que há muitos tipos de JOINs. Qual deles você escolhe dependerá do que você quer que ele faça.

Há um JOIN que não usamos com freqüência, mas que serve um propósito muito específico: o CROSS JOIN. Neste artigo, vou explicar o que um CROSS JOIN faz e como funciona. Explicarei também quando você deve usar um, e quando não deve.

O que é um CROSS JOIN?

Primeiro, vamos rever o que um JOIN faz em SQL: permite combinar dados (ou seja, registros) de várias tabelas. Os operadores do JOIN permitem que você junte registros de maneiras específicas, como por exemplo, apenas registros que tenham uma correspondência em ambas as tabelas.

Ao começarmos a explorar CROSS JOIN, começaremos a trabalhar com duas tabelas, "color" e "tshirt".

O ".color", que armazena os nomes das cores disponíveis para as camisetas, tem este aspecto:

id name
1 yellow
2 green
3 pink

A "tshirt", que armazena os tamanhos de várias camisetas, tem este aspecto:

id size
1 S
2 M
3 L
4 XL

As pessoas usam camisetas em todas as combinações de tamanhos e cores. Assim, vamos unir os dados destas tabelas.

O que é um CROSS JOIN?

CROSS JOIN devolve um produto cartesiano, ou todos os registros unidos a todos os registros em todas as tabelas. Não há nenhuma condição JOIN (ou seja, nenhuma cláusula ON). O número resultante de registros é igual ao número de linhas da primeira tabela multiplicado pelo número de linhas da segunda tabela. CROSS JOIN é usado muito raramente. Como ele produz todas as combinações possíveis de registros de todas as tabelas, pode ser uma operação perigosa para tabelas que contêm muitos registros.

Temos nossas duas tabelas, mostradas abaixo. Vamos usar um CROSS JOIN nelas e ver o que acontece:

tshirt
id size
1 S
2 M
3 L
4 XL
color
id name
1 yellow
2 green
3 pink










SELECT *  FROM  tshirt
CROSS JOIN  color;

Observe que uma tabela é listada após a cláusula FROM; o outro nome da tabela segue CROSS JOIN Não importa qual tabela é listada depois da e qual é depois da CROSS JOIN. Os resultados serão os mesmos: todas as combinações possíveis de registros de todas as tabelas.

Aqui está o resultado desta operação:

id size id name
1 S 1 yellow
2 M 1 yellow
3 L 1 yellow
4 XL 1 yellow
1 S 2 green
2 M 2 green
3 L 2 green
4 XL 2 green
1 S 3 pink
2 M 3 pink
3 L 3 pink
4 XL 3 pink

Selecionamos todos os registros da tabela "tshirt"tabela e junte cada registro com todos os registros da "color" mesa. Em outras palavras, temos a combinação de cada camiseta em cada tamanho com cada cor. O gráfico abaixo explica isso visualmente:

CROSS JOIN

Outras formas de obter produtos cartesianos

Há outra forma de obter uma consulta para devolver um produto cartesiano sem utilizar CROSS JOIN:

SELECT *  FROM  tshirt, color ;

Neste caso, as tabelas que você deseja participar devem ser listadas após a cláusula FROM . Note que, ao utilizar o *, você está selecionando todos os registros de ambas as tabelas. O resultado definido será o mesmo que o exemplo CROSS JOIN acima.

Usando CROSS JOIN na Multiplicação

Também podemos usar CROSS JOIN para fazer multiplicação. Vamos usar duas tabelas que armazenam alguns números básicos para ver como isto funciona. Primeiro, dê uma olhada nas tabelas:

"t1"

n
11
12
13

"t2"

n
11
12
13

Ambas as tabelas armazenam os mesmos números: 11, 12, 13. Nosso objetivo é multiplicar esses números por si mesmos, criando uma espécie de tabela de multiplicação. Podemos usar CROSS JOIN para fazer isso. Veja a consulta abaixo:

SELECT t1.n, t2.n, t1.n*t2.n AS result  FROM  t1
CROSS JOIN  t2 ;

O SELECT lista três colunas: números da primeira tabela (t1.n), números da segunda tabela (t2.n), e a multiplicação que é armazenada na coluna de resultados (t1.n*t2.n AS result). A tabela abaixo mostra o resultado:

t1.n t2.n result
11 11 121
11 12 132
11 13 143
12 11 132
12 12 144
12 13 156
13 11 143
13 12 156
13 13 169

Usando CROSS JOIN with Many Tables

Podemos utilizar mais de duas mesas em um CROSS JOIN. Imagine que uma empresa produz camisetas em três tamanhos (S, M, L) e em dois tecidos (algodão e linho). Cada camiseta está disponível em duas cores: rosa ou azul. Dê uma olhada nas seguintes tabelas:

"cor".

id name
1 blue
3 pink

"camiseta".

id size
1 S
2 M
3 L

"tecido".

id name
1 cotton
2 linen

Agora suponha que você queira ver todas as camisetas possíveis: cada combinação de tamanho, cor e tecido. A consulta abaixo recupera esta informação usando um CROSS JOIN em três tabelas:

SELECT tshirt.size as size, color.name AS color, fabric.name as fabric
FROM  tshirt 
CROSS JOIN  fabric
CROSS JOIN  color ;

Aqui está o resultado:

size color fabric
S blue cotton
M blue cotton
L blue cotton
S pink cotton
M pink cotton
L pink cotton
S blue linen
M blue linen
L blue linen
S pink linen
M pink linen
L pink linen

Existem doze camisetas possíveis. As duas cores multiplicadas por três tamanhos e novamente por dois tecidos resultam em um 12.

Saiba mais

Há mais a saber sobre o uso de CROSS JOIN do que o que cobrimos nesta introdução ilustrada. Se você quiser saber mais sobre JOINs, confira o curso LearnSQL SQL para Iniciantes.