You are on page 1of 24

CONSULTAS EM

BANCO DE DADOS

Alessandra Maciel Paz Milani


Produto cartesiano em SQL
Objetivos de aprendizagem
Ao final deste texto, você deve apresentar os seguintes aprendizados:

„„ Descrever a operação de produto cartesiano em álgebra relacional.


„„ Exemplificar a operação de produto cartesiano em um banco de
dados relacional.
„„ Demonstrar a operação de produto cartesiano em SQL.

Introdução
Vivemos em uma sociedade cada dia mais orientada a dados, e aqueles
indivíduos ou empresas que conseguirem extrair informação desses
dados poderão exercer suas atividades de maneira mais eficaz, o que
pode ampliar suas capacidades para tomadas de decisão mais assertivas.
Por conseguinte, há uma grande demanda por sistemas que permitem
o armazenamento e a recuperação desses dados. Atendendo a esse
propósito, existem muitas soluções para sistemas de gerenciamento de
banco de dados (SGBD), que possibilitam a realização de consultas por
meio da linguagem padrão SQL (Structured Query Language). E, uma
vez que os conceitos da álgebra relacional fazem parte dos fundamentos
da SQL e de como os SGBD comerciais processarão as consultas que
desenvolvemos, torna-se imprescindível entendermos o funcionamento
das operações da álgebra relacional.
Neste capítulo, você conhecerá a operação de produto cartesiano
em álgebra relacional, conseguirá identificar a operação de produto car-
tesiano em bancos de dados relacionais por meio de diversos exemplos
conceituais e, por fim, compreenderá como implementar essa operação
em SQL no SGBD PostgreSQL.
2 Produto cartesiano em SQL

1 Produto cartesiano em álgebra relacional


Pelo fato de a álgebra relacional oferecer fundamentos para manipular con-
juntos de dados em bancos de dados relacionais, quando necessitamos buscar
informações contidas em duas ou mais tabelas, podemos utilizar sua operação
produto cartesiano, que resultará, por sua vez, em uma relação composta pela
combinação de todas as tuplas das relações informadas como entrada. Assim,
essa operação produzirá novas tuplas ao concatenar todas as combinações de
tuplas possíveis de n relações básicas (ELMASRI; NAVATHE, 2011).
A operação produto cartesiano faz parte da lista de operações de conjuntos
e é classificada como uma operação binária. Logo, também pode ser explicada
como a operação que produz um novo conjunto resultante da multiplicação
de conjuntos. E, seguindo uma definição mais formal, como em Date (2016),
o produto cartesiano de dois conjuntos s1 e s2 (s1 × s2) é o conjunto de todos
os pares ordenados de elementos <x1, x2>, de modo que o primeiro elemento
do par (x1) seja um elemento de s1 e o segundo elemento do par (x2) seja
um elemento de s2. Note que essa definição pode ser aplicada para qualquer
número de conjuntos.
Outra maneira de formalizar a operação de produto cartesiano, representada
pelo ×, seria utilizando a seguinte expressão:

<Relação A> × <Relação B>

Então, por exemplo, considerando uma relação de Funcionários com essa


estrutura e esses elementos:

Funcionários = {matrícula, nome, endereço, data nascimento,


estado civil}
Funcionários = {< 101, Ana, Rua Florida, 12/05/1970, Casado >,
< 102, Carlos, Rua Tulipa, 22/06/1990, Solteiro >,
< 103, João, Avenida Flor, 01/02/1975, Casado >,
< 104, Rubens, Rua Violeta, 02/10/1980, Casado >}
Produto cartesiano em SQL 3

E outra relação de Departamentos, contendo estes elementos:

Departamentos = {código, descrição}


Departamentos = {< 1, RH >,
< 2, Vendas >}

Suponha que seja necessário realizar uma consulta que apresente todas
as informações combinadas para Funcionários e Departamentos.
A formalização dessa operação de produto cartesiano poderá será representada
pela expressão:

Funcionários × Departamentos

Por conseguinte, o retorno dessa operação será uma nova relação, que iden-
tificaremos como Func_Depto e que terá a seguinte estrutura e elementos:

Func _ Depto = {matrícula, nome, endereço, data nascimento,


estado civil, código, descrição}
Func _ Depto = {< 101, Ana, Rua Florida, 12/05/1970, Casado, 1,
RH >,
< 101, Ana, Rua Florida, 12/05/1970, Casado, 2, Vendas >,
< 102, Carlos, Rua Tulipa, 22/06/1990, Solteiro, 1, RH >,
< 102, Carlos, Rua Tulipa, 22/06/1990, Solteiro, 2,
Vendas >,
< 103, João, Avenida Flor, 01/02/1975, Casado, 1, RH >,
< 103, João, Avenida Flor, 01/02/1975, Casado, 2, Vendas >,
< 104, Rubens, Rua Violeta, 02/10/1980, Casado, 1, RH >,
< 104, Rubens, Rua Violeta, 02/10/1980, Casado, 2,
Vendas >}

Na Figura 1, você pode encontrar uma representação visual desse processo


da operação produto cartesiano aplicada ao nosso exemplo de Funcioná-
rios e Departamentos: no lado esquerdo, são apresentadas as relações
de funcionários e departamentos, utilizadas como entrada na operação; e,
à direita, são apresentadas a saída, a relação resultante Func_Depto, e
suas respectivas tuplas geradas de acordo com a combinação entre as tuplas
existentes nas relações de entrada.
4 Produto cartesiano em SQL

Figura 1. Representação visual para a operação produto cartesiano utilizando como exem-
plos as relações (entrada) Funcionários e Departamentos e a nova relação (saída)
Func_Depto.

Ainda, segundo Elmasri e Navathe (2011), a operação produto cartesiano


pode ser encontrada com outros termos, como “produto cruzado” e “junção
cruzada”, devendo, portanto, ser entendidos como sinônimos. Além disso,
cabe lembrar, que nesse contexto de estudo, você pode entender os seguintes
grupos de palavras como sinônimos:

„„ relação, conjunto e tabela;


„„ tuplas, registros e linhas;
„„ atributos, colunas ou campos.

Por fim, considerando uma representação de relações em formato tabular,


o conceito que vimos aqui para operação do produto cartesiano pode ser ilus-
trado da seguinte maneira: a quantidade de linhas resultantes corresponderá
à multiplicação da quantidade de linhas em cada tabela informada como
entrada. Já o número resultante de colunas será a soma da quantidade de
colunas existentes em cada tabela. A seguir, continuaremos a explorar essa
operação apresentando novos exemplos em formato tabular, como o utilizado
em bancos de dados relacionais.
Produto cartesiano em SQL 5

Exemplos da operação produto cartesiano


em tabelas relacionais
A partir de agora, você verá alguns exemplos da operação produto carte-
siano aplicada em tabelas de bancos de dados relacionais. Iniciaremos com
um caso simples: uma loja com duas tabelas, uma para armazenar dados de
clientes (cliente) e outra para o registro de pedidos realizados (pedido).
Na Figura 2, é mostrado o efeito da aplicação da operação produto cartesiano
considerando essas duas tabelas de entrada (cliente × pedido) e a nova
relação produzida (cliente_pedido).

Figura 2. Exemplo da operação produto cartesiano aplicada nas tabelas cliente e


pedido.

Agora, considere outro caso, o de uma instituição de ensino com três


tabelas: uma que contém dados de alunos (Quadro 1), com 5 linhas e
6 colunas; outra para armazenar dados de disciplinas (Quadro 2), com
3 linhas e 4 colunas; e uma terceira para armazenar dados de professores
(Quadro 3), com 2 linhas e 4 colunas.
Tendo em conta a necessidade da aplicação da operação do produto car-
tesiano para essas tabelas na expressão disciplinas × alunos, pense
nas seguintes questões: como os registros são apresentados na nova relação?
Quais colunas aparecem primeiro? Qual o total de linhas geradas? Depois,
confira no Quadro 4 o resultado esperado e veja se conseguiu realizar essa
mesma operação mentalmente.
6 Produto cartesiano em SQL

Quadro 1. Tabela para representação da relação de alunos

ID_ DATA_ SIT_ ID_


NOME EMAIL
ALUNO NASC MATR DISCIPLINA

10001 João 12/04/1990 jg_rico@ 0 1002


Gustavo Rico mail.com

10002 Luís Tadeu 26/08/1999 tadeum@ 1 1001


Marciano mail.com

10003 Otávio 05/05/1998 o_nunes@ 1 1002


Nunes mail.com
Santos

10004 Marta 10/06/1992 m.azevedo@ 1 1003


Azevedo mail.com

