SQL - Álgebra Relacional - Operações Fundamentais - Conceitos básicos
A grande maioria das aplicações que desenvolvemos atualmente utilizam um banco de dados relacional o que implica na utilização de consultas para obtenção de resultados. |
Para isso usamos a linguagem SQL que é a linguagem de pesquisa declarativa padrão para banco de dados relacional . Muitas das características originais do SQL foram inspiradas na álgebra relacional e neste artigo eu procuro abordar os conceitos básicos da álgebra relacional.
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 seqüência de operações na base de dados para calcular o resultado desejado.
Na terminologia formal de modelo relacional temos os seguintes conceitos:
A álgebra relacional é uma forma de cálculo sobre conjuntos ou relações.
A álgebra relacional recebia pouca atenção até a publicação do modelo relacional de dados de E.F Codd, em 1970. Codd propôs tal álgebra como uma base para linguagens de consulta em banco de dados.
(fonte: http://pt.wikipedia.org/wiki/%C3%81lgebra_relacional - consultado em novembro de 2012)
Neste artigo eu vou me ater às principais operações fundamentais da álgebra relacional.
Há seis operações fundamentais na álgebra relacional:
1- Seleção : Seleciona tuplas (linhas) que satisfazem um certo predicado ou condição.
Indicada por (letra grega sigma), é uma operação que para um conjunto inicial fornecido como argumento, produz um subconjunto estruturalmente idêntico, mas apenas com os elementos do conjunto original que atendem a uma determinada condição (chamada de predicado). A seleção pode ser entendida como uma operação que filtra as linhas de uma relação(tabela), e é uma operação unária, pois opera sobre um único conjunto de dados.
Notação - predicado (relação)
Alunos
id | nome | sexo |
123 | Macoratti | M |
234 | Miriam | F |
456 | Jefferson | M |
567 | Janice | F |
Ex 1: Selecionar tuplas de Alunos cujo nome = Macoratti
nome = 'Macoratti' (Alunos) ==> produz o conjunto dos elementos de alunos que atendem ao predicado [Nome = Macoratti], ou seja, representa um subconjunto dos alunos para o qual essa condição é avaliada como verdadeira.
id | nome | sexo |
123 | Macoratti | M |
Resultado
subconjunto horizontal de uma relação
Operadores de comparação : =,
<, <=, >, >=,
Operadores lógicos: ^ (and) V
(or) ¬ (not)
Ex 2: Selecionar as tuplas de Alunos com id > 123 e id < 567
id > 123 ^ id < 567
id | nome | sexo |
234 | Miriam | F |
456 | Jefferson | M |
O operador de seleção é comutativo => <condição1> (<condição2>) = <condição2> (<condição1>)
2- Projeção : Gera novas relações excluindo alguns atributos
Indicada por (a letra grega pi) produz um conjunto onde há um elemento para cada elemento do conjunto de entrada, sendo que a estrutura dos membros do conjunto resultante é definida nos argumentos da operação. Pode ser entendida como uma operação que filtra as colunas de uma tabela. Por operar sobre apenas um conjunto de entrada é classificada como uma operação unária.
Notação: lista_nome_atributos (Relação)
Ex. 1 - projete o atributo nome sobre a relação Alunos
nome (Alunos)
nome |
Macoratti |
Miriam |
Jefferson |
Janice |
Ex. 2 : Descobrir o nome e o id de todos os alunos do sexo masculino
Neste caso será necessário combinar uma projeção com uma seleção.
Se decidirmos projetar as colunas desejadas diretamente a partir da relação alunos, estaremos considerando também os elementos do sexo feminino o que não queremos. Como a projeção não permite descartar linhas, apenas colunas, deveremos fornecer a essa operação o subconjunto resultante de uma filtragem (seleção) da relação de alunos original, como mostram as figuras abaixo, que representam as relações e as operações de duas maneiras diferentes.
Definindo a expressão que atende aos requisitos temos:
id,nome ( sexo = 'M' ) (Alunos)
id | nome |
123 | Macoratti |
456 | Jefferson |
O operador Projeção não é comutativo.
A álgebra relacional empresta da teoria de conjuntos quatro operadores: União, Intersecção, Diferença e Produto Cartesiano que veremos a seguir.
3- Produto Cartesiano X : Retorna todas as combinações de tuplas de duas R1 e R2.
O resultado do produto cartesiano de duas relações é uma terceira relação contendo todas as combinações possíveis entre os elementos das relacões originais.
Essa relação resultante possuirá um número de colunas que é igual à soma das quantidades de colunas das duas relações iniciais, e um número de linhas igual ao produto do número de suas linhas. Portanto, se fizermos o produto cartesiano de uma relação A que possua 5 colunas e 10 linhas com uma relação B onde existem 3 colunas e 8 linhas, a relação resultante terá 5+3= 8 colunas e 10*8= 80 linhas.
Assim, cada linha dessa relação corresponderá à concatenação de uma linha da primeira relação com uma linha da segunda.
Notação : relação1 x relação2 ( R1 x R2 )
Ex 1: Descobrir o nome do aluno, sexo e o nome do curso para cada aluno
Alunos
id | nome | sexo | curso |
123 | Macoratti | M | 100 |
234 | Miriam | F | 110 |
456 | Jefferson | M | 120 |
567 | Janice | F | 100 |
Cursos
id | nome |
100 | Quimica |
110 | Inglês |
120 | Matemática |
130 | Física |
nome, sexo, curso ( Alunos.curso = Cursos.id ( Alunos x Cursos) )
Resultado:
id | nome | sexo | nome |
123 | Macoratti | M | Quimica |
234 | Miriam | F | Inglês |
456 | Jefferson | M | Matemática |
567 | Janice | F | Quimica |
Note que primeiro fizemos o produto cartesiano ( Alunos x Cursos ) que resulta em uma relação com 6 colunas e 16 linhas:
id | nome | sexo | curso | id | nome |
123 | Macoratti | M | 100 | 100 | Quimica |
123 | Macoratti | M | 100 | 110 | Inglês |
123 | Macoratti | M | 100 | 120 | Matematica |
123 | Macoratti | M | 100 | 130 | Fisica |
234 | Miriam | F | 110 | 100 | Quimica |
234 | Miriam | F | 110 | 110 | Inglês |
234 | Miriam | F | 110 | 120 | Matematica |
234 | Miriam | F | 1100 | 130 | Fisica |
... | ... | ... | ... | ... | ... |
Depois fizemos uma seleção pelo código do curso : Alunos.curso = Cursos.id
id | nome | sexo | curso | id | nome |
123 | Macoratti | M | 100 | 100 | Quimica |
123 | Miriam | F | 110 | 110 | Inglês |
123 | Jefferson | M | 120 | 120 | Matematica |
123 | Janice | F | 100 | 100 | Quimica |
Em seguida fizemos um projeção de nome, sexo e curso:
nome | sexo | nome |
Macoratti | M | Quimica |
Miriam | F | Inglês |
Jefferson | M | Matemática |
Janice | F | Quimica |
4- União : Retorna a união das tuplas de duas relações R1 e R2 com eliminação automática de duplicatas;
Produz como resultado uma Relação que contém todas as linhas da primeira Relação seguidas de todas as linhas da segunda tabela. A Relação resultante possui a mesma quantidade de colunas que as relações originais, e tem um número de linhas que é no máximo igual à soma das linhas das relações fornecidas como operandos, já que as linhas que são comuns a ambas as relações aparecem uma única vez no resultado.
Notação: Relação1 Relação2 ( R1 R2)
Obs: As relações devem possuir o mesmo número de atributos.
Alunos Professores Funcionarios
|
|
|
Domínio: id = int |
A relação Alunos é compatível com Professores mas não é compatível com Funcionarios.
Ex1: Encontre uma relação com todos os alunos e com todos os professores:
resultado: Alunos Professores
id | nome | idade | curso |
10 | Macoratti | 45 | Quimica |
20 | Miriam | 43 | Artes |
30 | Bianca | 21 | Fisica |
100 | Pedro | 50 | Quimica |
200 | Maria | 45 | Fisica |
300 | Bianca | 21 | Artes |
A operação de união é comutativa => R1 R2 = R2 R1
5- Diferença -- : Retorna as tuplas presentes em R1 e ausentes em R2;
É uma operação que requer como operandos duas relações união-compatíveis, ou seja, estruturalmente idênticas. O resultado é uma relação que possui todas as linhas que existem na primeira relação e não existem na segunda.
Notação : relação1 - relação2 ( R1 - R2 )
Alunos (R1) Professores(R2)
|
|
Domínio: id = int |
Ex1 : Apresente uma relação de todos os alunos que não são professores
Resultado : Aluno - Professor
id | nome | idade | curso |
10 | Macoratti | 45 | Quimica |
20 | Miriam | 43 | Artes |
Note-se que a DIFERENÇA não é comutativa !
Resultado : Professor - Aluno
id | nome | idade | setor |
100 | Pedro | 50 | Quimica |
200 | Maria | 45 | Artes |
6- Interseção : Retorna as tuplas comuns a R1 e R2;
Esta é uma operação adicional que produz como resultado uma tabela que contém, sem repetições, todos os elementos que são comuns às duas tabelas fornecidas como operandos. As tabelas devem ser união-compatíveis.
Notação : relação1 relação2 ( R1 R2 )
Alunos(R1) Professores(R2)
|
|
Domínio: id = int |
Ex1 : Apresente uma relação de todos os alunos que são professores;
Resultado : Alunos Professores
id | nome | idade | curso |
30 | Bianca | 21 | Fisica |
Existem operadores de álgebra que são deriváveis de outros. A operação de intersecção é derivável de união e diferença: A B = A - ( A - B )
A operação de intersecção é comutativa => R1 R2 = R2 R1
7 - Junção Natural : Retorna a combinação de tuplas de duas relações R1 e R2 que satisfazem um predicado;
O resultado da operação junção natural é uma relação com todas as combinações das tuplas na relação1 (R1) e relação2 (R2) nas quais os seus atributos em comum são iguais.
É uma operação que produz uma combinação entre as linhas de uma relação com as linhas correspondentes de outra relação, sendo em princípio correspondente a uma seleção pelos atributos de relacionamento sobre um produto cartesiano dessas relações:
A operação de junção foi criada porque esse tipo de combinação de tabelas é muito comum, facilitando com isso a escrita de expressões. A tabela resultante de uma junção tem todas as colunas da primeira tabela e todas da segunda tabela.
Notação: R1 |x| R2
No exemplo a seguir temos as relações Empregados e Setores a sua junção natural :
Empregados Setores Empregados |x| Setores
|
|
|
A junção natural pode ser vista como uma combinação de uma operação de seleção aplicada sobre uma operação de produto cartesiano:
<critério> ( <relação1> X <relação2)
8 - Renomeação : Altera o nome de uma relação e/ou dos seus atributos
Esta operação unária primitiva redefine o nome de uma tabela em um determinado contexto. É útil para auto-relacionamentos, onde precisamos fazer a junção de uma tabela com ela mesma, e nesse caso cada versão da tabela precisa receber um nome diferente da outra.
Notação: <novo nome> (R)
Ex1: <empregados> (funcionarios)
Renomeia a
relação funcionarios parra empregados.
9
- Divisão : É 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.
Divisão é uma operação da álgebra relacional utilizada quando se deseja extrair de uma relação R1 uma determinada parte que possui as características (valores de atributos) da relação R2.
Notação: R1 R2
Ex1: Dada as relações:
Equipes Projetos
|
|
Resultado:
Equipes ( <nome_projeto> (Projetos))
|
|
=> |
|
10 - Atribuição : Permite que o conteúdo de uma relação seja atribuído (colocado) em uma variável especial, oferecendo a possibilidade de um tratamento até certo ponto algorítmico para algumas seqüências de operações.
Atribui-se a relação resultante de uma operação à direita de , a uma variável temporária, à esquerda, a qual poderá ser utilizada em relações subseqüentes.
Notação: variável operação
Ex1: Resultado Equipes ( <nome_projeto> (Projetos))
A seguir temos uma tabela com um resumo das operações vistas neste artigo:
Rom 10:9
Porque, se com a tua boca confessares a Jesus como Senhor, e em teu coração creres que Deus o ressuscitou dentre os mortos, será salvo;Rom 10:10
pois é com o coração que se crê para a justiça, e com a boca se faz confissão para a salvação.Rom 10:11
Porque a Escritura diz: Ninguém que nele crê será confundido.Rom 10:12
Porquanto não há distinção entre judeu e grego; porque o mesmo Senhor o é de todos, rico para com todos os que o invocam.Rom 10:13
Porque: Todo aquele que invocar o nome do Senhor será salvo.Referências: