Dando continuidade à série de artigos para que o internauta entre no mundo dos bancos de dados, sugiro que você leia meus dois primeiros artigos (Conceitos Fundamentais de Banco de Dados – Parte I e II) e também os artigos do Reinaldo Viana (Banco de Dados e Modelagem de Dados – Parte I, II e Final), para que haja uma perfeita compreensão dos conceitos e metodologias de um projeto de BD.
Darei continuidade falando sobre Linguagem de Consulta Formal, abordando a Álgebra Relacional.
Linguagens de consulta formal são linguagens em que o usuário solicita informações à base de dados. Geralmente formam uma linguagem de mais alto nível que as linguagens de programação.
A Álgebra Relacional é uma linguagem de consulta formal, porém procedimental, ou seja, o usuário dá as instruções ao sistema para que o mesmo realize uma sequência de operações na base de dados para calcular o resultado desejado.
A Álgebra Relacional define operadores para atuar nas tabelas (semelhante aos operadores +, - etc. da álgebra que estamos acostumados) para chegar ao resultado desejado.
A forma de trabalho desta linguagem de consulta é a de pegar uma ou mais tabelas (conforme necessidade) como entrada de dados e produzirá uma nova tabela como resultado das operações.
Funções da Álgebra Relacional
São definidas nove operações para se trabalhar com álgebra relacional:
- Union –União;
- Intersection– Intersecção;
- Difference– Diferença, Subtração;
- Product – Produto, Produto Cartesiano.
Estas quatro operações são provenientes da teoria de conjuntos, da matemática.
- Select– Seleção;
- Project– Projeção;
- Join– Junção;
- Divide – Divisão.
Aplicam-se especificamente ao modelo de dados relacional.
- Assignment– Designação, Atribuição.
É uma operação padrão das linguagens computacionais. Utilizaremos a seguinte tabela como estudo de caso para exemplificar nossas operações: EMPREGADO
Atribuindo um valor a uma nova tabela
O objetivo do operador de designação/atribuição é atribuir o resultado de uma operação a uma nova relação.
Simbologia: <-------- Ex.: R <----- AUB
Sintaxe: := Ex.: R := union(B, C)
Operação de Seleção (Select)
É utilizada para selecionar um subconjunto de tuplas numa relação que satisfaça uma condição de seleção predefinida. Representação gráfica:
Simbologia | σ |
Sintaxe | σ(Relação) |
Exemplo | σ sal>=2500 (EMPREGADO) |
A seleção acima nos apresentará como resultado as informações abaixo:
Operação de Projeção (Project)
A operação de projeção é utilizada para selecionar determinadas colunas de uma relação. A operação é executada em apenas uma relação e o resultado é uma nova relação contendo apenas os atributos selecionados, eliminando-se as duplicidades.
Simbologia | π |
Sintaxe | π(Relação) |
π | NOME, SOBRENOME, SAL (EMPREGADO) |
Teremos o seguinte resultado a partir da consulta acima:
NOME | SOBRENOME | SAL |
---|---|---|
José | da Silva | 7000 |
Cecília | Ortiz Rezende | 3200 |
Pedro | Silvestre | 2800 |
Felipe | Guilhermino | 1800 |
Luciana | Feitosa | 1500 |
Fabio | Santos Silva | 1500 |
Elaine | Cristina | 2500 |
Cleiton | Fernandes | 2200 |
Aninhar de operações e renomear de atributos
Podemos aninhar as operações e produzir novos resultados sem a necessidade de sucessivas operações. Imaginem se nos interessa apenas o nome, sobrenome e salário dos funcionários do departamento número 3. Vejamos como ficaria a expressão em álgebra relacional:
- 1 => Relação = Tabela, entidade, na terminologia formal de banco de dados.
- 2 => Tupla = Linha da tabela, registro, na terminologia formal de banco de dados.
π NOME, SOBRENOME, SAL (σ DEPTO=3 (EMPREGADO)), que nos produziria o seguinte resultado:
NOME | SOBRENOME | SAL |
---|---|---|
Cecília | Ortiz Rezende | 3200 |
Felipe | Guilhermino | 1800 |
Elaine | Cristina | 2500 |
Cleiton | Fernandes | 2200 |
Podemos ainda, criar relações intermediárias, dando um nome para cada uma delas e finalmente chegando ao resultado desejado:
R1 <---- σ DEPTO=3 (EMPREGADO)
E logo após:
RESULT <----- πNOME, SOBRENOME, SAL (R1), onde RESULT produziria o mesmo resultado da expressão aninhada.
E finalmente, ainda podemos renomear os atributos que aparecerão na relação resultante, para isso, basta identificar o novo nome para os atributos:
RESULT(Nome, Sobrenome, Salário) <----- πNOME, SOBRENOME, SAL (σ DEPTO=3 (EMPREGADO))
Resultado:
NOME | SOBRENOME | SAL |
---|---|---|
Cecília | Ortiz Rezende | 3200 |
Felipe | Guilhermino | 1800 |
Elaine | Cristina | 2500 |
Cleiton | Fernandes | 2200 |
Revendo a teoria dos conjuntos
Vamos descrever as funções da álgebra relacional pelas operações que vieram da teoria dos conjuntos:
União (Union)
O operador de união cria uma relação partindo de duas outras, levando as tuplas comuns e não comuns a ambas, desta forma aparecerão no resultado somente linhas únicas de uma ou outra relação e as informações duplicadas aparecerão somente uma vez.
Uma característica é que somente é possível utilizar este operador caso as tabelas de origem possuam compatibilidade de união, ou seja, as tabelas devem ser equivalentes e gerem o mesmo tipo de resultado.
Representação gráfica:
Simbologia | U |
Sintaxe | (Relação 1)U(Relação 2) |
Exemplo: Imagine que precisemos recuperar A identificação de todos os empregados que trabalham no departamento 3 ou supervisione diretamente um empregado que trabalhe no departamento 3. Faremos as seguintes operações:
DEPTO3 <---- σ DEPTO=3 (EMPREGADO)
RESULT1 <---- π ID_EMP (DEPTO3)
ID_EMP |
---|
12584-7 |
17987-5 |
16257-2 |
15234-1 |
RESULT2 <---- π ID_GER (DEPTO3)
ID_GER |
---|
17206-2 |
12584-7 |
RESULT(ID) <----- (RESULT1)U(RESULT2)
ID |
---|
12584-7 |
17987-5 |
16257-2 |
15234-1 |
17206-2 |
Somente foi possível realizar a união entre RESULT1 e RESULT2, pois, apesar dos atributos serem diferentes, o número e o tipo de atributos são os mesmos, possibilitando uma compatibilidade de união.
Intersecção (Intersection)
A relação criada pela operação de intersecção será o resultado de todas as tuplas que pertençam a ambas as relações presentes na operação. Representação gráfica:
Simbologia | ∩ |
Sintaxe | (Relação 1)∩(Relação 2) |
Como exemplo, considere as seguintes relações:
NOME | SOBRENOME |
---|---|
Cecília | Ortiz Rezende |
João | da Silva |
Laura | Nogueira |
Elaine | Cristina |
Paulo | Vidigal |
Pedro | Teodoro |
Sandra | Oliveira |
Marcio | de Souza |
NOME | SOBRENOME |
---|---|
Joel | Nunes |
Marcio | Santos |
Paula | Andrade |
Reinaldo | Fagundes |
text | text |
Cecília | Ortiz Rezende |
Desta forma, uma operação de intersecção entre as duas relações, seria executada da seguinte forma:
RESULTADO <---- (ALUNOS)∩(INSTRUTORES) e produziria a seguinte relação:
NOME | SOBRENOME |
---|---|
Marcio | Santos |
Cecília | Ortiz Rezende |
Uma observação extremamente relevante a ser feita é que ambas as operações de união ou intersecção são:
- Comutativas, ou seja, AUB = BUA e A∩B = B∩A; Aplicadas a qualquer número de relações;
- Associativas, ou seja: AUU(BUUC) = (AUB)UC e A∩(B∩C) = (A∩B)∩C
É uma ferramenta bastante poderosa principalmente no auxílio à definição lógica de abordagem a dados em tabelas. Fica claro que muitos conceitos trazidos da matemática tradicional são extremamente aplicáveis a esta técnica.
Agora iremos abordar as duas últimas instruções provenientes da teoria de conjuntos, as operações Difference e Product, e também as duas operações restantes que interagem com o modelo relacional, Join e Divide.
O bom entendimento de como os operadores de álgebra relacional trabalham, facilitam muito a muito na construção de boas consultas em linguagens como SQL, por exemplo. Aproveitem a navegação.
Operação de Diferença (Difference)
A operação de diferença consiste em obter uma relação a partir da diferença da primeira pela segunda relação.
É importante salientar que a diferença entre a primeira e segunda relação não é o mesmo do inverso, ou seja, da segunda pela primeira. Com isso podemos dizer que a operação de diferença não é comutativa.
Exemplificando, poderíamos dizer que A – B é diferente de B – A.
Simbologia | – |
Sintaxe | (Relação 1) – (Relação 2) |
Como exemplo, considere as relações vistas no artigo anterior:
NOME | SOBRENOME |
---|---|
Cecília | Ortiz Rezende |
João | da Silva |
Laura | Nogueira |
Elaine | Cristina |
Paulo | Vidigal |
Pedro | Teodoro |
Sandra | Oliveira |
Marcio | Santos |
Elisabeth | de Souza |
NOME | SOBRENOME |
---|---|
Joel | Nunes |
Marcio | Santos |
Paula | Andrade |
Reinaldo | Fagundes |
Cecília | Ortiz Rezende |
Exemplo 1:
Result1 <----- ALUNOS – INSTRUTORES
NOME | SOBRENOME |
---|---|
João | da Silva |
Laura | Nogueira |
Elaine | Cristina |
Paulo | Vidigal |
Pedro | Teodoro |
Sandra | Oliveira |
Elisabeth | de Souza |
Exemplo 2:
Result2 <----- INSTRUTORES – ALUNOS
NOME | SOBRENOME |
---|---|
Joel | Nunes |
Paula | Andrade |
Reinaldo | Fagundes |
Operação de Produto Cartesiano (Product)
O Produto Cartesiano é a combinação de tuplas das duas relações em questão. O resultado é que, para cada tupla da primeira relação, haverá a combinação com todas as tuplas da segunda relação, e vice-versa.
Simbologia | x |
Sintaxe | (Relação 1) x (Relação 2) |
Como exemplo, considere as relações abaixo:
NOME | SOBRENOME |
---|---|
Cecília | Ortiz Rezende |
João | da Silva |
Laura | Nogueira |
Elaine | Cristina |
COD_DISC | DESCRICAO |
---|---|
1 | Fundamentos de Bando de Dados |
2 | Linguagem de Programação |
3 | Introdução aos Sistemas Operacionais |
RESULT <----- ALUNOS x DISCIPLINA
NOME | SOBRENOME | COD_DISC | DESCRICAO |
---|---|---|---|
Cecília | Ortiz Rezende | 1 | Fundamentos de Bando de Dados |
Cecília | Ortiz Rezende | 2 | Linguagem de Programação |
Cecília | Ortiz Rezende | 3 | Introdução aos Sistemas Operacionais |
João | da Silva | 1 | Fundamentos de Bando de Dados |
João | da Silva | 2 | Linguagem de Programação |
João | da Silva | 3 | Introdução aos Sistemas Operacionais |
Laura | Nogueira | 1 | Fundamentos de Bando de Dados |
Laura | Nogueira | 2 | Linguagem de Programação |
Laura | Nogueira | 3 | Introdução aos Sistemas Operacionais |
Elaine | Cristina | 1 | Fundamentos de Bando de Dados |
Elaine | Cristina | 2 | Linguagem de Programação |
Elaine | Cristina | 3 | Introdução aos Sistemas Operacionais |
Operação de Junção (Join)
Veremos agora as duas últimas operações que interagem com o modelo relacional.
A operação de junção é utilizada para combinar tuplas de duas relações partindo dos atributos comuns a ambas.
O resultado conterá as colunas das duas relações que estão participando da junção.
Esta operação é de extrema importância em bancos de dados relacionais, pois é através dela que nos é permitido fazer relacionamento.
Simbologia | |x| |
Sintaxe | (Relação 1) |x| |
Uma condição de junção pode ser formada por mais de uma condição simples, apenas aplicando os operadores relacionais AND ou OR.
Vejamos um exemplo, considerando as seguintes tabelas:
NOME | SOBRENOME | TURMA |
---|---|---|
Cecília | Ortiz Rezende | 2TI |
João | da Silva | 1TI |
Laura | Nogueira | 2TI |
Elaine | Cristina | 2TI |
COD_TURMA | DESCRICAO |
---|---|
1TI | 1º Módulo - Informática |
2TI | 2º Módulo - Informática |
1TA | 1º Módulo - Administração |
2TA | 2º Módulo - Administração |
ALU_TUR <----- ALUNOS |x| TURMA=COD_TURMA TURMAS
NOME | SOBRENOME | TURMA | COD_TURMA | DESCRICAO |
---|---|---|---|---|
Cecília | Ortiz Rezende | 2TI | 2TI | 2º Módulo - Informática |
João | da Silva | 1TI | 1TI | 1º Módulo - Informática |
Laura | Nogueira | 2TI | 2TI | 2º Módulo - Informática |
Elaine | Cristina | 2TI | 2TI | 2º Módulo - Informática |
E finalmente, podemos usar um conjunto de operações para trazer, por exemplo, apenas os alunos que cursam o 2º módulo de Informática:
RESULT <----- COD_TURMA>=2TI ( NOME, SOBRENOME, DESCRICAO (ALUNOS |x| TURMA=COD_TURMA TURMAS))
NOME | SOBRENOME | DESCRICAO |
---|---|---|
Cecilia | Ortiz Rezende | 2º Módulo - Informática |
Laura | Nogueira | 2º Módulo - Informática |
Elaine | Cristina | 2º Módulo - Informática |
Operação de Divisão (Divide)
É uma operação adicional que produz como resultado a projeção de todos os elementos da primeira relação que se relacionam com todos os elementos da segunda relação.
Não é um operador primitivo, mas pode ter o resultado obtido por uma combinação de operadores primitivos.
Simbologia | ÷ |
Sintaxe | (Relação 1) ÷ (Relação 2) |
Vejamos no exemplo abaixo:
ID_EMP | COD_PROJ |
---|---|
17206-2 | 001 |
12584-7 | 002 |
16764-6 | 001 |
17206-2 | 002 |
15698-3 | 003 |
17206-2 | 003 |
COD_PROJ | DESCRICAO |
---|---|
001 | Sistema IRPF |
002 | Sistema RH |
003 | Sistema Banco |
ID_EMP | NOME | CARGO |
---|---|---|
17206-2 | Jorge | Analista |
12584-7 | Paula | Programadora |
16764-6 | Frederico | DBA |
15698-3 | Heloisa | Web Master |
Imagine a situação de querermos saber quais os funcionários que trabalham em todos os projetos:
RESULT <----- ( COD_PROJ (PROJETOS)) ÷ ( ID_EMP, COD_PROJ (EQUIPE))
ID_EMP |
---|
17206-2 |
SÍMBOLO | OPERAÇÃO | SINTAXE | TIPO |
---|---|---|---|
<----- | Atribuição | Variável <----- Relação | Primitiva |
σ | Seleção (Select) | Primitiva | |
π | Projeção (Project) | Primitiva | |
∪ | União (Union) | (Relação 1) ∪ (Relação 2) | Primitiva |
∩ | Interseção (Intersection) | (Relação 1) ∩ (Relação 2) | Adicional |
– | Diferença (Difference) | (Relação 1) – (Relação 2) | Primitiva |
X | Produto Cartesiano (Product) | (Relação 1) X (Relação 2) | Primitiva |
|x| | Junção (Join) | (Relação 1) |x| |
Adicional |
÷ | Adicional | (Relação 1) ÷ (Relação 2) | Adicional |
Conclusões
Finalizamos aqui este artigo sobre Álgebra Relacional. Tivemos uma boa noção de como é trabalhada a lógica de consultas através desta linguagem formal e podemos concluir que é uma ótima metodologia de desenvolvimento de raciocínio por parte de quem está aplicando a técnica.
Este desenvolvimento de raciocínio lógico em consultas a bancos de dados será muito útil na construção de instruções que irão interagir com o banco de dados, porém construindo essas instruções de maneira performática, tirando o máximo de desempenho possível.