10005 Michele 22/12/1995 mi_lt@ 0 1001


Lima Toledo mail.com

Quadro 2. Tabela para representação da relação de disciplinas

ID_DISCIPLINA DESC_DISC ID_PROFESSOR PERÍODO

1001 Estatística I 101 2020/1

1002 Cálculo Básico 102 2020/1

1003 Cálculo 102 2020/2


Avançado

Quadro 3. Tabela para representação da relação de professores

ID_PROFESSOR NOME TÍTULO DEPARTAMENTO

101 Jose Borges Mestrado Estatística

102 Mariana Tedesco Doutorado Matemática


Quadro 4. Tabela para representação da nova relação disc_alun, resultante da operação produto cartesiano disciplinas × alunos

ID_ DESC_ ID_ ID_ DATA_ SIT_ ID_


PERÍODO NOME EMAIL
DISCIPLINA DISC PROFESSOR ALUNO NASC MATR DISCIPLINA

1001 Estatís- 101 2020/1 10001 João Gus- 1990- Jg_rico@ 0 1002
tica I tavo Rico 04-12 mail.com

1001 Estatís- 101 2020/1 10002 Luís Tadeu 1999- tadeum@ 1 1001
tica I Marciano 08-26 mail.com

1001 Estatís- 101 2020/1 10003 Otávio Nu- 1998- o_nunes@ 1 1002
tica I nes Santos 05-05 mail.com

1001 Estatís- 101 2020/1 10004 Marta 1992- m.azevedo@ 1 1003


tica I Azevedo 06-10 mail.com

1001 Estatís- 101 2020/1 10004 Michele 1995- mi_lt@ 0 1001


tica I Lima 12-22 mail.com
Toledo

1002 Cálculo 102 2020/1 10001 João Gus- 1990- Jg_rico@ 0 1002
Básico tavo Rico 04-12 mail.com

1002 Cálculo 102 2020/1 10002 Luís Tadeu 1999- tadeum@ 1 1001
Básico Marciano 08-26 mail.com

(Continua)
Produto cartesiano em SQL
7
8

(Continuação)

Quadro 4. Tabela para representação da nova relação disc_alun, resultante da operação produto cartesiano disciplinas × alunos

ID_ DESC_ ID_ ID_ DATA_ SIT_ ID_


PERÍODO NOME EMAIL
DISCIPLINA DISC PROFESSOR ALUNO NASC MATR DISCIPLINA
Produto cartesiano em SQL

1002 Cálculo 102 2020/1 10003 Otávio Nu- 1998- o_nunes@ 1 1002
Básico nes Santos 05-05 mail.com

1002 Cálculo 102 2020/1 10004 Marta 1992- m.azevedo@ 1 1003


Básico Azevedo 06-10 mail.com

1002 Cálculo 102 2020/1 10004 Michele 1995- mi_lt@ 0 1001


Básico Lima 12-22 mail.com
Toledo

1003 Cálculo 102 2020/2 10001 João Gus- 1990- Jg_rico@ 0 1002
Avan- tavo Rico 04-12 mail.com
çado

1003 Cálculo 102 2020/2 10002 Luís Tadeu 1999- tadeum@ 1 1001
Avan- Marciano 08-26 mail.com
çado

1003 Cálculo 102 2020/2 10003 Otávio Nu- 1998- o_nunes@ 1 1002
Avan- nes Santos 05-05 mail.com
çado

(Continua)
(Continuação)

Quadro 4. Tabela para representação da nova relação disc_alun, resultante da operação produto cartesiano disciplinas × alunos

ID_ DESC_ ID_ ID_ DATA_ SIT_ ID_


PERÍODO NOME EMAIL
DISCIPLINA DISC PROFESSOR ALUNO NASC MATR DISCIPLINA

1003 Cálculo 102 2020/2 10004 Marta 1992- m.azevedo@ 1 1003


Avan- Azevedo 06-10 mail.com
çado
Produto cartesiano em SQL
9
10 Produto cartesiano em SQL

Como você pôde observar no Quadro 4, a apresentação seguiu a mesma


ordem indicada na expressão, ou seja, primeiro todas as colunas da tabela
disciplinas e, depois, as colunas correspondentes para a tabela alunos.
Para a ordem dos registros (tuplas combinadas), primeiro considerou-se a
primeira tupla da tabela disciplinas para combinar com as 5 tuplas da
tabela alunos. Apenas depois disso, a segunda tupla de disciplinas foi
também combinada com as mesmas tuplas da tabela alunos.
A partir da atualização da demanda, agora é necessário também trazer
informações combinadas com a tabela professores. Para isso, uma nova
expressão para representar essa operação de produto cartesiano é formulada:
disciplinas × alunos × professores. Você consegue prever
qual será o resultado?
A nova relação resultante dessa operação produto cartesiano (discipli-
nas × alunos × professores) retornará uma nova relação contendo
30 registros e 14 colunas. No Quadro 5, está uma amostra das combinações
projetadas considerando somente a aluna de nome “Marta Azevedo”.
A seguir, apresentamos como seria a expressão em álgebra relacional ao
compormos essa operação de seleção:
σ alunos.nome = Marta Azevedo (disciplinas × alunos
× professores)
Com esses exemplos, foi possível verificar a aplicação da operação produto
cartesiano em tabelas, de maneira a combinar o máximo de informações possí-
veis para as tabelas envolvidas. No próximo tópico, você continuará explorando
a operação produto cartesiano, mas por meio de exemplos implementados na
linguagem SQL, além de observar como ela pode ser combinada com outras
operações de álgebra relacional.
Quadro 5. Tabela para representação da relação resultante para operação produto cartesiano de disciplinas × alunos × professores combinada com a ope-
ração seleção, onde coluna nome da tabela alunos é igual a Marta Azevedo.

NOME
NOME

EMAIL
TITULO

PERIODO
SIT_MATR

ID_ALUNO

DESC_DISC
DATA_NASC

ID_DISCIPLINA
ID_DISCIPLINA

ID_PROFESSOR
ID_PROFESSOR
DEPARTAMENTO

1001 Estatística 101 2020/1 10004 Marta 1992- m.azevedo@ 1 1003 101 Jose Mestrado Estatística
I Azevedo 06-10 mail.com Borges

1002 Cálculo 102 2020/1 10004 Marta 1992- m.azevedo@ 1 1003 101 Jose Mestrado Estatística
Básico Azevedo 06-10 mail.com Borges

1003 Cálculo 102 2020/2 10004 Marta 1992- m.azevedo@ 1 1003 101 Jose Mestrado Estatística
Avançado Azevedo 06-10 mail.com Borges

1001 Estatística 101 2020/1 10004 Marta 1992- m.azevedo@ 1 1003 102 Mariana Doutorado Matemática
I Azevedo 06-10 mail.com Tedesco

1002 Cálculo 102 2020/1 10004 Marta 1992- m.azevedo@ 1 1003 102 Mariana Doutorado Matemática
Básico Azevedo 06-10 mail.com Tedesco

1003 Cálculo 102 2020/2 10004 Marta 1992- m.azevedo@ 1 1003 102 Mariana Doutorado Matemática
Avançado Azevedo 06-10 mail.com Tedesco
Produto cartesiano em SQL
11
12 Produto cartesiano em SQL

Implementação da operação produto


cartesiano em SQL
Agora que já está familiarizado com a operação de produto cartesiano, veremos
em mais detalhes como ela pode ser implementada na linguagem prática para
o modelo relacional. Vale ressaltar que a linguagem SQL (Structured Query
Language) foi desenvolvida com base em linguagens de consultas formais,
entre elas a álgebra relacional. Na Figura 3, vemos como seria a implementa-
ção SQL correspondente ao exemplo da nova relação de disciplinas ×
alunos (ver Quadro 4).

Figura 3. Exemplo de problema a ser atendido com a operação produto cartesiano, ex-
pressão para álgebra relacional e esta convertida para SQL.

A partir desse momento, usaremos em nossos exemplos o sistema de ge-


renciamento de banco de dados (SGBD) PostgreSQL. Para apresentação das
execuções dos comandos de consulta e dos respectivos resultados, empre-
garemos o software gráfico pgAdmin, disponibilizado gratuitamente com o
pacote de instalação do PostgreSQL.
Produto cartesiano em SQL 13

Note ainda que, para esse exemplo funcionar, precisamos antes termos
criado as tabelas alunos, disciplinas e professores. Depois disso,
podemos inserir alguns registros de exemplo em cada uma delas, que seguirão
a mesma estrutura de dados e tuplas apresentada anteriormente. Para imple-
mentação SQL, você pode considerar os seguintes comandos DDL (Data
Definition Language) para criação dessas tabelas no banco de dados.

