INF 314 - Engenharia da Informação - Março-abril 2006

Prof. Célio Guimarães     IC - Unicamp

Álgebra Relacional x SQL : conexão prática

SQL foi fortemente influenciada pelos trabalhos de Codd sobre Álgebra Relacional (AR) e Cálculo Relacional de Tuplas (CRT). Embora elas sejam equivalentes no que diz respeito ao poder de expressar consultas, SQL é mais poderosa devido principalmente aos seus recursos de contagem, ordenação (cláusula order by ) e agrupamento (cláusula group by ); a AR e o CRT podem ambas serem vistas como formas compactas de expressar consultas em SQL. O domínio de uma delas pode ser de grande ajuda no raciocínio lógico por trás das soluções de consultas complexas. É o que faremos através de alguns exemplos de AR vistos em aula.
É importante ressaltar, no entanto, uma diferença conceitual importante entre a AR e SQL: SQL não trata tabelas como conjuntos matemáticos, permitindo a ocorrência de linhas duplicadas. Uma forma de evitar isto é sempre especificar a chave primária ao criar uma tabela. Infelizmente isto não é suficiente, pois tabelas intermediárias produzidas ao se executar um comando SQL podem conter linhas duplicadas se certos cuidados não forem tomados: o exemplo mais simples desse efeito é a operação de projeção (Π) que elimina duplicatas na AR mas a sua tradução natural para SQL não o faz, como veremos. A sguir veremos como operações da AR são traduzidas para SQL:

  • Projeção: expressa em SQL na cláusula select do comando select

    Exemplo: "Para cada funcionário apresente os nomes dos seus dependentes"

         AR: Π numf, nomed Dependentes
         SQL: select numf,nomed from Dependntes
    
    "Dê uma lista dos funcionários que possuem dependentes"
     
        Π numf Dependentes
    	
        select numf from Dependentes
            problema: o funcionário 02 aparecerá duas vezes! É preciso incluir:
        select distinct numf from Dependentes
    
  • Produto cartesiano de duas ou mais tabelas: expresso em SQL na cláusula   from :
    Exemplos:
         select ...
         from Funcionarios, Dependentes
         ou,
         select ....
         from D as D1, D as D2, D as D3
    
    Observe também nesse exemplo os operadores de renomeação (ρ): as D1, as D2, etc. Usualmente o produto cartesiano será utilizado junto com uma seleção, conforme veremos.

  • Seleção (operador σ ) e junção θ (e/ou junção natural):

    Lembrando que a junção θ e junção natural são subconjuntos do produto cartesiano, obtidos através de uma comparação entre colunas, a seleção e a junção  podem ambas ser expressas através de uma expressão booleana na cláusula where:

    junção natural: "para cada funcionário que possui dependentes apresente o seu nome, os nomes e parentesco dos dependentes" (junção natural):

        Πnommef, nomed, par  Funcionarios |X| Dependentes
    
        select nomef, nomed, par 
        from Funcionarios, Dependentes
        where Funcionarios.numf = Dependentes.numf
    
    junção theta: tabela de "pais e filhos", D(p,f): "obtenha pares de pessoas x, y onde x é avô de y"
        ΠD1.p,D2.f D1 |X D1.f=D2.p| D2
            (qual a renomeação implícita na solução acima?)
    		
        select D1.p, D2.f
        from D as D1, D as D2
        where D1.f= D2.p                                        
    
    seleção e junção theta: "obtenha pares de pessoas da tabela "Pais e Filhos", D( p, f), que são cônjuges, isto é, possuem um ou mais filhos em comum"
        ρD1(p1,f1) D,  ρD2(p2,f2) D  
    	
        Πp1,p2p1 < p2 (D1 |Xf1=f2| D2))  ≡ Πp1,p2p1 < p2 and f1=f2 (D1 x D2))
    
    Exercício: re-escreva a expressão acima com a seguinte renomeação: ρD1(p,f) D e ρD2(p,f) D   deixando a expressão em AR mais próxima da tradução para SQL:
        select distinct D1.p, D2.p
        from D as D1, D as D2
        where D1.f = D2.f and D1.p < D2.p
    
    Exercício: por que distinct é necessário nesta solução e não na do problema anterior?

    Exercícios:
    (i) "Para cada funcionário apresente o seu numero e, em ordem decrescente, o número de seus descendentes".
    (ii) "Qual o funcionário que possui o maior número de dependentes?"
    (iii) "Para cada funcionário apresente o seu nome e, em ordem decrescente, o número de seus descendentes".

    AR : não é possivel expressar.
    SQL: relativamente simples usando os recursos de ordenação (order by), contagem ( count()) e de agrupamento (group by). Tente!