Post

Algebra relacional e SQL

SELECT (algebra relacional)

Em algebra relacional SELECT apenas filtra uma relação. Diferente do do SQL, onde além de filtrar com a clausula WHERE é possível selecionar quais campos da Relação deseja Obter.

Em SQL, um exemplo de SELECT seria:

1
2
3
SELECT *
FROM employee
WHERE salary>25000;

Em notação de algebra relacional, o símbolo do SELECT é a letra $\sigma$ (sigma). Escrevendo o comando SQL em algebra relacional ficaria:

\[\sigma_{\text{Salary}>25000}(\text{EMPLOYEE})\]

Perceba que $\sigma$ é uma função que recebe uma relação e retorna outra relação. Uma função que aplicada a apenas uma relação, portanto o SELECT é uma operação unária.

Project

Em algebra relacional PROJECT seleciona certas colunas, descarta outras, mas sempre remove as repetidas. Um comando SQL equivalente a essa operação seria:

1
2
SELECT DISTINCT Fname, Lname, Address
FROM employee

Assim como SELECT, PROJECT é uma operação unária.

Escrevendo o comando SQLPROJECT em algebra relacional ficaria:

\[\pi_{\text{Fname},\text{Lname},\text{Address}}(\text{EMPLOYEE})\]

Rename

A operação relacional RENAME também é uma função unária, ou seja, recebe como argumento de entrada uma única relação. Ela realiza a mudança de nome de um ou mais atributos ou renomear o nome da relação e é representada pela letra grega $\rho$ (“rho”). Também podemos renomear relações através da operação de atribuição: $\leftarrow$. Um exemplo de comando SQL que realiza a operação RENAME seria:

1
2
SELECT DISTINCT E.Fname AS First_name, E.Lname AS Last_name, E.Salary AS Salary
FROM EMPLOYEE AS E

Em algebra relacional seria:

\[\rho_{\text{E}(\text{First_name},\text{Last_name},\text{Salary})}(\text{EMPLOYEE})\]

Exemplo de tradução de um comando Sql para algebra relacional que utiliza os comandos SELECT, PROJECT e RENAME

1
2
3
SELECT DISTINCT E.Fname AS First_name, E.Lname AS Last_name, E.Salary AS Salary
FROM EMPLOYEE AS E
WHERE E.Dno=5;

Como o comando utiliza as múltiplas operações: SELECT, PROJECT e RENAME, podemos expressar essas operações dividindo em partes e criando relações intermediárias para facilitar o processo.

\[E \leftarrow \text{EMPLOYEE}\]

Ao invés de renomear a tabela com o operação $\rho$ preferir utilizar a atribuição

\[\text{Dep5_E} \leftarrow \sigma_{\text{Dno}=5}(E)\] \[\text{ProD5_E} \leftarrow \pi_{\text{Fname},\text{Lname},\text{Salary}}(\text{Dep5_E})\] \[\rho_{(\text{First_name},\text{Last_name},\text{Salary})}(\text{ProD5_E})\]

Operações binárias: Union, Intersection e Set Difference