CREATE TABLE alunos (id _ aluno INT, nome VARCHAR(40), dt _ nasc


DATE, email VARCHAR(20), sit _ matr INT, id _ disciplina INT);
CREATE TABLE disciplinas (id _ disciplina INT, desc _ disc VAR-
CHAR(40), id _ professor INT, periodo VARCHAR(20));
CREATE TABLE professores (id _ professor INT, nome VARCHAR(40),
titulo VARCHAR(20), departamento VARCHAR(20));

A seguir, você pode conferir o comando SQL DML (Data Manipulation


Language) utilizado para inserção de registros em cada tabela. No nosso
exemplo, adicionamos os mesmos registros já apresentados nos Quadros 1
(alunos), 2 (disciplinas) e 3 (professores), por isso não os repetimos
integralmente aqui.

INSERT INTO alunos(id _ aluno, nome, dt _ nasc, email, sit _ matr,


id _ disciplina)
VALUES (10001, 'João Gustavo Rico', TO _ DATE('12/04/1990','DD/MM/
YYYY'), 'jg _ rico@mail.com', 0, 1002);
INSERT INTO disciplinas(id _ disciplina, desc _ disc, id _ pro-
fessor, periodo)
VALUES (1001, 'Estatística I', 101, '2020/1');
INSERT INTO professores(id _ professor, nome, titulo, departamento)
VALUES (101, 'José Borges', 'Mestrado', 'Estatística');
14 Produto cartesiano em SQL

Ao final desse processo, se executarmos uma consulta para ver todas as


informações contidas nessas tabelas, teremos o retorno apresentado na Figura 4.

Figura 4. Exemplo das tabelas com registros de alunos, disciplinas e professores que foram
implementadas no SGBD PostgreSQL.

Agora, confira na Figura 5 o detalhe da implementação da operação de


produto cartesiano em SQL para o nosso problema de exemplo (o mesmo
apresentado na Figura 3): no topo, aparece o comando SQL (linha 1 no Query
Editor) para que sejam projetadas todas as colunas resultantes da operação
produto cartesiano para as tabelas disciplinas e alunos; logo abaixo,
com o título Data Output, consta a informação resultante dessa operação, ao
todo 15 linhas e 10 colunas.
Produto cartesiano em SQL 15

Figura 5. Implementação da operação produto cartesiano em SQL no SGBD PostgreSQL.


Nesse caso, é realizada uma consulta para apresentar as informações contidas em duas
tabelas, disciplinas e alunos.

Nessa consulta, estamos incluindo a palavra-chave CROSS JOIN, utilizada


para especificar a operação produto cartesiano em SQL. Alternativamente,
poderíamos escrever uma consulta simplesmente informando SELECT *
FROM disciplinas, alunos. Ambas as opções retornarão o mesmo
resultado, contudo a diferença reside no fato de que, ao indicar o CROSS
JOIN, você deixará explícito a sua intenção é realizar a operação produto
cartesiano para as tabelas envolvidas.
Como diferentes operações relacionais podem ser combinadas com a opera-
ção de produto cartesiano, iniciaremos fazendo a combinação com a operação
projeção, utilizada para definir quais colunas de interesse devem retornar
dentro da cláusula SELECT, em vez de trazer todas (“*”).
Imagine que agora precisamos fazer a projeção das colunas id_disci-
plina, desc_disc para a tabela disciplinas, e nome, sit_matr e
id_disciplina para a tabela alunos. Podemos criar a seguinte consulta
SQL para atender a essa necessidade:

SELECT id _ disciplina, desc _ disc, nome, sit _ matr,


id _ disciplina
FROM disciplinas CROSS JOIN alunos
16 Produto cartesiano em SQL

Porém, note que há colunas que repetem suas descrições nas tabelas, como
nome para tabela professores e alunos. Então, se executarmos essa
nova consulta, qual informação será recuperada?
Nenhuma, pois ela retornará um erro indicando que há colunas com refe-
rências ambíguas. Para evitarmos esse tipo de conflito, na cláusula SELECT
devemos adicionar a tabela de interesse antes da coluna, unindo a tabela e a
coluna com um ponto, dentro de uma estratégia chamada de qualificador de
nome, cuja implementação é bem simples, como no exemplo a seguir:

SELECT disciplinas.id _ disciplina, disciplinas.desc _ disc,


alunos.nome, alunos.sit _ matr, alunos.id _ disciplina
FROM disciplinas CROSS JOIN alunos

O SQL tem um recurso que permite criarmos identificadores para as tabelas,


que você pode entender como apelidos ou variáveis. Esses identificadores
devem ser colocados na frente do nome da coluna, unificados por um ponto
(na cláusula SELECT) e, depois, pelo nome da respectiva tabela (na cláusula
FROM). Na Figura 6, podemos observar como fica a implementação da mesma
consulta do exemplo anterior, mas agora utilizando esse recurso. Ainda, essa
mesma declaração poderia ser feita utilizando a palavra reservada AS logo
após o nome da tabela e antes da nova referência. Note que, na Figura 6, são
apresentadas somente as 5 primeiras linhas do resultado para exemplificação,
já que, ao todo, são 15 linhas resultantes para essa consulta.

Figura 6. Implementação da operação produto cartesiano em SQL no SGBD PostgreSQL.


Nesse caso, está sendo projetada parte das colunas disponíveis para as tabelas disci-
plinas e alunos. Além disso, para evitar conflito na projeção das colunas de mesmo
nome, foram introduzidas variáveis de intervalo para cada tabela.
Produto cartesiano em SQL 17

Antes, costumava-se referenciar o recurso exemplificado na Figura 6, para identificação


das tabelas, como pseudônimo (ou alias, em inglês). Embora você possa encontrar
algumas referências que empregam esse termo, ele está obsoleto (DATE, 2016).
Então, assim como indicado por Ramarkrishnan e Gehrke (2011), esse recurso é
definido como a introdução de uma variável de intervalo (ou range variable em inglês),
sendo útil quando o mesmo nome de tabela aparece mais de uma vez na cláusula
FROM e para prefixar os nomes das colunas na cláusula SELECT. Você pode conferir
mais detalhes dessa explicação no Capítulo 5 do livro de Ramarkrishnan e Gehrke (2011).

Por fim, vamos combinar a operação seleção. Para isso, adicionaremos a


cláusula WHERE ao comando SQL para que a consulta retorne apenas linhas
que atendam à determinada condição, por exemplo, se quisermos recuperar
apenas as informações da disciplina Cálculo Básico (que tem o código
1002). Na Figura 7, aparecem tal implementação e o novo resultado para
nossa consulta.

Figura 7. Implementação da operação produto cartesiano em SQL no SGBD PostgreSQL.


Nesse caso, são apresentadas informações para as tabelas disciplinas e alunos.
Foi adicionada uma condição para retornar somente informações referentes à disciplina
Cálculo Básico.
18 Produto cartesiano em SQL

Ao todo, retornaram 5 linhas para a consulta. Contudo, se precisarmos


encontrar todos os alunos que estão matriculados nessa disciplina, como
poderíamos ajustar essa consulta? Primeiro, você precisa saber que a coluna
sit_matr da tabela alunos representa a situação do aluno, sendo o código
1 atribuído para os ativos/matriculados, e 2 para os inativos/não matriculados.
Dessa maneira, uma nova condição deve ser incluída para indicar essa nova
necessidade (Figura 8, linha 5 do Query Editor).

Figura 8. Implementação da operação produto cartesiano em SQL no SGBD PostgreSQL.


Nesse caso, são apresentadas informações para as tabelas disciplinas e alunos.
Foi adicionada uma condição (operação seleção) para retornarem somente informações
referentes à disciplina Cálculo Básico.

Na Figura 8, você pode observar que o resultado para a nova consulta


apresenta 3 linhas. Mas esse resultado realmente atende ao nosso problema?
Ainda não, pois, nessa construção, ao indicarmos a operação produto cartesiano
com o CROSS JOIN, ainda estamos informando ao SGBD que queremos
ver a combinação de todos os registros dessas tabelas que atendem às duas
condições especificadas. Então, para ajustar a consulta de maneira a retornar
somente os alunos matriculados na disciplina Cálculo Básico, uma al-
ternativa consiste em adicionar uma condição na cláusula WHERE para indicar
que retorne somente os registros que tiverem o código 1002 para a coluna
id_disciplina na tabela alunos. Dessa maneira, apenas uma linha
retornará, correspondente ao aluno “Otávio Nunes Santos” (veja o exemplo da
Figura 9a). Porém, vale ressaltar que, com isso, essa consulta agora apresenta
duas condições quase idênticas para o código da disciplina, mas uma para
tabela disciplinas e outra para alunos.
Produto cartesiano em SQL 19

Então, outra alternativa corresponde a adicionar uma condição que faça uma
ligação entre os registros das tabelas envolvidas (veja o exemplo da Figura 9b,
linha 3 no Query Editor). Imagine ainda que só pudesse buscar as informações
com base no nome da disciplina, ou seja, sem saber o código correspondente,
como você o faria? Isso porque, na nossa tabela alunos, apenas aparece
o código da disciplina, e não a sua descrição. Você verá de maneira mais
aprofundada o conceito de junção em outros capítulos desta disciplina. Para
concluirmos o caso trabalhado aqui, na Figura 9 são apresentadas diferentes
construções e resultados para exemplificação do que discutimos até agora.

Figura 9. Implementação da operação produto cartesiano em SQL no SGBD PostgreSQL.


Nesse caso, são apresentadas diferentes consultas implementadas para as tabelas dis-
ciplinas e alunos. Nas consultas (a) e (b), as condições de seleção foram criadas
de maneira satisfatória para atenderem a nossa questão, enquanto as consultas (C) e (D)
retornam combinações dessas tabelas de maneira a não atender a nossa questão.

Nos exemplos da Figura 9, reduzimos as colunas projetadas para simplificar


a visualização e a comparação entre os resultados. As consultas identificadas
pelas letras (a) e (b) respondem à nossa pergunta: “Quais alunos estão matri-
culados na disciplina Cálculo Básico?”. Precisamos de uma lista que apresente
o código da disciplina, sua descrição e o nome dos alunos.
20 Produto cartesiano em SQL

Para a consulta (c), informamos duas condições: (1) que o aluno precisa
estar matriculado e (2) que o aluno precisa ter uma disciplina de código cor-
respondente a Cálculo Básico. Considerando essas duas condições,
encontramos o aluno Otávio Nunes Santos na tabela alunos, mas,
como não temos outra condição específica em relação à tabela disciplina,
ou algo que faça uma ligação entre os registros dessas tabelas, realiza-se a
operação produto cartesiano e produzem-se combinações para esse aluno com
todas as disciplinas disponíveis (Estatística I, Cálculo Básico e
Cálculo Avançado). Já na consulta (d), nossa questão não é atendida, pois
foram retornados todos os alunos matriculados, e não apenas os da disciplina
Cálculo Básico.

Elmasri e Navathe (2011) chamam a atenção para o fato de que a operação produto
cartesiano deve ser utilizada com cautela, visto que geraremos todas as combinações de
tuplas possíveis. E, como essa operação pode representar um custo de processamento
adicional ao SGBD, devemos avaliar sua real necessidade.
Portanto, quando possível, indica-se a combinação de outras operações da álgebra
relacional, como a projeção, a seleção e, especialmente, a junção. Assim, desenvolve-
remos consultas mais eficazes e que retornem as informações realmente necessárias.

Na prática, a operação de produto cartesiano é raramente utilizada de


maneira isolada (ELMASRI; NAVATHE, 2011). Contudo, seu entendimento
é fundamental tanto para avançar na compreensão de outras operações da
álgebra relacional quanto para evitar implementações inadequadas nas con-
sultas, como esquecimento ou escrita incorreta, de condições que indiquem
uma seleção válida ou um tipo de junção entre as tabelas.
Encerramos aqui o conteúdo planejado para a introdução à operação pro-
duto cartesiano da álgebra relacional, com exemplos aplicados em tabelas de
bancos de dados relacionais e implementação de consultas na linguagem SQL.
Produto cartesiano em SQL 21

DATE, J. The new relational database dictionary. [S. l.]: O’Reilly, 2016.
ELMASRI R.; NAVATHE, S. Sistemas de banco de dados. 6. ed. São Paulo: Pearson, 2011.
RAMARKRISHNAM, R.; GEHRKE, J. Sistemas de gerenciamento de banco de dados. 3. ed.
Porto Alegre: AMGH, 2011.

Leituras recomendadas
MACHADO, F. N. R. Banco de dados: projeto e implementação. 3. ed. São Paulo: Érica, 2009.
MANNINO, M. V. Projeto, desenvolvimento de aplicações e administração de banco de
dados. 3.ed. Porto Alegre: AMGH, 2008.

You might also like