Produto cartesiano
Agora, veremos outra operação binária, chamada produto cartesiano (ou produto cruzado ou junção cruzada). O símbolo que a representa é .
Apesar de ser uma operação de conjunto binária, as relações sobre as quais ela é aplicada não precisam ser compatíveis. Isso significa que o número de colunas, bem como o tipo das colunas, não precisam ser os mesmos.
O produto cartesiano gera uma nova relação formada pela combinação de cada tupla da primeira relação com cada tupla da segunda.
A relação resultante Q tem uma tupla para cada combinação de tuplas — uma de R e uma de S. Logo, se R tem tuplas (indicado como ), e S tem tuplas, então R × S terá tuplas.
Vale destacar que, isoladamente, o produto cartesiano raramente tem utilidade prática. Ele se torna significativo quando combinado a uma operação de seleção, que impõe condições para relacionar atributos das relações envolvidas. Assim, primeiro ocorre a junção de atributos, e em seguida a filtragem das tuplas de interesse.
👨🏻💻 Da Álgebra Relacional para SQL
Em SQL, o PRODUTO CARTESIANO pode ser realizado usando a opção CROSS JOIN
nas tabelas juntadas. Como alternativa, se houver duas tabelas na cláusula WHERE
e não houver condição de junção correspondente na consulta, o resultado também será o PRODUTO CARTESIANO das duas tabelas.
1️⃣ Exemplo simples de produto cartesiano:
SELECT *
FROM funcionarios, setores;
2️⃣ Produto cartesiano seguido pela operação de seleção:
SELECT *
FROM funcionarios, setores
WHERE funcionarios.setor_id = setores.id
👨🏻💻 Código
CREATE DATABASE exemplo;
USE exemplo;
create table MONTADORA(
id INT AUTO_INCREMENT PRIMARY KEY,
nome VARCHAR(50) NOT NULL UNIQUE,
pais VARCHAR(40) NOT NULL
);
create table MODELO(
id INT AUTO_INCREMENT PRIMARY KEY,
nome VARCHAR(50) NOT NULL UNIQUE,
montadora_id INT,
FOREIGN KEY (montadora_id) REFERENCES montadora(id)
);
INSERT INTO MONTADORA (nome,pais) VALUES ("Volkswagen","Alemanha");
INSERT INTO MONTADORA (nome,pais) VALUES ("Fiat","Italia");
INSERT INTO MONTADORA (nome,pais) VALUES ("Ford","Estados Unidos");
INSERT INTO MODELO (nome,montadora_id) VALUES ("Gol",1);
INSERT INTO MODELO (nome,montadora_id) VALUES ("Argo",2);
INSERT INTO MODELO (nome,montadora_id) VALUES ("Fiesta",3);
INSERT INTO MODELO (nome,montadora_id) VALUES ("Fusca",1);
Aplicando o produto cartesiano simples, temos o seguinte resultado:
SELECT * FROM MONTADORA, MODELO;
id | nome | pais | id | nome | montadora_id |
---|---|---|---|---|---|
1 | Ford | Estados Unidos | 1 | Gol | 1 |
2 | Fiat | Italia | 1 | Gol | 1 |
3 | Volkswagen | Alemanha | 1 | Gol | 1 |
1 | Ford | Estados Unidos | 2 | Argo | 2 |
2 | Fiat | Italia | 2 | Argo | 2 |
3 | Volkswagen | Alemanha | 2 | Argo | 2 |
1 | Ford | Estados Unidos | 3 | Fiesta | 3 |
2 | Fiat | Italia | 3 | Fiesta | 3 |
3 | Volkswagen | Alemanha | 3 | Fiesta | 3 |
1 | Ford | Estados Unidos | 4 | Fusca | 1 |
2 | Fiat | Italia | 4 | Fusca | 1 |
3 | Volkswagen | Alemanha | 4 | Fusca | 1 |
Aplicando uma operação de seleção () após o produto cartesiano:
SELECT * FROM MONTADORA,MODELO
WHERE MONTADORA.id = MODELO.montadora_id;
id | nome | pais | id | nome | montadora_id |
---|---|---|---|---|---|
1 | Volkswagen | Alemanha | 1 | Gol | 1 |
1 | Volkswagen | Alemanha | 4 | Fusca | 1 |
2 | Fiat | Italia | 2 | Argo | 2 |
3 | Ford | Estados Unidos | 3 | Fiesta | 3 |
Para organizar melhor, podemos aplicar a operação de renomear (:
SELECT m.id, m.nome, m.pais, c.id, c.nome
FROM MONTADORA AS M, MODELO AS C
WHERE m.id = c.montadora_id;
id | nome | pais | id | nome |
---|---|---|---|---|
1 | Volkswagen | Alemanha | 1 | Gol |
1 | Volkswagen | Alemanha | 4 | Fusca |
2 | Fiat | Italia | 2 | Argo |
3 | Ford | Estados Unidos | 3 | Fiesta |