As trés operações foram trazidas da teoria de conjuntos com adaptações para banco de dados relacionais. A adaptação feita para bancos relacionais tem nome, chama-se compatibilidade de tipos, duas relações $A$ e $B$ só podem realizar união, interseção e diferença se ambas as relações tiverem:

  1. o mesmo número $n$ de atributos (o mesmo grau)
  2. os mesmos tipos de atributo ($dom(A_i) = dom(B_i)$

Os símbolos de das operações são os mesmos da teoria de conjuntos:

  • UNION: $A \cup B$. Em SQL usa-se o comando UNION
  • INTERSECTION: $A \cap B$. Em SQL usa-se o comando INTERSECT
  • SET DIFFERENCE: $A - B$. Em SQL usa-se o comando EXCEPT

É importante salientar que o resultado dessas operações em algebra relacional não possuem tuplas repetidas. Caso queria realizar essas operações em SQL admitindo tuplas repetidas, então deve-se utilizar os comandos: UNION ALL,INTERSECT ALL, EXCEPT ALL

Produto Cartesiano

Produto cartesiano é uma operação binária que combina cada tupla de uma tabela $A$ com cada tupla de uma tabela $B$. Resultando em uma nova tabela $C$ que possuirá todos os atributos das tabelas $A$ e $B$

\[C(A_1,A_2,A_3,...,A_n,B_1,B_2,B_3,...,B_m)\]

Sabendo que a tabela $A$ tem $n$ colunas e $B$ tem $m$ colunas, logo a tabela $Q$ terá $n+m$ colunas. Perceba que essa operação não precisa respeitar a compatibilidade de tipos. O produto cartesiano é representando pelo símbolo $\times$. Exemplo 1: seja $A$ uma tabela com os tuplas $a_1,a_2,a_3$ e $B$ com as tuplas $b_1,b_2,b_3$, logo,

\[C \leftarrow A \times B\] \[C = (a_1b_1,a_1b_2,a_1b_3,a_2b_1,a_2b_2,a_2b_3,a_3b_1,a_3b_2,a_3b_3)\]

Onde $a_1b_1$ é uma tupla que possui todas as colunas de $a_1$ concatenadas com $b_1$.

Exemplo 2 Recupere através da tabelas 1 e 2 uma lista dos nomes (primeiro e último nome) de todas as dependentes das empregadas e o nome completo da empregada.

\[\text{Female_E} \leftarrow \sigma_{\text{Sex}='F'}(\text{EMPLOYEE})\] \[\text{E_NAMES} \leftarrow \pi_{(\text{Fname,Lname,Ssn})}(\text{Female_E})\] \[\text{CROSS_DEPENDENTS} \leftarrow \text{E_NAMES} \times \text{DEPENDENT}\] \[\text{E_DEPENDENTS} \leftarrow \sigma_{\text{Ssn}=\text{Essn}}(\text{CROSS_DEPENDENTS})\] \[\text{RESULT} \leftarrow \pi_{(\text{Fname,Lname,Dependent_name})}(\text{E_DEPENDENTS})\]

As tabelas geradas pelas operações são:

FnameMinitLnamessnBdateAddressSexSalarySuper_ssnDino
AliciaJZelaya9998877771968-01-193321 Castle, Spring, TXF2500098765432144
JenniferSWallace9876543211941-06-20291 Berry, Bellaire, TXF430008886655554
JoyceAEnglish4534534531972-07-315631 Rice, Houston, TXF250003334455555

tabela: Female_E

FnameMinitLnamessn
AliciaJZelaya999887777
JenniferSWallace987654321
JoyceAEnglish453453453

tabela: E_NAMES

FnameMinitLnamessnEssnDependent_nameSexBdateRelationship
AliciaJZelaya999887777333445555AliceF1986-04-05Daughter
AliciaJZelaya999887777333445555TheodoreM1983-10-25Son
AliciaJZelaya999887777333445555JoyF1958-05-03Spouse
AliciaJZelaya999887777987654321AbnerM1942-02-28Spouse
AliciaJZelaya999887777123456789MichaelM1988-01-04Son
AliciaJZelaya999887777123456789AliceF1988-12-30Daughter
AliciaJZelaya999887777123456789ElizabethF1967-05-05Spouse
JenniferSWallace987654321333445555AliceF1986-04-05Daughter
JenniferSWallace987654321333445555TheodoreM1983-10-25Son
JenniferSWallace987654321333445555JoyF1958-05-03Spouse
JenniferSWallace987654321987654321AbnerM1942-02-28Spouse
JenniferSWallace987654321123456789MichaelM1988-01-04Son
JenniferSWallace987654321123456789AliceF1988-12-30Daughter
JenniferSWallace987654321123456789ElizabethF1967-05-05Spouse
JoyceAEnglish453453453333445555AliceF1986-04-05Daughter
JoyceAEnglish453453453333445555TheodoreM1983-10-25Son
JoyceAEnglish453453453333445555JoyF1958-05-03Spouse
JoyceAEnglish453453453987654321AbnerM1942-02-28Spouse
JoyceAEnglish453453453123456789MichaelM1988-01-04Son
JoyceAEnglish453453453123456789AliceF1988-12-30Daughter
JoyceAEnglish453453453123456789ElizabethF1967-05-05Spouse

tabela: CROSS_DEPENDENTS

FnameMinitLnamessnEssnDependent_nameSexBdateRelationship
JenniferSWallace987654321987654321AbnerM1942-02-28Spouse

tabela: E_DEPENDENTS

FnameLnameDependent_name
JenniferWallaceAbner

tabela: RESULT

Join

Uma das operações muito utilizadas em comando SQL é o JOIN. Essa operação pode ser entendia como um produto cartesiano seguido de um SELECT. Portanto JOIN é uma operação binária cuja a relação resultante é $n +m$ onde $n$ é o número de atributos da primeira tabela e $m$ é o número de atributos da segunda tabela. Perceba que diferente do produto cartesiano o JOIN possui uma condição para que se satisfaça a junção das tabelas. Condição que especifica e limita as combinações entre as tuplas.

Essa operação é representada pelo símbolo $\Join$.

Utilizado o JOIN, podemos então substituir as equações:

\[\text{CROSS_DEPENDENTS} \leftarrow \text{E_NAMES} \times \text{DEPENDENT}\] \[\text{E_DEPENDENTS} \leftarrow \sigma_{\text{Ssn}=\text{Essn}}(\text{CROSS_DEPENDENTS})\]

Por apenas uma equação:

\[\text{E_DEPENDENTS} \leftarrow \text{E_NAMES} \Join_{\text{Ssn}=\text{Essn}} \text{DEPENDENT}\]

Tabelas

FnameMinitLnamessnBdateAddressSexSalarySuper_ssnDino
JohnBSmith1234567891965-01-09731 Fondren, Houston, TXM300003334455555
FranklinTWong3334455551955-12-08638 Voss, Houston, TXM400008886655555
AliciaJZelaya9998877771968-01-193321 Castle, Spring, TXF2500098765432144
JenniferSWallace9876543211941-06-20291 Berry, Bellaire, TXF430008886655554
RameshKNarayan6668844441962-09-15975 Fire Oak, Humble, TXM380003334455555
JoyceAEnglish4534534531972-07-315631 Rice, Houston, TXF250003334455555
AhmadVJabbar9879879871969-03-29980 Dallas, Houston, TXM250009876543214
JamesEBorg8886655551937-11-10450 Stone, Houston, TXM55000NULL1

Tabela 1: Employee

EssnDependent_nameSexBdateRelationship
333445555AliceF1986-04-05Daughter
333445555TheodoreM1983-10-25Son
333445555JoyF1958-05-03Spouse
987654321AbnerM1942-02-28Spouse
123456789MichaelM1988-01-04Son
123456789AliceF1988-12-30Daughter
123456789ElizabethF1967-05-05Spouse

Tabela 2: Dependent

This post is licensed under CC BY 4.0 by the author.