UNIVERSIDADE FEDERAL RURAL DE PERNAMBUCO (UFRPE)

  COORDENAÇÃO GERAL DE EDUCAÇÃO A DISTÂNCIA (EAD/UFRPE)




          Banco de Dados




     Sandra de Albuquerque Siebra




                                                    Volume 4




                    Recife, 2010
Universidade Federal Rural de Pernambuco


Reitor: Prof. Valmar Corrêa de Andrade
Vice-Reitor: Prof. Reginaldo Barros
Pró-Reitor de Administração: Prof. Francisco Fernando Ramos Carvalho
Pró-Reitor de Extensão: Prof. Paulo Donizeti Siepierski
Pró-Reitor de Pesquisa e Pós-Graduação: Prof. Fernando José Freire
Pró-Reitor de Planejamento: Prof. Rinaldo Luiz Caraciolo Ferreira
Pró-Reitora de Ensino de Graduação: Profª. Maria José de Sena
Coordenação Geral de Ensino a Distância: Profª Marizete Silva Santos



Produção Gráfica e Editorial
Capa e Editoração: Rafael Lira, Italo Amorim e Arlinda Torres
Revisão Ortográfica: Elias Vieira
Ilustrações: Mário França
Coordenação de Produção: Marizete Silva Santos
Sumário

   Apresentação................................................................................................................. 4

   Conhecendo o Volume 4 ................................................................................................ 5

   Capítulo 10 – Álgebra e Cálculo Relacional ..................................................................... 7

       Álgebra Relacional ...........................................................................................................7

       Álgebra Relacional: Operadores de Tabelas ..................................................................11

   Capítulo 11 – Criando e Mantendo um Banco de Dados ............................................... 26

       A SQL .............................................................................................................................26

   Capítulo 12 – Consultas em Banco de Dados Relacionais .............................................. 39

       Inserindo Dados em Tabelas ..........................................................................................39

   Considerações Finais .................................................................................................... 74

   Conheça a Autora ........................................................................................................ 76
Apresentação
       Caro(a) cursista,
       Seja bem-vindo(a) ao quarto módulo do curso Banco de Dados!
        Neste quarto módulo, vamos aprender a manipular um SGBD de forma a criar, manter e consultar o banco
de dados que você antes aprendeu a modelar. Para fazer isso, estudaremos principalmente a linguagem SQL,
presente em todos os banco de dados relacionais e de grande utilidade no acesso a eles.
        Adicionalmente, estudaremos um pouco de álgebra relacional e cálculo relacional que são formas de
representar matematicamente as operações que podem ser aplicadas a um Banco de Dados.
       Bons estudos!
                                       Sandra de Albuquerque Siebra
                                                  Autora




4
Banco de Dados




Conhecendo o Volume 4
        Neste quarto volume, você irá encontrar o Módulo 4 da disciplina de Banco de
Dados. Para facilitar seus estudos, veja a organização deste quarto módulo.

        Módulo 4 – Criação, Manutenção e Consulta a Banco de Dados

        Carga horária do Módulo 4: 15 h/aula
        Objetivo do Módulo 4:

    »   Introduzir os principais conceitos referentes a álgebra relacional e o cáclulo
        relacional como formas de manipulação e consulta a BD.
    »   Examinar os principais comandos em SQL para criação e manutenção de banco de
        dados.
    »   Examinar os principais comandos em SQL para consultas simples e aninhadas a
        banco de dados.
        Conteúdo Programático do Módulo 4:

    »   Álgebra Relacional.
    »   Cálculo Relacional de Tupla e Cálculo Relacional de Domínio.
    »   SQL – Conceitos básicos, comandos para criação e atualização do banco de dados.
    »   SQL - Consultas básicas e Consultas Aninhadas.




                                                                                                       5
Banco de Dados




                              Capítulo 10


                         O que vamos estudar neste capítulo?

                         Neste capítulo, vamos estudar os seguintes temas:

                     »   Álgebra Relacional.
                     »   Cálculo Relacional de Tupla.
                     »   Cálculo Relacional de Domínio.

                         Metas

                         Após o estudo deste capítulo, esperamos que você:

                     »   Compreenda o que é álgebra relacional e cálculo relacional.
                     »   Consiga diferenciar o cálculo relacional de tupla e de domínio.
                     »   Consiga fazer uso de alguns comandos da álgebra relacional.




6
Banco de Dados




Capítulo 10 – Álgebra e Cálculo
Relacional


              Vamos conversar sobre o assunto?


        Até aqui, já estudamos como modelar e otimizar nosso modelo para um banco de
dados relacional. Um modelo relacional representa o banco de dados como um conjunto
de relações. Uma relação pode ser pensada como uma tabela de valores, onde cada
linha na tabela representa uma coleção de valores de dados relacionados. Para acessar
e manipular esses valores há duas categorias de linguagens que podem ser utilizadas: as
linguagens formais (a álgebra relacional e o cálculo relacional) e as linguagens comerciais,
que são baseadas nas linguagens formais (tal como a SQL – Structured Query Language). As
linguagens formais são justamente as que daremos uma olhada nesse capítulo e uma das
linguagens comerciais mais utilizadas (a SQL) será assunto dos dois capítulos finais desse
volume.


       Neste capítulo, vamos estudar as linguagens formais para consulta e manipulação
dos dados em um banco de dados: a álgebra relacional e o cálculo relacional.



Álgebra Relacional
        A Álgebra Relacional é uma linguagem de consulta formal, porém procedimental
(procedural), 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. Ela consiste
de um conjunto de operações que têm como entrada uma ou duas relações e produzem,
como resultado, uma nova relação.
        Os operadores da álgebra relacional podem ser divididos em dois grupos:

    »   Operadores de Conjuntos: são operadores típicos definidos pela álgebra para
        conjunto, tais como união, interseção, diferença e produto cartesiano. As operações
        com esses operadores se aplicam a duas relações que obedeçam à “compatibilidade
        de união”, ou seja, ambas as relações devem apresentar atributos que pertençam
        respectivamente aos mesmos domínios.
    »   Operadores de Tabelas: são operadores definidos especialmente para a
        manipulação de tuplas, em bases de dados relacionais tais como: Select, Project
        e Join, entre outras. As operações com esses operadores se aplicam a quaisquer
        relações.
        Esses operadores serão detalhados nas seções a seguir.



               Observação


  As linguagens disponíveis para acesso a BDs relacionais, inclusive o SQL, não utilizam os mesmos
  operadores ou nomes definidos pela álgebra relacional. Entretanto todos, ou quase todos, os
  operadores da álgebra relacional podem ser escritos usando estas linguagens.


                                                                                                                      7
Banco de Dados



                     Álgebra Relacional: Operadores de Conjuntos

                             São operadores binários e para utilizá-los, é preciso se assegurar de que as duas
                     relações envolvidas nas operações tenham o mesmo tipo de tuplas, ou seja, pertençam
                     ao mesmo domínio. Essa condição é chamada união compatível. Em outras palavras, duas
                     relações R1 (A1, A2,..., An) e R2 (B1, B2, ..., Bn) são união compatível se elas tiverem o
                     mesmo grau n, e dom(Ai) = dom(Bi) para 1 ≤ i ≤ n. Isso significa que as duas relações têm
                     o mesmo número de atributos e que cada par de atributos correspondentes pertence ao
                     mesmo domínio.
                             Pode-se definir as operações de união, interseção, diferença e produto cartesiano
                     sobre duas relações que sejam união compatível R1 e R2. Resumidamente:

                         »   União (R1 ∪ R2) - todas as tuplas de R1 e todas as tuplas de R2, sendo que tuplas
                             duplicadas são eliminadas.

                         »   Interseção (R1 ∩ R2) - todas as tuplas comuns a R1 e R2.
                         »   Diferença (R1 – R2) - todas as tuplas de R1 que não estão em R2.
                         »   Produto Cartesiano (R1 x R2) - combinação das tuplas de R1 com as de R2.
                            Vamos detalhar e exemplificar, a seguir, cada uma dessas operações. Mas, antes,
                     algumas observações sobre essas operações:

                         »   As operações de união e interseção são operações comutativas. Ou seja:

                                               R1 ∪ R2 = R2 ∪ R1 e R1 ∩ R2 = R2 ∩ R1.
                         »   Já a operação de diferença não é comutativa: R - S ≠ S - R.
                         »   As operações de união e interseção são binárias, mas podem ser aplicadas a
                             qualquer número de relações e ambas são operações associativas. Assim:

                                           R ∪ (S ∪ T) = (R ∪ S) ∪ T e R ∩ (S ∩ T) = (R ∩ S) ∩ T.
                             Considere como base para os exemplos das operações as relações Professor e Aluno
                     representadas pelas Tabelas 1 e 2.


                                Tabela 1 - Relação Professor                 Tabela 2 - Relação Aluno


                                  CPF              Nome                      CPF              Nome

                                  1001          Ana Maria                    1002             João

                                  1002             João                      1116            Mércia

                                  1003             Pedro                     1900            Ronaldo




                     União: A ∪ B

                             União é a operação entre duas relações “união compatível” (mesmo número de
                     atributos e com domínio compatível) que gera uma relação resultante contendo todas
                     as tuplas (linhas) das duas relações originais, com eliminação das tuplas duplicadas.
                     Ela é denotada pelo símbolo ∪. Por exemplo, a união das relações Professor e Aluno
                     representadas pelas Tabelas 1 e 2 é a relação representada pela Tabela 3.



8
Banco de Dados



                      Tabela 3 – Relação Resultante de Professor ∪ Aluno

                                   CPF              Nome

                                   1001           Ana Maria

                                   1002              João

                                   1003              Pedro

                                   1116             Mércia

                                   1900            Ronaldo




Interseção: A ∩ B

         Interseção é a operação entre duas relações “união compatível” que gera uma
relação resultante contendo todas as tuplas (linhas) presentes em ambas as relações
originais. Ela é denotada pelo símbolo ∩. Por exemplo, a interseção das relações Professor e
Aluno representadas pelas Tabelas 1 e 2 é a relação representada pela Tabela 4.

                      Tabela 4 - Relação Resultante de Professor ∩ Aluno


                                    CPF              Nome

                                   1002              João




Diferença: A – B

        Diferença é a operação entre duas relações “união compatível” que gera uma relação
resultante contendo todas as linhas que estão na primeira relação, e que não aparecem na
segunda. Ela é denotada pelo símbolo –. Por exemplo, a diferença das relações Professor e
Aluno representadas pelas Tabelas 1 e 2 (Professor – Aluno) é a relação representada pela
Tabela 5, que contém as tuplas das relação Professor que não estão na relação Aluno.

                       Tabela 5 - Relação Resultante de Professor – Aluno


                                    CPF             Nome

                                   1001           Ana Maria

                                   1003              Pedro



         Para mostrar que a operação de diferença não é comutativa, vamos agora fazer
Aluno – Professor, ou seja, as tuplas que estão na relação Aluno, mas que não estão na
relação Professor. Veja pela relação resultante representada na Tabela 6 que os resultados
da diferença, mudando a ordem das relações são diferentes.




                                                                                                           9
Banco de Dados



                                              Tabela 6 - Relação Resultante de Aluno – Professor

                                                           CPF             Nome

                                                          1116             Mércia

                                                          1900            Ronaldo




                      Produto Cartesiano: A x B

                              O produto cartesiano combina duas relações gerando uma terceira cujas linhas
                      representam todas as possíveis combinações das linhas (tuplas) das relações originais. Um
                      esquema dessa combinação pode ser vista na Figura 1.




                                           Figura 1 - Esquema de combinações do Produto Cartesiano



                              O produto cartesiano é uma operação binária e é representado pelo símbolo X. O
                      formato geral da operação é: relação_1 X relação_2 . Vamos dar um exemplo. Qual seria o
                      resultado do produto cartesiano Cidade x Estado (vide Tabelas 7 e 8)?


                                   Tabela 7 - Relação Cidade                        Tabela 8 - Relação Estado


                                  Código             Nome                            UF             Região

                                    1                Recife                          PB            Nordeste

                                    2               Manaus                           AM             Norte

                                    3             João Pessoa



                               O resultado seria a relação resultante apresentada na Tabela 9. Veja que esta
                      relação resultante apresenta a combinação de todas as tuplas da relação Cidade, com todas
                      as tuplas da relação Estado.




10
Banco de Dados



                                   Tabela 9 - Relação Resultante


                     Código           Nome             UF            Região

                        1             Recife           PB           Nordeste

                        2             Natal            PB           Nordeste

                        3          João Pessoa         PB           Nordeste

                        1             Recife           AM             Norte

                        2             Natal            AM             Norte

                        3          João Pessoa         AM             Norte




 Renomear para diferenciar: O Produto Cartesiano entre duas relações R1 e R2 (R1 x R2) apresenta
 problemas quando:


 * As relações têm mesmo nome;


 * Se se quer fazer o produto de uma relação com ela mesma ou


 * O produto cartesiano está envolvido com a relação resultante de expressões (que vamos ver o
 que são daqui a pouco).


 Isso porque um mesmo nome de atributo pode aparecer tanto em R1 quanto em R2. Por isso, é
 preciso estabelecer um modo de diferenciar esses atributos na relação resultante. Para isso, pode-
 se anexar ao atributo o nome da relação a qual ele pertença: nome_relacao.nome_atributo. Por
 exemplo, se fizéssemos o produto cartesiano entre as relações Professor e Aluno (vide Tabelas 1 e
 2), como as duas tabelas possuem atributos de mesmo nome, a relação resultante ficaria com as
 seguintes colunas: (Professor.CPF, Professor.Nome, Aluno.CPF, Aluno.Nome)




Álgebra Relacional: Operadores de Tabelas
         Os operadores de tabela manipulam tuplas em bases de dados relacionais e podem
ser aplicados a quaisquer relações. A seguir, descreveremos cada uma das operações.


Seleção

         O operador de seleção é usado para selecionar tuplas que satisfaçam uma
determinada condição. Essas tuplas selecionadas geram uma relação resultante. O esquema
da relação resultante é o mesmo da relação original. O operador de seleção é representado
pela letra grega sigma (δ) e seu formato geral é: δ condição(tabela ou relação). O operador
da seleção é unário, ou seja, seleciona tuplas de somente uma relação. Vamos dar alguns
exemplos a partir da relação Cidade (vide Tabela 10).




                                                                                                                       11
Banco de Dados



                                                         Tabela 10 - Relação Cidade


                                            Código          Nome           É_capital      UF

                                                 1          Recife             S          PE

                                                 2          Natal              S          RN

                                                 3       João Pessoa           S          PB

                                                 4          Patos              N          PB



                              δ UF = ‘PB’(cidade) daria como resultado a relação da Tabela 11, que atenderia a
                      algo como: selecione da relação cidade, as tuplas cuja UF seja igual ao valor ‘PB’.

                                                       Tabela 11 - Relação Resultante


                                          Código          Nome            É_capital        UF

                                             3          João Pessoa           S            PB

                                             4             Patos              N            PB



                                Para especificar as condições da seleção podemos utilizar: valores constantes, nome
                      de atributos (colunas), operadores relacionais (=, <, >, <=, >=, ≠) ou operadores lógicos (and,
                      or, not). Por exemplo, δ UF=’PB’ and E_Capital=’N’(CIDADE) daria como resultado a relação
                      da Tabela 12, que atenderia a algo como: selecione da relação cidade, as tuplas cuja UF seja
                      igual ao valor ‘PB’ e o campo E_Capital tenha o valor ‘N’.

                                                       Tabela 12 - Relação Resultante


                                            Código          Nome          É_capital        UF

                                                 4          Patos             N            PB



                              Vamos a outro exemplo, suponha o esquema de relação Empregado (CPF, Nome,
                      DataNasc, Endereço, Sexo, NumDep, Salario). Agora, suponha que desejamos selecionar
                      os empregados que trabalham no departamento 10 e ganham mais de 1500 ou aqueles que
                      trabalham no departamento 3 e ganham mais que 4000. Como ficaria?
                             δ (NumDep = 10 and salario > 1500) or (NumDep=3 and salario > 4000)
                      (Empregado)
                              A operação de seleção é comutativa, ou seja, uma sequência de seleção pode ser
                      aplicada em qualquer ordem:
                              δ <cond1> (δ <cond2> (Relação)) = δ <cond2> (δ <cond1> (Relação))
                             Sempre é possível combinar uma propagação de operações de seleção dentro de
                      uma única operação de seleção, fazendo uso de uma condição conjuntiva (AND):
                              δ <cond1> (δ <cond2> (Relação)) = δ <cond1> and <cond2> (Relação)
                              δ <cond1> (δ <cond2> ( ... (δ <condN> (Relação)) ...)) = δ <cond1> AND <cond2>
                                                AND ... AND <condN> (Relação)



12
Banco de Dados



Projeção

         A operação de projeção é unária e opera sobre uma única relação gerando outra
relação resultante que conterá todas as linhas da relação original, mas apenas as colunas
(atributos) que se deseja projetar (e que foram especificadas na operação). Ou seja, retorna
parte da relação deixando de fora os atributos que não foram solicitados. Na relação
resultante as tuplas (linhas) duplicadas são eliminadas. O formato geral da operação de
projeção é: π A1, A2, …, An (Relação) onde A1, A2, ..., An são nomes de atributos da relação.
Vamos dar um exemplo. Tomando como base a relação Cidade (vide Tabela 10), vamos
supor que queremos selecionar (projetar) apenas os atributos Nome e UF. Daí precisaríamos
da seguinte operação: π Nome, UF (Cidade). A relação resultante dessa projeção seria a
apresentada na Tabela 13. Observe que a relação resultante tem todas as tuplas da relação
original, mas só apresenta os atributos especificados na operação de projeção. Além disso,
observe que estes atributos aparecem na mesma ordem em que foram especificados.

                          Tabela 13 - Relação Resultante da Projeção

                                     Nome              UF

                                     Recife            PE

                                     Natal             RN

                                  João Pessoa          PB

                                     Patos             PB



        Na verdade, se observarmos bem, o operador de projeção também serve para
selecionar. Porém, enquanto o operador de SELEÇÃO seleciona tuplas de uma relação, o
operador de PROJEÇÃO seleciona colunas de uma Relação.
        O número de tuplas na relação resultante sempre será igual ou menor que a
quantidade de tuplas na relação original. Isto porque tuplas duplicadas são eliminadas. Por
exemplo, observe a seguinte operação de projeção π Nome, UF (Cidade) aplicada à relação
Cidade (vide Tabela 10). Veja que “PB” aparece apenas uma vez na relação resultante (vide
Tabela 14). Mesmo que ela apareça duas vezes na relação original (Tabela 10).

                          Tabela 14 - Relação Resultante da Projeção


                                              UF

                                              PE

                                              RN

                                              PB



        A operação de projeção não é comutativa. Apenas no caso específico de <lista2>
conter os mesmos atributos de <lista1> pode-se observar comutatividade.
           π <lista_atributos1> (π <lista_atributos2> (Relação)) ≠ π <lista_atributos 2>
                             (π<lista_atributos1> (Relação))




                                                                                                            13
Banco de Dados



                      Combinando Operações

                               Em geral, existe a necessidade de se aplicar várias operações da álgebra relacional
                      uma após a outra. Pode-se escrever essas operações em apenas uma única expressão da
                      álgebra relacional, combinando as operações, usando tanto operadores de conjunto, quanto
                      de tabela. Vamos dar alguns exemplos a seguir.

                          »   Tomando como base as relações Professor(CPF, Nome) e Aluno (CPF, Nome) -
                              vide Tabelas 1 e 2 – se desejássemos encontrar o nome de todos os professores
                              que também são alunos, poderíamos usar a expressão: Π nome(Professor) ∩ Π
                              nome(Aluno)
                          »   A partir da relação Empregado (CPF, Nome, Sexo, Salario, Num_Dep), vide Tabela
                              15, selecione o nome e o salário de todos os empregados que trabalhem no
                              departamento de número 4. Para isso, poderíamos usar a expressão:
                                                 Π nome, salario (δ Num_Dep=4(Empregado))
                              Isso daria origem a tabela 16.

                                                      Tabela 15 - Relação Empregado

                                     CPF           Nome              Sexo       Salario    Num_Dep

                                    1234         Ana Gomes            F          1500          2

                                    2345        Pedro Nunes           M          1000          4

                                    3765         Maria Lima           F          2000          2

                                    4987         Igor Matos           M          3500          5

                                    9876         Laís Ramos           F          3000          4




                                                      Tabela 16 - Relação Resultante


                                                          Nome              Salario

                                                       Pedro Nunes           1000

                                                       Laís Ramos            3000




                                                       Tabela 17 - Relação Gerente


                                    CPF           Nome           Sexo           Salario     Num_Dep

                                   5678        João Teixeira         M           1800           2

                                   2345        Pedro Nunes           M           1000           4



                          »   A partir da relação Empregado (Tabela 15) e da relação Gerente (Tabela 17),
                              encontre o nome de todos os empregados que não são gerentes. Para isso,
                              poderíamos usar a expressão:
                                                   Π nome (Empregado) - Π nome (Gerente)



14
Banco de Dados



         Outra forma de combinar operações é aplicar uma única operação por vez e criar
relações intermediárias. Neste caso, é preciso dar nomes às relações intermediárias. Por
exemplo, vamos tomar o exemplo anteriormente visto de tomar a relação Empregado como
base (Tabela 15) e dela recuperar o nome e o salário de todos os empregados que trabalham
no departamento 4. Já apresentamos como fazer isso com uma única expressão. Agora,
alternativamente, seria possível explicitar a sequência de operações, dando um nome para
cada relação intermediária:
        Empregados_Dep4 ← ß δ Num_Dep=4(Empregado)
        Π nome, salario (Empregados_Dep4)


Junção

         O operador de junção combina as linhas de duas tabelas (relações) segundo uma ou
mais condições. A condição de junção deve ser baseada em uma ou mais colunas (atributos)
de cada uma das tabelas cujos valores compartilhem um domínio comum. As linhas das
tabelas serão combinadas sempre que a condição de junção for verdadeira. (geralmente
a condição é uma igualdade entre atributos equivalentes). O join é representado pelo
operador binário |x| e o formato geral de utilização é: Relação1 |x| <condição de junção>
Relação2. Por exemplo, Cidade |x| cidade.UF = Estado.UF Estado. Vai combinar os valores
das relações Cidade (Tabela 18) e Estado (Tabela 19), de acordo com a igualdade do atributo
comum às duas relações: a UF. Dessa forma, seria gerada a relação representada na Tabela
20. Veja que a primeira tupla da relação Cidade (vide Tabela 18) não faz parte da relação
resultante, por que ela não tem equivalente na relação Estado (já que está sendo feita a
igualdade com base no atributo UF). Ou seja, tuplas cujos atributos de junção são nulos não
aparecem na relação resultante.

                                    Tabela 18 - Relação Cidade

                           Código            Nome                 Sexo

                             1               Recife                PE

                             2              Manaus                 AM

                             3             João Pessoa             PB




                                    Tabela 19 - Relação Estado


                                      UF              Região

                                      PB           Nordeste

                                      AM               Norte




                                 Tabela 20 - Relação Resultante


           Código         Nome             Cidade.UF           Estado.UF   Região

             2           Manaus              AM                  AM         Norte

             3         João Pessoa            PB                  PB       Nordeste



                                                                                                          15
Banco de Dados



                              Quando a condição de uma junção é a igualdade, a junção é chamada de equijoin.
                      O equijoin gera duas colunas idênticas na relação resultante (vide as colunas UF na Tabela
                      20). Uma Junção Natural é um equijoin onde uma das colunas idênticas é eliminada. Como
                      assim? O operador de junção natural combina as linhas de duas tabelas que tem atributos
                      comuns (mesmo nome), resultando numa tabela que contém apenas as linhas onde todos
                      os atributos comuns apresentam o mesmo valor. Na relação resultante, uma das colunas
                      idênticas é eliminada, evitando a duplicidade.
                               A junção natural equivale a uma seleção precedida de um produto cartesiano.
                      Assim:
                                            Cidade |x| cidade.UF = Estado.UF Estado é equivalente a
                                                    δ cidade.UF = Estado.UF (Cidade x Estado)
                               Se duas relações envolvidas em uma junção natural não têm atributos em comum,
                      então a junção natural produz um resultado igual ao produzido pelo produto cartesiano.

                       » EQUIJOIN: junção onde somente operadores de comparação “=“ são utilizados. Gera colunas
                       idênticas.


                       » JUNÇÃO NATURAL: requer que os dois atributos de junção tenha o mesmo nome em ambas as
                       relações. Nesse tipo de join outras condições podem ser utilizadas além da igualdade. A relação
                       resultante não gera nenhuma duplicidade.



                      Cálculo Relacional

                              O Cálculo Relacional (CR) é uma linguagem de consulta formal. Utilizando-se de uma
                      expressão declarativa pode-se especificar uma consulta. Uma expressão de cálculo permite
                      a descrição da consulta desejada sem especificar os procedimentos para obtenção dessas
                      informações, ou seja, é não-procedural. Contudo, tal consulta deve ser capaz de descrever
                      formalmente a informação desejada, com exatidão.
                               No Cálculo Relacional existem variáveis, constantes, operadores lógicos, de
                      comparação e quantificadores. As expressões de Cálculo são chamadas de fórmulas. Uma
                      tupla de respostas é essencialmente uma atribuição de constantes às variáveis que levam a
                      fórmula a um estado verdadeiro. Existem dois tipos de cálculo relacional: Cálculo Relacional
                      de Tuplas (CRT) e Cálculo Relacional de Domínio (CRD), ambos subconjuntos simples de
                      lógica de primeira ordem. No CRT, as variáveis são definidas sobre (isto é, associam) tuplas.
                      Já em CRD, variáveis são definidas sobre o domínio dos elementos (ou seja, sobre os valores
                      dos campos).
                              Como o cálculo relacional é pouco utilizado, vamos apenas apresentar algumas
                      definições e exemplos, a título informativo, de cada um dos tipos de cálculo. Adicionalmente,
                      é importante saber que todas as expressões de consulta descritas no Cálculo Relacional
                      possuem equivalentes em Álgebra Relacional, que é mais utilizada e possui mais ferramentas
                      para dar suporte a construção de suas expressões.


                      Cálculo Relacional de Tupla

                               O Cálculo Relacional de Tupla (CRT) é baseado na especificação de um número de
                      variáveis de tuplas. Cada variável de tupla pode assumir como seu valor qualquer tupla da
                      relação especificada. Uma consulta em CRT é especificada da seguinte forma:
                               {variável tupla | predicado} ou { t | P(t) } que significa o conjunto de todas as tuplas

16
Banco de Dados



t, tal que o predicado P seja verdadeiro para t. E temos que t é uma variável de tuplas. P é
uma expressão condicional e t.A ou t[A] denota o valor do atributo A da tupla t. O resultado
de tal consulta é o conjunto de todas as variáveis tuplas para as quais o predicado é indicado
como verdadeiro.
        Uma expressão genérica do cálculo relacional de tuplas tem a forma:
              {t1.A1, t2.A2, ..., tn.An | predicado(t1, t2, ..., tn, tn+1, tn+2, ..., tn+m)}
         Onde: t1, t2, ..., tn, tn+1, tn+2, ..., tn+m são variáveis de tuplas, cada Ai é um
atributo da relação na qual ti se encontra e o predicado é uma fórmula do cálculo relacional
de tuplas.
        Uma fórmula é definida, de forma recursiva, por uma ou mais fórmulas atômicas.
Essas fórmulas podem ser conectadas por operadores lógicos (AND, OR ou NOT), como
segue:

    »   Se F1 e F2 são fórmulas atômicas, então (F1 AND F2), (F1 OR F2), NOT (F1) e NOT
        (F2) também o são, tendo seus valores verdade derivados a partir de F1 e F2.



               Relembrando...


                  (F1 AND F2) será TRUE apenas se ambos, F1 e F2, forem TRUE;
              (F1 OR F2) será TRUE quando uma das duas fórmulas F1 e F2, for TRUE;
                            NOT(F1) será TRUE quando F1 for FALSE;
                            NOT(F2) será TRUE quando F2 for FALSE.


    »   Se F1 é uma fórmula atômica, então (Ǝ t)(F1) também o é, e seu valor verdade
        apenas será TRUE se a fórmula F for avaliada como verdadeira para pelo menos
        uma tupla atribuída para ocorrências livres de t (que é uma variável de tupla) em F.
    »   Se F1 é uma fórmula atômica, então (∀ t)(F1) também o é, e seu valor verdade
        apenas será TRUE se a fórmula F for avaliada como verdadeira para todas as tuplas
        atribuídas para ocorrências livres de t em F.
        Adicionalmente, temos:

    »   Uma fórmula atômica ti.A op tj.B, onde op é um dos operadores de comparação no
        conjunto {=, >, <, ≠, >=, <=}, ti e tj são variáveis de tuplas, A é um atributo da relação
        na qual ti se encontra, B é um atributo da relação na qual tj se encontra.
    »   Uma fórmula atômica ti.A op c ou c op tj.B, onde op é um dos operadores de
        comparação no conjunto {=, >, <, ≠, >=, <=}, ti e tj são variáveis de tuplas, A é um
        atributo da relação na qual ti se encontra, B é um atributo da relação na qual tj se
        encontra e c é um valor constante.
        Nos dois casos acima, se as variáveis de tupla forem designadas de forma que
os valores dos atributos especificados satisfaçam o predicado, a fórmula assumirá valor
verdade TRUE.
       Cada uma das fórmulas atômicas anteriormente especificadas tem seu valor
verdade avaliado como TRUE ou FALSE para uma combinação específica de tuplas.




                                                                                                                 17
Banco de Dados




                        Todas as variáveis tuplas abordadas são consideradas variáveis livres (elas aparecem em
                        uma expressão de cálculo relacional à esquerda da barra |), uma vez que estas não aparecem
                        quantificadas. Porém, quando quantificadores (universal (∀) ou existencial (Ǝ)) aparecem nas
                        fórmulas, as variáveis que os sucedem são denominadas variáveis limite.


                                                        Tabela 21 - Relação Empregado

                                      CPF           Nome             Sexo              Salario    Cod_Depto

                                     1234        Ana Gomes            F                 1500          2

                                     2345        Pedro Nunes          M                 1000          4

                                     3765        Maria Lima           F                 2000          2

                                     4987         Igor Matos          M                 3500          5

                                     9876        Laís Ramos           F                 3000          4




                                                      Tabela 22 - Relação Departamento

                                                               Cod          Descricao

                                                                2            Vendas

                                                                4           Suporte

                                                                5           Gerência



                               Vamos dar alguns exemplos para ilustrar. Tomando como base a relação Empregado
                      (vide Tabela 21) e a relação Departamento (vide Tabela 22), suponha as seguintes consultas
                      e como elas ficariam representadas em cálculo relacional de tupla.

                             »   Obtenha todos os empregados cujo salário seja maior que 3000 reais: { t |
                                 EMPREGADO(t) AND t.SALARIO > 3000 }.
                                 Analisando a expressão podemos lê-la da seguinte forma: considere uma tupla t,
                                 ela deve ser uma tupla da relação empregado, cujo atributo salário dessa tupla deve
                                 ser maior que 3000. EMPREGADO(t) é o mesmo que dizer que t ∈ EMPREGADO.
                                 A consulta acima resulta em uma relação que contém todas as tuplas t da relação
                                 EMPREGADO que satisfazem a condição (no caso, salário > 3000).
                               No CRT especificamos primeiro os atributos desejados. Se for usado apenas o t, sem
                      especificação de atributos, todos os atributos da tupla são recuperados. Logo, na consulta
                      acima, seriam recuperados os atributos CPF, Nome, Sexo, Salario e Cod_Depto (vide Tabela
                      21). Agora, suponha que gostaríamos de recuperar apenas os atributos CPF e Nome das
                      tuplas que atendessem a condição. Como faríamos?
                                             { t.CPF, t.Nome | EMPREGADO(t) AND t.SALARIO > 3000 }.
                                 Observe que os atributos desejados são especificados do lado esquerdo da barra
                      (|).

                             »   Vamos a outro exemplo. Obtenha o nome e o salário dos empregados que
                                 trabalham para o departamento de Suporte.
                                    {t.NOME, t.SALARIO | EMPREGADO(t) AND (Ǝ d) (DEPARTAMENTO (d) AND


18
Banco de Dados



                 d.DESCRICAO = ‘Suporte’ AND d.COD = t.COD_DEPTO)}

        Analisando a expressão podemos lê-la da seguinte forma: obtenha o nome e o
        salário de todas as tuplas da relação empregado e exista um departamento d, cuja
        descrição seja ‘Suporte’ e o código desse departamento de nome ‘Suporte’ seja
        igual ao código do departamento da tupla sendo avaliada na relação Empregado.
       Vamos exemplificar agora o quanto o CRT pode ser representado facilmente por
uma expressão da álgebra relacional, levando em conta a relação Empregado (Tabela 21).

    »   Recupere o CPF e o nome de todos os empregados.
                           Em CRT: { t.CPF, t.Nome | EMPREGADO(t) }
                       Em Álgebra Relacional: π CPF, Nome (Empregado)

    »   Recupere todos os empregados do sexo masculino
                        Em CRT: { t | EMPREGADO(t) AND t.SEXO = ‘M’ }
                        Em Álgebra Relacional: δ Sexo = ‘M’ (Empregado)


Cálculo Relacional de Domínio (CRD)

         Trata-se de uma segunda forma de cálculo relacional, equivalente ao CRT. Essa
forma usa variáveis de domínio que tomam valores do domínio de um atributo, em vez de
valores da tupla inteira. Uma expressão neste cálculo tem a forma:
                         { <x1, x2, ... , xn > | Predicado (x1, x2, ..., xn) }
        onde x1, x2, ..., xn representam variáveis de domínio e Predicado representa uma
fórmula composta de átomos, como no cálculo relacional de tupla.
         A diferença básica entre CRT e CRD é que neste último as variáveis estendem-se
sobre valores únicos de domínios de atributos. Para formar uma relação de grau n para
um resultado de consulta, faz-se necessário criar n variáveis de domínio, uma para cada
atributo. Como em CRT, as fórmulas são avaliadas em valores verdade para um conjunto
específico de valores.
       A seguir, para fins de comparação e para ilustrar o CRD, seguem em CRD os mesmos
exemplos de consultas já escritos em CRT.

                               Tabela 23 - Relação Empregado


           a               b                  c                  d                   e

          CPF            Nome               Sexo              Salario            Cod_Depto

         1234         Ana Gomes               F                1500                  2

         2345         Pedro Nunes            M                 1000                  4

         3765          Maria Lima             F                2000                  2

         4987          Igor Matos            M                 3500                  5

         9876          Laís Ramos             F                3000                  4




                                                                                                              19
Banco de Dados



                                                       Tabela 24 - Relação Departamento

                                                             m                 n

                                                            Cod            Descricao

                                                             2              Vendas

                                                             4             Suporte

                                                             5             Gerência



                                    Tomando como base as tabelas 23 e 24 que representam, respectivamente, as
                           relações Empregado e Departamento (note que cada coluna dessas relações recebeu uma
                           letra para referenciar o domíno do atributo representado por cada coluna), podemos
         Comentário        realizar as seguintes consultas:

                               »   Obtenha todos os empregados cujo salário seja maior que 3000 reais: { t |
1
 Observe que as letras             EMPREGADO(t) AND t.SALARIO > 3000 }.
à esquerda da barra
(|) representam o                               { abcde1 | (Ǝ d2) EMPREGADO(abcde) AND d > 3000 }
domíno dos atributos
desejados (vide                »   Se na consulta anterior quiséssemos recuperar apenas o CPF e o nome dos
Tabela 23), como                   empregados, teríamos:
conseqüência, eles
referenciam as colunas                             { ab | (Ǝ d) EMPREGADO(abcde) AND d > 3000 }
desejadas.
                               »   Obtenha o nome e o salário dos empregados que trabalham para o departamento
                                   de Suporte.
         Comentário                  { bd | (Ǝ e) (Ǝ m)(Ǝ n) (EMPREGADO(abcde) AND DEPARTAMENTO(mn) AND
                                                           n = ‘Suporte’ AND m = e) }
2
 Somente é
necessário quantificar
as variáveis que           Considerações Finais
participam de uma
condição.
                                   A álgebra relacional é uma forma de cálculo sobre conjuntos ou relações. Uma
Ou seja, só usamos o       aplicação prática da álgebra relacional é na execução de consultas a bancos de dados
operador existencial Ǝ
na variável de domínio
                           relacionais. A álgebra relacional recebia pouca atenção até a publicação do modelo
d, porque apenas essa      relacional de dados de E.F Codd, em 1970. Codd propôs tal álgebra como uma base para
variável é usada na        linguagens de consulta em banco de dados. As operações da álgebra relacional podem ser
condição expressa no
                           resumidas de forma ilustrada na Figura 2.
predicado (d > 3000)




    20
Banco de Dados




                     Figura 2 - Resumo das Operações da Álgebra Relacional



         O Cálculo Relacional é uma linguagem formal, não-procedural, para consulta a
relações. A álgebra relacional tem poder de expressão essencialmente equivalente ao do
cálculo relacional, esse resultado é conhecido como teorema de Codd. Em geral, a álgebra
relacional é bem mais utilizada do que o cálculo relacional.


             Conheça Mais


        Para obter mais informações sobre o assunto estudado nesse capítulo você pode
consultar qualquer um dos livros listados a seguir. Todos eles possuem capítulos dedicados a
Álgebra Relacional e o Cálculo Relacional (de Tupla e de Domínio):

        KORTH, Henry F; SILBERSCHATZ, Abraham; SUDARSHAN, S. Sistema de banco de
        dados. Traduzido por Daniel Vieira. Rio de Janeiro: Elsevier;Campus, 2006.
        ELMASRI, Ramez; NAVATHE, Shamkant B. Sistemas de banco de dados. 4a. ed. São
        Paulo: Pearson Education do Brasil, 2005.
        DATE, C. J. Introdução a sistemas de bancos de dados. Rio de Janeiro: Campus,
        2000.
        ALVES, W.P. Fundamentos de Bancos de Dados. Editora Érica, 2004.




                                                                                                           21
Banco de Dados




                                     Você Sabia?


                        O Cálculo relacional dependendo do autor pode ter sua notação ligeiramente modificada. A
                        notação que fizemos uso nesse capítulo é a notação de Navathe (ELMASRI e NAVATHE, 2005).
                        Porém, existe também a notação de Korth (KORTH, SILBERSCHATZ e SUDARSHAN, 2006). Para
                        ilustrar as diferenças, vamos repetir a mesma consulta anteriormente realizada:
                        » Obtenha o nome e o salário dos empregados que trabalham para o departamento de
                        Suporte. Na notação de Navathe, que já utilizamos, ficaria:
                          {bd | (Ǝ e) (Ǝ m) (Ǝ n) (EMPREGADO(abcde) AND DEPARTAMENTO(mn) AND n = ‘Suporte’
                                                               AND m = e)}
                                    Já na notação de Korth, a mesma sentença ficaria da seguinte forma:
                                {<b, d> | <b, d> � empregado ∧ departamento(mn) ∧ n = “Suporte” ∧ m = e)}
                        Veja que o formato geral da expressão muda um pouco, mas o que muda mesmo é a simbologia
                        dos operadores lógicos: AND (∧), OR (∨), NOT (¬), a forma de expressar as variáveis de tupla
                        (observe o começo das duas expressões e veja a diferença) e ao invés de aspas simples em
                        constantes, usa-se aspas duplas.




                                   Aprenda Praticando


                              Como a álgebra relacional é mais utilizada, vamos avaliar alguns exercícios
                      resolvidos para que, logo depois, você possa resolver os seus exercícios sozinho.

                          1) Tome como base os esquemas das tabelas 25 e 26 e mostre como ficariam as
                             consultas, a seguir, em álgebra relacional.

                                                         Tabela 25 - Relação Devedor

                                             Nome             Num_Emprestimo             Sexo

                                           Ana Gomes                 01                   F

                                          Pedro Nunes                03                   M

                                           Maria Lima                05                   F



                                                        Tabela 26 - Relação Empréstimo

                                            Agencia           Num_Emprestimo             Valor

                                              3456                   01                  1500

                                              2123                   03                  5000

                                              2123                   05                  2500



                              Em geral, na realização de consultas as operações mais utilizadas são a projeção
                      (representada pelo símbolo π) que seleciona quais colunas (atributos) se deseja na relação
                      resultante e a seleção (representada pelo símbolo δ) que seleciona quais tuplas da relação
                      atendem a uma determinada condição. Se a projeção não for utilizada, todos os atributos da
                      relação original farão parte da relação resultante. Quando necessitamos de dados que estão


22
Banco de Dados



em duas relações diferentes, devemos utilizar a operação de junção |x|.

    »   Apresentar os dados de todos os devedores do sexo feminino. Cada vez que
        desejamos selecionar tuplas da relação de acordo com uma determinada condição,
        usamos a seleção.
        δ sexo = ‘F’ (devedor)

    »   Apresentar o nome e o número do emprestimo de todos os devedores do sexo
        masculino. Como é especificado o que deve ser mostrado – nome e número
        empréstimo – é necessário usar a projeção antes da seleção)
        π nome,num_emprestimo (δ sexo = ‘M’ (devedor))

    »   Mostrar o nome das pessoas que possuem empréstimo acima de três mil reais
        na agência 2123. Como o nome da pessoa está na relação devedor e o valor do
        empréstimo na relação empréstimo, é necessário fazer a junção dessas duas
        relações, para ser possível selecionar o que foi pedido. A junção é feita equiparando
        os atributos que as relações têm em comum.
        π nome (δ valor > 3000 and agencia = 2123 (Devedor |x| devedor.num_emprestimo
        = empréstimo.num_emprestimo Emprestimo))
    »   Apresentar as pessoas cujo número do empréstimo é igual a 5 e o número da
        agência é igual a 2123 ou que o número do empréstimo seja igual a 3 e o valor do
        empréstimo maior do que 1000 reais. É um caso de seleção onde é necessário usar
        operadores lógicos para montar as condições.
        δ (num_emprestimo = 5 and agencia = 2123) or (num_emprestimo = 3 and valor >
        1000) (Emprestimo))




               Atividades e Orientações de Estudo


        Agora vamos exercitar o que foi estudado neste capítulo. Assim sendo, faça as
atividades sugeridas a seguir. Lembre que exercitar vai lhe ajudar a fixar melhor o conteúdo
estudado. Mãos à obra!




               Atividades Práticas                                                                    Dica

                                                                                                3
                                                                                                  No Word, a
                                                                                                simbologia usada na
        Responda as questões a seguir em um documento de texto (doc)3 e poste as
                                                                                                álgebra relacional
respostas no ambiente virtual, no local indicado. Esse trabalho deve ser feito em DUPLA.        pode ser inserida no
                                                                                                documento através
         Especifique usando a álgebra relacional as consultas a seguir, tomando como base       do seguinte caminho:
as relações cujos esquemas estão representados a seguir.                                        Inserir -> Símbolo,
                                                                                                fazendo uso da fonte
                                                                                                Symbol (daí você
    EMPREGADO                                                                                   escolhe na tabela
                                                                                                que é apresentada o
    CPF (PK)      Nome       DtNasc      Endereco      Sexo     Salario    Cod_Dep (FK)         símbolo apropriado)




                                                                                                                 23
Banco de Dados




                           DEPARTAMENTO

                               Cod_Dep (PK)          Descricao          CPF_Gerente (FK)      Dt_Inicio_Gerencia



                                        PROJETO

                                          Cod_Proj (PK)          Nome_Proj          Cod_Dep (FK)



                                          ALOCACAO

                                              CPF (PK)           Cod_Proj (PK)        Horas


                               DEPENDENTE

                                   CPF (PK)        Nome_Depen                Sexo              Parentesco



                          a) Recuperar os nomes de empregados do departamento 6 que trabalham mais que
                             20 horas no projeto chamado ‘Star Project’.
                          b) Listar os nomes dos empregados que tenham um dependente com o mesmo nome
                             deles.
                          c) Recuperar os códigos e os nomes dos projetos do departamento de nome
                             “Pesquisa”.
                          d) Listar o nome do projeto, do departamento ao qual ele pertence e o nome dos
                             empregados deles.
                          e) Recuperar os nomes dos empregados que trabalham em todos os projetos.
                          f) Recuperar os nomes dos empregados que não trabalham em quaisquer projetos.
                          h) Recuperar o nome e o sexo de todos os dependentes do empregado de CPF de
                             número 12345.
                          i)   Recuperar o nome e a quantidade de horas trabalhadas por cada empregado em
                               cada projeto do qual faz parte.




                                    Vamos Revisar?


                               Você estudou, neste capítulo, formas de acessar e manipular os dados armazenados
                      em um banco de dados, fazendo uso de linguagens formais tais como a álgebra relacional e
                      o cálculo relacional (tanto de tupla, quanto de domíno). A maneira de raciocionar fazendo
                      uso dessas linguagens irá facilitar a compreensão do uso da linguagem comercial a ser
                      estudada nos capítulos seguintes: a SQL. Até lá!




24
Banco de Dados




         Capítulo 11


    O que vamos estudar neste capítulo?

    Neste capítulo, vamos estudar os seguintes temas:

»   A Linguagem SQL.
»   Subdivisões da SQL.
»   Como criar um Banco de Dados usando SQL.

    Metas

    Após o estudo deste capítulo, esperamos que você:

»   Conheça a linguagem SQL.
»   Conheça as subdivisões da linguagem.
»   Consiga criar e manter a estrutura de um banco de dados usando SQL.
»   Consiga criar índices para um banco de dados.




                                                                                           25
Banco de Dados




                      Capítulo 11 – Criando e Mantendo um
                      Banco de Dados


                                   Vamos conversar sobre o assunto?


                               “No capítulo anterior vimos linguagens formais para consulta a banco de dados
                      relacionais. Porém, na área comercial, essas linguagens não são muito utilizadas, ao invés
                      delas, são usadas linguagens comerciais para criação, manutenção e consulta a banco de
                      dados. Entre essas linguagens, a SQL (Structured Query Language) é a mais utilizada. Por
                      isso mesmo, a interface SQL é implementada em todos os sistemas de bancos de dados
                      relacionais existentes. É justamente sobre a SQL que estudaremos nesse capítulo e no
                      capítulo seguinte.”



                              Neste capítulo, começaremos estudando a linguagem comercial SQL, com o
                      objetivo de ter um conhecimento geral sobre a linguagem e criar e manter esquemas de
                      bancos de dados relacionais. Adicionalmente, também apresentaremos como criar índices
                      para esses esquemas. Vamos lá?



                      A SQL
                              SQL ou Structured Query Language (Linguagem de Consulta Estruturada) é uma
                      linguagem de consulta declarativa, não-procedural, fundamentada na álgebra e no cálculo
                      relacional de tupla. Apesar de ser chamada linguagem de consulta (Query), ela não é apenas
                      de consulta, ela inclui comandos para definição, manutenção e consulta em bancos de dados
                      relacionais. Além disso, ela define mecanismos para criação de visões, especificações de
                      segurança, autorizações, definições de restrições e controle de transações. Adicionalmente,
                      ela possui regras para embutir os comandos SQL em linguagens de programação genéricas
                      como Java, PHP, C# ou C/C++.
                               A SQL foi desenvolvida pelo laboratório da IBM, nos anos 70, como parte do
                      sistema System R (o primeiro SGBD relacional). Ela foi, inicialmente, chamada de SEQUEL
                      (Structured English Query Language), mas teve seu nome alterado para SQL por razões
                      Jurídicas. Em 1986, em um esforço conjunto da ANSI (American Nacional Standars Institute)
                      e da ISO (International Standards Organization) criou-se a primeira versão padrão da SQL, a
                      SQL-86 (SQL1), substituída posteriormente pela SQL-92 (SQL2) e depois pela SQL-99 (SQL3).
                      O atual projeto da SQL é o padrão 200n.
                              A SQL padrão é suportada por todos os SGBDs relacionais comerciais. Porém,
                      mesmo padronizada, existem variações, ou seja, cada fornecedor pode incluir comandos
                      próprios na SQL utilizada pelo seu SGBD. Em outras palavras, cada implementação do SQL
                      de cada fornecedor possui os comandos do SQL padrão (também chamado SQL ANSI)
                      e, também, algumas adaptações para resolver certas particularidades. Para conhecer
                      o conjunto completo de comandos SQL de um determinado fornecedor (ex: Oracle),
                      recomendamos a leitura do manual do fabricante. A vantagem de fazer uso apenas do SQL
                      padrão é não ter problemas com migração de SGBD para SGBD. Por exemplo, se você fazia
                      uso de SQL Server e, depois, migrou para o uso do Oracle, se fez uso apenas do SQL padrão,


26
Banco de Dados



não haverá problemas ou necessidade de adaptações.
        O SQL usado nesta disciplina será o baseado no Padrão ANSI e nenhuma
característica específica de SGBD será abordada. Dessa forma, para praticar os comandos de
SQL aqui ensinados, você poderá fazer uso de qualquer SGBD comercial.


Subdivisão da SQL

         A SQL é composta por grupos de instruções que são utilizadas no processo de
administração e controle de bancos de dados. Esses grupos serão descritos a seguir (vide
Figura 3).

    »   DDL (Data Definition Language - Linguagem de Definição de Dados) - as instruções
        do tipo DDL permitem efetuar a criação das estruturas (esquemas) de tabelas
        (relações) onde os dados serão armazenados, índices e os bancos de dados como
        um todo. Permitem também efetuar alterações nas estruturas criadas, bem
        como remover estruturas existentes. Neste grupo estão as instruções: CREATE
        TABLE, DROP TABLE, ALTER TABLE, CREATE INDEX e DROP INDEX. O resultado da
        compilação dos parâmetros/comandos DDL geram os dicionários de dados (arquivo
        de metadados). Adicionalmente, a DDL inclui comandos para definição de visões e
        para especificação de direitos de acesso às relações/visões.




                                Figura 3 - Subdivisões da SQL



    »   DML (Data Manipulation Language - Linguagem de Manipulação de Dados) - as
        instruções do tipo DML permitem efetuar a manipulação dos dados que estejam
        armazenados nas tabelas de um determinado banco de dados. Desta forma é
        possível cadastrar, alterar e excluir registros (tuplas) existentes. Neste grupo
        encontram-se as instruções: INSERT, SELECT, UPDATE e DELETE. De todos os
        comandos existentes, o comando SELECT é o mais importante e utilizado, pois é
        com ele que se obtém a extração de informações a partir do banco de dados.
    »   DCL (Data Control Language - Linguagem de Controle de Dados) – as instruções
        do tipo DCL permitem controlar o acesso e os privilégios dos usuários às relações e
        visões, protegendo os dados de manipulações não autorizadas;
    »   TML (Transactions Manipulation Language - Linguagem de Manipulação de
        Transações) – as intruções do tipo TML especificam as transações através de
        comandos de iniciação e finalização das mesmas, garantindo o compartilhamento e
        a integridade dos dados.

                                                                                                          27
Banco de Dados



                                   Nesta disciplina apenas abordaremos a DDL e a DML.


                           Tipos de Dados

                                    Antes de entrar nos comandos propiamente ditos da SQL, vale a pena comentar
                           sobre tipos de dados. Para definir os atributos das tabelas, precisamos definir os domínios
                           de cada um deles. Isso é feito através da especificação do tipo do dado. Nesse ponto é
                           importante ressaltar que cada SGBD tem um conjunto próprio de tipos de dados. Mas,
                           podemos dizer que, genericamente, vamos encontrar na maioria dos SGBDs tipos como:

                               »   Char(X): Para dados caracteres, onde X é o tamanho máximo permitido de caracteres
                                   e esse tamanho é fixo. Ou seja, se for especificado, por exemplo, um tamanho de
                                   50 caracteres, sempre será ocupado na memória 50 posições, independente da
                                   palavra sendo armazenada.
                               »   Varchar(X): Idem o anterior, mas o tamanho armazenado é variável. Se ocupará
                                   memória apenas para o que for digitado, tendo o X apenas como referência para
                                   tamanho máximo.
                               »   Integer : Para dados numéricos inteiros positivos ou negativos
                               »   Decimal(X,Y): Pada dados numéricos decimais, onde X é o tamanho máximo
                                   permitido da parte inteira e Y é o tamanho máximo da parte fracionária
                               »   Date: Para datas. Seu formato depende do SGBD relacional. E cada SGBD pode ter
                                   um tipo diferenciado para armazenamento de datas.
                               »   Logical: Para os valores lógicos TRUE ou FALSE.


                           Comandos SQL para Definição de Dados (DDL)

                                   A DDL serve para expressar a especificação do esquema do BD. O resultado da
                           compilação dos parâmetros DDLs é um conjunto de tabelas que são armazenadas em um
                           arquivo especial chamado dicionário de dados4.
         Comentário               Os comandos SQL para definição de dados são: CREATE, DROP e ALTER. Vamos
                           dar uma olhada em cada um desses comandos, a seguir e, para exemplificar o uso deles,
4
 Relembrando: o            vamos tomar a modelagem da Figura 4 como base. Nela temos especificado o MER para
Dicionário de Dados        uma Editora.
é um arquivo de
metadados (dados a
respeito de dados)
no SGBD. Ou seja, ele
contém a semântica
dos dados do BD (o
que eles significam).




                                                       Figura 4 - Modelo base para exemplos



                                   O MR para este diagrama é o seguinte (baseado nas regras de conversão do MER
                           para o MR, anteriormente vistas):

    28
Banco de Dados



          AUTOR (CodAutor (PK), Nome, Nascimento)
          LIVRO (TitLivro (PK), CodAutor (FK), CodEditora (FK), Valor,Publicacao, Volume,
          Idioma)
          EDITORA (CodEditora (PK), Razao, Endereco, Cidade)


DDL - Criando Tabelas

        O comando CREATE TABLE especifica uma nova tabela (relação), dando o seu nome
e especificando as colunas (atributos), cada uma com seu nome, tipo e restrições iniciais.
       A forma geral do comando é: create table nome_tabela. Por exemplo: create table
Empregado. Porém, a sintaxe completa do comando é bem mais detalhada:

    CREATE TABLE Nome_Tabela (
           Nome_Atributo1 Tipo [(Tamanho)] [NOT NULL] [DEFAULT valor] [...],
           [,Nome_Atributo2 Tipo [(Tamanho)] [NOT NULL] [DEFAULT valor] [...],
           [PRIMARY KEY (Primária1[, Primária2 [, ...]])]
           [UNIQUE (Candidata1[, Candidata2[, ...]])]
           [FOREIGN KEY (Estrangeira1[, Estrangeira2 [, ...]]) REFERENCES
                  TabelaExterna [(AtributoExterno1 [, AtributoExterno2 [, ...]])]
           [CHECK (condição)]
      )
       Onde : ( ) Indica parte da sintaxe do comando e [ ] Indica opcionalidade do comando.
Vamos explicar agora cada parte do comando completo.
          Nome_Atributo - nome do atributo que está sendo definido
          Tipo: domínio do atributo ou seja o tipo do dado do atributo.
        Tamanho : alguns tipos de dados necessitam de especificação do tamanho do dado.
Por exemplo, o tipo CHAR
          NOT NULL: expressa que o atributo não pode receber valores nulos
       DEFAULT valor: indica um valor a ser atribuído ao atributo caso não seja
determinado um valor durante a inserção
        PRIMARY KEY (Primária1, Primária2, ...) – serve para especificar a(s) chave(s)
primária(s) da tabela.
         UNIQUE: indica que o atributo tem valor único na tabela. Qualquer tentativa de se
introduzir uma linha na tabela contendo um valor igual ao do atributo será rejeitada. Serve
para indicar chaves secundárias (chaves candidatas). Em Candidata1, Candidata2 devem ser
especificados os atributos que terão esse valor único na tabela.
         FOREIGN KEY (Estrangeira1[, Estrangeira2 [, ...]]) REFERENCES TabelaExterna
[(AtributoExterno1 [, AtributoExterno2 [, ...]]) – serve para especificar os atributos que
são chaves estrangeiras na relação, já relacionando-os às tabelas onde eles são chave
primária (Integridade Referencial). Em Estrangeira1, Estrangeira2, ... especificam-se os
atributos que são chave estrangeira. Em TabelaExterna se especifica o nome da tabela onde
o atributo é chave primária e, por fim, o nome desse atributo nessa TabelaExterna (porque
os atributos na relação e na tabela externa original podem ter nomes diferentes). Se os
atributos da relação e da tabela externa tiverem o mesmo nome, esses AtributoExterno1,


                                                                                                          29
Banco de Dados



                           AtributoExterno2, ... não precisam ser especificados.
                                   CHECK (condição) – aqui são especificadas condições que devem ser checadas na
                           inserção de dados na tabela (validações).
                                    Vamos agora dar exemplos de uso dessa sintaxe tomando o nosso modelo base
         Comentário
                           (Figura 4). Primeiro, vamos criar as tabelas Autor e Editora que são tabelas simples (sem
                           chaves estrangeiras ou checagens a serem feitas):
5
 Como tipo de
dados estamos                  CREATE TABLE AUTOR(
deduzindo os tipos
possíveis baseados na              CodAutor INTEGER NOT NULL,
explicação da seção
anterior sobre tipos de            Nome CHAR(50)5 NOT NULL,
dados.
                                   Nascimento DATE NOT NULL,
                                   PRIMARY KEY (CodAutor),
         Comentário
                                   UNIQUE (Nome) );

6
  Valor será do tipo           CREATE TABLE EDITORA(
DECIMAL, ou seja,
                                   CodEditora INTEGER NOT NULL,
um valor de ponto
flutuante, tendo 3                 Razao CHAR(50),
casas na parte inteira e
duas casas decimais.               Endereco CHAR(50),
                                   Cidade CHAR(30)
         Comentário                PRIMARY KEY(CodEditora ));
                                   Agora, podemos partir para a definição da tabela Livro que faz uso das duas tabelas
7
  Aqui está sendo
especificado o valor
                           anteriormente definidas:
default para o atributo
                               CREATE TABLE LIVRO(
idioma. Se esse campo
não for informado, o               Titulo CHAR(50) NOT NULL,
valor “Português” será
assumido.                          CodAutor INTEGER NOT NULL,
                                   CodEditora INTEGER NOT NULL,
         Comentário                Valor DECIMAL(3.2)6,
                                   Publicacao DATE,
8
 Veja que está
sendo especificada                 Volume INTEGER,
uma chave primária
composta, uma vez                  Idioma CHAR (15) DEFAULT = ‘Português’ 7,
que dois atributos
fazem parte da                     PRIMARY KEY (Titulo, CodAutor8),
especificação.
                                   FOREIGN KEY (CodAutor) REFERENCES AUTOR9,
                                   FOREIGN KEY (CodEditora) REFERENCES EDITORA,
         Comentário
                                   CHECK Valor > 10.010);
9
 Veja que estamos                  Só pra ilustrar melhor o uso da cláusula CHECK vamos dar outro exemplo de criação
espeficifando que          de tabela, fora do exemplo do modelo base (Figura 4). Suponha que desejamos criar a tabela
CodEditora é chave         estudante que contenha os atributos matricula, nome e nível.
estrangeira na tabela
sendo definida e é um              CREATE TABLE estudante (
atributo pertencente
a tabela Autor (sendo                       matricula char(10) NOT NULL,
chave primária nessa
outra tabela – tabela                       nome char(15) NOT NULL,
externa)
                                            nivel char(15) NOT NULL,


    30
Banco de Dados



                  PRIMARY KEY (matricula),
                  CHECK (nivel IN (“Bacharelado”, ”Mestrado”, ”Doutorado”)))11

 O SQL-89 obrigava os atributos da chave primária a serem declarados como NOT NULL e UNIQUE.               Comentário
 SQL-92 e posteriores já assumem essas condições, assim, sua declaração é redundante.
                                                                                                    10
                                                                                                       Aqui é especificado
        Uma cláusula FOREIGN KEY pode incluir regras de remoção / atualização:                      que os livros que
                                                                                                    forem criados devem
    FOREIGN KEY (coluna) REFERENCES tabela                                                          ter seu valor maior
                                                                                                    que 10. Essa é uma
        [ON DELETE {RESTRICT | CASCADE | SET NULL | SET DEFAULT}]                                   validação que será
                                                                                                    feita a cada inserção /
        [ON UPDATE {RESTRICT | CASCADE | SET NULL | SET DEFAULT}]
                                                                                                    alteração de dados na
        Suponha que T2 tem uma chave estrangeira para T1, ou seja, tem um atributo que              tabela.
é chave primária em T1. Vejamos as cláusulas ON DELETE e ON UPDATE

    ON DELETE                                                                                              Comentário

        RESTRICT: (default) significa que uma tentativa de se remover uma linha de T1               11
                                                                                                      Veja que aqui
        falhará se alguma linha em T2 combinar com a chave da tupla de T1 que está sendo            estamos especificando
        deletada.                                                                                   os valores possíveis
                                                                                                    para o atributo nível.
        CASCADE: a remoção de uma linha de T1 implica em remoção de todas as linhas de
        T2 que combinam com a chave da tupla de T1 sendo deletada.
                                                                                                           Comentário
        SET NULL: remoção de T1 implica em colocar NULL em todos os atributos de T2 que
        sejam chave estrangeira e estejam relacionados com a tupla sendo deletada em T1.
                                                                                                    12
                                                                                                       O valor default para
        SET DEFAULT: remoção de linha em T1 implica em colocar valores DEFAULT nos                  o departamento é 1.
        atributos da chave estrangeira de cada linha de T2 que combina
    ON UPDATE                                                                                              Comentário
        RESTRICT: (default) a atualização de um atributo de T1 falha se existem linhas em
        T2 combinando com a tupla sendo modificada.                                                  A chave primária é a
                                                                                                    13

                                                                                                    matrícula.
        CASCADE: a atualização de atributo em T1 implica que linhas que combinam em T2
        também serão atualizadas
                                                                                                           Comentário
        SET NULL: a atualização de T1 implica que valores da chave estrangeira em T2, nas
        linhas que combinam com a tupla de T1 sendo atualizada, são postos para NULL.               14
                                                                                                       Veja que aqui o
                                                                                                    atributo da tabela
        SET DEFAULT: a atualização de T1 implica que valores da chave estrangeira de T2             sendo definida tem
        nas linhas que combinam terão valores default aplicados.                                    nome diferente do
                                                                                                    atributo na sua tabela
        Vamos dar um exemplo de uso dessas cláusulas:                                               externa de origem.
                                                                                                    Por isso, o nome do
    CREATE TABLE empregado (
                                                                                                    atributo na tabela
         matricula char(10) NOT NULL,                                                               externa precisa ser
                                                                                                    especificado.
         nome char(15) NOT NULL,
         cod_depto INT NOT NULL DEFAULT 112,                                                               Comentário
         PRIMARY KEY(matricula) ,    13

                                                                                                    15
                                                                                                       Aqui é especificado
         FOREIGN KEY(supervisor) REFERENCES Empregado(matricula)14
                                                                                                    que, se a tupla que
                 ON DELETE SET NULL15                                                               contém a matrícula
                                                                                                    sendo utilizada nesta
                 ON UPDATE CASCADE16,                                                               tabela for deletada, o
                                                                                                    atributo SUPERVISOR
         FOREIGN KEY (cod_depto) REFERENCES Departamento(codigo)                                    deverá receber o valor
                                                                                                    NULL.
                 ON DELETE SET DEFAULT17


                                                                                                                       31
Banco de Dados



                                            ON UPDATE CASCADE);


                           DDL - Alterando Tabelas

                                   O comando ALTER TABLE permite inserir/eliminar/modificar colunas nas tabelas já
                           existentes, modificando a estrutura das mesmas. A sintaxe básica desse comando é:

                               ALTER TABLE Tabela {
                                    ADD (NomeNovoAtributo NovoTipo [BEFORE Nome_Atributo] [, ...] ) |
       Comentário
                                    DROP (Nome_Atributo [, ...] ) |
16
  Aqui é especifricado              MODIFY ( Nome_Atributo NovoTipo [ NOT NULL ] [DEFAULT, ... ] )
que, se a matrícula for
atualizada na tabela           }
de origem, todas as               Onde: | Indica escolha de várias opções e { } Indica obrigatoriedade de escolha de
tuplas da tabela onde
o atributo é chave         uma opção entre as várias. Agora, vamos explicar cada parte do comando.
estrangeira devem ser
atualizadas também.                Adicionando um novo atributo (nova coluna) na Tabela

                                   ADD (NomeNovoAtributo NovoTipo [BEFORE Nome_Atributo] [, ...] ) |
                                   Usando o ADD é possível adicionar um novo atributo na Tabela. Dessa forma, o novo
       Comentário          atributo deve ser especificado (nome e tipo). É possível ainda dizer antes de qual atributo
                           se deseja que esse novo atributo seja inserido (BEFORE nome_atributo). Por exemplo, se
17
   Aqui é especificado     desejássemos adicionar o campo E-MAIL na tabela Autor, do nosso exemplo base (Figura 4),
que, se a tupla que        usaríamos:
contém o código do
departamento sendo                 ALTER TABLE AUTOR ADD EMAIL CHAR(40);
utilizado nesta tabela
for deletada, o atributo
cod_depto deverá
receber o valor default
especificado para este                    Observação
atributo. No caso, o
número 1.
                             Os novos atributos terão valores nulos em todas as linhas. Por isso, não se pode usar NOT NULL
                             juntamente com ADD (na definição do novo atributo), quando a tabela já contiver registros
                             (lembre, com o uso de ADD a nova coluna é carregada com NULL’s).


                                   Deletando um atributo (uma coluna) da Tabela

                                   DROP (Nome_Atributo [, ...] ) |
                                   Para usar a cláusula DROP é necessário apenas especificar o nome do atributo que
                           se deseja remover da tabela. Porém, atenção, a cláusula DROP não remove atributos da
                           chave primária. Por exemplo, se desejássemos eliminar o campo E-MAIL (anteriormente
                           adicionado) da tabela Autor, usaríamos:
                                   ALTER TABLE AUTOR DROP EMAIL;
                                   A cláusula DROP pode ser usada com algumas configurações adicionais:
                                   DROP Nome_Atributo [CASCADE | RESTRICT] onde:

                                   CASCADE: removeria o atributo de todos os lugares onde ele estivesse sendo usado
                                   (outras tabelas como chave estrangeira e em visões).
                                   RESTRICT: não permitiria a remoção do atributo se este estivesse sendo usado em
                                   uma visão ou como chave estrangeira em outra tabela.


 32
Banco de Dados



        Ex: ALTER TABLE AUTOR DROP EMAIL RESTRICT;

        Modificando um atributo (uma coluna) da Tabela
                                                                                                           Comentário
        MODIFY18 ( Nome_Atributo NovoTipo [ NOT NULL ] [, ... ] )
       Esta cláusula serve para modificar as informações de um atributo como, por
                                                                                                     18
                                                                                                       Em alguns SGBDs
                                                                                                     ao invés de MODIFY
exemplo, seu tamanho, sua nulidade, etc. Quando se altera o tipo de dados de uma coluna,
                                                                                                     é usada a cláusula
os dados são convertidos para o novo tipo. Por exemplo, se desejássemos modificar o                  ALTER.
campo E-MAIL na tabela Autor, diminuindo seu tamanho de 40 para 30, usaríamos:
        ALTER TABLE AUTOR MODIFY EMAIL CHAR(25);
        O detalhe é que, se se diminuir o tamanho de um atributo do tipo CHAR, os dados
existentes serão truncados, havendo assim, perda de informação.


DDL – Criando e Removendo Índices

         Índices são estruturas que permitem agilizar a busca e ordenação de dados em
tabelas. Para criar um índice em uma tabela existente usamos o comando CREATE INDEX. A
sintaxe completa desse comando é:

    CREATE [UNIQUE] INDEX Nome_Indice ON
             Nome_Tabela (Nome_Atributo1 [, Nome_Atributo2…])
         Neste comando devemos especificar se o índice deve ser único (UNIQUE), ou seja,
não deve permitir repetições (restrição de chaves) ou se será apenas um índice usado para
acelerar a busca entre as tuplas da tabela. Depois, devemos especificar o nome do índice
(Nome_Indice), a qual tabela ele vai pertencer (Nome_Tabela) e qual(ais) atributo(s) fará                  Comentário
(ão) parte do índice. Por exemplo, se desejássemos criar um índice para o campo código do
autor da tabela Autor, usaríamos:                                                                    19
                                                                                                       Foi usado o sufixo
                                                                                                     IDX para indicar que
        CREATE UNIQUE INDEX CodigoIDX ON Autor (CodAutor);
                                            19
                                                                                                     é um índice para o
        Agora, se desejássemos criar um índice para pesquisar pelo código do autor e pelo            código do autor.
código da editora ao mesmo tempo, usaríamos:
        CREATE INDEX AutorEditoraIDX ON Livro (CodAutor,CodEditora);
        O default é indexar em ordem ascendente, se quisermos uma ordem descendente                        Comentário
devemos adicionar palavra DESC depois do nome do atributo (no final do comando). Por
exemplo, suponha que se deseja pesquisar os autores pelo seu nascimento. Mas das datas               20
                                                                                                        Foi usado o sufixo
maiores (mais rescentes) para as menores (mais antigas). Assim, ficaríamos com:                      IDX para indicar que é
                                                                                                     um índice para o nome
        CREATE INDEX NascIDX20 ON Autor (Nascimento) DESC;                                           do autor.




              Observação


  Uma consulta que envolva atributos indexados é realizada com um tempo de execução melhor
  do que com atributos não-indexados. Agora, cuidado, você também não pode indexar TODOS os
  atributos de uma tabela. Você deverá usar o bom-senso para escolher quais aqueles que serão
  indexados de acordo com o problema sendo modelado e a freqüência de uso do atributo em
  consultas.


        Alguns SGBDs (por exemplo, o Oracle) criam, automaticamente, índices para as
chaves primárias das tabelas, fazendo uso da cláusula UNIQUE.


                                                                                                                       33
Banco de Dados



                                  Para eliminarmos um índice usamos o comando DROP INDEX, cuja sintaxe é:
       Comentário                 DROP INDEX Nome-Índice21
                                 Por exemplo, suponha que sejamos deletar o índice criado para a data de
21
  Deve ser usado o        nascimento do autor, ficaríamos com:
nome que foi dado ao
índice na criação do              DROP INDEX NascIDX
mesmo.


                          DDL - Excluindo Tabelas
       Comentário
                                  Para excluir uma tabela existente do SGBD é utilizado o comando DROP. Agora,
22
   Para criar tabelas     é necessário muito cuidado com este comando, pois ao deletar a tabela (esquema da
é usado o comando         mesma), automaticamente, TODOS os dados da tabela também serão excluídos. A sintaxe
CREATE TABLE.             desse comando é:

                                  DROP TABLE Nome_Tabela
                                  Exemplo:
       Comentário
                                  /* Excluir a tabela livro */
23
   Integer indica um              DROP TABLE LIVRO;
valor numérico inteiro
e como o código é a
chave, ele deve ser
NOT NULL.
                                       Conheça Mais


                                   Em geral, os livros de banco de dados trazem um ou mais capítulo sobre SQL. Entre
                          esses livros temos:
       Comentário
                                  SILBERSCHATZ, Abraham; KORTH, Henry F; SUDARSHAN, S. Sistema de banco de
                                  dados. Traduzido por Daniel Vieira. Rio de Janeiro: Elsevier;Campus, 2006.
24
   A descrição deve ser
um atributo do tipo               ELMASRI, Ramez; NAVATHE, Shamkant B. Sistemas de banco de dados. 4a. ed. São
caractere. Usando o
                                  Paulo: Pearson Education do Brasil, 2005.
bom-senso você define
o tamanho do campo.               DATE, C. J. Introdução a sistemas de bancos de dados. Rio de Janeiro: Campus,
Optei pela descrição
ser também not null.
                                  2000.
                                  ALVES, W.P. Fundamentos de Bancos de Dados. Editora Érica, 2004.
                                  Além destes, há livros específicos sobre SQL, independente de SGBD, tais como:
       Comentário
                                  BEIGHLEY, Lynn. Use a Cabeça SQL. Starlin Alta Consult, 1ª Edição, 2008
25
   O preço é um valor             KLINE, Daniel; KLINE, Kelvin E. Sql - O Guia Essencial - Manual de Referência
decimal . Optei por ele           Profissional. Alta Books, 2010.
poder assumir o valor
NULL (suponha que no              SHELDON, Robert; OPPEL, Andy. SQL – Um Guia para Iniciantes. Editora Ciência
momento do cadastro               Moderna, 3ª Edição, 2009
você ainda não saiba
por quanrto vai vender            DAMAS, Luís. Sql - Structured Query Language. Editora LTC, 6ª edição, 2007.
o produto.




 34
Banco de Dados




             Você Sabia?


Além da SQL outra linguage comercial para manipulação de SGBDs é a QBE (Query-by-Example).
A versão experimental da linguagem foi descrita formalmente (publicada) por Moshe Zloof
em 1977. A versão comercial foi descrita em 1978 pela IBM e usada mais tarde na Query
Management Facility (QMF). A QBE tem por base o cálculo relacional de domínio e possui sintaxe
bidimensional: as consultas parecem tabelas. Nesta linguagem as consultas são expressas “por
exemplo”. Em vez de determinar um procedimento para obtenção da resposta desejada, o
usuário dá um exemplo do que é desejado. A partir daí, o sistema generaliza o exemplo para o
                                                                                                             Comentário
processamento da resposta da consulta.
                                                                                                      26
                                                                                                         Você não pode
                                                                                                      deixar para especificar
                                                                                                      a quantidade de itens
           Aprenda Praticando                                                                         depois. Por isso, NOT
                                                                                                      NULL.


      Utilize SQL para fazer o que se pede, a partir do modelo relacional a seguir.

 »    Produto (cod_prod (PK), descricao, preco)                                                              Comentário
 »    Item_Venda (cod_venda (PK), cod_prod(PK), qntde)
                                                                                                      27
                                                                                                         Veja que está
 »    Venda (cod_venda (PK), nome_cliente)                                                            sendo especificada
                                                                                                      uma chave primária
 1) Crie as tabelas acima usando o comando, sabendo que os códigos devem ser                          composta, uma vez
    valores núméricos, preco deve ser um valor de ponto flutuante e qntde (quantidade                 que dois atributos
                                                                                                      fazem parte da
    comprada do produto) deve ser um valor inteiro, obrigatoriamente, maior que zero
                                                                                                      especificação.
    (afinal, ninguém compra zero produto!).
      Devemos começar a criação pelas tabelas mais simples (sem chave estrangeira).
      Dessa forma, vamos criar primeiro a tabela PRODUTO e, depois, a tabela VENDA.                          Comentário
 CREATE TABLE22 PRODUTO(
                                                                                                      28
                                                                                                         Veja que estamos
      cod_prod integer23 NOT NULL,                                                                    espeficifando que
                                                                                                      cod_prod é chave
      descricao CHAR(45) NOT NULL24,                                                                  estrangeira na tabela
                                                                                                      e é um atributo
      preco DECIMAL25(5,2),                                                                           pertencente a tabela
      PRIMARY KEY (cod_prod) )                                                                        Produto.

      Seguindo o mesmo raciocínio da tabela anterior, criaremos, agora, a tabela VENDA.

 CREATE TABLE VENDA(
      cod_venda integer NOT NULL,
      nome_cliente CHAR(40) NOT NULL,
      PRIMARY KEY (cod_venda) )
 CREATE TABLE ITEM_VENDA(
      cod_prod INTEGER NOT NULL,
      cod_venda INTEGER NOT NULL,
      qntde INTEGER NOT NULL26,
      PRIMARY KEY (cod_prod, cod_venda)27,
      FOREIGN KEY (cod_prod) REFERENCES Produto28,
      FOREIGN KEY (cod_venda) REFERENCES Venda,


                                                                                                                         35
Banco de Dados



                                   CHECK qntde > 0)29;
                              2) Altere a Tabela VENDA para incluir o atributo Dt_Venda e, depois, para mudar o
       Comentário                tamanho do atributo nome para 50 caracteres.

29
   Aqui é especificado         ALTER TABLE VENDA {                       ALTER TABLE VENDA {
que a quantidade de                 ADD Dt_Venda DATE NOT                    MODIFY Nome_Cliente CHAR(50)31
itens deve ser maior                NULL30
que zero, conforme
foi especificado no            }                                             }
enunciado.
                              3) Criar um Índice para o atributo nome_cliente da tabela VENDA
                              CREATE INDEX clienteIDX32 ON VENDA (nome_cliente);

       Comentário

30
  Adicionamos o                        Atividades e Orientações de Estudo
atributo à tabela
VENDA.

                                   Agora é a sua vez de fazer as atividades! Lembre-se praticar é muito importante pra
                          fixar o conteúdo estudado!
       Comentário
                                   Atividades Práticas:
31
  Aumentamos o
tamanho para 50.                 Resolva as atividades a seguir em um documento texto e poste o mesmo no
                          ambiente virtual, no local indicado. Essa atividade é para ser realizada em DUPLA (escolha
                          seu companheiro de trabalho!) e fará parte da avaliação somativa de vocês.
       Comentário
                              I) A partir do modelo relacional especificado a seguir, escreva os comandos SQL que
                                  realizem as operações solicitadas.
32
   Como estamos
fazendo neste capítulo,             Professor (CPF_Prof (PK), Nome_Prof, Titulacao)
você pode adotar um
sufixo para indicar o               Disciplina (Cod_Disc (PK), CPF_Prof (FK), Nome_Disc, carga_horaria)
nome do índice, como
no caso IDX.                        Aluno (Matricula (PK), Nome)
                                    Turma (Cod_Disc (PK), Matricula (PK), sala)
                              1) Faça a criação das tabelas do modelo relacional especificado acima. Algumas
                                 observações são: o atributo TITULACAO deve ser caractere de tamanho 30, deve
                                 permitir nulos e os valors permitidos são “graduado, especialista, mestre ou
                                 doutor”. A carga horária da disciplina deve ser maior que zero.
                              2) Altere a tabela PROFESSOR para para incluir o atributo tempo de serviço, do tipo
                                 inteiro e que deve ser not null. E modifique o atributo titulação para que passe a
                                 não permitir valores nulos.
                              3) Altere a tabela TURMA para deletar o atributo sala.
                              4) Altere a tabela ALUNO para incluir o curso que ele está prestando. Esse atributo
                                 deve ser caractere de tamanho 40 e não deve permitir nulos. O valor default desse
                                 atributo deve ser “Informática”.
                              5) Crie índices para os atributos Nome_Prof (tabela professor) e Nome_Disc (tabela
                                 Disciplina).




 36
Banco de Dados




             Vamos Revisar?


         Nos capítulos anteriores a esse, você estudou como fazer a modelagem conceitual
do seu banco de dados e, depois, como projetá-lo segundo o modelo relacional (MR). A
partir do MR gerado, para poder criar fisicamente o banco de dados, você necessitará fazer
uso dos comandos estudados neste capítulo. Esses comandos fazem parte da DDL (Data
Definition Language) da SQL e incluem, entre outros, comandos para criar, alterar e deletar
tabelas, além de comandos para criação e deleção de índices de tabela. Os comandos aqui
estudados poderão ser utilizados em qualquer SGBD, pois fazem parte do SQL ANSI. Uma
vez que seu banco de dados estiver criado, ele poderá ser manipulado e consultado usando
a DML (Data Manipulation Language) da SQL, este será o assunto do próximo capítulo.




                                                                                                          37
Banco de Dados




                                  Capítulo 12


                             O que vamos estudar neste capítulo?

                             Neste capítulo, vamos estudar os seguintes temas:

                         »   Inserção de dados em Tabelas.
                         »   Deleção de dados de Tabelas.
                         »   Consultas em Tabelas.

                             Metas

                             Após o estudo deste capítulo, esperamos que você saiba utilizar a DML (Data
                      Manipulation Language) do SQL. Dessa forma, você deverá saber:

                         »   Inserir dados em Tabelas.
                         »   Deletar dados de Tabelas.
                         »   Realizar consultas simples, agrupadas e aninhadas em Tabelas.




38
Banco de Dados




Capítulo 12 – Consultas em Banco de
Dados Relacionais


             Vamos conversar sobre o assunto?


         No capítulo anterior você aprendeu como criar fisicamente o seu banco de dados
através dos comandos da DDL (Data Definition Language) da SQL. Ou seja, você aprendeu
como fazer a criação de tabelas, índices para determinados atributos das tabelas e fazer a
manutenção de tudo que foi criado em termos de esquema (definição da tabela). Agora, que
as tabelas já estão criadas, resta saber como inserir dados nas mesmas, como atualizar ou
deletar esses dados inseridos, além de como fazer para buscar informações em uma ou mais
tabelas através de consultas simples ou aninhadas. É justamente isto que você irá estudar
neste capítulo.



        Neste capítulo estudaremos a DML (Data Manipulation Language) da SQL que
engloba justamente os comandos da SQL para inserção, deleção, atualização e consulta de
dados em tabelas de banco de dados relacionais. Vamos lá?



Inserindo Dados em Tabelas
         A partir do momento em que uma tabela está criada, ela já pode receber a entrada
de dados. Para isto usamos o comando INSERT INTO. Este comando adiciona uma ou mais
linhas na tabela. A sintaxe desse comando é:

    è Para inserir uma única tupla (linha):
        INSERT INTO nome_tabela [(atrib1,atrib2,...)] VALUES (valor1, valor2,...)
        Onde:

        nome_tabela deve ser o nome da tabela onde se deseja inserir dados.
        Atrib1, atrib2, ... são os nomes dos atributos que receberão os valores na inserção.
        Se for omitida essa lista de nomes de atributos serão selecionadas todas as colunas
        da tabela, pela sua ordem de criação33. Se for especificada uma lista de nomes
        de atributos, os valores para os dados deverão ser especificados para inserção na             Comentário
        ordem em que aparecem na lista.
        Valor1, valor2, ... são os valores que serão atribuídos aos atributos. Esses valores   33
                                                                                                 Importante atentar
        devem ser especificados seguindo a ordem dos atributos (ou da lista de atributos       para isto porque você
                                                                                               deverá especificar
        especificada no comando ou a ordem de criação dos atributos na tabela). Na             os valores a serem
        especificação dos valores também deve-se atentar que: 1) Valores de atributos do       inseridos também pela
        tipo caracter (CHAR ou VARCHAR) e do tipo DATE devem estar entre apóstrofos.           ordem de criação dos
                                                                                               atributos. Senão, corre
        2) A entrada de dados baseada em caracteres deve ser efetuada, de preferência
                                                                                               o risco de inserir dados
        com caracteres em maiúsculo e sem acentuação, pois se algum acento for utilizado,      nos campos errados.
        pode criar problemas no momento de uma pesquisa com uma palavra idêntica que
        não possua acento. 3) Os atributos especificados como NOT NULL devem sempre
        receber algum valor senão um erro será gerado e o comando não será executado,


                                                                                                                  39
Banco de Dados



                                   pois esses atributos nunca poderão ficar vazios.
       Comentário              è Para inserir mais de uma tupla (linha):
                                   INSERT INTO nome_tabela [(atrib1,atrib2,...)] <comando SELECT>34
34
  O comando SELECT
sera explicado                    Vamos exemplificar o uso desses comandos. Para isso, tomaremos como base o
posteriormente. Por        modelo relacional usado nos exemplos do capítulo anterior, mas com alguns atributos a
hora, o importante é
                           menos, veja:
saber que podemos
inserir em uma tabela,
várias tuplas, resultado    AUTOR (CodAutor (PK), Nome, Nascimento)
de uma consulta
usando SELECT.
                            LIVRO (TitLivro (PK), CodAutor (FK), CodEditora (FK), Valor, Ano_Publicacao)


                            EDITORA (CodEditora (PK), Razao, Endereco, Cidade)

                                   Vamos aos exemplos. Suponha que você deseje inserir um registro na tabela Autor.
       Comentário
                           Como ficaria?
35
   Observe que, como               INSERT INTO Autor ( CodAutor, Nome, Nascimento )
mencionado, valores
do tipo caracter e                 VALUES (112, ‘C. J. Date’, ‘03/12/1941’35);
valores do tipo DATE
                                   Lembrando que a ordem dos valores deve ser a mesma ordem dos atributos para
devem vir entre
apóstrofos.                que sejam inseridos nos lugares corretos. Agora, vamos inserir um registro na tabela Editora.
                                   INSERT INTO Editora( CodEditora, Razao, Endereco, Cidade )
                                   VALUES (1, ‘Editora Campus’, ‘R. Sete de Setembro,111’, ‘Rio de Janeiro’);
                                    Depois de preenchida as tabelas base (que não dependem de nenhuma outra),
       Comentário
                           vamos colocar um registro na tabela Livro, que depende de valores cadastrados nas duas
                           tabelas anteriores
36
  Lembre que, quando
não especificamos a                INSERT INTO Livro36
ordem dos atributos,
é tomada a ordem de                VALUES (‘Introdução a Sistemas de Banco de Dados’, 11237, 138, NULL39, ‘2000’);
criação dos atributos
na tabela. Assim, os                Chamamos a atenção para o fato que, na Tabela Livro, o código do autor e o código
valores dos atributos      da editora são chaves estrangeiras e, para que tudo dê certo, os valores utilizados, aqui, no
deveriam vir nessa
                           insert, devem existir anteriormente nas tabelas de origem das chaves estrangeiras, no caso,
mesma ordem de
criação que está           nas tabelas Autor e Editora.
especificada no
esquema da tabela
                                    Para finalizar os exemplos, vamos fazer a criação de uma nova tabela no nosso
Livro, do modelo           modelo, chamada AUTOR_JOVEM com os mesmos campos da tabela AUTOR. Depois,
relacional exemplo.        vamos inserir nesta nova tabela os autores da tabela AUTOR com nascimento posterior a
                           01/01/1980. Como ficariam os comandos SQL para realizar essas ações? Comecemos pela
       Comentário          criação da nova tabela.
                                   CREATE TABLE AUTOR_JOVEM(
37
  112 é o código do
autor anteriormente                  CodAutor INTEGER NOT NULL,
cadastrado.                          Nome CHAR(50) NOT NULL,
                                     Nascimento DATE NOT NULL,
       Comentário
                                     PRIMARY KEY (CodAutor),
38
  O Valor 1 é o                      UNIQUE (Nome, Nascimento) );
código da editora
                                  Agora vamos preencher essa tabela com os autores com nascimento posterior a
anteriormente
cadastrada.                01/01/1980.
                                   INSERT INTO AUTOR_JOVEM

 40
Banco de Dados



        SELECT * FROM AUTOR WHERE Nascimento40 > ‘01/01/1980’;

                                                                                                         Comentário
Atualizando Dados em Tabelas
                                                                                                   39
                                                                                                     Como o atributo
         Para modificar o valor de atributos de uma ou mais tuplas (linhas), dependendo            VALOR pode receber
dos critérios de seleção de quem será modificado, o comando UPDATE deve ser utilizado. A           valores nulos (ele não
                                                                                                   é NOT NULL) pela
sintaxe desse comando é:                                                                           definição feita na
                                                                                                   tabela, no capítulo
        UPDATE nome_tabela SET lista_atributos com atribuições de valores
                                                                                                   anterior, podemos
        [WHERE condição de seleção das tuplas a serem modificadas]                                 preenchê-lo com o
                                                                                                   valor NULL.
         Onde: nome_tabela - é a indicação da tabela em que se deseja efetuar a atualização
dos registros;
                                                                                                         Comentário
        lista_atributos com atribuições de valores – É a indicação de quais atributos
deverão ser atualizados e por qual valor. Esse trecho deve ter o seguinte formato: nome_           40
                                                                                                      Aqui fazemos a
atributo1 [, nome_atributo2, ....] = {valor ou expressão }                                         seleção dos autores
                                                                                                   com nascimento maior
        A cláusula WHERE especifica quais dados da coluna serão alterados. Quando                  que 01/01/1980.
a cláusula WHERE (que é opcional) é omitida, o UPDATE deve ser aplicado a todas as                 Veremos o comando
tuplas da relação. Ou seja, todas as tuplas da relação serão modificadas. Por exemplo: se          SELECT , o mais
                                                                                                   importante da DML,
desejássemos reajustar o valor de todos os livros em 10%, usaríamos o seguinte comando:            em detalhes, mais a
                                                                                                   frente.
        UPDATE LIVRO SET Valor = Valor * 1.141
         Como no comando acima não foi especificada uma cláusula WHERE, todos os livros                  Comentário
cadastrados na tabela LIVRO seriam atualizados. Agora, vamos supor que desejássemos
alterar o endereço e a cidade da editora com CodEditora = 10.                                      41
                                                                                                      O valor antigo
        UPDATE EDITORA SET endereco = ‘Av. N.S. de Fátima, 456’, cidade = ‘João Pessoa42’          de cada livro vai
                                                                                                   receber o valor antigo
        WHERE CodEditora = 1;                                                                      aumentado de 10%
         Aqui não seriam atualizadas todas as editoras da tabela EDITORA, mas apenas a             (representado na
                                                                                                   fórmula pelo 1.1)
editora de código 10.

 A cláusula WHERE aceita como condição um comando SELECT. Daremos mais detalhes do que pode              Comentário
 vir em uma cláusula WHERE mais à frente. Aguarde...
                                                                                                   42
                                                                                                      Veja que apenas
                                                                                                   os campos endereço
Exluindo Dados de Tabelas                                                                          e cidade, como
                                                                                                   solicitado, seriam
                                                                                                   atualizados. Os
         Para excluir linhas (que satisfaçam uma determinada condição) de uma ou mais              novos valores para os
tabelas, usa-se o comando DELETE FROM, cuja sintaxe é:                                             atributos vëm entre
                                                                                                   apóstrofos porque são
        DELETE FROM Nome_Tabela                                                                    do tipo caracter.
        [WHERE Condição43]
        Se omitirmos a cláusula WHERE, então o DELETE será aplicado a todas as tuplas                    Comentário
da relação, ou seja, TODOS os registros da tabela serão deletados (cuidado com esse
comando!). Porém, a tabela permanece no BD como uma tabela vazia. Por exemplo, o                   43
                                                                                                      A cláusula WHERE
                                                                                                   especifica quais
comando: DELETE FROM LIVRO; Deletaria todos os registros da tabela livro, deixando a
                                                                                                   linhas da tabela serão
mesma vazia. Vale ressaltar que a tabela (seu esquema) permanece. Logo, esse comando               excluídas.
não é equivalente ao DROP TABLE (que apagaria o esquema da tabela do banco de dados e,
por consequência, todos os dados da tabela seriam deletados juntamente).
        Quando a cláusula WHERE é especificada, apenas os registros que obedecem a
condição estabelecida são deletados. Por exemplo, excluir os registros da tabela autor cujo


                                                                                                                     41
Banco de Dados



                           codAutor seja igual a 15.
                                   DELETE FROM AUTOR WHERE CodAutor = 15;


       Comentário          Consultando Dados em Tabelas
44
   Você pode                       Chegamos, agora, no comando mais importante da SQL por ser o utilizado com mais
especificar os atributos
                           frequência: o SELECT. Este comando se tornou o mais importante da linguagem SQL devido
desejados
                           ao seu poder de consulta. Pois com ele poderemos realizar, entre outras coisas, consultas
                           em uma ou mais tabelas, realizar consultas aninhadas, fazer a aplicação de funções pré-
                           existentes e utilizar operações relacionais (união, diferença, interseção e obviamente
                           seleção) com extrema simplicidade na manipulação das tabelas. A estrutura básica do
                           comando SELECT é:
       Comentário
                            SELECT → PROJEÇÃO da álgebra relacional
45
  Ou pode utulizar
o * (asterisco) que         FROM → Onde a pesquisa será feita (uma ou mais tabelas)
indica que se quer
projetar TODAS as
colunas da(s) tabela(s)     WHERE → Condições da SELEÇÃO
espedificada(s) na
cláusula FROM.                      Em resumo, a cláusula SELECT corresponde à operação de projeção da álgebra
                           relacional. Usada para listar os atributos desejados do resultado de uma consulta. A
                           cláusula FROM corresponde A especificação de onde a pesquisa será realizada. Em uma ou
                           mais tabelas (quando for usada mais de uma tabela, será aplicada a operação de produto
       Comentário          cartesiano da álgebra relacional). A cláusula WHERE corresponde à operação de seleção
                           da álgebra relacional, onde são especificadas as condições de pesquisa na(s) tabela(s)
46
   Veja que, na cláusula   identificadas na cláusula FROM.
WHERE espedificamos
a condição de pesquisa
que, no caso, é o
código ser igual a 5.




                                   Vamos dar um exemplo. Selecione todas as informações da tabela AUTOR. Haveria
                           duas formas de realizar essa consulta:

                                   SELECT CodAutor, Nome, Nascimento44 FROM AUTOR ; ou
                                   SELECT45 * FROM AUTOR ;
                                   Outro exemplo seria: Selecione todas as informações sobre o autor de código 5.
                                   SELECT * FROM AUTOR WHERE CodAutor = 546;
                                   Além dessa parte básica o comando SELECT tem várias outras que iremos explicando
                           nas próximas seções, começando da utilização mais simples, até chegar na mais elaborada.
                           Para dar uma ideia, a sintaxe completa do comando é:
                                   SELECT [DISTINCT] nome_coluna,....
                                   FROM nome_tabela, ....
                                   [WHERE (condições)]
                                   [GROUP BY nome_coluna, ....] [HAVING (condições)]



 42
Banco de Dados



        [{INTERSECT | MINUS | UNION} outro_comando_select]
        [ORDER BY nome_coluna {ASC | DESC}, ....];
        Cada cláusula permite a especificação de algum elemento referente às operações
relacionadas a álgebra relacional :

        SELECT - o que deseja-se na tabela de resultado
        FROM - de onde retirar os dados necessários
        WHERE - condições para busca dos resultados
        GROUP BY - agrupamento de resultados
        HAVING - condições para a definição de grupos na tabela de resultados
        INTERSECT - permite a interseção de tabelas
        MINUS - permite a diferença entre tabelas
        UNION - permite a união de tabelas
        ORDER BY - estabelece a ordenação lógica da tabela de resultados (ASC – ordenação
        ascendente, DESC – ordenação descendente)
         É importante ressaltar que o resultado de qualquer comando SELECT é uma tabela
com as tuplas (e os atributos destas) que atendam aos critérios especificados. Para mostrar
esse ponto, além de tomarmos como base o mesmo modelo exemplo que vem sendo
utilizado para demonstrar as consultas das seções a seguir, vamos fazer uso das Relações
mostradas nas Tabelas 27, 28 e 29 que representam exemplos do modelo base preenchido.

                                    Tabela 27 - Relação Editora

        Cod_Editora (PK)          Razao                 Endereco                 Cidade

               1                 Sextante           Av. Hortências, 234     Porto Alegre

               2                 Fantasy              R. 24 horas, 55           São Paulo

               3                 Bookman            Av. das Ubaias, 303          Recife




                                    Tabela 28 - Relação Autor

                   Cod_Autor (PK)               Nome               Nascimento

                           110               Pedro Alves           18/03/1955

                           111              Carolina Dantas        22/02/1970

                           112              Olívia Duncan          10/01/1968




                                                                                                             43
Banco de Dados



                                                         Tabela 29 - Relação Livro

                            TitLivro (PK)      CodAutor (FK)       CodEditora (FK)        Valor      Ano_Publicacao

                          Banco de Dados           110                   3                150,00           2009

                             O Estranho            111                   1                45,00            2010

                              Sucesso              112                   2                35,00            2000

                          Arquitetura de BD        110                   3                110,00           2007

                            O Conhecido            111                   1                55,00            2009

                           BD Distribuídos         110                   3                98,00            2010




                      Consultas Simples Sem Condição

                              Como exemplificado na seção anterior, uma consulta simples, utiliza apenas as
                      cláusulas SELECT/FROM. Por exemplo, selecionar todas as informações de todas as editoras
                      cadastradas:

                              SELECT * FROM Editora;
                              Esse comando resultaria na Tabela 30, pois o * (asterisco), como já explicado
                      anteriormente, indica que todos os atributos (colunas) da tabela devem ser selecionados.

                                                     Tabela 30 - Relação Resultante

                                 Cod_Editora        Razao                    Endereco                Cidade

                                        1          Sextante           Av. Hortências, 234          Porto Alegre

                                        2           Fantasy             R. 24 horas, 55             São Paulo

                                        3          Bookman            Av.das Ubaias, 303              Recife



                              Outra opção seria selecionar apenas alguns atributos das editoras. Para isso, é
                      necessário na cláusula SELECT especificar os nomes dos atributos que se deseja na tabela
                      resultante. Por exemplo, selecionar a razão e a cidade de todas as editoras cadastradas.
                              SELECT razao, cidade FROM Editora;
                              Esse comando resultaria na Tabela 31, uma vez que apenas os atributos razão e
                      cidade foram selecionados. Porém, observe que todas as tuplas da tabela aparecem, pois
                      não há condição de filtragem.

                                                     Tabela 31 - Relação Resultante

                                                         Razao                Cidade

                                                       Sextante          Porto Alegre

                                                         Fantasy           São Paulo

                                                       Bookman                Recife




44
Banco de Dados



        Uma coluna (atributo), também pode ser especificada colocando antes dele o nome
de sua tabela (útil apenas quando existem atributos de nomes iguais em tabelas diferentes
– veremos mais à frente, quando estudarmos a opção de consulta em mais de uma tabela).
Exemplo:
        SELECT Editora.razao, Editora.cidade FROM Editora47;
        Uma coluna pode ser renomeada durante a consulta usando a cláusula AS, da                     Comentário
seguinte forma: NomeColuna AS NomeColunaRenomeada. O que mudaria com isso? O
nome da coluna renomeada seria a que iria aparecer na tabela resultante (vide Tabela 32),      47
                                                                                                  A relação resultante
                                                                                               seria também a Tabela
ao invés do nome original da coluna. Por exemplo, selecionar a razão de todas as editoras
                                                                                               31.
cadastradas, chamando a razão de nome_empresa.
        SELECT razao AS Nome_empresa FROM Editora;

                                Tabela 32 - Relação Resultante
                                                                                                      Comentário
                                      Nome_empresa48

                                          Sextante
                                                                                               48
                                                                                                 Observe que na
                                                                                               relação resultante o
                                           Fantasy                                             nome da coluna que
                                                                                               aparece é o nome
                                          Bookman                                              dado a coluna com a
                                                                                               renomeação.

          Renomear um atributo, também, é útil quando realizamos algum tipo de operação
sobre o resultado do atributo selecionado. Por exemplo, selecionar todos os títulos dos
livros e seus valores em dobro. Para isso, podemos realizar uma seleção e no atributo valor,
aplicar a operação de multiplicar por dois, resultando na relação da tabela 33.
        SELECT Titulo, Valor * 2 AS Dobro49 FROM Livro;
                                                                                                      Comentário
                                Tabela 33 - Relação Resultante
                                                                                               49
                                                                                                  Cada valor retornado
                                    TitLivro           Dobro50                                 seria multiplicado por
                                                                                               dois e apareceria em
                                Banco de Dados          300,00                                 uma coluna chamada
                                                                                               DOBRO, devido a
                                  O Estranho            90,00                                  renomeação.
                                    Sucesso             70,00

                               Arquitetura de BD        220,00

                                  O Conhecido           110,00

                                BD Distribuídos         196,00
                                                                                                      Comentário

        No caso de uso de operadores aritméticos, se a coluna não for renomeada,               50
                                                                                                  Se avaliar a relação
                                                                                               original, vai verificar
aparecerá como título da coluna a fórmula utilizada. Ou seja, é criada uma coluna na relação
                                                                                               que essa coluna é
resultante que não pertence à tabela a partir dos cálculos realizados sobre um ou mais         justamente o valor
atributos da tabela (vide Tabela 34). Por exemplo, selecionar todos os títulos dos livros e    calculado na cláusula
seus valores com 10% de desconto.                                                              SELECT, ou seja, o
                                                                                               dobro.
        SELECT Titulo, Valor - (Valor * 0.1) FROM LIVRO;




                                                                                                                   45
Banco de Dados



                                                          Tabela 34 - Relação Resultante

                                                        TitLivro               Valor - (Valor * 0.1)

                                                     Banco de Dados                   135,00

                                                       O Estranho                     40.50

                                                        Sucesso                       31.50

                                                    Arquitetura de BD                 99,00

                                                      O Conhecido                     55,00
       Comentário
                                                     BD Distribuídos                  98,00

51
   Como o ALL é o
default, ele não precisa
ser especificado.
                                    Em SQL a eliminação de linhas duplicadas não é feita automaticamente, devendo a
Logo, esse comando         mesma ser especificada explicitamente, se desejada. Para isso usamos a cláusula DISTINCT
é equivalente ao           no SELECT. Pois, se ela não for especificada, o padrão é ALL, ou seja, selecionar tudo,
anterior.
                           inclusive valores repetidos. Por exemplo, selecionar todas os anos de publicação de livros
                           da tabela LIVRO, resultaria na relação da tabela 34, onde podem ser observados valores
                           reptidos.
                                   SELECT ALL Ano_Publicacao FROM Livro; ou
                                   SELECT Ano_Publicacao51 FROM Livro;

                                                          Tabela 35 - Relação Resultante

       Comentário                                                  Ano_Publicacao

                                                                        2009
52
  Com esse comando,
se houvesse , por                                                       2010
exemplo, duas ou
                                                                        2000
mais cidades RECIFE
cadastradas na tabela                                                   2007
Editora, esse valor
seria apresentado                                                       2009
na tabela resultante
apenas uma única vez.                                                   2010



                                  Agora, se quiséssemos realizar a mesma consulta, agora, sem valores repetidos,
                           deveríamos usar a cláusula DISTINCT, resultando na relação da Tabela 35.
       Comentário
                                   SELECT DISTINCT Ano_Publicacao FROM Livro52;
53
   Observe que nessa                                      Tabela 36 - Relação Resultante
tabela resultante,
diferente da tabela 34,
não existem valores                                                Ano_Publicacao53
repetidos.
                                                                        2009
                                                                        2010
                                                                        2000
                                                                        2007


                           Consultas usando Funções de Agregação

                                   Na cláusula SELECT, é possível utilizar funções de agregação (vide Tabela 37), para

 46
Banco de Dados



projetar cálculos relacionados a atributos de uma ou mais relações.

                           Tabela 37 - Funções de Agregação no SQL

                                   Funções de Agregação
                   AVG            Calcula a média dos valores selecionados
                   MIN          Calcula o menor valor entre os selecionados
                   MAX          Calcula o maior valor entre os selecionados
                  COUNT          Conta quantos valores foram selecionados
                   SUM          Calcula o somatório dos valores selecionados



        Essas funções são utilizadas logo após o SELECT, no local de especificação dos
atributos a serem projetados na seleção. O resultado do uso dessas funções é uma tabela
contendo apenas o valor calculado. Vamos dar alguns exemplos.

    »   Projetar a média dos valores dos livros
                                                                                                Comentário
        SELECT AVG (Valor)54 FROM LIVRO;
                                                                                          54
                                                                                             Veja que o atributo
                                         AVG (Valor)                                      do qual se deseja
                                              82,16                                       calcular a média vem
                                                                                          entre parênteses.
                                                                                          Fazendo isso, todos
                                                                                          os valores de livro da
    »   Informar o valor do livro mais caro                                               tabela são recuperados
                                                                                          e o AVG calcula a
        SELECT MAX (Valor) FROM LIVRO;                                                    média deles.

                                        MAX (Valor)
                                           150,00



    »   Informar o valor do livro mais barato
        SELECT MIN (Valor) FROM LIVRO;

                                         MIN (Valor)
                                              35,00



    »   Projetar a quantidade de autores cadastrados
        SELECT COUNT (*) AS QUANTIDADE55 FROM AUTOR;
                                                                                                Comentário
                                        QUANTIDADE

                                                3                                         55
                                                                                             Nessa cláusula, o
                                                                                          COUNT conta quantas
                                                                                          tuplas existem na
                                                                                          tabela AUTOR. O AS
    »   Somar todos os valores dos livros cadastrados                                     renomeou a coluna
        SELECT SUM (Valor) FROM LIVRO;                                                    para QUANTIDADE..


                                        SUM (Valor)

                                           493,00



                                                                                                           47
Banco de Dados



                              As funções de agregação não podem ser combinadas a outros atributos da tabela
                      no resultado da consulta. Assim, a consulta a seguir não seria possível:




                      Restringindo a Consulta de Dados em Tabelas

                              Para restringir as consultas realizadas com o SELECT, precisamos fazer uso da
                      cláusula WHERE. Essa cláusula especifica quais linhas da(s) tabela(s) listada(s) na cláusula
                      FROM serão afetadas pela condição. Se nenhuma cláusula WHERE for especificada, a
                      consulta retornará todas as linhas da tabela, como visto nas seções anteriores. Na cláusula
                      WHERE é especificada a condição de restrição fazendo uso de operadores lógicos (AND, OR
                      e NOT) e relacionais (=, <>, >, <, >= e <=). A condição de WHERE pode ser de três tipos:
                      comparação, ligação entre tabelas (Join) e subconsultas (Sub-Queries). Vamos estudar cada
                      uma delas.


                      Comparação

                                Em geral, a comparação é realizada fazendo uso de uma condição composta por:
                                                   Expressão Operador Relacional Expressão
                              Onde, a condição é verdadeira quando a 1a expressão atende ao operador
                      relacional sobre a 2ª. Por exemplo, selecionar os livros publicados após 2008 (vide resultado
                      da consulta na Tabela 38):
                                              SELECT * FROM LIVRO WHERE Ano_Publicacao > ‘2008’;

                                                       Tabela 38 - Relação Resultante


                              TitLivro (PK)     CodAutor (FK)     CodEditora (FK)       Valor    Ano_Publicacao

                          Banco de Dados            110                  3              150,00       2009

                              O Estranho            111                  1              45,00        2010

                              O Conhecido           111                  1              55,00        2009

                          BD Distribuídos           110                  3              98,00        2010



                               Também, podem ser utilizadas na comparação algumas cláusulas para trazer
                      facilidades para a seleção de dados. Vamos a elas!

                          »     WHERE atributo [NOT] BETWEEN valor1 AND valor2;
                                Busca por intervalos de valores compreendidos entre os valores 1 e 2 (inclusive).
                                A variação é usar na frente do BETWEEN a cláusula NOT, neste caso, a busca é por
                                valores que estejam FORA do intervalo. Por exemplo, selecionar os livros com valor
                                de 50,00 a 100,00 (Resultado na Tabela 39).



48
Banco de Dados



        SELECT * FROM LIVRO

                                  Tabela 39 - Relação Resultante


     TitLivro (PK)     CodAutor (FK)        CodEditora (FK)        Valor    Ano_Publicacao

     O Conhecido            111                    1               55,00         2009

    BD Distribuídos         110                    3               98,00         2010



        Se se desejasse os livros fora do intervalo (ou seja, mais baratos que 50 e mais caros
        que 100) seria usada a cláusula NOT (Resultado na Tabela 40).
        SELECT * FROM LIVRO
        WHERE Valor NOT BETWEEN 50.00 AND 100.00;

                                  Tabela 40 - Relação Resultante

     TitLivro (PK)     CodAutor (FK)        CodEditora (FK)         Valor    Ano_Publicacao

   Banco de Dados           110                    3               150,00         2009

     O Estranho             111                    1                45,00         2010

       Sucesso              112                    2                35,00         2000

  Arquitetura de BD         110                    3               110,00         2007
                                                                                                         Comentário

                                                                                                   56
                                                                                                      O caracter
                                                                                                   especial usado para
        WHERE atributo [N OT] LIKE ‘padrão’                                                        representação de
                                                                                                   padrões muda de
        Esta cláusula busca por padrões em atributos do tipo CHAR. A condição é satisfeita
                                                                                                   SGBD para SGBD.
        quando o valor do atributo é igual ao valor do padrão. Caracteres especiais56 são
        utilizados para construção do padrão, tais como:
        “%” ou “*” → Usados para representar zero ou mais caracteres.                                    Comentário
        “_” ou “?” → Usados para representar um único caractere.
                                                                                                   57
                                                                                                      Observe que o
        [a-f] : busca por qualquer caractere entre ´a´ e ´f´ (usado no SQL-Server).                padrão vem entre
                                                                                                   apóstrofos. Observe
        Vamos dar alguns exemplos. Selecionar todos os livros cujo título tenha 7 caracteres       também que é usada
        e inicie com a letra S (resultado na Tabela 41).                                           uma interrogação (?)
                                                                                                   para cada caractere do
        SELECT * FROM Livro WHERE TitLivro LIKE ‘S??????’57;                                       nome. Como se deseja
                                                                                                   que a letra S seja a
                                  Tabela 41 - Relação Resultante                                   primeira. Ela vem
                                                                                                   escrita no padrão.
      TitLivro (PK)    CodAutor (FK)       CodEditora (FK)         Valor    Ano_Publicacao

        Sucesso             112                    2               35,00        2000
                                                                                                         Comentário

        Selecionar todos os livros que tenham a palavra BD no seu título (resultado na             58
                                                                                                     Aqui o símbolo
Tabela 42).                                                                                        % representa que
                                                                                                   pode existir qualquer
        SELECT * FROM Livro WHERE TitLivro LIKE ‘%BD%58’;                                          número de caracteres
                                                                                                   antes ou depois da
                                                                                                   palavra BD.




                                                                                                                     49
Banco de Dados



                                                          Tabela 42 - Relação Resultante


                              TitLivro (PK)    CodAutor (FK)        CodEditora (FK)        Valor    Ano_Publicacao

                          Arquitetura de BD         110                    3               110,00       2007

                           BD Distribuídos          110                    3               98,00        2010



                                Da mesma forma que se usa o LIKE, também pode ser usado o NOT LIKE. Neste
                                último caso, é devolvida na consulta os valores que NÃO obedecem ao padrão
                                especificado. Uma observação importante é que LIKE e NOT LIKE só se aplicam
                                sobre atributos do tipo CHAR.
                          »     WHERE atributo IS [NOT] NULL
                                Essa cláusula testa a existência de valores nulos (NULL) ou não nulos (NOT NULL).
                                Ele faz com que a consulta retorne as tuplas da relação cujo atributo em questão
                                seja nulo ou não nulo, conforme a cláusula sendo utilizada. Para dar exemplo de
                                uso dessa cláusula, vamos supor que a relação LIVRO seja a da tabela 43. Assim,
                                vamos a realizar a seguinte consulta: selecionar todos os livros que estão sem preço
                                definido (resultado na Tabela 44).

       Comentário               SELECT * FROM Livro WHERE Valor IS NULL59

                                                            Tabela 43 - Relação Livro
59
   Vai checar entre
todos os livros aqueles
que tem no valor do           TitLivro (PK)     CodAutor (FK)       CodEditora (FK)        Valor    Ano_Publicacao
livro NULL.
                           Banco de Dados            110                    3              150,00       2009

                               O Estranho            111                    1              45,00        2010

                                 Sucesso             112                    2              NULL         2000

                          Arquitetura de BD          110                    3              110,00       2007

                              O Conhecido            111                    1              55,00        2009

                           BD Distribuídos           110                    3              NULL         2010




                                                          Tabela 44 - Relação Resultante


                              TitLivro (PK)    CodAutor (FK)        CodEditora (FK)        Valor    Ano_Publicacao

                                Sucesso             112                    2                NULL         2000

                          BD Distribuídos           110                    3                NULL         2010



                          »     WHERE expressão [NOT] IN (Valores)
                                Teste de pertinência elemento-conjunto. O teste da condição é verdadeiro se o
                                valor da expressão for igual (ou diferente, se for usado o NOT) a um dos valores
                                especificados entre parênteses. Por exemplo, selecionar as editoras com sede em
                                São Paulo ou Rio de Janeiro (resultado na Tabela 45).


50
Banco de Dados



        SELECT * FROM editora
        WHERE Cidade IN (‘São Paulo’, ‘Rio de Janeiro’)60;
                                                                                                            Comentário
                                 Tabela 45 - Relação Resultante
                                                                                                     60
                                                                                                       Veja que como
           Cod_Editora (PK)            Razao            Endereco            Cidade                   a comparação se
                                                                                                     refere a um campo
                   2               Fantasy           R. 24 horas, 55       São Paulo                 caracter , os valores
                                                                                                     devem vir entre
                                                                                                     apóstrofos. Cada valor
                                                                                                     é comparado com o
        É possível misturar os vários tipos de comparação aqui explicados em uma única               atributo envolvido
cláusula WHERE interligada por operadores lógicos. Vamos dar um exemplo: Selecionar                  na comparação. Veja
                                                                                                     que nesse caso o IN
todos os livros que iniciam com a letra O, estão com preço definido e foram publicados               é equivalente a uma
depois de 2009 (resultado na Tabela 46, de consulta aplicada na Tabela 43).                          condição do tipo
                                                                                                     (Cidade = ‘São Paulo”
        SELECT * FROM Livro                                                                          OR cidade = ‘Rio de
                                                                                                     Janeiro’).
        WHERE Titulo LIKE ‘O%’ AND
        Valor IS NOT NULL AND
        Ano_Publicacao > ‘2009’

                                 Tabela 46 - Relação Resultante


   TitLivro (PK)       CodAutor (FK)       CodEditora (FK)         Valor       Ano_Publicacao

   O Estranho              111                   1                 45,00               2010




Ligação Entre Tabelas - Join

         Diz-se que tabelas estão relacionadas se tiverem campos comuns (em uma tabela
chave primária e em outra chave estrangeira). O efeito do JOIN é a criação de uma tabela
temporária em que cada par de linhas (de tabelas diferentes) que satisfaça a condição de
ligação, seja interligada para formar uma única linha.
          A ligação é sempre estabelecida na cláusula WHERE através da igualdade de campos
de tabelas diferentes, tabelas essas que precisam ter sido especificdas na cláusula FROM.
O FROM estabelece o produto cartesiano entre as tabelas listadas e a cláusula WHERE
filtra as linhas úteis segundo a condição especificada. É possível misturar as cláusulas de
comparação, vistas anteriormente, juntamente com AND, OR e NOT para formar condições
de ligações mais complexas.
         Vamos aos exemplos, para deixar tudo mais claro. Selecione todos os títulos dos
livros e o nome de seus respectivos autores. Veja que, para responder a essa consulta, não
seria possível consultar apenas a tabela livro, pois esta não possui o nome do autor, mas
apenas o código do mesmo. Para obter o nome do autor seria necessário fazer um JOIN das
tabelas LIVRO e AUTOR. Então, como fazer isso? Fazendo a igualdade entre os campos que                      Comentário
as tabelas possuem em comum:
                                                                                                     61
                                                                                                        Para cada atributo
        SELECT autor.Nome, livro.TitLivro FROM autor, livro61                                        identificamos a qual
                                                                                                     tabela ele pertence.
        WHERE autor.Cod_Autor = livro.CodAutor;
        Para evitar escrever o nome completo da tabela na frente de cada atributo, para
deixar mais claro a que tabela cada atributo pertence durante o JOIN, podemos dar apelidos

                                                                                                                        51
Banco de Dados



                      às tabelas. Para ilustrar, vamos apresentar o mesmo exemplo anterior modificado para usar
                      os apelidos:
                              SELECT AU.Nome, LI. TitLivro FROM AUTOR AU, LIVRO LI
                              WHERE AU.Cod_Autor = LI.CodAutor;
                              Em ambas as consultas a relação resultante é a apresentada na Tabela 47.

                                                          Tabela 47 - Relação Resultante


                                                     TitLivro                        Nome

                                                Banco de Dados                    Pedro Alves

                                                   O Estranho                    Carolina Dantas

                                                    Sucesso                      Olívia Duncan

                                               Arquitetura de BD                  Pedro Alves

                                                  O Conhecido                    Carolina Dantas

                                                 BD Distribuídos                  Pedro Alves



                               No JOIN podem ser unidas duas ou mais tabelas. Para se ligar várias tabelas, usa-se
                      o operador lógico AND entre as condições do JOIN. Vamos dar outro exemplo. Selecionar
                      todos os nomes de autores, o título dos seus livros e a razão das editoras, considerando
                      os livros que custem mais de 50 reais e cujas editoras sejam Fantasy ou Bookman. Veja
                      que para responder a essa consulta, precisamos fazer um JOIN entre as três tabelas: Livro
                      (considerar a da Tabela 43), Autor e Editora.
                              SELECT AU.Nome, LI. TitLivro, ED.Razao
                              FROM autor AU, livro LI, editora ED
                              WHERE AU.Cod_Autor = LI.CodAutor AND
                                    LI.CodEditora = ED.Cod_Editora AND
                                   LI.Valor > 50,00 AND
                                   ED.Razao IN (‘Fantasy, ‘Bookman’) ;
                              O resultado desta consulta pode ser observado na Tabela 48.

                                                          Tabela 48 - Relação Resultante


                                              Nome                    TitLivro               Razao

                                            Pedro Alves           Banco de Dados            Bookman




                                     Observação


                        É preciso ter muito cuidado com os JOINs, pois exigem alto custo de execução (implicam
                        diretamente na performance). Além disso, quando os JOINs forem utilizados, deve-se ter cuidado
                        para fazer corretamente a montagem da condição de junção.




52
Banco de Dados



Subconsultas (Sub-Queries)

        Na condição especificada na cláusula WHERE podem ser usadas subconsultas. Essas
subconsultas podem retornar um valor simples, ou um conjunto de valores. Vamos olhar
cada caso.

        Subconsultas que retornam um valor simples

        Neste caso, a subconsulta deve retornar uma única tupla. Para isso, podem-se usar
as funções de agregação (AVG,MIN,MAX,...). Esse tipo de subconsulta é utilizado para fazer
a comparação elemento-elemento e tem o seguinte formato:
        WHERE expressão {= | <> | > | >= | < | <=} (Subconsulta)
         Onde: subconsulta é outra consulta (SELECT) que pode conter qualquer uma das
cláusulas anteriormente estudadas. Por exemplo, selecionar os títulos dos livros mais caros
que a média de preço dos livros. Veja que primeiro precisamos calcular a média de preço
dos livros para depois buscar por aqueles livros que tem seu preço acima da média. Logo, a
maneira de fazer isso é usando uma subconsulta, como veremos a seguir:
        SELECT TitLivro FROM Livro
        WHERE Valor > (SELECT AVG (Valor) FROM Livro) ;
        Na execução da subconsulta, seria calculado o valor da média dos livros (a partir da
Tabela 43), que seria o valor 60. Depois, a mesma tabela seria avaliada pela consulta externa,
para obter os títulos de livros cujos valores fossem maiores do que a média calculada na
subconsulta, resultando na Tabela 49.

                                Tabela 49 - Relação Resultante

                                           TitLivro

                                       Banco de Dados

                                      Arquitetura de BD




Subconsultas que retornam um conjunto de valores

        Usadas para fazer comparação elemento-conjunto. Em outras palavras, elas
estabelecem uma relação de pertinência (�) entre elementos e conjuntos (tabelas). Sua
avaliação retorna um valor booleano. Esse tipo de subconsultas pode ser definido através
das cláusulas IN, ANY, ALL e EXISTS. Vamos dar uma olhada em cada uma dessas cláusulas.

    »   WHERE expressão [NOT] IN (Sub-Consulta) – já estudamos o IN anteriormente
        neste capítulo em consultas simples. Agora, estamos vendo o uso do mesmo com
        subconsultas. Essa cláusula verificaria se o resultado da expressão está contido no
        subconjunto de valores retornado pela subconsulta. Por exemplo, selecionar o
        nome e a data de nascimento dos autores de livros que não tem valor definido (ou
        seja, que tem valor NULL).
        SELECT Nome, Nascimento FROM Autor
        WHERE CodAutor IN
                  (SELECT CodAutor FROM Livro



                                                                                                             53
Banco de Dados



                                       WHERE Valor IS NULL);
                              A relação resultante da consulta pode ser vista na Tabela 50.

                                                      Tabela 50 - Relação Resultante


                                                      Nome                    Nascimento

                                                   Pedro Alves                18/03/1955

                                                  Olívia Duncan               10/01/1968



                          »   WHERE expressão { = | <> | > | >= | < | <= } ANY (Sub-consulta) – o ANY verifica se a
                              condição de comparação é verdadeira para pelo menos um dos valores retornados
                              pela subconsulta. Por exemplo, selecionar o nome de todos os autores, exceto o do
                              mais idoso (resultado na Tabela 51).
                              SELECT Nome FROM Autor
                              WHERE Nascimento < ANY (SELECT Nascimento FROM Autor)

                                                      Tabela 51 - Relação Resultante

                                                       Nome                   Nascimento

                                                  Carolina Dantas              22/02/1970

                                                   Olívia Duncan               10/01/1968



                              Quando na comparação é utilizada a igualdade ( = ANY), a cláusula passa a ter o
                      mesmo efeito que a cláusula IN, anteriormente estudada. Vejamos com o uso do ANY a
                      mesma consulta usada para exemplificar o IN. Selecione o nome e a data de nascimento dos
                      autores de livros que não tem valor definido (ou seja, que tem valor NULL).
                              SELECT Nome, Nascimento FROM Autor
                              WHERE CodAutor = ANY (SELECT CodAutor FROM Livro
                                                         WHERE Valor IS NULL);

                          »   WHERE expressão { = | <> | > | >= | < | <= } ALL (Sub-consulta) - verifica se a
                              condição é verdadeira para todos os valores retornados pela subconsulta. É o
                              oposto de ANY. Por exemplo, selecionar o titulo dos livros que têm valor maior que
                              todos os livros da editora Sextante (resultado na Tabela 52).
                              SELECT TitLivro FROM Livro
                              WHERE Valor > ALL (SELECT Valor FROM Livro Li, Editora Ed
                                                WHERE Ed.Razao = ‘Sextante’ AND
                                                         Li.CodEditora = Ed.Cod_Editora);

                                                      Tabela 52 - Relação Resultante


                                                              TitLivro (PK)

                                                             Banco de Dados

                                                            Arquitetura de BD



54
Banco de Dados



         Quando na comparação é utilizado <> ALL, a cláusula passa a ter o mesmo efeito
que a cláusula NOT IN.

    »   WHERE expressão [NOT] EXISTS (Sub-consulta) - verifica a existência de dados
        numa lista de valores da subconsulta. Retorna VERDADEIRO ou FALSO, conforme
        a subconsulta retorne ou não linhas de resultado. Por exemplo, selecione o nome
        de todos os autores que têm livros publicados nas editoras Fantasy ou Bookman
        (resultado na Tabela 54).
        SELECT Au.Nome FROM AUTOR Au
        WHERE EXISTS (SELECT * FROM LIVRO Li, EDITORA Ed
                          WHERE Li.CodAutor=Au.Cod_Autor AND
                                   Li.CodEditora=Ed.Cod_Editora AND
                                   Ed.Razao IN (‘Fantasy, ‘Bookman’));

                                Tabela 54 - Relação Resultante

                                             Nome

                                          Pedro Alves

                                        Olívia Duncan




Ordenando Resultados

         Para ordenar os resultados das consultas pelos valores de uma ou mais colunas
(atributos), utiliza-se a cláusula ORDER BY. As linhas são ordenadas pela primeira coluna
(atributo) especificada após o ORDER BY. Quando as linhas de uma coluna possuem valores
iguais, estas serão classificadas pelo valor da segunda coluna especificada após o ORDER BY
e assim por diante. Há dois tipos de ordenação:

    »   ASC → Ascendente (default)
    »   DESC → Decrescente
         Vamos ao exemplo: Selecionar o nome e o nascimento dos autores em ordem
decrescente do nascimento. Para datas iguais, considerar a ordem alfabética do nome do
autor (resultado na Tabela 54).
        SELECT Nome, Nascimento FROM Autor
        ORDER BY Nascimento DESC, Nome ASC;

                                Tabela 54 - Relação Resultante


                               Nome                     Nascimento

                           Carolina Dantas              22/02/1970

                           Olívia Duncan                10/01/1968

                            Pedro Alves                 18/03/1955




                                                                                                          55
Banco de Dados



                      Agrupando Resultados

                              lgumas vezes, na apresentação dos resultados da consulta, é preciso organizar a
                      seleção dos dados em grupos ou apresentar informações adicionais ou totalizadoras sobre
                      determinados grupos de dados. Para isso, é usada a cláusula GROUP BY. Ela agrupa os
                      resultados por valores idênticos. Ela é usada, muitas vezes, com as funções de agregação,
                      mas pode ser usada, também, sem estas. Vamos a alguns exemplos de uso:
                              Calcular a média dos valores dos livros cadastrados, separados por editora. Veja que
                      para poder realizar esse cálculo, necessitamos agrupar os livros de acordo com as editoras
                      dos mesmos. Por isso, precisamos da cláusula GROUP BY.
                              SELECT Editora.Razao, AVG (Livro.Valor) FROM Livro, Editora
                              WHERE Livro.CodEditora=Editora.Cod_Editora
                              GROUP BY Editora.Razao ;

                                                      Tabela 55 - Relação Resultante


                                                     Razao             AVG(Livro.Valor)

                                                    Sextante                50,00

                                                    Fantasy                 NULL

                                                   Bookman                  86,66



                              Observe que a relação resultante (Tabela 55) apresenta cada editora apenas
                      uma vez e a média dos livros de cada uma delas. Em outras palavras, a relação resultante
                      apresenta as tuplas da relação Livro separadas em grupos (de acordo com as editoras) e a
                      função AVG é aplicada a cada grupo separadamente.

                       Uma observação importante é que os campos do GROUP BY devem, obrigatoriamente, aparecer
                       no SELECT.

                              Vamos dar outro exemplo. Contar quantos livros foram publicados por ano de
                      publicação (vide resultado na Tabela 56).
                              SELECT Ano_Publicacao, COUNT(Ano_Publicacao) FROM Livro
                              GROUP BY Ano_Publicacao
                              ORDER BY Ano_Publicacao;

                                                      Tabela 56 - Relação Resultante


                                             Ano_Publicacao         COUNT(Ano_Publicacao)

                                                  2000                          1

                                                  2007                          1

                                                  2009                          2

                                                  2010                          2



                              Até agora, usamos funções de agregação. Agora, vamos dar um exemplo de uso do


56
Banco de Dados



GROUP BY sem fazer uso de funções de agregação: Selecionar o nome do autor, o título do
livro e seu valor organizados de acordo com seu autor. O resultado desta consulta pode ser
visualizado na Tabela 57. Veja que
        SELECT Autor.Nome, Livro.TitLivro, Livro.Valor FROM Autor, Livro
        WHERE Autor.Cod_Autor=Livro.CodAutor
        GROUP BY Autor.Nome;

                                   Tabela 57 - Relação Resultante


                     Nome                     TitLivro (PK)                Valor

                   Pedro Alves              Arquitetura de BD              110,00

                   Pedro Alves              Banco de Dados                 150,00

                   Pedro Alves               BD Distribuídos               NULL

                 Carolina Dantas               O Estranho                  45,00

                 Carolina Dantas              O Conhecido                  55,00

                  Olívia Duncan                  Sucesso                   NULL



        Também, é possível agrupar os resultados da seleção por mais de um atributo.
Nesse caso, eles serão agrupados na ordem em que aparecem no GROUP BY (tal qual ocorre
na cláusula ORDER BY), criando algo como um grupo dentro de outro grupo. Por exemplo,
selecionar o nome do autor, o ano de publicação e o título dos livros, organizando-os pelo
nome do autor e depois pelo ano de publicação. O resultado dessa consulta pode ser visto
na Tabela 58.
        SELECT Autor.Nome, Livro.Ano_Publicacao, Livro.TitLivro FROM Autor, Livro
        WHERE Autor.Cod_Autor=Livro.CodAutor
        GROUP BY Autor.Nome, Livro.Ano_Publicacao;

                                   Tabela 58 - Relação Resultante


                   Nome                 Ano_Publicacao                  TitLivro

                Pedro Alves                  2009                   Banco de Dados

                Pedro Alves                  2007                   Arquitetura de BD

                Pedro Alves                  2010                    BD Distribuídos

              Carolina Dantas                2010                      O Estranho

              Carolina Dantas                2009                     O Conhecido

               Olívia Duncan                 2000                       Sucesso



        Em alguns momentos, será necessário agrupar informações de forma condicional,
ou seja, especificar (filtrar) quais grupos deverão ser mostrados. Para isso, é utilizada
a cláusula HAVING. Você poderia perguntar, e por que não usar a cláusula WHERE? No
caso de filtragem de grupos, não é possível usar o WHERE, pois ela é usada somente para


                                                                                                         57
Banco de Dados



                      restringir as linhas que serão selecionadas para a formação dos grupos. Enquanto a cláusula
                      HAVING é usada para restringir os grupos já formados, ou seja, ela só é atendida depois do
                      agrupamento realizado.
                               A cláusula HAVING só pode ser utilizada em conjunto com a cláusula GROUP BY.
                      Ou seja, ela só existe se associada à cláusula GROUP BY (mas o oposto não). Assim, ela vem
                      depois do GROUP BY e antes do ORDER BY. A condição do HAVING só pode envolver os
                      campos/funções do SELECT. Vamos a um exemplo: Selecione o código das editoras cujo
                      preço médio dos livros é maior do que 60. Veja que nesse caso, primeiro tem de ser feito
                      o agrupamento (para poder calcular o preço médio dos livros por editora) e depois é que a
                      condição deverá ser aplicada, para indicar quais dos grupos deverão ser apresentados na
                      relação resultante. Esse é um caso típico de uso do HAVING. A relação resultante da consulta
                      sem usar a cláusula HAVING seria a da Tabela 59. Porém, com o uso do HAVING, os grupos
                      resultante seriam restrindos ao apresentado na Tabela 60.
                              SELECT CodEditora, AVG (Valor) AS MediaValor FROM LIVRO
                              GROUP BY CodEditora
                              HAVING MediaValor > 60
                              ORDER BY CodEditora;

                                                Tabela 59 - Relação Resultante sem HAVING


                                                    CodEditora          MediaValor

                                                           1               50,00

                                                           2               NULL

                                                           3               86,66




                                                Tabela 60 - Relação Resultante com HAVING


                                                    CodEditora           MediaValor

                                                           3                86,66



                                Outro exemplo seria: Selecionar o nome dos autores que publicaram mais de 2
                      livros. Vide a relação resultante na Tabela 61.
                              SELECT Autor.Nome, COUNT (DISTINCT Livro.TitLivro) FROM Livro, Autor
                              WHERE Autor.Cod_Autor = Livro.CodAutor
                              GROUP BY AUTOR.Nome
                              HAVING COUNT (DISTINCT LIVRO.Titulo) > 2;

                                                      Tabela 61 - Relação Resultante


                                            Autor.Nome           COUNT(DISTINCT Livro.TitLivro)

                                             Pedro Alves                       3




58
Banco de Dados



Operações sobre Conjuntos

        Algumas operações de conjunto foram incorporadas à linguagem SQL. Existem
as operações de União (UNION), Interseção (INTERSECT) e Subtração (EXCEPT). As
relações resultantes dessas operações são sempre um conjunto de tuplas, sendo que
tuplas duplicadas são eliminadas do resultado. A SQL também possui operações sobre
multiconjuntos (conjuntos que permitem repetição de elementos): UNION ALL, INTERSECT
ALL e EXCEPT ALL. Todas essas operações são aplicadas apenas às relações que sejam
compatíveis.

 Essas operações são úteis em queries que referenciam diferentes tabelas. Essas operações
 combinam resultados de dois ou mais comandos select em um único resultado. Por isso, são
 também conhecidos como joins verticais.

          Algumas observações sobre essas operações são: comandos SELECT devem
selecionar o mesmo número de colunas e as colunas correspondentes devem ser do mesmo
tipo. As linhas duplicadas são, automaticamente, eliminadas e a cláusula DISTINCT não pode
ser usada. Os nomes das colunas da primeira query (consulta) são os que aparecem na
relação resultante da operação.
        Vamos exemplificar, a seguir, cada uma dessas operações. Nos exemplos, considere
o seguinte modelo relacional:


     MEDICO (CodMedico (PK), Nome,                 DEPOSITANTE (CPF        (PK),   Nome,
     CRM) e                                        Agencia, Conta) e
     PACIENTE (CodPaciente (PK), Nome);            DEVEDOR (CPF (PK), Nome, Agencia,
                                                   Conta).

        União (UNION)

        Faz a união entre duas relações compatíveis, eliminando linhas repetidas. Em
outras palavras, gera-se uma nova relação com todas as tuplas das duas relações resultantes
envolvidas na união, sem repetir tuplas. Acrescenta-se ALL à operação para manter as linhas
repetidas. Vamos aos exemplos.
        Selecionar todos os clientes da agência A1 que tenham empréstimo ou tenham
feito depósito. Para isso, são realizadas duas consultas e os resultados são unidos em uma
única tabela.
        (SELECT * FROM Depositante WHERE Agencia = ‘A1’)
        UNION
        (SELECT * FROM Devedor WHERE Agencia = ‘A1’);
         Mesmo quando duas relações completas não são compatíveis, tais como MEDICO e
PACIENTE, podemos realizar união entre parte delas, tornando-as compatíveis pela escolha
dos atributos em comum. Por exemplo, selecionar o nome de todas as pessoas cadastradas
no hospital, independente da posição que ocupem.
        (SELECT Nome FROM Medico)
        UNION
        (SELECT Nome FROM Paciente);




                                                                                                             59
Banco de Dados



                               Interseção (INTERSECT)

                             Retorna apenas as linhas que pertencem às duas relações resultantes, se elas forem
                      compatíveis, sem repetição. Por exemplo, selecionar o nome de todas as pessoas que são
                      médicos e pacientes ao mesmo tempo.
                               (SELECT Nome FROM Medico)
                               INTERSECT
                               (SELECT Nome FROM Paciente);
                               Selecionar todos os clientes da agência A1 com empréstimo e depósito.
                               (SELECT * FROM Depositante WHERE Agencia = ‘A1’)
                               INTERSECT
                               (SELECT * FROM Devedor WHERE Agencia = ‘A1’);

                               Exceção (EXCEPT ou MINUS)

                              Retorna apenas as linhas que pertencem à primeira tabela, com exceção das que
                      aparecem na segunda. Em outras palavras, retorna somente as linhas da primeira query
                      (consulta) que não estão presentes no resultado da segunda query. Por exemplo, selecionar
                      o nome de todas as pessoas que são médicos e não são pacientes.
                               (SELECT Nome FROM Medico)
                               EXCEPT
                               (SELECT Nome FROM Paciente);
                             Selecionar todos os clientes da agência A1 que possuem conta, mas não fizeram
                      empréstimo.
                               (SELECT * FROM Depositante WHERE Agencia = ‘A1’)
                               EXCEPT
                               (SELECT * FROM Devedor WHERE Agencia = ‘A1’);


                      Manipulando Visões

                               Visões são tabelas virtuais que não ocupam espaço físico e são criadas a partir de
                      tabelas reais. Elas permitem criar tabelas personalizadas, de acordo com o perfil do usuário.
                      Visões são ótimas para substituir consultas frequentemente usadas. Para criar uma visão
                      utilizamos o seguinte comando:
                              CREATE         VIEW          Nome_Visão                 [Colunas_visão]           AS
                      (ExpressãoConsultaPreenchimentoVisao)
                               Por exemplo, criar uma visão com os clientes que tem conta ou empréstimo no
                      banco.
                               CREATE VIEW TodosClientes AS
                                        (SELECT * FROM Depositante)
                                        UNION
                                        (SELECT * FROM Devedor);
                             Outro exemplo, criar uma visão com os livros da editora Bookman com 10% de
                      desconto.

60
Banco de Dados



        CREATE VIEW LivrosBookmanDesconto (Titulo, Valor_Desconto) AS
                 (SELECT, TitLivro, Valor - (Valor * 0.1) FROM Livro, Editora
                 WHERE Livro.CodEditora = Editora.Cod_Editora AND
                                    Editora.Razao = ‘Bookman’);
         Também, é possível criar uma nova visão a partir de uma outra visão anteriormente
criada. Por exemplo, criar uma visão para todos os clientes da agência A1. Já criamos uma
visão com os clientes que tem conta ou empréstimo no banco. Vamos utilizar essa visão
criada para atender ao que se pede:
        CREATE VIEW TodosClientesA1 AS
                      (SELECT * FROM TodosClientes WHERE Agencia = ‘A1’);
        Após definida uma visão, qualquer operação de consulta pode ser aplicada sobre
ela. Consultas sobre visões são escritas da mesma forma como para uma tabela qualquer e
as operações realizadas sobre uma visão refletem nas tabelas físicas das quais elas derivam.
Por exemplo, selecionar o título e o valor dos livros da visão LivrosBookmanDesconto que
tenham valor acima de 50 reais.
        SELECT Titulo, Valor_Desconto FROM LivrosBookmanDesconto
        WHERE Valor_Desconto > 50;
        Para remover uma visão, utilizamos o comando:
                                     DROP VIEW Nome_Visão
        A remoção de uma visão é feita em cascata. Por exemplo, remover a visão chamada
TodosClientes:
        DROP VIEW TodosClientes;
        Como a remoção é feita em cascata, a visão TodosClientesA1, que foi criada
a partir da visão TodosClientes, também é removida. Outro exemplo, remover a visão
LivrosBookmanDesconto:
        DROP VIEW LivrosBookmanDesconto;.


Uma Noção da DCL (Data Control Language)

        A DCL cuida das autorizações de acesso. Isso porque um SGBD Relacional pode ser
acessado por diversos usuários e cada usuário possui um determinado perfil em relação
aos dados das tabelas ou visões. Alguns usuários só podem consultar, outros atualizar e
consultar, outros só inserir, outros podem tudo (por exemplo, o DBA), etc.
        O objetivo dos comandos da DCL é proteger os dados do uso indevido de qualquer
usuário através da configuração de privilégios por usuário. Os privilégios garantem
segurança e integridade dos dados, bem como a responsabilidade de cada usuário sobre
seus dados específicos. Dois comandos fazem parte da DCL: GRANT e REVOKE.
        O comando GRANT atribui privilégios de utilização de tabelas ou visões de uma
base de dados. A sintaxe desse comando é:
                      GRANT Privilégios ON Tabelas/Visões TO LoginUsuários
        Os privilégios podem ser:

    »   Select: pode executar uma consulta sobre a tabela
    »   Insert: pode executar uma inserção sobre a tabela


                                                                                                           61
Banco de Dados



                          »   Delete: pode apagar registros da tabela
                          »   Update: pode modificar registros da tabela
                          »   All Privileges: pode executar qualquer operação sobre a ela
                              Alguns exemplos são:
                              GRANT Select ON Livro, Autor TO Paulo, Joao
                              GRANT Select, Insert, Update ON TodosClientes TO Ana
                              GRANT All Privileges ON Depositante TO PUBLIC
                            O comando REVOKE revoga os privilégios de acesso dos usuários. A sintaxe desse
                      comando é:
                                          REVOKE Privilégios ON Tabelas/Visões FROM LoginUsuários
                              Alguns exemplos de uso são:
                              REVOKE Select ON Livro, Autor FROM Paulo, Joao
                              REVOKE Select, Insert, Update ON TodosClientes FROM Ana
                              REVOKE All Privileges ON Depositante FROM PUBLIC


                      Considerações Finais

                              Pronto! Agora você tem o poder de criar, manipular, deletar e consultar o seu banco
                      de dados. Porém, para que o SQL se torne mais familiar para você e você consiga utilizar com
                      mais facilidade os comandos e realizar consultas simples e aninhadas, você precisa praticar
                      bastante. Por isso, é importante a escolha de um SGBD onde você possa implementar o
                      banco de dados modelado em capítulos anteriores e possa inserir, atualizar e consultar os
                      dados desse banco de dados. A prática é a chave para o sucesso, não esqueça disso!


                                   Conheça Mais


                              Como mencionado no capítulo anterior, em geral, os livros de banco de dados
                      trazem um ou mais capítulo sobre SQL. Entre esses livros temos:

                              SILBERSCHATZ, Abraham; KORTH, Henry F; SUDARSHAN, S. Sistema de banco de
                              dados. Traduzido por Daniel Vieira. Rio de Janeiro: Elsevier;Campus, 2006.
                              ELMASRI, Ramez; NAVATHE, Shamkant B. Sistemas de banco de dados. 4a. ed. São
                              Paulo: Pearson Education do Brasil, 2005.
                              DATE, C. J. Introdução a sistemas de bancos de dados. Rio de Janeiro: Campus,
                              2000.
                              ALVES, W.P. Fundamentos de Bancos de Dados. Editora Érica, 2004.
                              Além destes, há livros específicos sobre SQL, independente de SGBD, tais como:

                              BEIGHLEY, Lynn. Use a Cabeça SQL. Starlin Alta Consult, 1ª Edição, 2008
                              KLINE, Daniel; KLINE, Kelvin E. Sql - O Guia Essencial - Manual de Referência
                              Profissional. Alta Books, 2010.
                              SHELDON, Robert; OPPEL, Andy. SQL – Um Guia para Iniciantes. Editora Ciência
                              Moderna, 3ª Edição, 2009.



62
Banco de Dados



DAMAS, Luís. Sql - Structured Query Language. Editora LTC, 6ª edição, 2007.




     Aprenda Praticando


Tomando como base as tabelas abaixo, vamos executar algumas consultas SQ.

                                 PRODUTO


               Cod_Prod (PK)       Nm_prod          Valor

                      001          Photoshop       150,00

                      002          Coreldraw       250,00

                      003            Flash          30,00

                      004             CAB          100,00

                      005           Adobe           NULL




                            PRODUTOS_PEDIDO

                Numero (PK)       Cod_Prod (PK)      Qtd

                      111               001           02

                      111               002           03

                      111               003           02

                      222               002           03

                      222               003           05

                      222               004           10

                      333               004           03




                                  PEDIDO


            Numero (PK)          Data          Cod_Fornec (FK)

                111            10/02/2010            F1

                222            23/03/2010            F2

                333            20/05/2010            F1




                                                                                               63
Banco de Dados



                                                             FORNECEDOR


                                           Cod_Fornec (PK)      Nome (PK)        Endereco

                                                  F1             InfoSoft        R. Flor, 25

                                                  F2             BRSofts         Av. Itu, 33



                             Vamos começar demonstrando algumas consultas bem simples, sem condição
                      alguma, usando a estrutura base SELECT atributos FROM nome_tabela e apresentando
                      também o uso de operadores aritméticos na apresentação dos dados.

                               Apresente todos os dados dos fornecedores cadastrados:
                               SELECT * FROM Fornecedor;
                          b) Apresente o nome de todos os produtos cadastrados
                               SELECT Nm_prod FROM Produto;
                          c) Apresente todos os dados dos produtos, sendo que o valor deve ser apresentado
                             com um desconto de 10%. Aqui, mesmo selecionando tudo, vamos destrinchar o
                             nome dos atributos, para poder apresentar o desconto. Veja que usamos também
                             apelido pra o campo do desconto
                               SELECT Cod_prod, Nm_prod, (Valor – (valor * 0.1)) AS Valor_Com_Desconto FROM
                               Produto;
                              Agora, vamos dar uma olhada no uso de funções. Lembre-se que essas funções que
                      vimos existem no SQL-ANSI, ou seja, na parte básica do SQL que toda versão deve oferecer.
                      Alguns SGBDs podem oferecer funções adicionais, além do básico.

                          d) Calcule a quantidade de pedidos realizados
                               SELECT Count(Numero) FROM Pedido;
                          e) Qual a média de preço dos produtos
                               SELECT AVG(valor) FROM Produto;
                          f) Qual o nome e o valor do produto mais caro?
                               SELECT Nm_prod, MAX(Valor) FROM Produto;
                          g) Qual o nome e o valor do produto mais barato?
                               SELECT Nm_prod, MIN(Valor) FROM Produto;
                              Comecemos agora a apresentar consultas mais elaborados, com a inclusão da parte
                      condicional (cláusula WHERE).

                          h) Apresente o nome dos produtos que custam mais de 100 reais.
                               SELECT Nm_prod FROM Produto WHERE Valor >100,00;
                          i)   Apresente o nome dos produtos cujo valor está entre 150 e 300 reais.
                               SELECT Nm_prod FROM Produto WHERE Valor BETWEEN 150,00 AND 300,00;
                          j)   Selecione o nome dos produtos que começam com a letra C.
                               SELECT Nm_prod FROM Produto WHERE Nm_prod LIKE ‘C%’;
                          k) Selecione o nome dos produtos que ainda não possuem valor definido.
                               SELECT Nm_prod FROM Produto WHERE Valor IS NULL


64
Banco de Dados



        Junções (JOINS) são usada em boa parte das consultas reais. Por isso, vamos ilustrar
alguns casos de junção.

    l)   Apresente o número do pedido, a data em que ele foi realizado e o nome do
         fornecedor do pedido, para todos os pedidos cadastrados, ordenando o resultado
         pelo nome do fornecedor.
         SELECT P.Numero, P.Data, F.Nome FROM Pedido P, Fornecedor F WHERE P.Cod_
         Fornec=F.Cod_Fornec ORDER BY F.Nome.
    m) Selecionar o número do pedido, o nome do produto pedido e o valor a ser pago por
       cada produto do pedido
         SELECT PP.Numero, P.Nm_prod, (P.Valor * PP.Qtd) AS A_Pagar FROM Produto P,
         Produtos_Pedido PP
       Para finalizar, vamos apresentar agora alguns exemplos que fazem uso de
agrupamento (GROUP BY) e de subconsultas.

    a) Apresentar o número do pedido e o total a pagar por ele para todos os pedidos
       realizados.
         SELECT PP.Numero, SUM(P.Valor * PP.Qtd) AS Valor_Total FROM Produto P,
         Produtos_Pedido PP GROUP BY PP.Numero;
    o) Selecione o nome dos produtos que estão fazendo parte de pelo menos um pedido.
         SELECT P.Nm_prod FROM Produto P WHERE P.Cod_Prod IN (SELECT DISTINCT
         PP.Cod_Prod FROM Produtos_Pedido PP);




                                                                                                           65
Banco de Dados




                                     Você Sabia?


                        Você sabia que a ordem em que as consultas SQL são construídas pode influenciar no desempenho
                        do SGBD? Pois é! Influencia sim. Para ter consultas mais otimizadas, seguem alguns conselhos.
                        » No tocante a modelagem e projeto do BD (Se não for muito tarde): Uma má performance
                        pode também ser resultado de uma modelagem ruim. É importante se preocupar com a
                        modelagem correta do problema e em realizar a normalização do modelo relacional produzido
                        pelo menos até a 3FN (Terceira Forma Normal).
                        » Use índices, mas não os crie em demasia. Muitos índices podem resultar em um efeito
                        adverso no desempenho.
                        » Procure no SELECT selecionar, exclusivamente, os atributos de que você necessita na
                        consulta. Procure não utilizar SELECT * porque o gerenciador de consultas deve ler primeiro a
                        estrutura da tabela antes de executar a sentença.
                        » Se utilizar várias tabelas na consulta (JOINs), especifique sempre a que tabela pertence cada
                        campo (atributo). Isso fará o gerenciador de consultas economizar o tempo de localizar a que
                        tabela pertence o campo. Por exemplo, ao invés de:
                               › SELECT Nome, Fatura FROM Cliente, Faturamento WHERE IdCliente = IdClienteFaturado,
                               procure sempre utilizar:
                               › SELECT Cliente.Nome, Faturamento.Fatura FROM Cliente, Faturamento WHERE
                               Cliente.IdCliente = Faturamento.IdClienteFaturado.
                        » Sempre que possível, procure usar nas condições da cláusula WHERE aqueles campos que
                        fazem parte da chave da relação ou relações sendo consultada(s).
                        » Quando for usar operadores de comparação, evite usar NOT em condições de pesquisa. Eles
                        podem diminuir a velocidade de recuperação de dados porque todos os registros em uma tabela
                        são avaliados. Sempre use condições de pesquisa positivas ao invés de negativas. As condições
                        de pesquisa negativas, tais como NOT BETWEEN, NOT IN e IS NOT NULL, atrasam as consultas.
                        » Utilize ORDER BY, GROUP BY e HAVING apenas se necessário, pois um tempo a mais é gasto
                        para organizar os dados da tabela resultante.
                        » Ao fazer a montagem da cláusula WHERE é interessante que a condição mais restritiva
                        seja avaliada em 1º lugar, uma vez que será retornado um subconjunto menor de dados.
                        Principalmente, se for haver um JOIN, já restringir a quantidade de dados antes do JOIN pode
                        garantir uma melhora no desempenho. A maioria dos otimizadores lê uma consulta da parte
                        inferior da clausula WHERE para cima. Nesse caso, a condição mais restritiva deve ficar por
                        último na clausula WHERE. Adicionalmente, quando se utilizam várias tabelas dentro da consulta
                        há que ter cuidado com a ordem das tabelas na cláusula FROM. Se desejarmos saber quantos
                        alunos se matricularam no ano 1996 e escrevermos:
                               › FROM Aluno, Matricula WHERE Aluno.IdAluno = Matricula.IdAluno AND Matricula.
                               Ano = 1996 - o gerenciador percorrerá todos os alunos para buscar suas matrículas e
                               devolver as correspondentes. Porém, se escrevermos:
                               › FROM Matricula, Aluno WHERE Matricula.Ano = 1996 AND Matricula.IdAluno = Aluno.
                               IdAluno - o gerenciador filtra as matrículas e depois seleciona os alunos, desta forma tem
                               que percorrer menos registros, melhorando o desempenho.
                        Nem sempre lembramos dessas recomendações quando estamos montando os SQLs. Porém, é
                        recomendado que você procure otimizar, pelo menos, os SQL mais críticos (mais utilizados ou
                        que envolvam mais tabelas). Por exemplo, revisando os SQLs montados em um programa antes
                        dele ir para produção.



                                    Atividades e Orientações de Estudos


                               Agora é a sua vez de fazer as atividades! Lembre que praticar é muito importante
                      pra fixar o conteúdo estudado! SQL, tal como qualquer linguagem de programação, só se
                      aprende exercitando!


66
Banco de Dados



        Simulado:

        Resolva as atividades, a seguir, em um documento texto, criando uma tabela de
respostas (tipo um gabarito) e poste o mesmo no ambiente virtual, no local indicado. Essa
atividade é para ser realizada INDIVIDUALMENTE e fará parte da sua avaliação somativa.
Usamos nesse exercício questões que fizeram parte de vários concursos da área de
informática.

    1) (Judiciário/Programação de Sistemas/TRE-MG/FCC/2005) Os comandos básicos
       do SQL, pertencentes a classe de linguagem de manipulação de dados são:
        a) drop e delete
        b) update e drop
        c) alter e delete
        d) alter e drop
        e) update e delete
    2) (Judiciário/Programação de Sistemas/TRE-MG/FCC/2005) Uma subconsulta SQL é
       uma instrução SELECT que NÃO pode estar aninhada dentro de uma instrução:
        a) Create
        b) Select
        c) Insert
        d) Delete
        e) Update
    3) (Analista Judiciário/Análise de Sistemas/TRE-RN/FCC/2005) Em um banco de
       dados relacional, é comando DDL:
        a) DELETE FROM TABLE
        b) SELECT ALL FROM TABLE
        c) CREATE INDEX
        d) UPDATE
        e) INSERT
    4) (Analista de Sistemas – Desenvolvimento de Sistemas/BADESC/FGV/2010) A
       figura, a seguir, mostra o modelo relacional de um Banco de Dados de um sistema
       acadêmico. Esse modelo possui as tabelas Aluno, NotaAluno e Disciplina:




        Assinale a alternativa que indique o comando SQL que, ao ser executado em um
        SGBD relacional baseado nesse modelo, retornará o nome de cada disciplina e a
        média das notas dos alunos da disciplina.
        a) SELECT Disciplina.nome, sum(nota)/count(nota)


                                                                                                        67
Banco de Dados



                             FROM Disciplina, NotaAluno
                             WHERE Disciplina.cod_disciplina=NotaAluno.cod_disciplina
                             GROUP BY Disciplina.nome;
                         b) SELECT Disciplina.nome, sum(nota)/count(nota)
                             FROM Disciplina, NotaAluno
                             WHERE Disciplina.cod_disciplina = NotaAluno.cod_disciplina AND Aluno.cod_
                             aluno = NotaAluno.cod_aluno
                             ORDER BY Aluno.cod_Aluno;
                         c) SELECT Disciplina.nome, count(nota)/sum(nota) FROM Disciplina, NotaAluno
                             WHERE Disciplina.cod_disciplina = NotaAluno.cod_disciplina AND Aluno.cod_
                             aluno = NotaAluno.cod_aluno
                             GROUP BY Disciplina.cod_disciplina;
                         d) SELECT Disciplina.nome, avg(nota) FROM Disciplina, NotaAluno
                             WHERE Disciplina.cod_disciplina = NotaAluno.cod_disciplina
                             ORDER BY Disciplina.nome;
                         e) SELECT Disciplina.nome, avg(nota) FROM Disciplina, NotaAluno
                             WHERE Disciplina.cod_disciplina = NotaAluno.cod_disciplina
                             GROUP BY Aluno.nome;
                      5) (Analista de Sistemas Júnior – Processos de Negócios/Petrobrás/
                         CESGRANRIO/2010) Considere as instâncias de relações R1 e R2 apresentadas
                         abaixo, onde o cabeçalho de cada uma dessas instâncias de relações apresenta os
                         respectivos nomes das colunas.

                                          R1     sno     pno        R2      pno

                                                  1       1                  1

                                                  1       2                  2

                                                  1       3

                                                  1       4

                                                  2       1

                                                  2       2

                                                  3       2

                                                  4       2

                                                  4       4



                         Considere a expressão em SQL:
                         SELECT R1.sno
                         FROM R1
                         WHERE R1.pno >= ALL (SELECT R2.pno FROM R2)



68
Banco de Dados



     O resultado dessa consulta é:

a)     sno         b)    sno         c)   sno      d)    sno        e)    sno

        1                 1               1               1                1

        2                 1               2               2                1

        2                 1               3               3                1

        2                 2               3               3                2

        4                 2               4               4                3

        4                 3               4               4                4

                          4               4                                4



6) (Analista de Sistemas Júnior – Processos de Negócios/Petrobrás/
   CESGRANRIO/2010) Em SQL, a instrução que permite alterar vários registros é:
     a) Delete
     b) Create Index
     c) Update
     d) Change
     e) Atualize
7) (Técnico em Informática/Petrobrás/CESGRANRIO/2010) Na linguagem SQL, a
   estrutura básica da instrução select consiste em três cláusulas que são:
     a) Distinct, select e where
     b) Insert, update e select
     c) Replace, join e where
     d) Update, replace e include
     e) Select, from e where
8) (Técnico em Informática/Petrobrás/CESGRANRIO/2010) Considere a instrução :
   DELETE FROM Aluno WHERE idade < 21 AND nome like “*A”; Esta instrução:
     a) Elimina a tabela Aluno
     b) Elimina os registros da tabela que verifiquem, simultaneamente, as duas
        condições expressas.
     c) Elimina os registros da tabela em que a idade seja inferior a 21 ou o nome
        comece com a letra A.
     d) Elimina os registros da tabela que verifiquem pelo menos uma das condições
        expressas.
     e) Nenhuma das anteriores.
9) (Analista de Tecnologia da Informação – Banco de Dados /MPE-RN/FCC/2010)
   Para eliminar as linhas em duplicidade no resultado de uma consulta em uma
   tabela, no commando SELECT da linguagem SQL, utiliza-se:
     a) A cláusula ORDER BY


                                                                                                 69
Banco de Dados



                         b) A cláusula HAVING.
                         c) Uma condição da cláusula WHERE.
                         d) A palavra-chave DISTINCT.
                         e) As palavras-chave NOT DUPLICATE
                      10) Analista de Sistemas /TCE-AL/FCC/2008) Considere o seguinte resultado de uma
                          consulta SQL a tabela chamada TabPessoa, onde Sobrenome é o nome da coluna da
                          qual se deseja obter os dados (existem outras colunas):

                                                        Sobrenome

                                                        Francisco

                                                          Inácio



                         Na hipótese de ambos os sobrenomes estarem adequadamente cadastrados na
                         TabPessoa, sem importar a ordem, a correta expressão que obtém tal resultado é:
                         a) SELECT Sobrenome FROM TabPessoa WHERE Sobrenome = ‘Francisco’ AND
                            ‘Inácio’
                         b) SELECT Sobrenome FROM TabPessoa WHERE Sobrenome IN (‘Francisco’,’Inácio’)
                         c) SELECT FROM TabPessoa WHERE Sobrenome = (‘Francisco’ OR ‘Inácio’)
                         d) SELECT IN TabPessoa WHERE Sobrenome IN (‘Francisco’,’Inácio’)
                         e) SELECT FROM TabPessoa WHERE Sobrenome IN (‘Francisco’,’Inácio’)
                      11) (Analista de Sistemas Júnior – Engenharia de Software / Petrobrás / CESGRANRIO
                          / 2008) Considere as tabelas de um banco de dados relacional descritas abaixo,
                          onde os campos que compõem as chaves primárias estão assinalados com *.

                                 TABELA                            CAMPOS

                                CLIENTE      *CODIGO_C, CPF, NOME, CIDADE

                                PRODUTO      *CODIGO_P, DESCRICAO, PRECO

                                VENDA        *CODIGO_C, *CODIGO_P, CPF, DATA, QUANTIDADE



                         Há uma chave estrangeira de VENDA para CLIENTE com base nos campos CODIGO_C
                         e de VENDA para PRODUTO com base nos campos CODIGO_P. O campo CPF é chave
                         candidata para CLIENTE e também é armazenado na tabela VENDA. Os campos
                         NOME e DESCRICAO também são chaves candidatas de suas respectivas tabelas.
                         Os campos CIDADE, PRECO, DATA e QUANTIDADE admitem valores repetidos.
                         Considere o comando em SQL apresentado a seguir.
                         SELECT C.CIDADE, AVG(P.PRECO) FROM CLIENTE C, PRODUTO P, VENDA V
                         WHERE C.CODIGO_C = V.CODIGO_C AND
                                  P.CODIGO_P = V.CODIGO_P AND
                                  P.PRECO > 100
                         GROUP BY C.CIDADE
                         HAVING AVG(P.PRECO) < 200



70
Banco de Dados



   a) Para cada cidade, a média de preço de produtos vendidos a clientes da cidade
      com valores acima de 100, se a média for menor que 200.
   b) Para cada cidade, a média de preço dos produtos vendidos a clientes da cidade
      com valores entre 100 e 200.
   c) Para cada cidade, a quantidade de produtos vendidos com valores entre 100 e
      200.
   d) Para cada cidade, a média de preço dos produtos vendidos a clientes da cidade
      que compraram produtos de valores maiores do que 100 e cuja média de
      compra é menor do que 200.
   e) Apenas a cidade cuja média de preço dos produtos vendidos é a mais alta
      dentre as que tiveram média menor do que 200 e produtos vendidos com
      valores acima de 100.
12) (Analista Judiciário – Análise de Sistemas - Suporte /TJ-PA/FCC/2009) Dada uma
    linha de tabela relacional:

              TABELA: Turma_Alunos

              Codigo_Turma                   Alpha          ADM1

              Num_Aluno                     Number           16

              Media_Final                   Number           7,5



   Após a execução do comando SQL:
   Select Codigo_Turma, count(*) as Total_Alunos from Turma_Alunos
   group by Codigo_Turma;
   será apresentado como resultado:

   a) a quantidade de alunos de cada turma.
   b) o número de alunos de todas as turmas.
   c) os códigos das turmas existentes.
   d) a quantidade de turmas de cada curso.
   e) a quantidade total de turmas existentes.
13) (Analista Judiciário – Análise de Sistemas - Desenvolvimento /TJ-SE/FCC/2009)
    A expressão SQL-ANSI: SELECT coluna FROM tabela WHERE coluna LIKE ‘literal%’ ;
    recupera todas as:
   a) linhas com coluna cujo conteúdo termina com literal.
   b) linhas com coluna cujo conteúdo inicia com literal.
   c) linhas com coluna cujo conteúdo contém literal em qualquer posição.
   d) colunas de tabela cujo nome termina com literal.
   e) colunas de tabela cujo nome inicia com literal.
14) (Analista de Sistemas /CAMARA-SJC/FIP/2009) Uma consulta feita a uma tabela de
    CLIENTE de um banco de dados relacional retornou o seguinte resultado:




                                                                                                  71
Banco de Dados



                                                     Empresa           Faturamento

                                                    Anabiotíca          190.044,09

                                                     Petrobana          234.511,23

                                                    Canalservice        123.387,34

                                                   Anablematica         734.576,00



                              O comando SQL que pode ter gerado tal resultado é:

                              a) SELECT Empresa, Faturamento FROM CLIENTE WHERE Empresa LIKE “ana”
                              b) SELECT Empresa, Faturamento FROM CLIENTE WHERE Empresa LIKE “%ana%”
                              c) SELECT Empresa, Faturamento FROM CLIENTE WHERE Empresa = “%ana%”
                              d) SELECT Empresa, Faturamento FROM CLIENTE WHERE Empresa BETWEEN
                                 “ana%ana”
                              e) SELECT Empresa, Faturamento FROM CLIENTE WHERE Empresa BETWEEN
                                 “%ana%”

                              Atividade Prática (Mini-Projeto):

                              Resolva as atividades, a seguir, em um documento texto e poste o mesmo no
                      ambiente virtual, no local indicado. Essa atividade é para ser realizada em DUPLA (escolha
                      seu companheiro de trabalho!) e fará parte da avaliação somativa de vocês. Dado o modelo
                      conceitual da figura abaixo, faça o que se pede.




72
Banco de Dados



        a) Apresente o modelo relacional correspondente deste diagrama conceitual.
        b) Normalize o modelo relacional obtido até a 3FN.
        c) Crie as tabelas e os índices, de acordo com o modelo normalizado
        d) Insira dados nas tabelas (pelo menos 3 linhas em cada tabela).
        e) Elabore pelo menos 3 SQLs de atualização para qualquer uma das tabelas, a sua
           escolha.
        f) Elaborar pelo menos três SQLs de exclusão para qualquer uma das tabelas, a
           sua escolha.
        g) Elaborar pelo menos cinco consultas que envolvam seleção condicional de
           dados usando, em pelo menos uma delas, ordenação.
        h) Elaborar pelo menos cinco consultas que envolvam junção de duas ou mais
           tabelas;
        i)   Elaborar pelo menos duas consultas que envolvam agrupamento de dados.
        j)   Elaborar pelo menos duas consultas que envolvam subconsultas.




              Vamos Revisar?


        Neste capítulo foi estudada a DML (Data Manipulation Language), que é a parte da
linguagem SQL que possui comandos para manipulação de dados. Ou seja, possui comandos
para inserção (INSERT), atualização (UPDATE), deleção (DELETE) e consulta (SELECT) aos
dados. Adicionalmente, neste capítulo também foram vistas operações com conjuntos de
dados, tais como união (UNION), interseção (INTERSECT) e exceção (EXCEPT) e, brevemente,
a DCL (Data Control Language), que contém comandos para autorizar ou não o acesso aos
dados (GRANT e REVOKE, respectivamente).




                                                                                                       73
Banco de Dados




                      Considerações Finais
                              Olá, cursista!
                             Esperamos que você tenha aproveitado este quarto e último módulo da disciplina
                      Banco de Dados, assim como a disciplina como um todo.
                               Com tudo que foi estudado nesta disciplina, você já tem o conhecimento necessário
                      para modelar, projetar, criar o seu banco de dados e trabalhar com ele, armazenando,
                      alterando, deletando e consultado os dados armazenados. Claro que o aprimoramento
                      desse conhecimento adquirido recentemente só virá com a prática e com leituras adicionais
                      para aprofundamento. Assim sendo, quem quiser saber mais sobre banco de dados ou
                      quiser trabalhar com os mesmos, aproveite as referências indicadas em cada capítulo e
                      bons estudos! Adicionalmente, procure fazer uso de algum SGBD para praticar o uso de SQL
                      e divirta-se!
                              Foi um prazer ter estado com vocês nessa jornada de conhecimento!
                              Até mais!
                                                   Sandra de Albuquerque Siebra
                                                               Autora




74
Banco de Dados




     Referências

ALVES, W.P. Fundamentos de Bancos de Dados. Editora Érica, 2004.
BATINI, C.; CERI, S.; NAVATHE, S. B. Conceptual database design: an entity-
relationship approach. San Francisco: Benjamim Cummings, 1992.
BEIGHLEY, Lynn. Use a Cabeça SQL. Starlin Alta Consult, 1ª Edição, 2008
COUGO, Paulo Sérgio. Modelagem Conceitual e Projeto de Banco de Dados.
Elsevier Editora, 1997.
DAMAS, Luís. Sql - Structured Query Language. Editora LTC, 6ª edição, 2007.
DATE, C. J. Banco de dados: tópicos avançados. Rio de Janeiro : Campus, 1988.
DATE, C. J. Introdução a Sistemas de Banco de Dados. Elsevier Editora, 2004.
ELMASRI, Ramez;NAVATHE, Shamkant B. Sistemas de banco de dados. Traduzido
por: Marilia Guimarães Pinheiro et al. 4a. ed. São Paulo: Pearson Education do
Brasil, 2005.
HEUSER, Carlos Alberto. Projeto de Banco de Dados. 3. Edição., Porto Alegre : Sagra-
Luzzatto, 2004.
KLINE, Daniel; KLINE, Kelvin E. Sql - O Guia Essencial - Manual de Referência
Profissional. Alta Books, 2010.
KORTH, H. F.; SILBERSCHATZ, A.; SUDARSHAN, S. Sistema de Banco de Dados.
Elsevier Editora, 2006.
KROENKE, David M. Banco de Dados: Fundamentos, Projeto e Implementação. 6ª
Edição. Editora LTC, 1999.
LAENDER, A. H. F. ; CASANOVA, M. A. ; TUCHERMAN, L. . On the Design and
Maintenance of Optimized Relational Representations of Entity-Relationship
Schemas. Data & Knowledge Engineering, Amsterdam, v. 11, n. 1, p. 1-20, 1993
Revista SQL Magazine - http://www.sqlmagazine.com.br
SETZER, V. W. Banco de dados. 3.ed. São Paulo : Revista Edgard Blucher, 1989.
SHELDON, Robert; OPPEL, Andy. SQL – Um Guia para Iniciantes. Editora Ciência
Moderna, 3ª Edição, 2009
SILBERSCHATZ, Abraham; KORTH, Henry F;SUDARSHAN, S. Sistema de banco de
dados. Traduzido por Daniel Vieira. Rio de Janeiro: Elsevier;Campus, 2006.




                                                                                                   75
Banco de Dados




                      Conheça a Autora

                              Sandra de Albuquerque Siebra

                              Doutora em Ciência da Computação, pelo Centro de Informática da UFPE onde
                      trabalhou com Ambientes Virtuais de Aprendizagem e Ambientes Colaborativos em Geral.
                      Ensinou na Faculdade Integrada do Recife (FIR) e na Universidade Católica de Pernambuco
                      (UNICAP), além de ter trabalhado como gerente de projetos no Centro de Estudos e Sistemas
                      Avançados do Recife (CESAR). Atualmente, é professora da Universidade Federal Rural de
                      Pernambuco (UFRPE). Atua na equipe de Educação a Distância da UFRPE e no Departamento
                      de Estatística e Informática (DEINFO), como professora autora de materiais didáticos para
                      cursos a distância, já tendo também atuado como coordenadora de curso e professora
                      executora de disciplinas. Tem experiência, trabalhos desenvolvidos e artigos publicados nas
                      áreas de Educação a Distância, Interfaces Homem- Máquina, Sistemas Colaborativos, Banco
                      de Dados, Análise e Projeto de Sistemas Orientados a Objetos, Sistemas de Informação e
                      Engenharia de Software. Atualmente, desenvolve pesquisas sobre contextualização de
                      interações em ambientes virtuais de aprendizagem e trabalho cooperativo.




76

Banco de dados_-_volume_4_v10

  • 1.
    UNIVERSIDADE FEDERAL RURALDE PERNAMBUCO (UFRPE) COORDENAÇÃO GERAL DE EDUCAÇÃO A DISTÂNCIA (EAD/UFRPE) Banco de Dados Sandra de Albuquerque Siebra Volume 4 Recife, 2010
  • 2.
    Universidade Federal Ruralde Pernambuco Reitor: Prof. Valmar Corrêa de Andrade Vice-Reitor: Prof. Reginaldo Barros Pró-Reitor de Administração: Prof. Francisco Fernando Ramos Carvalho Pró-Reitor de Extensão: Prof. Paulo Donizeti Siepierski Pró-Reitor de Pesquisa e Pós-Graduação: Prof. Fernando José Freire Pró-Reitor de Planejamento: Prof. Rinaldo Luiz Caraciolo Ferreira Pró-Reitora de Ensino de Graduação: Profª. Maria José de Sena Coordenação Geral de Ensino a Distância: Profª Marizete Silva Santos Produção Gráfica e Editorial Capa e Editoração: Rafael Lira, Italo Amorim e Arlinda Torres Revisão Ortográfica: Elias Vieira Ilustrações: Mário França Coordenação de Produção: Marizete Silva Santos
  • 3.
    Sumário Apresentação................................................................................................................. 4 Conhecendo o Volume 4 ................................................................................................ 5 Capítulo 10 – Álgebra e Cálculo Relacional ..................................................................... 7 Álgebra Relacional ...........................................................................................................7 Álgebra Relacional: Operadores de Tabelas ..................................................................11 Capítulo 11 – Criando e Mantendo um Banco de Dados ............................................... 26 A SQL .............................................................................................................................26 Capítulo 12 – Consultas em Banco de Dados Relacionais .............................................. 39 Inserindo Dados em Tabelas ..........................................................................................39 Considerações Finais .................................................................................................... 74 Conheça a Autora ........................................................................................................ 76
  • 4.
    Apresentação Caro(a) cursista, Seja bem-vindo(a) ao quarto módulo do curso Banco de Dados! Neste quarto módulo, vamos aprender a manipular um SGBD de forma a criar, manter e consultar o banco de dados que você antes aprendeu a modelar. Para fazer isso, estudaremos principalmente a linguagem SQL, presente em todos os banco de dados relacionais e de grande utilidade no acesso a eles. Adicionalmente, estudaremos um pouco de álgebra relacional e cálculo relacional que são formas de representar matematicamente as operações que podem ser aplicadas a um Banco de Dados. Bons estudos! Sandra de Albuquerque Siebra Autora 4
  • 5.
    Banco de Dados Conhecendoo Volume 4 Neste quarto volume, você irá encontrar o Módulo 4 da disciplina de Banco de Dados. Para facilitar seus estudos, veja a organização deste quarto módulo. Módulo 4 – Criação, Manutenção e Consulta a Banco de Dados Carga horária do Módulo 4: 15 h/aula Objetivo do Módulo 4: » Introduzir os principais conceitos referentes a álgebra relacional e o cáclulo relacional como formas de manipulação e consulta a BD. » Examinar os principais comandos em SQL para criação e manutenção de banco de dados. » Examinar os principais comandos em SQL para consultas simples e aninhadas a banco de dados. Conteúdo Programático do Módulo 4: » Álgebra Relacional. » Cálculo Relacional de Tupla e Cálculo Relacional de Domínio. » SQL – Conceitos básicos, comandos para criação e atualização do banco de dados. » SQL - Consultas básicas e Consultas Aninhadas. 5
  • 6.
    Banco de Dados Capítulo 10 O que vamos estudar neste capítulo? Neste capítulo, vamos estudar os seguintes temas: » Álgebra Relacional. » Cálculo Relacional de Tupla. » Cálculo Relacional de Domínio. Metas Após o estudo deste capítulo, esperamos que você: » Compreenda o que é álgebra relacional e cálculo relacional. » Consiga diferenciar o cálculo relacional de tupla e de domínio. » Consiga fazer uso de alguns comandos da álgebra relacional. 6
  • 7.
    Banco de Dados Capítulo10 – Álgebra e Cálculo Relacional Vamos conversar sobre o assunto? Até aqui, já estudamos como modelar e otimizar nosso modelo para um banco de dados relacional. Um modelo relacional representa o banco de dados como um conjunto de relações. Uma relação pode ser pensada como uma tabela de valores, onde cada linha na tabela representa uma coleção de valores de dados relacionados. Para acessar e manipular esses valores há duas categorias de linguagens que podem ser utilizadas: as linguagens formais (a álgebra relacional e o cálculo relacional) e as linguagens comerciais, que são baseadas nas linguagens formais (tal como a SQL – Structured Query Language). As linguagens formais são justamente as que daremos uma olhada nesse capítulo e uma das linguagens comerciais mais utilizadas (a SQL) será assunto dos dois capítulos finais desse volume. Neste capítulo, vamos estudar as linguagens formais para consulta e manipulação dos dados em um banco de dados: a álgebra relacional e o cálculo relacional. Álgebra Relacional A Álgebra Relacional é uma linguagem de consulta formal, porém procedimental (procedural), 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. Ela consiste de um conjunto de operações que têm como entrada uma ou duas relações e produzem, como resultado, uma nova relação. Os operadores da álgebra relacional podem ser divididos em dois grupos: » Operadores de Conjuntos: são operadores típicos definidos pela álgebra para conjunto, tais como união, interseção, diferença e produto cartesiano. As operações com esses operadores se aplicam a duas relações que obedeçam à “compatibilidade de união”, ou seja, ambas as relações devem apresentar atributos que pertençam respectivamente aos mesmos domínios. » Operadores de Tabelas: são operadores definidos especialmente para a manipulação de tuplas, em bases de dados relacionais tais como: Select, Project e Join, entre outras. As operações com esses operadores se aplicam a quaisquer relações. Esses operadores serão detalhados nas seções a seguir. Observação As linguagens disponíveis para acesso a BDs relacionais, inclusive o SQL, não utilizam os mesmos operadores ou nomes definidos pela álgebra relacional. Entretanto todos, ou quase todos, os operadores da álgebra relacional podem ser escritos usando estas linguagens. 7
  • 8.
    Banco de Dados Álgebra Relacional: Operadores de Conjuntos São operadores binários e para utilizá-los, é preciso se assegurar de que as duas relações envolvidas nas operações tenham o mesmo tipo de tuplas, ou seja, pertençam ao mesmo domínio. Essa condição é chamada união compatível. Em outras palavras, duas relações R1 (A1, A2,..., An) e R2 (B1, B2, ..., Bn) são união compatível se elas tiverem o mesmo grau n, e dom(Ai) = dom(Bi) para 1 ≤ i ≤ n. Isso significa que as duas relações têm o mesmo número de atributos e que cada par de atributos correspondentes pertence ao mesmo domínio. Pode-se definir as operações de união, interseção, diferença e produto cartesiano sobre duas relações que sejam união compatível R1 e R2. Resumidamente: » União (R1 ∪ R2) - todas as tuplas de R1 e todas as tuplas de R2, sendo que tuplas duplicadas são eliminadas. » Interseção (R1 ∩ R2) - todas as tuplas comuns a R1 e R2. » Diferença (R1 – R2) - todas as tuplas de R1 que não estão em R2. » Produto Cartesiano (R1 x R2) - combinação das tuplas de R1 com as de R2. Vamos detalhar e exemplificar, a seguir, cada uma dessas operações. Mas, antes, algumas observações sobre essas operações: » As operações de união e interseção são operações comutativas. Ou seja: R1 ∪ R2 = R2 ∪ R1 e R1 ∩ R2 = R2 ∩ R1. » Já a operação de diferença não é comutativa: R - S ≠ S - R. » As operações de união e interseção são binárias, mas podem ser aplicadas a qualquer número de relações e ambas são operações associativas. Assim: R ∪ (S ∪ T) = (R ∪ S) ∪ T e R ∩ (S ∩ T) = (R ∩ S) ∩ T. Considere como base para os exemplos das operações as relações Professor e Aluno representadas pelas Tabelas 1 e 2. Tabela 1 - Relação Professor Tabela 2 - Relação Aluno CPF Nome CPF Nome 1001 Ana Maria 1002 João 1002 João 1116 Mércia 1003 Pedro 1900 Ronaldo União: A ∪ B União é a operação entre duas relações “união compatível” (mesmo número de atributos e com domínio compatível) que gera uma relação resultante contendo todas as tuplas (linhas) das duas relações originais, com eliminação das tuplas duplicadas. Ela é denotada pelo símbolo ∪. Por exemplo, a união das relações Professor e Aluno representadas pelas Tabelas 1 e 2 é a relação representada pela Tabela 3. 8
  • 9.
    Banco de Dados Tabela 3 – Relação Resultante de Professor ∪ Aluno CPF Nome 1001 Ana Maria 1002 João 1003 Pedro 1116 Mércia 1900 Ronaldo Interseção: A ∩ B Interseção é a operação entre duas relações “união compatível” que gera uma relação resultante contendo todas as tuplas (linhas) presentes em ambas as relações originais. Ela é denotada pelo símbolo ∩. Por exemplo, a interseção das relações Professor e Aluno representadas pelas Tabelas 1 e 2 é a relação representada pela Tabela 4. Tabela 4 - Relação Resultante de Professor ∩ Aluno CPF Nome 1002 João Diferença: A – B Diferença é a operação entre duas relações “união compatível” que gera uma relação resultante contendo todas as linhas que estão na primeira relação, e que não aparecem na segunda. Ela é denotada pelo símbolo –. Por exemplo, a diferença das relações Professor e Aluno representadas pelas Tabelas 1 e 2 (Professor – Aluno) é a relação representada pela Tabela 5, que contém as tuplas das relação Professor que não estão na relação Aluno. Tabela 5 - Relação Resultante de Professor – Aluno CPF Nome 1001 Ana Maria 1003 Pedro Para mostrar que a operação de diferença não é comutativa, vamos agora fazer Aluno – Professor, ou seja, as tuplas que estão na relação Aluno, mas que não estão na relação Professor. Veja pela relação resultante representada na Tabela 6 que os resultados da diferença, mudando a ordem das relações são diferentes. 9
  • 10.
    Banco de Dados Tabela 6 - Relação Resultante de Aluno – Professor CPF Nome 1116 Mércia 1900 Ronaldo Produto Cartesiano: A x B O produto cartesiano combina duas relações gerando uma terceira cujas linhas representam todas as possíveis combinações das linhas (tuplas) das relações originais. Um esquema dessa combinação pode ser vista na Figura 1. Figura 1 - Esquema de combinações do Produto Cartesiano O produto cartesiano é uma operação binária e é representado pelo símbolo X. O formato geral da operação é: relação_1 X relação_2 . Vamos dar um exemplo. Qual seria o resultado do produto cartesiano Cidade x Estado (vide Tabelas 7 e 8)? Tabela 7 - Relação Cidade Tabela 8 - Relação Estado Código Nome UF Região 1 Recife PB Nordeste 2 Manaus AM Norte 3 João Pessoa O resultado seria a relação resultante apresentada na Tabela 9. Veja que esta relação resultante apresenta a combinação de todas as tuplas da relação Cidade, com todas as tuplas da relação Estado. 10
  • 11.
    Banco de Dados Tabela 9 - Relação Resultante Código Nome UF Região 1 Recife PB Nordeste 2 Natal PB Nordeste 3 João Pessoa PB Nordeste 1 Recife AM Norte 2 Natal AM Norte 3 João Pessoa AM Norte Renomear para diferenciar: O Produto Cartesiano entre duas relações R1 e R2 (R1 x R2) apresenta problemas quando: * As relações têm mesmo nome; * Se se quer fazer o produto de uma relação com ela mesma ou * O produto cartesiano está envolvido com a relação resultante de expressões (que vamos ver o que são daqui a pouco). Isso porque um mesmo nome de atributo pode aparecer tanto em R1 quanto em R2. Por isso, é preciso estabelecer um modo de diferenciar esses atributos na relação resultante. Para isso, pode- se anexar ao atributo o nome da relação a qual ele pertença: nome_relacao.nome_atributo. Por exemplo, se fizéssemos o produto cartesiano entre as relações Professor e Aluno (vide Tabelas 1 e 2), como as duas tabelas possuem atributos de mesmo nome, a relação resultante ficaria com as seguintes colunas: (Professor.CPF, Professor.Nome, Aluno.CPF, Aluno.Nome) Álgebra Relacional: Operadores de Tabelas Os operadores de tabela manipulam tuplas em bases de dados relacionais e podem ser aplicados a quaisquer relações. A seguir, descreveremos cada uma das operações. Seleção O operador de seleção é usado para selecionar tuplas que satisfaçam uma determinada condição. Essas tuplas selecionadas geram uma relação resultante. O esquema da relação resultante é o mesmo da relação original. O operador de seleção é representado pela letra grega sigma (δ) e seu formato geral é: δ condição(tabela ou relação). O operador da seleção é unário, ou seja, seleciona tuplas de somente uma relação. Vamos dar alguns exemplos a partir da relação Cidade (vide Tabela 10). 11
  • 12.
    Banco de Dados Tabela 10 - Relação Cidade Código Nome É_capital UF 1 Recife S PE 2 Natal S RN 3 João Pessoa S PB 4 Patos N PB δ UF = ‘PB’(cidade) daria como resultado a relação da Tabela 11, que atenderia a algo como: selecione da relação cidade, as tuplas cuja UF seja igual ao valor ‘PB’. Tabela 11 - Relação Resultante Código Nome É_capital UF 3 João Pessoa S PB 4 Patos N PB Para especificar as condições da seleção podemos utilizar: valores constantes, nome de atributos (colunas), operadores relacionais (=, <, >, <=, >=, ≠) ou operadores lógicos (and, or, not). Por exemplo, δ UF=’PB’ and E_Capital=’N’(CIDADE) daria como resultado a relação da Tabela 12, que atenderia a algo como: selecione da relação cidade, as tuplas cuja UF seja igual ao valor ‘PB’ e o campo E_Capital tenha o valor ‘N’. Tabela 12 - Relação Resultante Código Nome É_capital UF 4 Patos N PB Vamos a outro exemplo, suponha o esquema de relação Empregado (CPF, Nome, DataNasc, Endereço, Sexo, NumDep, Salario). Agora, suponha que desejamos selecionar os empregados que trabalham no departamento 10 e ganham mais de 1500 ou aqueles que trabalham no departamento 3 e ganham mais que 4000. Como ficaria? δ (NumDep = 10 and salario > 1500) or (NumDep=3 and salario > 4000) (Empregado) A operação de seleção é comutativa, ou seja, uma sequência de seleção pode ser aplicada em qualquer ordem: δ <cond1> (δ <cond2> (Relação)) = δ <cond2> (δ <cond1> (Relação)) Sempre é possível combinar uma propagação de operações de seleção dentro de uma única operação de seleção, fazendo uso de uma condição conjuntiva (AND): δ <cond1> (δ <cond2> (Relação)) = δ <cond1> and <cond2> (Relação) δ <cond1> (δ <cond2> ( ... (δ <condN> (Relação)) ...)) = δ <cond1> AND <cond2> AND ... AND <condN> (Relação) 12
  • 13.
    Banco de Dados Projeção A operação de projeção é unária e opera sobre uma única relação gerando outra relação resultante que conterá todas as linhas da relação original, mas apenas as colunas (atributos) que se deseja projetar (e que foram especificadas na operação). Ou seja, retorna parte da relação deixando de fora os atributos que não foram solicitados. Na relação resultante as tuplas (linhas) duplicadas são eliminadas. O formato geral da operação de projeção é: π A1, A2, …, An (Relação) onde A1, A2, ..., An são nomes de atributos da relação. Vamos dar um exemplo. Tomando como base a relação Cidade (vide Tabela 10), vamos supor que queremos selecionar (projetar) apenas os atributos Nome e UF. Daí precisaríamos da seguinte operação: π Nome, UF (Cidade). A relação resultante dessa projeção seria a apresentada na Tabela 13. Observe que a relação resultante tem todas as tuplas da relação original, mas só apresenta os atributos especificados na operação de projeção. Além disso, observe que estes atributos aparecem na mesma ordem em que foram especificados. Tabela 13 - Relação Resultante da Projeção Nome UF Recife PE Natal RN João Pessoa PB Patos PB Na verdade, se observarmos bem, o operador de projeção também serve para selecionar. Porém, enquanto o operador de SELEÇÃO seleciona tuplas de uma relação, o operador de PROJEÇÃO seleciona colunas de uma Relação. O número de tuplas na relação resultante sempre será igual ou menor que a quantidade de tuplas na relação original. Isto porque tuplas duplicadas são eliminadas. Por exemplo, observe a seguinte operação de projeção π Nome, UF (Cidade) aplicada à relação Cidade (vide Tabela 10). Veja que “PB” aparece apenas uma vez na relação resultante (vide Tabela 14). Mesmo que ela apareça duas vezes na relação original (Tabela 10). Tabela 14 - Relação Resultante da Projeção UF PE RN PB A operação de projeção não é comutativa. Apenas no caso específico de <lista2> conter os mesmos atributos de <lista1> pode-se observar comutatividade. π <lista_atributos1> (π <lista_atributos2> (Relação)) ≠ π <lista_atributos 2> (π<lista_atributos1> (Relação)) 13
  • 14.
    Banco de Dados Combinando Operações Em geral, existe a necessidade de se aplicar várias operações da álgebra relacional uma após a outra. Pode-se escrever essas operações em apenas uma única expressão da álgebra relacional, combinando as operações, usando tanto operadores de conjunto, quanto de tabela. Vamos dar alguns exemplos a seguir. » Tomando como base as relações Professor(CPF, Nome) e Aluno (CPF, Nome) - vide Tabelas 1 e 2 – se desejássemos encontrar o nome de todos os professores que também são alunos, poderíamos usar a expressão: Π nome(Professor) ∩ Π nome(Aluno) » A partir da relação Empregado (CPF, Nome, Sexo, Salario, Num_Dep), vide Tabela 15, selecione o nome e o salário de todos os empregados que trabalhem no departamento de número 4. Para isso, poderíamos usar a expressão: Π nome, salario (δ Num_Dep=4(Empregado)) Isso daria origem a tabela 16. Tabela 15 - Relação Empregado CPF Nome Sexo Salario Num_Dep 1234 Ana Gomes F 1500 2 2345 Pedro Nunes M 1000 4 3765 Maria Lima F 2000 2 4987 Igor Matos M 3500 5 9876 Laís Ramos F 3000 4 Tabela 16 - Relação Resultante Nome Salario Pedro Nunes 1000 Laís Ramos 3000 Tabela 17 - Relação Gerente CPF Nome Sexo Salario Num_Dep 5678 João Teixeira M 1800 2 2345 Pedro Nunes M 1000 4 » A partir da relação Empregado (Tabela 15) e da relação Gerente (Tabela 17), encontre o nome de todos os empregados que não são gerentes. Para isso, poderíamos usar a expressão: Π nome (Empregado) - Π nome (Gerente) 14
  • 15.
    Banco de Dados Outra forma de combinar operações é aplicar uma única operação por vez e criar relações intermediárias. Neste caso, é preciso dar nomes às relações intermediárias. Por exemplo, vamos tomar o exemplo anteriormente visto de tomar a relação Empregado como base (Tabela 15) e dela recuperar o nome e o salário de todos os empregados que trabalham no departamento 4. Já apresentamos como fazer isso com uma única expressão. Agora, alternativamente, seria possível explicitar a sequência de operações, dando um nome para cada relação intermediária: Empregados_Dep4 ← ß δ Num_Dep=4(Empregado) Π nome, salario (Empregados_Dep4) Junção O operador de junção combina as linhas de duas tabelas (relações) segundo uma ou mais condições. A condição de junção deve ser baseada em uma ou mais colunas (atributos) de cada uma das tabelas cujos valores compartilhem um domínio comum. As linhas das tabelas serão combinadas sempre que a condição de junção for verdadeira. (geralmente a condição é uma igualdade entre atributos equivalentes). O join é representado pelo operador binário |x| e o formato geral de utilização é: Relação1 |x| <condição de junção> Relação2. Por exemplo, Cidade |x| cidade.UF = Estado.UF Estado. Vai combinar os valores das relações Cidade (Tabela 18) e Estado (Tabela 19), de acordo com a igualdade do atributo comum às duas relações: a UF. Dessa forma, seria gerada a relação representada na Tabela 20. Veja que a primeira tupla da relação Cidade (vide Tabela 18) não faz parte da relação resultante, por que ela não tem equivalente na relação Estado (já que está sendo feita a igualdade com base no atributo UF). Ou seja, tuplas cujos atributos de junção são nulos não aparecem na relação resultante. Tabela 18 - Relação Cidade Código Nome Sexo 1 Recife PE 2 Manaus AM 3 João Pessoa PB Tabela 19 - Relação Estado UF Região PB Nordeste AM Norte Tabela 20 - Relação Resultante Código Nome Cidade.UF Estado.UF Região 2 Manaus AM AM Norte 3 João Pessoa PB PB Nordeste 15
  • 16.
    Banco de Dados Quando a condição de uma junção é a igualdade, a junção é chamada de equijoin. O equijoin gera duas colunas idênticas na relação resultante (vide as colunas UF na Tabela 20). Uma Junção Natural é um equijoin onde uma das colunas idênticas é eliminada. Como assim? O operador de junção natural combina as linhas de duas tabelas que tem atributos comuns (mesmo nome), resultando numa tabela que contém apenas as linhas onde todos os atributos comuns apresentam o mesmo valor. Na relação resultante, uma das colunas idênticas é eliminada, evitando a duplicidade. A junção natural equivale a uma seleção precedida de um produto cartesiano. Assim: Cidade |x| cidade.UF = Estado.UF Estado é equivalente a δ cidade.UF = Estado.UF (Cidade x Estado) Se duas relações envolvidas em uma junção natural não têm atributos em comum, então a junção natural produz um resultado igual ao produzido pelo produto cartesiano. » EQUIJOIN: junção onde somente operadores de comparação “=“ são utilizados. Gera colunas idênticas. » JUNÇÃO NATURAL: requer que os dois atributos de junção tenha o mesmo nome em ambas as relações. Nesse tipo de join outras condições podem ser utilizadas além da igualdade. A relação resultante não gera nenhuma duplicidade. Cálculo Relacional O Cálculo Relacional (CR) é uma linguagem de consulta formal. Utilizando-se de uma expressão declarativa pode-se especificar uma consulta. Uma expressão de cálculo permite a descrição da consulta desejada sem especificar os procedimentos para obtenção dessas informações, ou seja, é não-procedural. Contudo, tal consulta deve ser capaz de descrever formalmente a informação desejada, com exatidão. No Cálculo Relacional existem variáveis, constantes, operadores lógicos, de comparação e quantificadores. As expressões de Cálculo são chamadas de fórmulas. Uma tupla de respostas é essencialmente uma atribuição de constantes às variáveis que levam a fórmula a um estado verdadeiro. Existem dois tipos de cálculo relacional: Cálculo Relacional de Tuplas (CRT) e Cálculo Relacional de Domínio (CRD), ambos subconjuntos simples de lógica de primeira ordem. No CRT, as variáveis são definidas sobre (isto é, associam) tuplas. Já em CRD, variáveis são definidas sobre o domínio dos elementos (ou seja, sobre os valores dos campos). Como o cálculo relacional é pouco utilizado, vamos apenas apresentar algumas definições e exemplos, a título informativo, de cada um dos tipos de cálculo. Adicionalmente, é importante saber que todas as expressões de consulta descritas no Cálculo Relacional possuem equivalentes em Álgebra Relacional, que é mais utilizada e possui mais ferramentas para dar suporte a construção de suas expressões. Cálculo Relacional de Tupla O Cálculo Relacional de Tupla (CRT) é baseado na especificação de um número de variáveis de tuplas. Cada variável de tupla pode assumir como seu valor qualquer tupla da relação especificada. Uma consulta em CRT é especificada da seguinte forma: {variável tupla | predicado} ou { t | P(t) } que significa o conjunto de todas as tuplas 16
  • 17.
    Banco de Dados t,tal que o predicado P seja verdadeiro para t. E temos que t é uma variável de tuplas. P é uma expressão condicional e t.A ou t[A] denota o valor do atributo A da tupla t. O resultado de tal consulta é o conjunto de todas as variáveis tuplas para as quais o predicado é indicado como verdadeiro. Uma expressão genérica do cálculo relacional de tuplas tem a forma: {t1.A1, t2.A2, ..., tn.An | predicado(t1, t2, ..., tn, tn+1, tn+2, ..., tn+m)} Onde: t1, t2, ..., tn, tn+1, tn+2, ..., tn+m são variáveis de tuplas, cada Ai é um atributo da relação na qual ti se encontra e o predicado é uma fórmula do cálculo relacional de tuplas. Uma fórmula é definida, de forma recursiva, por uma ou mais fórmulas atômicas. Essas fórmulas podem ser conectadas por operadores lógicos (AND, OR ou NOT), como segue: » Se F1 e F2 são fórmulas atômicas, então (F1 AND F2), (F1 OR F2), NOT (F1) e NOT (F2) também o são, tendo seus valores verdade derivados a partir de F1 e F2. Relembrando... (F1 AND F2) será TRUE apenas se ambos, F1 e F2, forem TRUE; (F1 OR F2) será TRUE quando uma das duas fórmulas F1 e F2, for TRUE; NOT(F1) será TRUE quando F1 for FALSE; NOT(F2) será TRUE quando F2 for FALSE. » Se F1 é uma fórmula atômica, então (Ǝ t)(F1) também o é, e seu valor verdade apenas será TRUE se a fórmula F for avaliada como verdadeira para pelo menos uma tupla atribuída para ocorrências livres de t (que é uma variável de tupla) em F. » Se F1 é uma fórmula atômica, então (∀ t)(F1) também o é, e seu valor verdade apenas será TRUE se a fórmula F for avaliada como verdadeira para todas as tuplas atribuídas para ocorrências livres de t em F. Adicionalmente, temos: » Uma fórmula atômica ti.A op tj.B, onde op é um dos operadores de comparação no conjunto {=, >, <, ≠, >=, <=}, ti e tj são variáveis de tuplas, A é um atributo da relação na qual ti se encontra, B é um atributo da relação na qual tj se encontra. » Uma fórmula atômica ti.A op c ou c op tj.B, onde op é um dos operadores de comparação no conjunto {=, >, <, ≠, >=, <=}, ti e tj são variáveis de tuplas, A é um atributo da relação na qual ti se encontra, B é um atributo da relação na qual tj se encontra e c é um valor constante. Nos dois casos acima, se as variáveis de tupla forem designadas de forma que os valores dos atributos especificados satisfaçam o predicado, a fórmula assumirá valor verdade TRUE. Cada uma das fórmulas atômicas anteriormente especificadas tem seu valor verdade avaliado como TRUE ou FALSE para uma combinação específica de tuplas. 17
  • 18.
    Banco de Dados Todas as variáveis tuplas abordadas são consideradas variáveis livres (elas aparecem em uma expressão de cálculo relacional à esquerda da barra |), uma vez que estas não aparecem quantificadas. Porém, quando quantificadores (universal (∀) ou existencial (Ǝ)) aparecem nas fórmulas, as variáveis que os sucedem são denominadas variáveis limite. Tabela 21 - Relação Empregado CPF Nome Sexo Salario Cod_Depto 1234 Ana Gomes F 1500 2 2345 Pedro Nunes M 1000 4 3765 Maria Lima F 2000 2 4987 Igor Matos M 3500 5 9876 Laís Ramos F 3000 4 Tabela 22 - Relação Departamento Cod Descricao 2 Vendas 4 Suporte 5 Gerência Vamos dar alguns exemplos para ilustrar. Tomando como base a relação Empregado (vide Tabela 21) e a relação Departamento (vide Tabela 22), suponha as seguintes consultas e como elas ficariam representadas em cálculo relacional de tupla. » Obtenha todos os empregados cujo salário seja maior que 3000 reais: { t | EMPREGADO(t) AND t.SALARIO > 3000 }. Analisando a expressão podemos lê-la da seguinte forma: considere uma tupla t, ela deve ser uma tupla da relação empregado, cujo atributo salário dessa tupla deve ser maior que 3000. EMPREGADO(t) é o mesmo que dizer que t ∈ EMPREGADO. A consulta acima resulta em uma relação que contém todas as tuplas t da relação EMPREGADO que satisfazem a condição (no caso, salário > 3000). No CRT especificamos primeiro os atributos desejados. Se for usado apenas o t, sem especificação de atributos, todos os atributos da tupla são recuperados. Logo, na consulta acima, seriam recuperados os atributos CPF, Nome, Sexo, Salario e Cod_Depto (vide Tabela 21). Agora, suponha que gostaríamos de recuperar apenas os atributos CPF e Nome das tuplas que atendessem a condição. Como faríamos? { t.CPF, t.Nome | EMPREGADO(t) AND t.SALARIO > 3000 }. Observe que os atributos desejados são especificados do lado esquerdo da barra (|). » Vamos a outro exemplo. Obtenha o nome e o salário dos empregados que trabalham para o departamento de Suporte. {t.NOME, t.SALARIO | EMPREGADO(t) AND (Ǝ d) (DEPARTAMENTO (d) AND 18
  • 19.
    Banco de Dados d.DESCRICAO = ‘Suporte’ AND d.COD = t.COD_DEPTO)} Analisando a expressão podemos lê-la da seguinte forma: obtenha o nome e o salário de todas as tuplas da relação empregado e exista um departamento d, cuja descrição seja ‘Suporte’ e o código desse departamento de nome ‘Suporte’ seja igual ao código do departamento da tupla sendo avaliada na relação Empregado. Vamos exemplificar agora o quanto o CRT pode ser representado facilmente por uma expressão da álgebra relacional, levando em conta a relação Empregado (Tabela 21). » Recupere o CPF e o nome de todos os empregados. Em CRT: { t.CPF, t.Nome | EMPREGADO(t) } Em Álgebra Relacional: π CPF, Nome (Empregado) » Recupere todos os empregados do sexo masculino Em CRT: { t | EMPREGADO(t) AND t.SEXO = ‘M’ } Em Álgebra Relacional: δ Sexo = ‘M’ (Empregado) Cálculo Relacional de Domínio (CRD) Trata-se de uma segunda forma de cálculo relacional, equivalente ao CRT. Essa forma usa variáveis de domínio que tomam valores do domínio de um atributo, em vez de valores da tupla inteira. Uma expressão neste cálculo tem a forma: { <x1, x2, ... , xn > | Predicado (x1, x2, ..., xn) } onde x1, x2, ..., xn representam variáveis de domínio e Predicado representa uma fórmula composta de átomos, como no cálculo relacional de tupla. A diferença básica entre CRT e CRD é que neste último as variáveis estendem-se sobre valores únicos de domínios de atributos. Para formar uma relação de grau n para um resultado de consulta, faz-se necessário criar n variáveis de domínio, uma para cada atributo. Como em CRT, as fórmulas são avaliadas em valores verdade para um conjunto específico de valores. A seguir, para fins de comparação e para ilustrar o CRD, seguem em CRD os mesmos exemplos de consultas já escritos em CRT. Tabela 23 - Relação Empregado a b c d e CPF Nome Sexo Salario Cod_Depto 1234 Ana Gomes F 1500 2 2345 Pedro Nunes M 1000 4 3765 Maria Lima F 2000 2 4987 Igor Matos M 3500 5 9876 Laís Ramos F 3000 4 19
  • 20.
    Banco de Dados Tabela 24 - Relação Departamento m n Cod Descricao 2 Vendas 4 Suporte 5 Gerência Tomando como base as tabelas 23 e 24 que representam, respectivamente, as relações Empregado e Departamento (note que cada coluna dessas relações recebeu uma letra para referenciar o domíno do atributo representado por cada coluna), podemos Comentário realizar as seguintes consultas: » Obtenha todos os empregados cujo salário seja maior que 3000 reais: { t | 1 Observe que as letras EMPREGADO(t) AND t.SALARIO > 3000 }. à esquerda da barra (|) representam o { abcde1 | (Ǝ d2) EMPREGADO(abcde) AND d > 3000 } domíno dos atributos desejados (vide » Se na consulta anterior quiséssemos recuperar apenas o CPF e o nome dos Tabela 23), como empregados, teríamos: conseqüência, eles referenciam as colunas { ab | (Ǝ d) EMPREGADO(abcde) AND d > 3000 } desejadas. » Obtenha o nome e o salário dos empregados que trabalham para o departamento de Suporte. Comentário { bd | (Ǝ e) (Ǝ m)(Ǝ n) (EMPREGADO(abcde) AND DEPARTAMENTO(mn) AND n = ‘Suporte’ AND m = e) } 2 Somente é necessário quantificar as variáveis que Considerações Finais participam de uma condição. A álgebra relacional é uma forma de cálculo sobre conjuntos ou relações. Uma Ou seja, só usamos o aplicação prática da álgebra relacional é na execução de consultas a bancos de dados operador existencial Ǝ na variável de domínio relacionais. A álgebra relacional recebia pouca atenção até a publicação do modelo d, porque apenas essa relacional de dados de E.F Codd, em 1970. Codd propôs tal álgebra como uma base para variável é usada na linguagens de consulta em banco de dados. As operações da álgebra relacional podem ser condição expressa no resumidas de forma ilustrada na Figura 2. predicado (d > 3000) 20
  • 21.
    Banco de Dados Figura 2 - Resumo das Operações da Álgebra Relacional O Cálculo Relacional é uma linguagem formal, não-procedural, para consulta a relações. A álgebra relacional tem poder de expressão essencialmente equivalente ao do cálculo relacional, esse resultado é conhecido como teorema de Codd. Em geral, a álgebra relacional é bem mais utilizada do que o cálculo relacional. Conheça Mais Para obter mais informações sobre o assunto estudado nesse capítulo você pode consultar qualquer um dos livros listados a seguir. Todos eles possuem capítulos dedicados a Álgebra Relacional e o Cálculo Relacional (de Tupla e de Domínio): KORTH, Henry F; SILBERSCHATZ, Abraham; SUDARSHAN, S. Sistema de banco de dados. Traduzido por Daniel Vieira. Rio de Janeiro: Elsevier;Campus, 2006. ELMASRI, Ramez; NAVATHE, Shamkant B. Sistemas de banco de dados. 4a. ed. São Paulo: Pearson Education do Brasil, 2005. DATE, C. J. Introdução a sistemas de bancos de dados. Rio de Janeiro: Campus, 2000. ALVES, W.P. Fundamentos de Bancos de Dados. Editora Érica, 2004. 21
  • 22.
    Banco de Dados Você Sabia? O Cálculo relacional dependendo do autor pode ter sua notação ligeiramente modificada. A notação que fizemos uso nesse capítulo é a notação de Navathe (ELMASRI e NAVATHE, 2005). Porém, existe também a notação de Korth (KORTH, SILBERSCHATZ e SUDARSHAN, 2006). Para ilustrar as diferenças, vamos repetir a mesma consulta anteriormente realizada: » Obtenha o nome e o salário dos empregados que trabalham para o departamento de Suporte. Na notação de Navathe, que já utilizamos, ficaria: {bd | (Ǝ e) (Ǝ m) (Ǝ n) (EMPREGADO(abcde) AND DEPARTAMENTO(mn) AND n = ‘Suporte’ AND m = e)} Já na notação de Korth, a mesma sentença ficaria da seguinte forma: {<b, d> | <b, d> � empregado ∧ departamento(mn) ∧ n = “Suporte” ∧ m = e)} Veja que o formato geral da expressão muda um pouco, mas o que muda mesmo é a simbologia dos operadores lógicos: AND (∧), OR (∨), NOT (¬), a forma de expressar as variáveis de tupla (observe o começo das duas expressões e veja a diferença) e ao invés de aspas simples em constantes, usa-se aspas duplas. Aprenda Praticando Como a álgebra relacional é mais utilizada, vamos avaliar alguns exercícios resolvidos para que, logo depois, você possa resolver os seus exercícios sozinho. 1) Tome como base os esquemas das tabelas 25 e 26 e mostre como ficariam as consultas, a seguir, em álgebra relacional. Tabela 25 - Relação Devedor Nome Num_Emprestimo Sexo Ana Gomes 01 F Pedro Nunes 03 M Maria Lima 05 F Tabela 26 - Relação Empréstimo Agencia Num_Emprestimo Valor 3456 01 1500 2123 03 5000 2123 05 2500 Em geral, na realização de consultas as operações mais utilizadas são a projeção (representada pelo símbolo π) que seleciona quais colunas (atributos) se deseja na relação resultante e a seleção (representada pelo símbolo δ) que seleciona quais tuplas da relação atendem a uma determinada condição. Se a projeção não for utilizada, todos os atributos da relação original farão parte da relação resultante. Quando necessitamos de dados que estão 22
  • 23.
    Banco de Dados emduas relações diferentes, devemos utilizar a operação de junção |x|. » Apresentar os dados de todos os devedores do sexo feminino. Cada vez que desejamos selecionar tuplas da relação de acordo com uma determinada condição, usamos a seleção. δ sexo = ‘F’ (devedor) » Apresentar o nome e o número do emprestimo de todos os devedores do sexo masculino. Como é especificado o que deve ser mostrado – nome e número empréstimo – é necessário usar a projeção antes da seleção) π nome,num_emprestimo (δ sexo = ‘M’ (devedor)) » Mostrar o nome das pessoas que possuem empréstimo acima de três mil reais na agência 2123. Como o nome da pessoa está na relação devedor e o valor do empréstimo na relação empréstimo, é necessário fazer a junção dessas duas relações, para ser possível selecionar o que foi pedido. A junção é feita equiparando os atributos que as relações têm em comum. π nome (δ valor > 3000 and agencia = 2123 (Devedor |x| devedor.num_emprestimo = empréstimo.num_emprestimo Emprestimo)) » Apresentar as pessoas cujo número do empréstimo é igual a 5 e o número da agência é igual a 2123 ou que o número do empréstimo seja igual a 3 e o valor do empréstimo maior do que 1000 reais. É um caso de seleção onde é necessário usar operadores lógicos para montar as condições. δ (num_emprestimo = 5 and agencia = 2123) or (num_emprestimo = 3 and valor > 1000) (Emprestimo)) Atividades e Orientações de Estudo Agora vamos exercitar o que foi estudado neste capítulo. Assim sendo, faça as atividades sugeridas a seguir. Lembre que exercitar vai lhe ajudar a fixar melhor o conteúdo estudado. Mãos à obra! Atividades Práticas Dica 3 No Word, a simbologia usada na Responda as questões a seguir em um documento de texto (doc)3 e poste as álgebra relacional respostas no ambiente virtual, no local indicado. Esse trabalho deve ser feito em DUPLA. pode ser inserida no documento através Especifique usando a álgebra relacional as consultas a seguir, tomando como base do seguinte caminho: as relações cujos esquemas estão representados a seguir. Inserir -> Símbolo, fazendo uso da fonte Symbol (daí você EMPREGADO escolhe na tabela que é apresentada o CPF (PK) Nome DtNasc Endereco Sexo Salario Cod_Dep (FK) símbolo apropriado) 23
  • 24.
    Banco de Dados DEPARTAMENTO Cod_Dep (PK) Descricao CPF_Gerente (FK) Dt_Inicio_Gerencia PROJETO Cod_Proj (PK) Nome_Proj Cod_Dep (FK) ALOCACAO CPF (PK) Cod_Proj (PK) Horas DEPENDENTE CPF (PK) Nome_Depen Sexo Parentesco a) Recuperar os nomes de empregados do departamento 6 que trabalham mais que 20 horas no projeto chamado ‘Star Project’. b) Listar os nomes dos empregados que tenham um dependente com o mesmo nome deles. c) Recuperar os códigos e os nomes dos projetos do departamento de nome “Pesquisa”. d) Listar o nome do projeto, do departamento ao qual ele pertence e o nome dos empregados deles. e) Recuperar os nomes dos empregados que trabalham em todos os projetos. f) Recuperar os nomes dos empregados que não trabalham em quaisquer projetos. h) Recuperar o nome e o sexo de todos os dependentes do empregado de CPF de número 12345. i) Recuperar o nome e a quantidade de horas trabalhadas por cada empregado em cada projeto do qual faz parte. Vamos Revisar? Você estudou, neste capítulo, formas de acessar e manipular os dados armazenados em um banco de dados, fazendo uso de linguagens formais tais como a álgebra relacional e o cálculo relacional (tanto de tupla, quanto de domíno). A maneira de raciocionar fazendo uso dessas linguagens irá facilitar a compreensão do uso da linguagem comercial a ser estudada nos capítulos seguintes: a SQL. Até lá! 24
  • 25.
    Banco de Dados Capítulo 11 O que vamos estudar neste capítulo? Neste capítulo, vamos estudar os seguintes temas: » A Linguagem SQL. » Subdivisões da SQL. » Como criar um Banco de Dados usando SQL. Metas Após o estudo deste capítulo, esperamos que você: » Conheça a linguagem SQL. » Conheça as subdivisões da linguagem. » Consiga criar e manter a estrutura de um banco de dados usando SQL. » Consiga criar índices para um banco de dados. 25
  • 26.
    Banco de Dados Capítulo 11 – Criando e Mantendo um Banco de Dados Vamos conversar sobre o assunto? “No capítulo anterior vimos linguagens formais para consulta a banco de dados relacionais. Porém, na área comercial, essas linguagens não são muito utilizadas, ao invés delas, são usadas linguagens comerciais para criação, manutenção e consulta a banco de dados. Entre essas linguagens, a SQL (Structured Query Language) é a mais utilizada. Por isso mesmo, a interface SQL é implementada em todos os sistemas de bancos de dados relacionais existentes. É justamente sobre a SQL que estudaremos nesse capítulo e no capítulo seguinte.” Neste capítulo, começaremos estudando a linguagem comercial SQL, com o objetivo de ter um conhecimento geral sobre a linguagem e criar e manter esquemas de bancos de dados relacionais. Adicionalmente, também apresentaremos como criar índices para esses esquemas. Vamos lá? A SQL SQL ou Structured Query Language (Linguagem de Consulta Estruturada) é uma linguagem de consulta declarativa, não-procedural, fundamentada na álgebra e no cálculo relacional de tupla. Apesar de ser chamada linguagem de consulta (Query), ela não é apenas de consulta, ela inclui comandos para definição, manutenção e consulta em bancos de dados relacionais. Além disso, ela define mecanismos para criação de visões, especificações de segurança, autorizações, definições de restrições e controle de transações. Adicionalmente, ela possui regras para embutir os comandos SQL em linguagens de programação genéricas como Java, PHP, C# ou C/C++. A SQL foi desenvolvida pelo laboratório da IBM, nos anos 70, como parte do sistema System R (o primeiro SGBD relacional). Ela foi, inicialmente, chamada de SEQUEL (Structured English Query Language), mas teve seu nome alterado para SQL por razões Jurídicas. Em 1986, em um esforço conjunto da ANSI (American Nacional Standars Institute) e da ISO (International Standards Organization) criou-se a primeira versão padrão da SQL, a SQL-86 (SQL1), substituída posteriormente pela SQL-92 (SQL2) e depois pela SQL-99 (SQL3). O atual projeto da SQL é o padrão 200n. A SQL padrão é suportada por todos os SGBDs relacionais comerciais. Porém, mesmo padronizada, existem variações, ou seja, cada fornecedor pode incluir comandos próprios na SQL utilizada pelo seu SGBD. Em outras palavras, cada implementação do SQL de cada fornecedor possui os comandos do SQL padrão (também chamado SQL ANSI) e, também, algumas adaptações para resolver certas particularidades. Para conhecer o conjunto completo de comandos SQL de um determinado fornecedor (ex: Oracle), recomendamos a leitura do manual do fabricante. A vantagem de fazer uso apenas do SQL padrão é não ter problemas com migração de SGBD para SGBD. Por exemplo, se você fazia uso de SQL Server e, depois, migrou para o uso do Oracle, se fez uso apenas do SQL padrão, 26
  • 27.
    Banco de Dados nãohaverá problemas ou necessidade de adaptações. O SQL usado nesta disciplina será o baseado no Padrão ANSI e nenhuma característica específica de SGBD será abordada. Dessa forma, para praticar os comandos de SQL aqui ensinados, você poderá fazer uso de qualquer SGBD comercial. Subdivisão da SQL A SQL é composta por grupos de instruções que são utilizadas no processo de administração e controle de bancos de dados. Esses grupos serão descritos a seguir (vide Figura 3). » DDL (Data Definition Language - Linguagem de Definição de Dados) - as instruções do tipo DDL permitem efetuar a criação das estruturas (esquemas) de tabelas (relações) onde os dados serão armazenados, índices e os bancos de dados como um todo. Permitem também efetuar alterações nas estruturas criadas, bem como remover estruturas existentes. Neste grupo estão as instruções: CREATE TABLE, DROP TABLE, ALTER TABLE, CREATE INDEX e DROP INDEX. O resultado da compilação dos parâmetros/comandos DDL geram os dicionários de dados (arquivo de metadados). Adicionalmente, a DDL inclui comandos para definição de visões e para especificação de direitos de acesso às relações/visões. Figura 3 - Subdivisões da SQL » DML (Data Manipulation Language - Linguagem de Manipulação de Dados) - as instruções do tipo DML permitem efetuar a manipulação dos dados que estejam armazenados nas tabelas de um determinado banco de dados. Desta forma é possível cadastrar, alterar e excluir registros (tuplas) existentes. Neste grupo encontram-se as instruções: INSERT, SELECT, UPDATE e DELETE. De todos os comandos existentes, o comando SELECT é o mais importante e utilizado, pois é com ele que se obtém a extração de informações a partir do banco de dados. » DCL (Data Control Language - Linguagem de Controle de Dados) – as instruções do tipo DCL permitem controlar o acesso e os privilégios dos usuários às relações e visões, protegendo os dados de manipulações não autorizadas; » TML (Transactions Manipulation Language - Linguagem de Manipulação de Transações) – as intruções do tipo TML especificam as transações através de comandos de iniciação e finalização das mesmas, garantindo o compartilhamento e a integridade dos dados. 27
  • 28.
    Banco de Dados Nesta disciplina apenas abordaremos a DDL e a DML. Tipos de Dados Antes de entrar nos comandos propiamente ditos da SQL, vale a pena comentar sobre tipos de dados. Para definir os atributos das tabelas, precisamos definir os domínios de cada um deles. Isso é feito através da especificação do tipo do dado. Nesse ponto é importante ressaltar que cada SGBD tem um conjunto próprio de tipos de dados. Mas, podemos dizer que, genericamente, vamos encontrar na maioria dos SGBDs tipos como: » Char(X): Para dados caracteres, onde X é o tamanho máximo permitido de caracteres e esse tamanho é fixo. Ou seja, se for especificado, por exemplo, um tamanho de 50 caracteres, sempre será ocupado na memória 50 posições, independente da palavra sendo armazenada. » Varchar(X): Idem o anterior, mas o tamanho armazenado é variável. Se ocupará memória apenas para o que for digitado, tendo o X apenas como referência para tamanho máximo. » Integer : Para dados numéricos inteiros positivos ou negativos » Decimal(X,Y): Pada dados numéricos decimais, onde X é o tamanho máximo permitido da parte inteira e Y é o tamanho máximo da parte fracionária » Date: Para datas. Seu formato depende do SGBD relacional. E cada SGBD pode ter um tipo diferenciado para armazenamento de datas. » Logical: Para os valores lógicos TRUE ou FALSE. Comandos SQL para Definição de Dados (DDL) A DDL serve para expressar a especificação do esquema do BD. O resultado da compilação dos parâmetros DDLs é um conjunto de tabelas que são armazenadas em um arquivo especial chamado dicionário de dados4. Comentário Os comandos SQL para definição de dados são: CREATE, DROP e ALTER. Vamos dar uma olhada em cada um desses comandos, a seguir e, para exemplificar o uso deles, 4 Relembrando: o vamos tomar a modelagem da Figura 4 como base. Nela temos especificado o MER para Dicionário de Dados uma Editora. é um arquivo de metadados (dados a respeito de dados) no SGBD. Ou seja, ele contém a semântica dos dados do BD (o que eles significam). Figura 4 - Modelo base para exemplos O MR para este diagrama é o seguinte (baseado nas regras de conversão do MER para o MR, anteriormente vistas): 28
  • 29.
    Banco de Dados AUTOR (CodAutor (PK), Nome, Nascimento) LIVRO (TitLivro (PK), CodAutor (FK), CodEditora (FK), Valor,Publicacao, Volume, Idioma) EDITORA (CodEditora (PK), Razao, Endereco, Cidade) DDL - Criando Tabelas O comando CREATE TABLE especifica uma nova tabela (relação), dando o seu nome e especificando as colunas (atributos), cada uma com seu nome, tipo e restrições iniciais. A forma geral do comando é: create table nome_tabela. Por exemplo: create table Empregado. Porém, a sintaxe completa do comando é bem mais detalhada: CREATE TABLE Nome_Tabela ( Nome_Atributo1 Tipo [(Tamanho)] [NOT NULL] [DEFAULT valor] [...], [,Nome_Atributo2 Tipo [(Tamanho)] [NOT NULL] [DEFAULT valor] [...], [PRIMARY KEY (Primária1[, Primária2 [, ...]])] [UNIQUE (Candidata1[, Candidata2[, ...]])] [FOREIGN KEY (Estrangeira1[, Estrangeira2 [, ...]]) REFERENCES TabelaExterna [(AtributoExterno1 [, AtributoExterno2 [, ...]])] [CHECK (condição)] ) Onde : ( ) Indica parte da sintaxe do comando e [ ] Indica opcionalidade do comando. Vamos explicar agora cada parte do comando completo. Nome_Atributo - nome do atributo que está sendo definido Tipo: domínio do atributo ou seja o tipo do dado do atributo. Tamanho : alguns tipos de dados necessitam de especificação do tamanho do dado. Por exemplo, o tipo CHAR NOT NULL: expressa que o atributo não pode receber valores nulos DEFAULT valor: indica um valor a ser atribuído ao atributo caso não seja determinado um valor durante a inserção PRIMARY KEY (Primária1, Primária2, ...) – serve para especificar a(s) chave(s) primária(s) da tabela. UNIQUE: indica que o atributo tem valor único na tabela. Qualquer tentativa de se introduzir uma linha na tabela contendo um valor igual ao do atributo será rejeitada. Serve para indicar chaves secundárias (chaves candidatas). Em Candidata1, Candidata2 devem ser especificados os atributos que terão esse valor único na tabela. FOREIGN KEY (Estrangeira1[, Estrangeira2 [, ...]]) REFERENCES TabelaExterna [(AtributoExterno1 [, AtributoExterno2 [, ...]]) – serve para especificar os atributos que são chaves estrangeiras na relação, já relacionando-os às tabelas onde eles são chave primária (Integridade Referencial). Em Estrangeira1, Estrangeira2, ... especificam-se os atributos que são chave estrangeira. Em TabelaExterna se especifica o nome da tabela onde o atributo é chave primária e, por fim, o nome desse atributo nessa TabelaExterna (porque os atributos na relação e na tabela externa original podem ter nomes diferentes). Se os atributos da relação e da tabela externa tiverem o mesmo nome, esses AtributoExterno1, 29
  • 30.
    Banco de Dados AtributoExterno2, ... não precisam ser especificados. CHECK (condição) – aqui são especificadas condições que devem ser checadas na inserção de dados na tabela (validações). Vamos agora dar exemplos de uso dessa sintaxe tomando o nosso modelo base Comentário (Figura 4). Primeiro, vamos criar as tabelas Autor e Editora que são tabelas simples (sem chaves estrangeiras ou checagens a serem feitas): 5 Como tipo de dados estamos CREATE TABLE AUTOR( deduzindo os tipos possíveis baseados na CodAutor INTEGER NOT NULL, explicação da seção anterior sobre tipos de Nome CHAR(50)5 NOT NULL, dados. Nascimento DATE NOT NULL, PRIMARY KEY (CodAutor), Comentário UNIQUE (Nome) ); 6 Valor será do tipo CREATE TABLE EDITORA( DECIMAL, ou seja, CodEditora INTEGER NOT NULL, um valor de ponto flutuante, tendo 3 Razao CHAR(50), casas na parte inteira e duas casas decimais. Endereco CHAR(50), Cidade CHAR(30) Comentário PRIMARY KEY(CodEditora )); Agora, podemos partir para a definição da tabela Livro que faz uso das duas tabelas 7 Aqui está sendo especificado o valor anteriormente definidas: default para o atributo CREATE TABLE LIVRO( idioma. Se esse campo não for informado, o Titulo CHAR(50) NOT NULL, valor “Português” será assumido. CodAutor INTEGER NOT NULL, CodEditora INTEGER NOT NULL, Comentário Valor DECIMAL(3.2)6, Publicacao DATE, 8 Veja que está sendo especificada Volume INTEGER, uma chave primária composta, uma vez Idioma CHAR (15) DEFAULT = ‘Português’ 7, que dois atributos fazem parte da PRIMARY KEY (Titulo, CodAutor8), especificação. FOREIGN KEY (CodAutor) REFERENCES AUTOR9, FOREIGN KEY (CodEditora) REFERENCES EDITORA, Comentário CHECK Valor > 10.010); 9 Veja que estamos Só pra ilustrar melhor o uso da cláusula CHECK vamos dar outro exemplo de criação espeficifando que de tabela, fora do exemplo do modelo base (Figura 4). Suponha que desejamos criar a tabela CodEditora é chave estudante que contenha os atributos matricula, nome e nível. estrangeira na tabela sendo definida e é um CREATE TABLE estudante ( atributo pertencente a tabela Autor (sendo matricula char(10) NOT NULL, chave primária nessa outra tabela – tabela nome char(15) NOT NULL, externa) nivel char(15) NOT NULL, 30
  • 31.
    Banco de Dados PRIMARY KEY (matricula), CHECK (nivel IN (“Bacharelado”, ”Mestrado”, ”Doutorado”)))11 O SQL-89 obrigava os atributos da chave primária a serem declarados como NOT NULL e UNIQUE. Comentário SQL-92 e posteriores já assumem essas condições, assim, sua declaração é redundante. 10 Aqui é especificado Uma cláusula FOREIGN KEY pode incluir regras de remoção / atualização: que os livros que forem criados devem FOREIGN KEY (coluna) REFERENCES tabela ter seu valor maior que 10. Essa é uma [ON DELETE {RESTRICT | CASCADE | SET NULL | SET DEFAULT}] validação que será feita a cada inserção / [ON UPDATE {RESTRICT | CASCADE | SET NULL | SET DEFAULT}] alteração de dados na Suponha que T2 tem uma chave estrangeira para T1, ou seja, tem um atributo que tabela. é chave primária em T1. Vejamos as cláusulas ON DELETE e ON UPDATE ON DELETE Comentário RESTRICT: (default) significa que uma tentativa de se remover uma linha de T1 11 Veja que aqui falhará se alguma linha em T2 combinar com a chave da tupla de T1 que está sendo estamos especificando deletada. os valores possíveis para o atributo nível. CASCADE: a remoção de uma linha de T1 implica em remoção de todas as linhas de T2 que combinam com a chave da tupla de T1 sendo deletada. Comentário SET NULL: remoção de T1 implica em colocar NULL em todos os atributos de T2 que sejam chave estrangeira e estejam relacionados com a tupla sendo deletada em T1. 12 O valor default para SET DEFAULT: remoção de linha em T1 implica em colocar valores DEFAULT nos o departamento é 1. atributos da chave estrangeira de cada linha de T2 que combina ON UPDATE Comentário RESTRICT: (default) a atualização de um atributo de T1 falha se existem linhas em T2 combinando com a tupla sendo modificada. A chave primária é a 13 matrícula. CASCADE: a atualização de atributo em T1 implica que linhas que combinam em T2 também serão atualizadas Comentário SET NULL: a atualização de T1 implica que valores da chave estrangeira em T2, nas linhas que combinam com a tupla de T1 sendo atualizada, são postos para NULL. 14 Veja que aqui o atributo da tabela SET DEFAULT: a atualização de T1 implica que valores da chave estrangeira de T2 sendo definida tem nas linhas que combinam terão valores default aplicados. nome diferente do atributo na sua tabela Vamos dar um exemplo de uso dessas cláusulas: externa de origem. Por isso, o nome do CREATE TABLE empregado ( atributo na tabela matricula char(10) NOT NULL, externa precisa ser especificado. nome char(15) NOT NULL, cod_depto INT NOT NULL DEFAULT 112, Comentário PRIMARY KEY(matricula) , 13 15 Aqui é especificado FOREIGN KEY(supervisor) REFERENCES Empregado(matricula)14 que, se a tupla que ON DELETE SET NULL15 contém a matrícula sendo utilizada nesta ON UPDATE CASCADE16, tabela for deletada, o atributo SUPERVISOR FOREIGN KEY (cod_depto) REFERENCES Departamento(codigo) deverá receber o valor NULL. ON DELETE SET DEFAULT17 31
  • 32.
    Banco de Dados ON UPDATE CASCADE); DDL - Alterando Tabelas O comando ALTER TABLE permite inserir/eliminar/modificar colunas nas tabelas já existentes, modificando a estrutura das mesmas. A sintaxe básica desse comando é: ALTER TABLE Tabela { ADD (NomeNovoAtributo NovoTipo [BEFORE Nome_Atributo] [, ...] ) | Comentário DROP (Nome_Atributo [, ...] ) | 16 Aqui é especifricado MODIFY ( Nome_Atributo NovoTipo [ NOT NULL ] [DEFAULT, ... ] ) que, se a matrícula for atualizada na tabela } de origem, todas as Onde: | Indica escolha de várias opções e { } Indica obrigatoriedade de escolha de tuplas da tabela onde o atributo é chave uma opção entre as várias. Agora, vamos explicar cada parte do comando. estrangeira devem ser atualizadas também. Adicionando um novo atributo (nova coluna) na Tabela ADD (NomeNovoAtributo NovoTipo [BEFORE Nome_Atributo] [, ...] ) | Usando o ADD é possível adicionar um novo atributo na Tabela. Dessa forma, o novo Comentário atributo deve ser especificado (nome e tipo). É possível ainda dizer antes de qual atributo se deseja que esse novo atributo seja inserido (BEFORE nome_atributo). Por exemplo, se 17 Aqui é especificado desejássemos adicionar o campo E-MAIL na tabela Autor, do nosso exemplo base (Figura 4), que, se a tupla que usaríamos: contém o código do departamento sendo ALTER TABLE AUTOR ADD EMAIL CHAR(40); utilizado nesta tabela for deletada, o atributo cod_depto deverá receber o valor default especificado para este Observação atributo. No caso, o número 1. Os novos atributos terão valores nulos em todas as linhas. Por isso, não se pode usar NOT NULL juntamente com ADD (na definição do novo atributo), quando a tabela já contiver registros (lembre, com o uso de ADD a nova coluna é carregada com NULL’s). Deletando um atributo (uma coluna) da Tabela DROP (Nome_Atributo [, ...] ) | Para usar a cláusula DROP é necessário apenas especificar o nome do atributo que se deseja remover da tabela. Porém, atenção, a cláusula DROP não remove atributos da chave primária. Por exemplo, se desejássemos eliminar o campo E-MAIL (anteriormente adicionado) da tabela Autor, usaríamos: ALTER TABLE AUTOR DROP EMAIL; A cláusula DROP pode ser usada com algumas configurações adicionais: DROP Nome_Atributo [CASCADE | RESTRICT] onde: CASCADE: removeria o atributo de todos os lugares onde ele estivesse sendo usado (outras tabelas como chave estrangeira e em visões). RESTRICT: não permitiria a remoção do atributo se este estivesse sendo usado em uma visão ou como chave estrangeira em outra tabela. 32
  • 33.
    Banco de Dados Ex: ALTER TABLE AUTOR DROP EMAIL RESTRICT; Modificando um atributo (uma coluna) da Tabela Comentário MODIFY18 ( Nome_Atributo NovoTipo [ NOT NULL ] [, ... ] ) Esta cláusula serve para modificar as informações de um atributo como, por 18 Em alguns SGBDs ao invés de MODIFY exemplo, seu tamanho, sua nulidade, etc. Quando se altera o tipo de dados de uma coluna, é usada a cláusula os dados são convertidos para o novo tipo. Por exemplo, se desejássemos modificar o ALTER. campo E-MAIL na tabela Autor, diminuindo seu tamanho de 40 para 30, usaríamos: ALTER TABLE AUTOR MODIFY EMAIL CHAR(25); O detalhe é que, se se diminuir o tamanho de um atributo do tipo CHAR, os dados existentes serão truncados, havendo assim, perda de informação. DDL – Criando e Removendo Índices Índices são estruturas que permitem agilizar a busca e ordenação de dados em tabelas. Para criar um índice em uma tabela existente usamos o comando CREATE INDEX. A sintaxe completa desse comando é: CREATE [UNIQUE] INDEX Nome_Indice ON Nome_Tabela (Nome_Atributo1 [, Nome_Atributo2…]) Neste comando devemos especificar se o índice deve ser único (UNIQUE), ou seja, não deve permitir repetições (restrição de chaves) ou se será apenas um índice usado para acelerar a busca entre as tuplas da tabela. Depois, devemos especificar o nome do índice (Nome_Indice), a qual tabela ele vai pertencer (Nome_Tabela) e qual(ais) atributo(s) fará Comentário (ão) parte do índice. Por exemplo, se desejássemos criar um índice para o campo código do autor da tabela Autor, usaríamos: 19 Foi usado o sufixo IDX para indicar que CREATE UNIQUE INDEX CodigoIDX ON Autor (CodAutor); 19 é um índice para o Agora, se desejássemos criar um índice para pesquisar pelo código do autor e pelo código do autor. código da editora ao mesmo tempo, usaríamos: CREATE INDEX AutorEditoraIDX ON Livro (CodAutor,CodEditora); O default é indexar em ordem ascendente, se quisermos uma ordem descendente Comentário devemos adicionar palavra DESC depois do nome do atributo (no final do comando). Por exemplo, suponha que se deseja pesquisar os autores pelo seu nascimento. Mas das datas 20 Foi usado o sufixo maiores (mais rescentes) para as menores (mais antigas). Assim, ficaríamos com: IDX para indicar que é um índice para o nome CREATE INDEX NascIDX20 ON Autor (Nascimento) DESC; do autor. Observação Uma consulta que envolva atributos indexados é realizada com um tempo de execução melhor do que com atributos não-indexados. Agora, cuidado, você também não pode indexar TODOS os atributos de uma tabela. Você deverá usar o bom-senso para escolher quais aqueles que serão indexados de acordo com o problema sendo modelado e a freqüência de uso do atributo em consultas. Alguns SGBDs (por exemplo, o Oracle) criam, automaticamente, índices para as chaves primárias das tabelas, fazendo uso da cláusula UNIQUE. 33
  • 34.
    Banco de Dados Para eliminarmos um índice usamos o comando DROP INDEX, cuja sintaxe é: Comentário DROP INDEX Nome-Índice21 Por exemplo, suponha que sejamos deletar o índice criado para a data de 21 Deve ser usado o nascimento do autor, ficaríamos com: nome que foi dado ao índice na criação do DROP INDEX NascIDX mesmo. DDL - Excluindo Tabelas Comentário Para excluir uma tabela existente do SGBD é utilizado o comando DROP. Agora, 22 Para criar tabelas é necessário muito cuidado com este comando, pois ao deletar a tabela (esquema da é usado o comando mesma), automaticamente, TODOS os dados da tabela também serão excluídos. A sintaxe CREATE TABLE. desse comando é: DROP TABLE Nome_Tabela Exemplo: Comentário /* Excluir a tabela livro */ 23 Integer indica um DROP TABLE LIVRO; valor numérico inteiro e como o código é a chave, ele deve ser NOT NULL. Conheça Mais Em geral, os livros de banco de dados trazem um ou mais capítulo sobre SQL. Entre esses livros temos: Comentário SILBERSCHATZ, Abraham; KORTH, Henry F; SUDARSHAN, S. Sistema de banco de dados. Traduzido por Daniel Vieira. Rio de Janeiro: Elsevier;Campus, 2006. 24 A descrição deve ser um atributo do tipo ELMASRI, Ramez; NAVATHE, Shamkant B. Sistemas de banco de dados. 4a. ed. São caractere. Usando o Paulo: Pearson Education do Brasil, 2005. bom-senso você define o tamanho do campo. DATE, C. J. Introdução a sistemas de bancos de dados. Rio de Janeiro: Campus, Optei pela descrição ser também not null. 2000. ALVES, W.P. Fundamentos de Bancos de Dados. Editora Érica, 2004. Além destes, há livros específicos sobre SQL, independente de SGBD, tais como: Comentário BEIGHLEY, Lynn. Use a Cabeça SQL. Starlin Alta Consult, 1ª Edição, 2008 25 O preço é um valor KLINE, Daniel; KLINE, Kelvin E. Sql - O Guia Essencial - Manual de Referência decimal . Optei por ele Profissional. Alta Books, 2010. poder assumir o valor NULL (suponha que no SHELDON, Robert; OPPEL, Andy. SQL – Um Guia para Iniciantes. Editora Ciência momento do cadastro Moderna, 3ª Edição, 2009 você ainda não saiba por quanrto vai vender DAMAS, Luís. Sql - Structured Query Language. Editora LTC, 6ª edição, 2007. o produto. 34
  • 35.
    Banco de Dados Você Sabia? Além da SQL outra linguage comercial para manipulação de SGBDs é a QBE (Query-by-Example). A versão experimental da linguagem foi descrita formalmente (publicada) por Moshe Zloof em 1977. A versão comercial foi descrita em 1978 pela IBM e usada mais tarde na Query Management Facility (QMF). A QBE tem por base o cálculo relacional de domínio e possui sintaxe bidimensional: as consultas parecem tabelas. Nesta linguagem as consultas são expressas “por exemplo”. Em vez de determinar um procedimento para obtenção da resposta desejada, o usuário dá um exemplo do que é desejado. A partir daí, o sistema generaliza o exemplo para o Comentário processamento da resposta da consulta. 26 Você não pode deixar para especificar a quantidade de itens Aprenda Praticando depois. Por isso, NOT NULL. Utilize SQL para fazer o que se pede, a partir do modelo relacional a seguir. » Produto (cod_prod (PK), descricao, preco) Comentário » Item_Venda (cod_venda (PK), cod_prod(PK), qntde) 27 Veja que está » Venda (cod_venda (PK), nome_cliente) sendo especificada uma chave primária 1) Crie as tabelas acima usando o comando, sabendo que os códigos devem ser composta, uma vez valores núméricos, preco deve ser um valor de ponto flutuante e qntde (quantidade que dois atributos fazem parte da comprada do produto) deve ser um valor inteiro, obrigatoriamente, maior que zero especificação. (afinal, ninguém compra zero produto!). Devemos começar a criação pelas tabelas mais simples (sem chave estrangeira). Dessa forma, vamos criar primeiro a tabela PRODUTO e, depois, a tabela VENDA. Comentário CREATE TABLE22 PRODUTO( 28 Veja que estamos cod_prod integer23 NOT NULL, espeficifando que cod_prod é chave descricao CHAR(45) NOT NULL24, estrangeira na tabela e é um atributo preco DECIMAL25(5,2), pertencente a tabela PRIMARY KEY (cod_prod) ) Produto. Seguindo o mesmo raciocínio da tabela anterior, criaremos, agora, a tabela VENDA. CREATE TABLE VENDA( cod_venda integer NOT NULL, nome_cliente CHAR(40) NOT NULL, PRIMARY KEY (cod_venda) ) CREATE TABLE ITEM_VENDA( cod_prod INTEGER NOT NULL, cod_venda INTEGER NOT NULL, qntde INTEGER NOT NULL26, PRIMARY KEY (cod_prod, cod_venda)27, FOREIGN KEY (cod_prod) REFERENCES Produto28, FOREIGN KEY (cod_venda) REFERENCES Venda, 35
  • 36.
    Banco de Dados CHECK qntde > 0)29; 2) Altere a Tabela VENDA para incluir o atributo Dt_Venda e, depois, para mudar o Comentário tamanho do atributo nome para 50 caracteres. 29 Aqui é especificado ALTER TABLE VENDA { ALTER TABLE VENDA { que a quantidade de ADD Dt_Venda DATE NOT MODIFY Nome_Cliente CHAR(50)31 itens deve ser maior NULL30 que zero, conforme foi especificado no } } enunciado. 3) Criar um Índice para o atributo nome_cliente da tabela VENDA CREATE INDEX clienteIDX32 ON VENDA (nome_cliente); Comentário 30 Adicionamos o Atividades e Orientações de Estudo atributo à tabela VENDA. Agora é a sua vez de fazer as atividades! Lembre-se praticar é muito importante pra fixar o conteúdo estudado! Comentário Atividades Práticas: 31 Aumentamos o tamanho para 50. Resolva as atividades a seguir em um documento texto e poste o mesmo no ambiente virtual, no local indicado. Essa atividade é para ser realizada em DUPLA (escolha seu companheiro de trabalho!) e fará parte da avaliação somativa de vocês. Comentário I) A partir do modelo relacional especificado a seguir, escreva os comandos SQL que realizem as operações solicitadas. 32 Como estamos fazendo neste capítulo, Professor (CPF_Prof (PK), Nome_Prof, Titulacao) você pode adotar um sufixo para indicar o Disciplina (Cod_Disc (PK), CPF_Prof (FK), Nome_Disc, carga_horaria) nome do índice, como no caso IDX. Aluno (Matricula (PK), Nome) Turma (Cod_Disc (PK), Matricula (PK), sala) 1) Faça a criação das tabelas do modelo relacional especificado acima. Algumas observações são: o atributo TITULACAO deve ser caractere de tamanho 30, deve permitir nulos e os valors permitidos são “graduado, especialista, mestre ou doutor”. A carga horária da disciplina deve ser maior que zero. 2) Altere a tabela PROFESSOR para para incluir o atributo tempo de serviço, do tipo inteiro e que deve ser not null. E modifique o atributo titulação para que passe a não permitir valores nulos. 3) Altere a tabela TURMA para deletar o atributo sala. 4) Altere a tabela ALUNO para incluir o curso que ele está prestando. Esse atributo deve ser caractere de tamanho 40 e não deve permitir nulos. O valor default desse atributo deve ser “Informática”. 5) Crie índices para os atributos Nome_Prof (tabela professor) e Nome_Disc (tabela Disciplina). 36
  • 37.
    Banco de Dados Vamos Revisar? Nos capítulos anteriores a esse, você estudou como fazer a modelagem conceitual do seu banco de dados e, depois, como projetá-lo segundo o modelo relacional (MR). A partir do MR gerado, para poder criar fisicamente o banco de dados, você necessitará fazer uso dos comandos estudados neste capítulo. Esses comandos fazem parte da DDL (Data Definition Language) da SQL e incluem, entre outros, comandos para criar, alterar e deletar tabelas, além de comandos para criação e deleção de índices de tabela. Os comandos aqui estudados poderão ser utilizados em qualquer SGBD, pois fazem parte do SQL ANSI. Uma vez que seu banco de dados estiver criado, ele poderá ser manipulado e consultado usando a DML (Data Manipulation Language) da SQL, este será o assunto do próximo capítulo. 37
  • 38.
    Banco de Dados Capítulo 12 O que vamos estudar neste capítulo? Neste capítulo, vamos estudar os seguintes temas: » Inserção de dados em Tabelas. » Deleção de dados de Tabelas. » Consultas em Tabelas. Metas Após o estudo deste capítulo, esperamos que você saiba utilizar a DML (Data Manipulation Language) do SQL. Dessa forma, você deverá saber: » Inserir dados em Tabelas. » Deletar dados de Tabelas. » Realizar consultas simples, agrupadas e aninhadas em Tabelas. 38
  • 39.
    Banco de Dados Capítulo12 – Consultas em Banco de Dados Relacionais Vamos conversar sobre o assunto? No capítulo anterior você aprendeu como criar fisicamente o seu banco de dados através dos comandos da DDL (Data Definition Language) da SQL. Ou seja, você aprendeu como fazer a criação de tabelas, índices para determinados atributos das tabelas e fazer a manutenção de tudo que foi criado em termos de esquema (definição da tabela). Agora, que as tabelas já estão criadas, resta saber como inserir dados nas mesmas, como atualizar ou deletar esses dados inseridos, além de como fazer para buscar informações em uma ou mais tabelas através de consultas simples ou aninhadas. É justamente isto que você irá estudar neste capítulo. Neste capítulo estudaremos a DML (Data Manipulation Language) da SQL que engloba justamente os comandos da SQL para inserção, deleção, atualização e consulta de dados em tabelas de banco de dados relacionais. Vamos lá? Inserindo Dados em Tabelas A partir do momento em que uma tabela está criada, ela já pode receber a entrada de dados. Para isto usamos o comando INSERT INTO. Este comando adiciona uma ou mais linhas na tabela. A sintaxe desse comando é: è Para inserir uma única tupla (linha): INSERT INTO nome_tabela [(atrib1,atrib2,...)] VALUES (valor1, valor2,...) Onde: nome_tabela deve ser o nome da tabela onde se deseja inserir dados. Atrib1, atrib2, ... são os nomes dos atributos que receberão os valores na inserção. Se for omitida essa lista de nomes de atributos serão selecionadas todas as colunas da tabela, pela sua ordem de criação33. Se for especificada uma lista de nomes de atributos, os valores para os dados deverão ser especificados para inserção na Comentário ordem em que aparecem na lista. Valor1, valor2, ... são os valores que serão atribuídos aos atributos. Esses valores 33 Importante atentar devem ser especificados seguindo a ordem dos atributos (ou da lista de atributos para isto porque você deverá especificar especificada no comando ou a ordem de criação dos atributos na tabela). Na os valores a serem especificação dos valores também deve-se atentar que: 1) Valores de atributos do inseridos também pela tipo caracter (CHAR ou VARCHAR) e do tipo DATE devem estar entre apóstrofos. ordem de criação dos atributos. Senão, corre 2) A entrada de dados baseada em caracteres deve ser efetuada, de preferência o risco de inserir dados com caracteres em maiúsculo e sem acentuação, pois se algum acento for utilizado, nos campos errados. pode criar problemas no momento de uma pesquisa com uma palavra idêntica que não possua acento. 3) Os atributos especificados como NOT NULL devem sempre receber algum valor senão um erro será gerado e o comando não será executado, 39
  • 40.
    Banco de Dados pois esses atributos nunca poderão ficar vazios. Comentário è Para inserir mais de uma tupla (linha): INSERT INTO nome_tabela [(atrib1,atrib2,...)] <comando SELECT>34 34 O comando SELECT sera explicado Vamos exemplificar o uso desses comandos. Para isso, tomaremos como base o posteriormente. Por modelo relacional usado nos exemplos do capítulo anterior, mas com alguns atributos a hora, o importante é menos, veja: saber que podemos inserir em uma tabela, várias tuplas, resultado AUTOR (CodAutor (PK), Nome, Nascimento) de uma consulta usando SELECT. LIVRO (TitLivro (PK), CodAutor (FK), CodEditora (FK), Valor, Ano_Publicacao) EDITORA (CodEditora (PK), Razao, Endereco, Cidade) Vamos aos exemplos. Suponha que você deseje inserir um registro na tabela Autor. Comentário Como ficaria? 35 Observe que, como INSERT INTO Autor ( CodAutor, Nome, Nascimento ) mencionado, valores do tipo caracter e VALUES (112, ‘C. J. Date’, ‘03/12/1941’35); valores do tipo DATE Lembrando que a ordem dos valores deve ser a mesma ordem dos atributos para devem vir entre apóstrofos. que sejam inseridos nos lugares corretos. Agora, vamos inserir um registro na tabela Editora. INSERT INTO Editora( CodEditora, Razao, Endereco, Cidade ) VALUES (1, ‘Editora Campus’, ‘R. Sete de Setembro,111’, ‘Rio de Janeiro’); Depois de preenchida as tabelas base (que não dependem de nenhuma outra), Comentário vamos colocar um registro na tabela Livro, que depende de valores cadastrados nas duas tabelas anteriores 36 Lembre que, quando não especificamos a INSERT INTO Livro36 ordem dos atributos, é tomada a ordem de VALUES (‘Introdução a Sistemas de Banco de Dados’, 11237, 138, NULL39, ‘2000’); criação dos atributos na tabela. Assim, os Chamamos a atenção para o fato que, na Tabela Livro, o código do autor e o código valores dos atributos da editora são chaves estrangeiras e, para que tudo dê certo, os valores utilizados, aqui, no deveriam vir nessa insert, devem existir anteriormente nas tabelas de origem das chaves estrangeiras, no caso, mesma ordem de criação que está nas tabelas Autor e Editora. especificada no esquema da tabela Para finalizar os exemplos, vamos fazer a criação de uma nova tabela no nosso Livro, do modelo modelo, chamada AUTOR_JOVEM com os mesmos campos da tabela AUTOR. Depois, relacional exemplo. vamos inserir nesta nova tabela os autores da tabela AUTOR com nascimento posterior a 01/01/1980. Como ficariam os comandos SQL para realizar essas ações? Comecemos pela Comentário criação da nova tabela. CREATE TABLE AUTOR_JOVEM( 37 112 é o código do autor anteriormente CodAutor INTEGER NOT NULL, cadastrado. Nome CHAR(50) NOT NULL, Nascimento DATE NOT NULL, Comentário PRIMARY KEY (CodAutor), 38 O Valor 1 é o UNIQUE (Nome, Nascimento) ); código da editora Agora vamos preencher essa tabela com os autores com nascimento posterior a anteriormente cadastrada. 01/01/1980. INSERT INTO AUTOR_JOVEM 40
  • 41.
    Banco de Dados SELECT * FROM AUTOR WHERE Nascimento40 > ‘01/01/1980’; Comentário Atualizando Dados em Tabelas 39 Como o atributo Para modificar o valor de atributos de uma ou mais tuplas (linhas), dependendo VALOR pode receber dos critérios de seleção de quem será modificado, o comando UPDATE deve ser utilizado. A valores nulos (ele não é NOT NULL) pela sintaxe desse comando é: definição feita na tabela, no capítulo UPDATE nome_tabela SET lista_atributos com atribuições de valores anterior, podemos [WHERE condição de seleção das tuplas a serem modificadas] preenchê-lo com o valor NULL. Onde: nome_tabela - é a indicação da tabela em que se deseja efetuar a atualização dos registros; Comentário lista_atributos com atribuições de valores – É a indicação de quais atributos deverão ser atualizados e por qual valor. Esse trecho deve ter o seguinte formato: nome_ 40 Aqui fazemos a atributo1 [, nome_atributo2, ....] = {valor ou expressão } seleção dos autores com nascimento maior A cláusula WHERE especifica quais dados da coluna serão alterados. Quando que 01/01/1980. a cláusula WHERE (que é opcional) é omitida, o UPDATE deve ser aplicado a todas as Veremos o comando tuplas da relação. Ou seja, todas as tuplas da relação serão modificadas. Por exemplo: se SELECT , o mais importante da DML, desejássemos reajustar o valor de todos os livros em 10%, usaríamos o seguinte comando: em detalhes, mais a frente. UPDATE LIVRO SET Valor = Valor * 1.141 Como no comando acima não foi especificada uma cláusula WHERE, todos os livros Comentário cadastrados na tabela LIVRO seriam atualizados. Agora, vamos supor que desejássemos alterar o endereço e a cidade da editora com CodEditora = 10. 41 O valor antigo UPDATE EDITORA SET endereco = ‘Av. N.S. de Fátima, 456’, cidade = ‘João Pessoa42’ de cada livro vai receber o valor antigo WHERE CodEditora = 1; aumentado de 10% Aqui não seriam atualizadas todas as editoras da tabela EDITORA, mas apenas a (representado na fórmula pelo 1.1) editora de código 10. A cláusula WHERE aceita como condição um comando SELECT. Daremos mais detalhes do que pode Comentário vir em uma cláusula WHERE mais à frente. Aguarde... 42 Veja que apenas os campos endereço Exluindo Dados de Tabelas e cidade, como solicitado, seriam atualizados. Os Para excluir linhas (que satisfaçam uma determinada condição) de uma ou mais novos valores para os tabelas, usa-se o comando DELETE FROM, cuja sintaxe é: atributos vëm entre apóstrofos porque são DELETE FROM Nome_Tabela do tipo caracter. [WHERE Condição43] Se omitirmos a cláusula WHERE, então o DELETE será aplicado a todas as tuplas Comentário da relação, ou seja, TODOS os registros da tabela serão deletados (cuidado com esse comando!). Porém, a tabela permanece no BD como uma tabela vazia. Por exemplo, o 43 A cláusula WHERE especifica quais comando: DELETE FROM LIVRO; Deletaria todos os registros da tabela livro, deixando a linhas da tabela serão mesma vazia. Vale ressaltar que a tabela (seu esquema) permanece. Logo, esse comando excluídas. não é equivalente ao DROP TABLE (que apagaria o esquema da tabela do banco de dados e, por consequência, todos os dados da tabela seriam deletados juntamente). Quando a cláusula WHERE é especificada, apenas os registros que obedecem a condição estabelecida são deletados. Por exemplo, excluir os registros da tabela autor cujo 41
  • 42.
    Banco de Dados codAutor seja igual a 15. DELETE FROM AUTOR WHERE CodAutor = 15; Comentário Consultando Dados em Tabelas 44 Você pode Chegamos, agora, no comando mais importante da SQL por ser o utilizado com mais especificar os atributos frequência: o SELECT. Este comando se tornou o mais importante da linguagem SQL devido desejados ao seu poder de consulta. Pois com ele poderemos realizar, entre outras coisas, consultas em uma ou mais tabelas, realizar consultas aninhadas, fazer a aplicação de funções pré- existentes e utilizar operações relacionais (união, diferença, interseção e obviamente seleção) com extrema simplicidade na manipulação das tabelas. A estrutura básica do comando SELECT é: Comentário SELECT → PROJEÇÃO da álgebra relacional 45 Ou pode utulizar o * (asterisco) que FROM → Onde a pesquisa será feita (uma ou mais tabelas) indica que se quer projetar TODAS as colunas da(s) tabela(s) WHERE → Condições da SELEÇÃO espedificada(s) na cláusula FROM. Em resumo, a cláusula SELECT corresponde à operação de projeção da álgebra relacional. Usada para listar os atributos desejados do resultado de uma consulta. A cláusula FROM corresponde A especificação de onde a pesquisa será realizada. Em uma ou mais tabelas (quando for usada mais de uma tabela, será aplicada a operação de produto Comentário cartesiano da álgebra relacional). A cláusula WHERE corresponde à operação de seleção da álgebra relacional, onde são especificadas as condições de pesquisa na(s) tabela(s) 46 Veja que, na cláusula identificadas na cláusula FROM. WHERE espedificamos a condição de pesquisa que, no caso, é o código ser igual a 5. Vamos dar um exemplo. Selecione todas as informações da tabela AUTOR. Haveria duas formas de realizar essa consulta: SELECT CodAutor, Nome, Nascimento44 FROM AUTOR ; ou SELECT45 * FROM AUTOR ; Outro exemplo seria: Selecione todas as informações sobre o autor de código 5. SELECT * FROM AUTOR WHERE CodAutor = 546; Além dessa parte básica o comando SELECT tem várias outras que iremos explicando nas próximas seções, começando da utilização mais simples, até chegar na mais elaborada. Para dar uma ideia, a sintaxe completa do comando é: SELECT [DISTINCT] nome_coluna,.... FROM nome_tabela, .... [WHERE (condições)] [GROUP BY nome_coluna, ....] [HAVING (condições)] 42
  • 43.
    Banco de Dados [{INTERSECT | MINUS | UNION} outro_comando_select] [ORDER BY nome_coluna {ASC | DESC}, ....]; Cada cláusula permite a especificação de algum elemento referente às operações relacionadas a álgebra relacional : SELECT - o que deseja-se na tabela de resultado FROM - de onde retirar os dados necessários WHERE - condições para busca dos resultados GROUP BY - agrupamento de resultados HAVING - condições para a definição de grupos na tabela de resultados INTERSECT - permite a interseção de tabelas MINUS - permite a diferença entre tabelas UNION - permite a união de tabelas ORDER BY - estabelece a ordenação lógica da tabela de resultados (ASC – ordenação ascendente, DESC – ordenação descendente) É importante ressaltar que o resultado de qualquer comando SELECT é uma tabela com as tuplas (e os atributos destas) que atendam aos critérios especificados. Para mostrar esse ponto, além de tomarmos como base o mesmo modelo exemplo que vem sendo utilizado para demonstrar as consultas das seções a seguir, vamos fazer uso das Relações mostradas nas Tabelas 27, 28 e 29 que representam exemplos do modelo base preenchido. Tabela 27 - Relação Editora Cod_Editora (PK) Razao Endereco Cidade 1 Sextante Av. Hortências, 234 Porto Alegre 2 Fantasy R. 24 horas, 55 São Paulo 3 Bookman Av. das Ubaias, 303 Recife Tabela 28 - Relação Autor Cod_Autor (PK) Nome Nascimento 110 Pedro Alves 18/03/1955 111 Carolina Dantas 22/02/1970 112 Olívia Duncan 10/01/1968 43
  • 44.
    Banco de Dados Tabela 29 - Relação Livro TitLivro (PK) CodAutor (FK) CodEditora (FK) Valor Ano_Publicacao Banco de Dados 110 3 150,00 2009 O Estranho 111 1 45,00 2010 Sucesso 112 2 35,00 2000 Arquitetura de BD 110 3 110,00 2007 O Conhecido 111 1 55,00 2009 BD Distribuídos 110 3 98,00 2010 Consultas Simples Sem Condição Como exemplificado na seção anterior, uma consulta simples, utiliza apenas as cláusulas SELECT/FROM. Por exemplo, selecionar todas as informações de todas as editoras cadastradas: SELECT * FROM Editora; Esse comando resultaria na Tabela 30, pois o * (asterisco), como já explicado anteriormente, indica que todos os atributos (colunas) da tabela devem ser selecionados. Tabela 30 - Relação Resultante Cod_Editora Razao Endereco Cidade 1 Sextante Av. Hortências, 234 Porto Alegre 2 Fantasy R. 24 horas, 55 São Paulo 3 Bookman Av.das Ubaias, 303 Recife Outra opção seria selecionar apenas alguns atributos das editoras. Para isso, é necessário na cláusula SELECT especificar os nomes dos atributos que se deseja na tabela resultante. Por exemplo, selecionar a razão e a cidade de todas as editoras cadastradas. SELECT razao, cidade FROM Editora; Esse comando resultaria na Tabela 31, uma vez que apenas os atributos razão e cidade foram selecionados. Porém, observe que todas as tuplas da tabela aparecem, pois não há condição de filtragem. Tabela 31 - Relação Resultante Razao Cidade Sextante Porto Alegre Fantasy São Paulo Bookman Recife 44
  • 45.
    Banco de Dados Uma coluna (atributo), também pode ser especificada colocando antes dele o nome de sua tabela (útil apenas quando existem atributos de nomes iguais em tabelas diferentes – veremos mais à frente, quando estudarmos a opção de consulta em mais de uma tabela). Exemplo: SELECT Editora.razao, Editora.cidade FROM Editora47; Uma coluna pode ser renomeada durante a consulta usando a cláusula AS, da Comentário seguinte forma: NomeColuna AS NomeColunaRenomeada. O que mudaria com isso? O nome da coluna renomeada seria a que iria aparecer na tabela resultante (vide Tabela 32), 47 A relação resultante seria também a Tabela ao invés do nome original da coluna. Por exemplo, selecionar a razão de todas as editoras 31. cadastradas, chamando a razão de nome_empresa. SELECT razao AS Nome_empresa FROM Editora; Tabela 32 - Relação Resultante Comentário Nome_empresa48 Sextante 48 Observe que na relação resultante o Fantasy nome da coluna que aparece é o nome Bookman dado a coluna com a renomeação. Renomear um atributo, também, é útil quando realizamos algum tipo de operação sobre o resultado do atributo selecionado. Por exemplo, selecionar todos os títulos dos livros e seus valores em dobro. Para isso, podemos realizar uma seleção e no atributo valor, aplicar a operação de multiplicar por dois, resultando na relação da tabela 33. SELECT Titulo, Valor * 2 AS Dobro49 FROM Livro; Comentário Tabela 33 - Relação Resultante 49 Cada valor retornado TitLivro Dobro50 seria multiplicado por dois e apareceria em Banco de Dados 300,00 uma coluna chamada DOBRO, devido a O Estranho 90,00 renomeação. Sucesso 70,00 Arquitetura de BD 220,00 O Conhecido 110,00 BD Distribuídos 196,00 Comentário No caso de uso de operadores aritméticos, se a coluna não for renomeada, 50 Se avaliar a relação original, vai verificar aparecerá como título da coluna a fórmula utilizada. Ou seja, é criada uma coluna na relação que essa coluna é resultante que não pertence à tabela a partir dos cálculos realizados sobre um ou mais justamente o valor atributos da tabela (vide Tabela 34). Por exemplo, selecionar todos os títulos dos livros e calculado na cláusula seus valores com 10% de desconto. SELECT, ou seja, o dobro. SELECT Titulo, Valor - (Valor * 0.1) FROM LIVRO; 45
  • 46.
    Banco de Dados Tabela 34 - Relação Resultante TitLivro Valor - (Valor * 0.1) Banco de Dados 135,00 O Estranho 40.50 Sucesso 31.50 Arquitetura de BD 99,00 O Conhecido 55,00 Comentário BD Distribuídos 98,00 51 Como o ALL é o default, ele não precisa ser especificado. Em SQL a eliminação de linhas duplicadas não é feita automaticamente, devendo a Logo, esse comando mesma ser especificada explicitamente, se desejada. Para isso usamos a cláusula DISTINCT é equivalente ao no SELECT. Pois, se ela não for especificada, o padrão é ALL, ou seja, selecionar tudo, anterior. inclusive valores repetidos. Por exemplo, selecionar todas os anos de publicação de livros da tabela LIVRO, resultaria na relação da tabela 34, onde podem ser observados valores reptidos. SELECT ALL Ano_Publicacao FROM Livro; ou SELECT Ano_Publicacao51 FROM Livro; Tabela 35 - Relação Resultante Comentário Ano_Publicacao 2009 52 Com esse comando, se houvesse , por 2010 exemplo, duas ou 2000 mais cidades RECIFE cadastradas na tabela 2007 Editora, esse valor seria apresentado 2009 na tabela resultante apenas uma única vez. 2010 Agora, se quiséssemos realizar a mesma consulta, agora, sem valores repetidos, deveríamos usar a cláusula DISTINCT, resultando na relação da Tabela 35. Comentário SELECT DISTINCT Ano_Publicacao FROM Livro52; 53 Observe que nessa Tabela 36 - Relação Resultante tabela resultante, diferente da tabela 34, não existem valores Ano_Publicacao53 repetidos. 2009 2010 2000 2007 Consultas usando Funções de Agregação Na cláusula SELECT, é possível utilizar funções de agregação (vide Tabela 37), para 46
  • 47.
    Banco de Dados projetarcálculos relacionados a atributos de uma ou mais relações. Tabela 37 - Funções de Agregação no SQL Funções de Agregação AVG Calcula a média dos valores selecionados MIN Calcula o menor valor entre os selecionados MAX Calcula o maior valor entre os selecionados COUNT Conta quantos valores foram selecionados SUM Calcula o somatório dos valores selecionados Essas funções são utilizadas logo após o SELECT, no local de especificação dos atributos a serem projetados na seleção. O resultado do uso dessas funções é uma tabela contendo apenas o valor calculado. Vamos dar alguns exemplos. » Projetar a média dos valores dos livros Comentário SELECT AVG (Valor)54 FROM LIVRO; 54 Veja que o atributo AVG (Valor) do qual se deseja 82,16 calcular a média vem entre parênteses. Fazendo isso, todos os valores de livro da » Informar o valor do livro mais caro tabela são recuperados e o AVG calcula a SELECT MAX (Valor) FROM LIVRO; média deles. MAX (Valor) 150,00 » Informar o valor do livro mais barato SELECT MIN (Valor) FROM LIVRO; MIN (Valor) 35,00 » Projetar a quantidade de autores cadastrados SELECT COUNT (*) AS QUANTIDADE55 FROM AUTOR; Comentário QUANTIDADE 3 55 Nessa cláusula, o COUNT conta quantas tuplas existem na tabela AUTOR. O AS » Somar todos os valores dos livros cadastrados renomeou a coluna SELECT SUM (Valor) FROM LIVRO; para QUANTIDADE.. SUM (Valor) 493,00 47
  • 48.
    Banco de Dados As funções de agregação não podem ser combinadas a outros atributos da tabela no resultado da consulta. Assim, a consulta a seguir não seria possível: Restringindo a Consulta de Dados em Tabelas Para restringir as consultas realizadas com o SELECT, precisamos fazer uso da cláusula WHERE. Essa cláusula especifica quais linhas da(s) tabela(s) listada(s) na cláusula FROM serão afetadas pela condição. Se nenhuma cláusula WHERE for especificada, a consulta retornará todas as linhas da tabela, como visto nas seções anteriores. Na cláusula WHERE é especificada a condição de restrição fazendo uso de operadores lógicos (AND, OR e NOT) e relacionais (=, <>, >, <, >= e <=). A condição de WHERE pode ser de três tipos: comparação, ligação entre tabelas (Join) e subconsultas (Sub-Queries). Vamos estudar cada uma delas. Comparação Em geral, a comparação é realizada fazendo uso de uma condição composta por: Expressão Operador Relacional Expressão Onde, a condição é verdadeira quando a 1a expressão atende ao operador relacional sobre a 2ª. Por exemplo, selecionar os livros publicados após 2008 (vide resultado da consulta na Tabela 38): SELECT * FROM LIVRO WHERE Ano_Publicacao > ‘2008’; Tabela 38 - Relação Resultante TitLivro (PK) CodAutor (FK) CodEditora (FK) Valor Ano_Publicacao Banco de Dados 110 3 150,00 2009 O Estranho 111 1 45,00 2010 O Conhecido 111 1 55,00 2009 BD Distribuídos 110 3 98,00 2010 Também, podem ser utilizadas na comparação algumas cláusulas para trazer facilidades para a seleção de dados. Vamos a elas! » WHERE atributo [NOT] BETWEEN valor1 AND valor2; Busca por intervalos de valores compreendidos entre os valores 1 e 2 (inclusive). A variação é usar na frente do BETWEEN a cláusula NOT, neste caso, a busca é por valores que estejam FORA do intervalo. Por exemplo, selecionar os livros com valor de 50,00 a 100,00 (Resultado na Tabela 39). 48
  • 49.
    Banco de Dados SELECT * FROM LIVRO Tabela 39 - Relação Resultante TitLivro (PK) CodAutor (FK) CodEditora (FK) Valor Ano_Publicacao O Conhecido 111 1 55,00 2009 BD Distribuídos 110 3 98,00 2010 Se se desejasse os livros fora do intervalo (ou seja, mais baratos que 50 e mais caros que 100) seria usada a cláusula NOT (Resultado na Tabela 40). SELECT * FROM LIVRO WHERE Valor NOT BETWEEN 50.00 AND 100.00; Tabela 40 - Relação Resultante TitLivro (PK) CodAutor (FK) CodEditora (FK) Valor Ano_Publicacao Banco de Dados 110 3 150,00 2009 O Estranho 111 1 45,00 2010 Sucesso 112 2 35,00 2000 Arquitetura de BD 110 3 110,00 2007 Comentário 56 O caracter especial usado para WHERE atributo [N OT] LIKE ‘padrão’ representação de padrões muda de Esta cláusula busca por padrões em atributos do tipo CHAR. A condição é satisfeita SGBD para SGBD. quando o valor do atributo é igual ao valor do padrão. Caracteres especiais56 são utilizados para construção do padrão, tais como: “%” ou “*” → Usados para representar zero ou mais caracteres. Comentário “_” ou “?” → Usados para representar um único caractere. 57 Observe que o [a-f] : busca por qualquer caractere entre ´a´ e ´f´ (usado no SQL-Server). padrão vem entre apóstrofos. Observe Vamos dar alguns exemplos. Selecionar todos os livros cujo título tenha 7 caracteres também que é usada e inicie com a letra S (resultado na Tabela 41). uma interrogação (?) para cada caractere do SELECT * FROM Livro WHERE TitLivro LIKE ‘S??????’57; nome. Como se deseja que a letra S seja a Tabela 41 - Relação Resultante primeira. Ela vem escrita no padrão. TitLivro (PK) CodAutor (FK) CodEditora (FK) Valor Ano_Publicacao Sucesso 112 2 35,00 2000 Comentário Selecionar todos os livros que tenham a palavra BD no seu título (resultado na 58 Aqui o símbolo Tabela 42). % representa que pode existir qualquer SELECT * FROM Livro WHERE TitLivro LIKE ‘%BD%58’; número de caracteres antes ou depois da palavra BD. 49
  • 50.
    Banco de Dados Tabela 42 - Relação Resultante TitLivro (PK) CodAutor (FK) CodEditora (FK) Valor Ano_Publicacao Arquitetura de BD 110 3 110,00 2007 BD Distribuídos 110 3 98,00 2010 Da mesma forma que se usa o LIKE, também pode ser usado o NOT LIKE. Neste último caso, é devolvida na consulta os valores que NÃO obedecem ao padrão especificado. Uma observação importante é que LIKE e NOT LIKE só se aplicam sobre atributos do tipo CHAR. » WHERE atributo IS [NOT] NULL Essa cláusula testa a existência de valores nulos (NULL) ou não nulos (NOT NULL). Ele faz com que a consulta retorne as tuplas da relação cujo atributo em questão seja nulo ou não nulo, conforme a cláusula sendo utilizada. Para dar exemplo de uso dessa cláusula, vamos supor que a relação LIVRO seja a da tabela 43. Assim, vamos a realizar a seguinte consulta: selecionar todos os livros que estão sem preço definido (resultado na Tabela 44). Comentário SELECT * FROM Livro WHERE Valor IS NULL59 Tabela 43 - Relação Livro 59 Vai checar entre todos os livros aqueles que tem no valor do TitLivro (PK) CodAutor (FK) CodEditora (FK) Valor Ano_Publicacao livro NULL. Banco de Dados 110 3 150,00 2009 O Estranho 111 1 45,00 2010 Sucesso 112 2 NULL 2000 Arquitetura de BD 110 3 110,00 2007 O Conhecido 111 1 55,00 2009 BD Distribuídos 110 3 NULL 2010 Tabela 44 - Relação Resultante TitLivro (PK) CodAutor (FK) CodEditora (FK) Valor Ano_Publicacao Sucesso 112 2 NULL 2000 BD Distribuídos 110 3 NULL 2010 » WHERE expressão [NOT] IN (Valores) Teste de pertinência elemento-conjunto. O teste da condição é verdadeiro se o valor da expressão for igual (ou diferente, se for usado o NOT) a um dos valores especificados entre parênteses. Por exemplo, selecionar as editoras com sede em São Paulo ou Rio de Janeiro (resultado na Tabela 45). 50
  • 51.
    Banco de Dados SELECT * FROM editora WHERE Cidade IN (‘São Paulo’, ‘Rio de Janeiro’)60; Comentário Tabela 45 - Relação Resultante 60 Veja que como Cod_Editora (PK) Razao Endereco Cidade a comparação se refere a um campo 2 Fantasy R. 24 horas, 55 São Paulo caracter , os valores devem vir entre apóstrofos. Cada valor é comparado com o É possível misturar os vários tipos de comparação aqui explicados em uma única atributo envolvido cláusula WHERE interligada por operadores lógicos. Vamos dar um exemplo: Selecionar na comparação. Veja que nesse caso o IN todos os livros que iniciam com a letra O, estão com preço definido e foram publicados é equivalente a uma depois de 2009 (resultado na Tabela 46, de consulta aplicada na Tabela 43). condição do tipo (Cidade = ‘São Paulo” SELECT * FROM Livro OR cidade = ‘Rio de Janeiro’). WHERE Titulo LIKE ‘O%’ AND Valor IS NOT NULL AND Ano_Publicacao > ‘2009’ Tabela 46 - Relação Resultante TitLivro (PK) CodAutor (FK) CodEditora (FK) Valor Ano_Publicacao O Estranho 111 1 45,00 2010 Ligação Entre Tabelas - Join Diz-se que tabelas estão relacionadas se tiverem campos comuns (em uma tabela chave primária e em outra chave estrangeira). O efeito do JOIN é a criação de uma tabela temporária em que cada par de linhas (de tabelas diferentes) que satisfaça a condição de ligação, seja interligada para formar uma única linha. A ligação é sempre estabelecida na cláusula WHERE através da igualdade de campos de tabelas diferentes, tabelas essas que precisam ter sido especificdas na cláusula FROM. O FROM estabelece o produto cartesiano entre as tabelas listadas e a cláusula WHERE filtra as linhas úteis segundo a condição especificada. É possível misturar as cláusulas de comparação, vistas anteriormente, juntamente com AND, OR e NOT para formar condições de ligações mais complexas. Vamos aos exemplos, para deixar tudo mais claro. Selecione todos os títulos dos livros e o nome de seus respectivos autores. Veja que, para responder a essa consulta, não seria possível consultar apenas a tabela livro, pois esta não possui o nome do autor, mas apenas o código do mesmo. Para obter o nome do autor seria necessário fazer um JOIN das tabelas LIVRO e AUTOR. Então, como fazer isso? Fazendo a igualdade entre os campos que Comentário as tabelas possuem em comum: 61 Para cada atributo SELECT autor.Nome, livro.TitLivro FROM autor, livro61 identificamos a qual tabela ele pertence. WHERE autor.Cod_Autor = livro.CodAutor; Para evitar escrever o nome completo da tabela na frente de cada atributo, para deixar mais claro a que tabela cada atributo pertence durante o JOIN, podemos dar apelidos 51
  • 52.
    Banco de Dados às tabelas. Para ilustrar, vamos apresentar o mesmo exemplo anterior modificado para usar os apelidos: SELECT AU.Nome, LI. TitLivro FROM AUTOR AU, LIVRO LI WHERE AU.Cod_Autor = LI.CodAutor; Em ambas as consultas a relação resultante é a apresentada na Tabela 47. Tabela 47 - Relação Resultante TitLivro Nome Banco de Dados Pedro Alves O Estranho Carolina Dantas Sucesso Olívia Duncan Arquitetura de BD Pedro Alves O Conhecido Carolina Dantas BD Distribuídos Pedro Alves No JOIN podem ser unidas duas ou mais tabelas. Para se ligar várias tabelas, usa-se o operador lógico AND entre as condições do JOIN. Vamos dar outro exemplo. Selecionar todos os nomes de autores, o título dos seus livros e a razão das editoras, considerando os livros que custem mais de 50 reais e cujas editoras sejam Fantasy ou Bookman. Veja que para responder a essa consulta, precisamos fazer um JOIN entre as três tabelas: Livro (considerar a da Tabela 43), Autor e Editora. SELECT AU.Nome, LI. TitLivro, ED.Razao FROM autor AU, livro LI, editora ED WHERE AU.Cod_Autor = LI.CodAutor AND LI.CodEditora = ED.Cod_Editora AND LI.Valor > 50,00 AND ED.Razao IN (‘Fantasy, ‘Bookman’) ; O resultado desta consulta pode ser observado na Tabela 48. Tabela 48 - Relação Resultante Nome TitLivro Razao Pedro Alves Banco de Dados Bookman Observação É preciso ter muito cuidado com os JOINs, pois exigem alto custo de execução (implicam diretamente na performance). Além disso, quando os JOINs forem utilizados, deve-se ter cuidado para fazer corretamente a montagem da condição de junção. 52
  • 53.
    Banco de Dados Subconsultas(Sub-Queries) Na condição especificada na cláusula WHERE podem ser usadas subconsultas. Essas subconsultas podem retornar um valor simples, ou um conjunto de valores. Vamos olhar cada caso. Subconsultas que retornam um valor simples Neste caso, a subconsulta deve retornar uma única tupla. Para isso, podem-se usar as funções de agregação (AVG,MIN,MAX,...). Esse tipo de subconsulta é utilizado para fazer a comparação elemento-elemento e tem o seguinte formato: WHERE expressão {= | <> | > | >= | < | <=} (Subconsulta) Onde: subconsulta é outra consulta (SELECT) que pode conter qualquer uma das cláusulas anteriormente estudadas. Por exemplo, selecionar os títulos dos livros mais caros que a média de preço dos livros. Veja que primeiro precisamos calcular a média de preço dos livros para depois buscar por aqueles livros que tem seu preço acima da média. Logo, a maneira de fazer isso é usando uma subconsulta, como veremos a seguir: SELECT TitLivro FROM Livro WHERE Valor > (SELECT AVG (Valor) FROM Livro) ; Na execução da subconsulta, seria calculado o valor da média dos livros (a partir da Tabela 43), que seria o valor 60. Depois, a mesma tabela seria avaliada pela consulta externa, para obter os títulos de livros cujos valores fossem maiores do que a média calculada na subconsulta, resultando na Tabela 49. Tabela 49 - Relação Resultante TitLivro Banco de Dados Arquitetura de BD Subconsultas que retornam um conjunto de valores Usadas para fazer comparação elemento-conjunto. Em outras palavras, elas estabelecem uma relação de pertinência (�) entre elementos e conjuntos (tabelas). Sua avaliação retorna um valor booleano. Esse tipo de subconsultas pode ser definido através das cláusulas IN, ANY, ALL e EXISTS. Vamos dar uma olhada em cada uma dessas cláusulas. » WHERE expressão [NOT] IN (Sub-Consulta) – já estudamos o IN anteriormente neste capítulo em consultas simples. Agora, estamos vendo o uso do mesmo com subconsultas. Essa cláusula verificaria se o resultado da expressão está contido no subconjunto de valores retornado pela subconsulta. Por exemplo, selecionar o nome e a data de nascimento dos autores de livros que não tem valor definido (ou seja, que tem valor NULL). SELECT Nome, Nascimento FROM Autor WHERE CodAutor IN (SELECT CodAutor FROM Livro 53
  • 54.
    Banco de Dados WHERE Valor IS NULL); A relação resultante da consulta pode ser vista na Tabela 50. Tabela 50 - Relação Resultante Nome Nascimento Pedro Alves 18/03/1955 Olívia Duncan 10/01/1968 » WHERE expressão { = | <> | > | >= | < | <= } ANY (Sub-consulta) – o ANY verifica se a condição de comparação é verdadeira para pelo menos um dos valores retornados pela subconsulta. Por exemplo, selecionar o nome de todos os autores, exceto o do mais idoso (resultado na Tabela 51). SELECT Nome FROM Autor WHERE Nascimento < ANY (SELECT Nascimento FROM Autor) Tabela 51 - Relação Resultante Nome Nascimento Carolina Dantas 22/02/1970 Olívia Duncan 10/01/1968 Quando na comparação é utilizada a igualdade ( = ANY), a cláusula passa a ter o mesmo efeito que a cláusula IN, anteriormente estudada. Vejamos com o uso do ANY a mesma consulta usada para exemplificar o IN. Selecione o nome e a data de nascimento dos autores de livros que não tem valor definido (ou seja, que tem valor NULL). SELECT Nome, Nascimento FROM Autor WHERE CodAutor = ANY (SELECT CodAutor FROM Livro WHERE Valor IS NULL); » WHERE expressão { = | <> | > | >= | < | <= } ALL (Sub-consulta) - verifica se a condição é verdadeira para todos os valores retornados pela subconsulta. É o oposto de ANY. Por exemplo, selecionar o titulo dos livros que têm valor maior que todos os livros da editora Sextante (resultado na Tabela 52). SELECT TitLivro FROM Livro WHERE Valor > ALL (SELECT Valor FROM Livro Li, Editora Ed WHERE Ed.Razao = ‘Sextante’ AND Li.CodEditora = Ed.Cod_Editora); Tabela 52 - Relação Resultante TitLivro (PK) Banco de Dados Arquitetura de BD 54
  • 55.
    Banco de Dados Quando na comparação é utilizado <> ALL, a cláusula passa a ter o mesmo efeito que a cláusula NOT IN. » WHERE expressão [NOT] EXISTS (Sub-consulta) - verifica a existência de dados numa lista de valores da subconsulta. Retorna VERDADEIRO ou FALSO, conforme a subconsulta retorne ou não linhas de resultado. Por exemplo, selecione o nome de todos os autores que têm livros publicados nas editoras Fantasy ou Bookman (resultado na Tabela 54). SELECT Au.Nome FROM AUTOR Au WHERE EXISTS (SELECT * FROM LIVRO Li, EDITORA Ed WHERE Li.CodAutor=Au.Cod_Autor AND Li.CodEditora=Ed.Cod_Editora AND Ed.Razao IN (‘Fantasy, ‘Bookman’)); Tabela 54 - Relação Resultante Nome Pedro Alves Olívia Duncan Ordenando Resultados Para ordenar os resultados das consultas pelos valores de uma ou mais colunas (atributos), utiliza-se a cláusula ORDER BY. As linhas são ordenadas pela primeira coluna (atributo) especificada após o ORDER BY. Quando as linhas de uma coluna possuem valores iguais, estas serão classificadas pelo valor da segunda coluna especificada após o ORDER BY e assim por diante. Há dois tipos de ordenação: » ASC → Ascendente (default) » DESC → Decrescente Vamos ao exemplo: Selecionar o nome e o nascimento dos autores em ordem decrescente do nascimento. Para datas iguais, considerar a ordem alfabética do nome do autor (resultado na Tabela 54). SELECT Nome, Nascimento FROM Autor ORDER BY Nascimento DESC, Nome ASC; Tabela 54 - Relação Resultante Nome Nascimento Carolina Dantas 22/02/1970 Olívia Duncan 10/01/1968 Pedro Alves 18/03/1955 55
  • 56.
    Banco de Dados Agrupando Resultados lgumas vezes, na apresentação dos resultados da consulta, é preciso organizar a seleção dos dados em grupos ou apresentar informações adicionais ou totalizadoras sobre determinados grupos de dados. Para isso, é usada a cláusula GROUP BY. Ela agrupa os resultados por valores idênticos. Ela é usada, muitas vezes, com as funções de agregação, mas pode ser usada, também, sem estas. Vamos a alguns exemplos de uso: Calcular a média dos valores dos livros cadastrados, separados por editora. Veja que para poder realizar esse cálculo, necessitamos agrupar os livros de acordo com as editoras dos mesmos. Por isso, precisamos da cláusula GROUP BY. SELECT Editora.Razao, AVG (Livro.Valor) FROM Livro, Editora WHERE Livro.CodEditora=Editora.Cod_Editora GROUP BY Editora.Razao ; Tabela 55 - Relação Resultante Razao AVG(Livro.Valor) Sextante 50,00 Fantasy NULL Bookman 86,66 Observe que a relação resultante (Tabela 55) apresenta cada editora apenas uma vez e a média dos livros de cada uma delas. Em outras palavras, a relação resultante apresenta as tuplas da relação Livro separadas em grupos (de acordo com as editoras) e a função AVG é aplicada a cada grupo separadamente. Uma observação importante é que os campos do GROUP BY devem, obrigatoriamente, aparecer no SELECT. Vamos dar outro exemplo. Contar quantos livros foram publicados por ano de publicação (vide resultado na Tabela 56). SELECT Ano_Publicacao, COUNT(Ano_Publicacao) FROM Livro GROUP BY Ano_Publicacao ORDER BY Ano_Publicacao; Tabela 56 - Relação Resultante Ano_Publicacao COUNT(Ano_Publicacao) 2000 1 2007 1 2009 2 2010 2 Até agora, usamos funções de agregação. Agora, vamos dar um exemplo de uso do 56
  • 57.
    Banco de Dados GROUPBY sem fazer uso de funções de agregação: Selecionar o nome do autor, o título do livro e seu valor organizados de acordo com seu autor. O resultado desta consulta pode ser visualizado na Tabela 57. Veja que SELECT Autor.Nome, Livro.TitLivro, Livro.Valor FROM Autor, Livro WHERE Autor.Cod_Autor=Livro.CodAutor GROUP BY Autor.Nome; Tabela 57 - Relação Resultante Nome TitLivro (PK) Valor Pedro Alves Arquitetura de BD 110,00 Pedro Alves Banco de Dados 150,00 Pedro Alves BD Distribuídos NULL Carolina Dantas O Estranho 45,00 Carolina Dantas O Conhecido 55,00 Olívia Duncan Sucesso NULL Também, é possível agrupar os resultados da seleção por mais de um atributo. Nesse caso, eles serão agrupados na ordem em que aparecem no GROUP BY (tal qual ocorre na cláusula ORDER BY), criando algo como um grupo dentro de outro grupo. Por exemplo, selecionar o nome do autor, o ano de publicação e o título dos livros, organizando-os pelo nome do autor e depois pelo ano de publicação. O resultado dessa consulta pode ser visto na Tabela 58. SELECT Autor.Nome, Livro.Ano_Publicacao, Livro.TitLivro FROM Autor, Livro WHERE Autor.Cod_Autor=Livro.CodAutor GROUP BY Autor.Nome, Livro.Ano_Publicacao; Tabela 58 - Relação Resultante Nome Ano_Publicacao TitLivro Pedro Alves 2009 Banco de Dados Pedro Alves 2007 Arquitetura de BD Pedro Alves 2010 BD Distribuídos Carolina Dantas 2010 O Estranho Carolina Dantas 2009 O Conhecido Olívia Duncan 2000 Sucesso Em alguns momentos, será necessário agrupar informações de forma condicional, ou seja, especificar (filtrar) quais grupos deverão ser mostrados. Para isso, é utilizada a cláusula HAVING. Você poderia perguntar, e por que não usar a cláusula WHERE? No caso de filtragem de grupos, não é possível usar o WHERE, pois ela é usada somente para 57
  • 58.
    Banco de Dados restringir as linhas que serão selecionadas para a formação dos grupos. Enquanto a cláusula HAVING é usada para restringir os grupos já formados, ou seja, ela só é atendida depois do agrupamento realizado. A cláusula HAVING só pode ser utilizada em conjunto com a cláusula GROUP BY. Ou seja, ela só existe se associada à cláusula GROUP BY (mas o oposto não). Assim, ela vem depois do GROUP BY e antes do ORDER BY. A condição do HAVING só pode envolver os campos/funções do SELECT. Vamos a um exemplo: Selecione o código das editoras cujo preço médio dos livros é maior do que 60. Veja que nesse caso, primeiro tem de ser feito o agrupamento (para poder calcular o preço médio dos livros por editora) e depois é que a condição deverá ser aplicada, para indicar quais dos grupos deverão ser apresentados na relação resultante. Esse é um caso típico de uso do HAVING. A relação resultante da consulta sem usar a cláusula HAVING seria a da Tabela 59. Porém, com o uso do HAVING, os grupos resultante seriam restrindos ao apresentado na Tabela 60. SELECT CodEditora, AVG (Valor) AS MediaValor FROM LIVRO GROUP BY CodEditora HAVING MediaValor > 60 ORDER BY CodEditora; Tabela 59 - Relação Resultante sem HAVING CodEditora MediaValor 1 50,00 2 NULL 3 86,66 Tabela 60 - Relação Resultante com HAVING CodEditora MediaValor 3 86,66 Outro exemplo seria: Selecionar o nome dos autores que publicaram mais de 2 livros. Vide a relação resultante na Tabela 61. SELECT Autor.Nome, COUNT (DISTINCT Livro.TitLivro) FROM Livro, Autor WHERE Autor.Cod_Autor = Livro.CodAutor GROUP BY AUTOR.Nome HAVING COUNT (DISTINCT LIVRO.Titulo) > 2; Tabela 61 - Relação Resultante Autor.Nome COUNT(DISTINCT Livro.TitLivro) Pedro Alves 3 58
  • 59.
    Banco de Dados Operaçõessobre Conjuntos Algumas operações de conjunto foram incorporadas à linguagem SQL. Existem as operações de União (UNION), Interseção (INTERSECT) e Subtração (EXCEPT). As relações resultantes dessas operações são sempre um conjunto de tuplas, sendo que tuplas duplicadas são eliminadas do resultado. A SQL também possui operações sobre multiconjuntos (conjuntos que permitem repetição de elementos): UNION ALL, INTERSECT ALL e EXCEPT ALL. Todas essas operações são aplicadas apenas às relações que sejam compatíveis. Essas operações são úteis em queries que referenciam diferentes tabelas. Essas operações combinam resultados de dois ou mais comandos select em um único resultado. Por isso, são também conhecidos como joins verticais. Algumas observações sobre essas operações são: comandos SELECT devem selecionar o mesmo número de colunas e as colunas correspondentes devem ser do mesmo tipo. As linhas duplicadas são, automaticamente, eliminadas e a cláusula DISTINCT não pode ser usada. Os nomes das colunas da primeira query (consulta) são os que aparecem na relação resultante da operação. Vamos exemplificar, a seguir, cada uma dessas operações. Nos exemplos, considere o seguinte modelo relacional: MEDICO (CodMedico (PK), Nome, DEPOSITANTE (CPF (PK), Nome, CRM) e Agencia, Conta) e PACIENTE (CodPaciente (PK), Nome); DEVEDOR (CPF (PK), Nome, Agencia, Conta). União (UNION) Faz a união entre duas relações compatíveis, eliminando linhas repetidas. Em outras palavras, gera-se uma nova relação com todas as tuplas das duas relações resultantes envolvidas na união, sem repetir tuplas. Acrescenta-se ALL à operação para manter as linhas repetidas. Vamos aos exemplos. Selecionar todos os clientes da agência A1 que tenham empréstimo ou tenham feito depósito. Para isso, são realizadas duas consultas e os resultados são unidos em uma única tabela. (SELECT * FROM Depositante WHERE Agencia = ‘A1’) UNION (SELECT * FROM Devedor WHERE Agencia = ‘A1’); Mesmo quando duas relações completas não são compatíveis, tais como MEDICO e PACIENTE, podemos realizar união entre parte delas, tornando-as compatíveis pela escolha dos atributos em comum. Por exemplo, selecionar o nome de todas as pessoas cadastradas no hospital, independente da posição que ocupem. (SELECT Nome FROM Medico) UNION (SELECT Nome FROM Paciente); 59
  • 60.
    Banco de Dados Interseção (INTERSECT) Retorna apenas as linhas que pertencem às duas relações resultantes, se elas forem compatíveis, sem repetição. Por exemplo, selecionar o nome de todas as pessoas que são médicos e pacientes ao mesmo tempo. (SELECT Nome FROM Medico) INTERSECT (SELECT Nome FROM Paciente); Selecionar todos os clientes da agência A1 com empréstimo e depósito. (SELECT * FROM Depositante WHERE Agencia = ‘A1’) INTERSECT (SELECT * FROM Devedor WHERE Agencia = ‘A1’); Exceção (EXCEPT ou MINUS) Retorna apenas as linhas que pertencem à primeira tabela, com exceção das que aparecem na segunda. Em outras palavras, retorna somente as linhas da primeira query (consulta) que não estão presentes no resultado da segunda query. Por exemplo, selecionar o nome de todas as pessoas que são médicos e não são pacientes. (SELECT Nome FROM Medico) EXCEPT (SELECT Nome FROM Paciente); Selecionar todos os clientes da agência A1 que possuem conta, mas não fizeram empréstimo. (SELECT * FROM Depositante WHERE Agencia = ‘A1’) EXCEPT (SELECT * FROM Devedor WHERE Agencia = ‘A1’); Manipulando Visões Visões são tabelas virtuais que não ocupam espaço físico e são criadas a partir de tabelas reais. Elas permitem criar tabelas personalizadas, de acordo com o perfil do usuário. Visões são ótimas para substituir consultas frequentemente usadas. Para criar uma visão utilizamos o seguinte comando: CREATE VIEW Nome_Visão [Colunas_visão] AS (ExpressãoConsultaPreenchimentoVisao) Por exemplo, criar uma visão com os clientes que tem conta ou empréstimo no banco. CREATE VIEW TodosClientes AS (SELECT * FROM Depositante) UNION (SELECT * FROM Devedor); Outro exemplo, criar uma visão com os livros da editora Bookman com 10% de desconto. 60
  • 61.
    Banco de Dados CREATE VIEW LivrosBookmanDesconto (Titulo, Valor_Desconto) AS (SELECT, TitLivro, Valor - (Valor * 0.1) FROM Livro, Editora WHERE Livro.CodEditora = Editora.Cod_Editora AND Editora.Razao = ‘Bookman’); Também, é possível criar uma nova visão a partir de uma outra visão anteriormente criada. Por exemplo, criar uma visão para todos os clientes da agência A1. Já criamos uma visão com os clientes que tem conta ou empréstimo no banco. Vamos utilizar essa visão criada para atender ao que se pede: CREATE VIEW TodosClientesA1 AS (SELECT * FROM TodosClientes WHERE Agencia = ‘A1’); Após definida uma visão, qualquer operação de consulta pode ser aplicada sobre ela. Consultas sobre visões são escritas da mesma forma como para uma tabela qualquer e as operações realizadas sobre uma visão refletem nas tabelas físicas das quais elas derivam. Por exemplo, selecionar o título e o valor dos livros da visão LivrosBookmanDesconto que tenham valor acima de 50 reais. SELECT Titulo, Valor_Desconto FROM LivrosBookmanDesconto WHERE Valor_Desconto > 50; Para remover uma visão, utilizamos o comando: DROP VIEW Nome_Visão A remoção de uma visão é feita em cascata. Por exemplo, remover a visão chamada TodosClientes: DROP VIEW TodosClientes; Como a remoção é feita em cascata, a visão TodosClientesA1, que foi criada a partir da visão TodosClientes, também é removida. Outro exemplo, remover a visão LivrosBookmanDesconto: DROP VIEW LivrosBookmanDesconto;. Uma Noção da DCL (Data Control Language) A DCL cuida das autorizações de acesso. Isso porque um SGBD Relacional pode ser acessado por diversos usuários e cada usuário possui um determinado perfil em relação aos dados das tabelas ou visões. Alguns usuários só podem consultar, outros atualizar e consultar, outros só inserir, outros podem tudo (por exemplo, o DBA), etc. O objetivo dos comandos da DCL é proteger os dados do uso indevido de qualquer usuário através da configuração de privilégios por usuário. Os privilégios garantem segurança e integridade dos dados, bem como a responsabilidade de cada usuário sobre seus dados específicos. Dois comandos fazem parte da DCL: GRANT e REVOKE. O comando GRANT atribui privilégios de utilização de tabelas ou visões de uma base de dados. A sintaxe desse comando é: GRANT Privilégios ON Tabelas/Visões TO LoginUsuários Os privilégios podem ser: » Select: pode executar uma consulta sobre a tabela » Insert: pode executar uma inserção sobre a tabela 61
  • 62.
    Banco de Dados » Delete: pode apagar registros da tabela » Update: pode modificar registros da tabela » All Privileges: pode executar qualquer operação sobre a ela Alguns exemplos são: GRANT Select ON Livro, Autor TO Paulo, Joao GRANT Select, Insert, Update ON TodosClientes TO Ana GRANT All Privileges ON Depositante TO PUBLIC O comando REVOKE revoga os privilégios de acesso dos usuários. A sintaxe desse comando é: REVOKE Privilégios ON Tabelas/Visões FROM LoginUsuários Alguns exemplos de uso são: REVOKE Select ON Livro, Autor FROM Paulo, Joao REVOKE Select, Insert, Update ON TodosClientes FROM Ana REVOKE All Privileges ON Depositante FROM PUBLIC Considerações Finais Pronto! Agora você tem o poder de criar, manipular, deletar e consultar o seu banco de dados. Porém, para que o SQL se torne mais familiar para você e você consiga utilizar com mais facilidade os comandos e realizar consultas simples e aninhadas, você precisa praticar bastante. Por isso, é importante a escolha de um SGBD onde você possa implementar o banco de dados modelado em capítulos anteriores e possa inserir, atualizar e consultar os dados desse banco de dados. A prática é a chave para o sucesso, não esqueça disso! Conheça Mais Como mencionado no capítulo anterior, em geral, os livros de banco de dados trazem um ou mais capítulo sobre SQL. Entre esses livros temos: SILBERSCHATZ, Abraham; KORTH, Henry F; SUDARSHAN, S. Sistema de banco de dados. Traduzido por Daniel Vieira. Rio de Janeiro: Elsevier;Campus, 2006. ELMASRI, Ramez; NAVATHE, Shamkant B. Sistemas de banco de dados. 4a. ed. São Paulo: Pearson Education do Brasil, 2005. DATE, C. J. Introdução a sistemas de bancos de dados. Rio de Janeiro: Campus, 2000. ALVES, W.P. Fundamentos de Bancos de Dados. Editora Érica, 2004. Além destes, há livros específicos sobre SQL, independente de SGBD, tais como: BEIGHLEY, Lynn. Use a Cabeça SQL. Starlin Alta Consult, 1ª Edição, 2008 KLINE, Daniel; KLINE, Kelvin E. Sql - O Guia Essencial - Manual de Referência Profissional. Alta Books, 2010. SHELDON, Robert; OPPEL, Andy. SQL – Um Guia para Iniciantes. Editora Ciência Moderna, 3ª Edição, 2009. 62
  • 63.
    Banco de Dados DAMAS,Luís. Sql - Structured Query Language. Editora LTC, 6ª edição, 2007. Aprenda Praticando Tomando como base as tabelas abaixo, vamos executar algumas consultas SQ. PRODUTO Cod_Prod (PK) Nm_prod Valor 001 Photoshop 150,00 002 Coreldraw 250,00 003 Flash 30,00 004 CAB 100,00 005 Adobe NULL PRODUTOS_PEDIDO Numero (PK) Cod_Prod (PK) Qtd 111 001 02 111 002 03 111 003 02 222 002 03 222 003 05 222 004 10 333 004 03 PEDIDO Numero (PK) Data Cod_Fornec (FK) 111 10/02/2010 F1 222 23/03/2010 F2 333 20/05/2010 F1 63
  • 64.
    Banco de Dados FORNECEDOR Cod_Fornec (PK) Nome (PK) Endereco F1 InfoSoft R. Flor, 25 F2 BRSofts Av. Itu, 33 Vamos começar demonstrando algumas consultas bem simples, sem condição alguma, usando a estrutura base SELECT atributos FROM nome_tabela e apresentando também o uso de operadores aritméticos na apresentação dos dados. Apresente todos os dados dos fornecedores cadastrados: SELECT * FROM Fornecedor; b) Apresente o nome de todos os produtos cadastrados SELECT Nm_prod FROM Produto; c) Apresente todos os dados dos produtos, sendo que o valor deve ser apresentado com um desconto de 10%. Aqui, mesmo selecionando tudo, vamos destrinchar o nome dos atributos, para poder apresentar o desconto. Veja que usamos também apelido pra o campo do desconto SELECT Cod_prod, Nm_prod, (Valor – (valor * 0.1)) AS Valor_Com_Desconto FROM Produto; Agora, vamos dar uma olhada no uso de funções. Lembre-se que essas funções que vimos existem no SQL-ANSI, ou seja, na parte básica do SQL que toda versão deve oferecer. Alguns SGBDs podem oferecer funções adicionais, além do básico. d) Calcule a quantidade de pedidos realizados SELECT Count(Numero) FROM Pedido; e) Qual a média de preço dos produtos SELECT AVG(valor) FROM Produto; f) Qual o nome e o valor do produto mais caro? SELECT Nm_prod, MAX(Valor) FROM Produto; g) Qual o nome e o valor do produto mais barato? SELECT Nm_prod, MIN(Valor) FROM Produto; Comecemos agora a apresentar consultas mais elaborados, com a inclusão da parte condicional (cláusula WHERE). h) Apresente o nome dos produtos que custam mais de 100 reais. SELECT Nm_prod FROM Produto WHERE Valor >100,00; i) Apresente o nome dos produtos cujo valor está entre 150 e 300 reais. SELECT Nm_prod FROM Produto WHERE Valor BETWEEN 150,00 AND 300,00; j) Selecione o nome dos produtos que começam com a letra C. SELECT Nm_prod FROM Produto WHERE Nm_prod LIKE ‘C%’; k) Selecione o nome dos produtos que ainda não possuem valor definido. SELECT Nm_prod FROM Produto WHERE Valor IS NULL 64
  • 65.
    Banco de Dados Junções (JOINS) são usada em boa parte das consultas reais. Por isso, vamos ilustrar alguns casos de junção. l) Apresente o número do pedido, a data em que ele foi realizado e o nome do fornecedor do pedido, para todos os pedidos cadastrados, ordenando o resultado pelo nome do fornecedor. SELECT P.Numero, P.Data, F.Nome FROM Pedido P, Fornecedor F WHERE P.Cod_ Fornec=F.Cod_Fornec ORDER BY F.Nome. m) Selecionar o número do pedido, o nome do produto pedido e o valor a ser pago por cada produto do pedido SELECT PP.Numero, P.Nm_prod, (P.Valor * PP.Qtd) AS A_Pagar FROM Produto P, Produtos_Pedido PP Para finalizar, vamos apresentar agora alguns exemplos que fazem uso de agrupamento (GROUP BY) e de subconsultas. a) Apresentar o número do pedido e o total a pagar por ele para todos os pedidos realizados. SELECT PP.Numero, SUM(P.Valor * PP.Qtd) AS Valor_Total FROM Produto P, Produtos_Pedido PP GROUP BY PP.Numero; o) Selecione o nome dos produtos que estão fazendo parte de pelo menos um pedido. SELECT P.Nm_prod FROM Produto P WHERE P.Cod_Prod IN (SELECT DISTINCT PP.Cod_Prod FROM Produtos_Pedido PP); 65
  • 66.
    Banco de Dados Você Sabia? Você sabia que a ordem em que as consultas SQL são construídas pode influenciar no desempenho do SGBD? Pois é! Influencia sim. Para ter consultas mais otimizadas, seguem alguns conselhos. » No tocante a modelagem e projeto do BD (Se não for muito tarde): Uma má performance pode também ser resultado de uma modelagem ruim. É importante se preocupar com a modelagem correta do problema e em realizar a normalização do modelo relacional produzido pelo menos até a 3FN (Terceira Forma Normal). » Use índices, mas não os crie em demasia. Muitos índices podem resultar em um efeito adverso no desempenho. » Procure no SELECT selecionar, exclusivamente, os atributos de que você necessita na consulta. Procure não utilizar SELECT * porque o gerenciador de consultas deve ler primeiro a estrutura da tabela antes de executar a sentença. » Se utilizar várias tabelas na consulta (JOINs), especifique sempre a que tabela pertence cada campo (atributo). Isso fará o gerenciador de consultas economizar o tempo de localizar a que tabela pertence o campo. Por exemplo, ao invés de: › SELECT Nome, Fatura FROM Cliente, Faturamento WHERE IdCliente = IdClienteFaturado, procure sempre utilizar: › SELECT Cliente.Nome, Faturamento.Fatura FROM Cliente, Faturamento WHERE Cliente.IdCliente = Faturamento.IdClienteFaturado. » Sempre que possível, procure usar nas condições da cláusula WHERE aqueles campos que fazem parte da chave da relação ou relações sendo consultada(s). » Quando for usar operadores de comparação, evite usar NOT em condições de pesquisa. Eles podem diminuir a velocidade de recuperação de dados porque todos os registros em uma tabela são avaliados. Sempre use condições de pesquisa positivas ao invés de negativas. As condições de pesquisa negativas, tais como NOT BETWEEN, NOT IN e IS NOT NULL, atrasam as consultas. » Utilize ORDER BY, GROUP BY e HAVING apenas se necessário, pois um tempo a mais é gasto para organizar os dados da tabela resultante. » Ao fazer a montagem da cláusula WHERE é interessante que a condição mais restritiva seja avaliada em 1º lugar, uma vez que será retornado um subconjunto menor de dados. Principalmente, se for haver um JOIN, já restringir a quantidade de dados antes do JOIN pode garantir uma melhora no desempenho. A maioria dos otimizadores lê uma consulta da parte inferior da clausula WHERE para cima. Nesse caso, a condição mais restritiva deve ficar por último na clausula WHERE. Adicionalmente, quando se utilizam várias tabelas dentro da consulta há que ter cuidado com a ordem das tabelas na cláusula FROM. Se desejarmos saber quantos alunos se matricularam no ano 1996 e escrevermos: › FROM Aluno, Matricula WHERE Aluno.IdAluno = Matricula.IdAluno AND Matricula. Ano = 1996 - o gerenciador percorrerá todos os alunos para buscar suas matrículas e devolver as correspondentes. Porém, se escrevermos: › FROM Matricula, Aluno WHERE Matricula.Ano = 1996 AND Matricula.IdAluno = Aluno. IdAluno - o gerenciador filtra as matrículas e depois seleciona os alunos, desta forma tem que percorrer menos registros, melhorando o desempenho. Nem sempre lembramos dessas recomendações quando estamos montando os SQLs. Porém, é recomendado que você procure otimizar, pelo menos, os SQL mais críticos (mais utilizados ou que envolvam mais tabelas). Por exemplo, revisando os SQLs montados em um programa antes dele ir para produção. Atividades e Orientações de Estudos Agora é a sua vez de fazer as atividades! Lembre que praticar é muito importante pra fixar o conteúdo estudado! SQL, tal como qualquer linguagem de programação, só se aprende exercitando! 66
  • 67.
    Banco de Dados Simulado: Resolva as atividades, a seguir, em um documento texto, criando uma tabela de respostas (tipo um gabarito) e poste o mesmo no ambiente virtual, no local indicado. Essa atividade é para ser realizada INDIVIDUALMENTE e fará parte da sua avaliação somativa. Usamos nesse exercício questões que fizeram parte de vários concursos da área de informática. 1) (Judiciário/Programação de Sistemas/TRE-MG/FCC/2005) Os comandos básicos do SQL, pertencentes a classe de linguagem de manipulação de dados são: a) drop e delete b) update e drop c) alter e delete d) alter e drop e) update e delete 2) (Judiciário/Programação de Sistemas/TRE-MG/FCC/2005) Uma subconsulta SQL é uma instrução SELECT que NÃO pode estar aninhada dentro de uma instrução: a) Create b) Select c) Insert d) Delete e) Update 3) (Analista Judiciário/Análise de Sistemas/TRE-RN/FCC/2005) Em um banco de dados relacional, é comando DDL: a) DELETE FROM TABLE b) SELECT ALL FROM TABLE c) CREATE INDEX d) UPDATE e) INSERT 4) (Analista de Sistemas – Desenvolvimento de Sistemas/BADESC/FGV/2010) A figura, a seguir, mostra o modelo relacional de um Banco de Dados de um sistema acadêmico. Esse modelo possui as tabelas Aluno, NotaAluno e Disciplina: Assinale a alternativa que indique o comando SQL que, ao ser executado em um SGBD relacional baseado nesse modelo, retornará o nome de cada disciplina e a média das notas dos alunos da disciplina. a) SELECT Disciplina.nome, sum(nota)/count(nota) 67
  • 68.
    Banco de Dados FROM Disciplina, NotaAluno WHERE Disciplina.cod_disciplina=NotaAluno.cod_disciplina GROUP BY Disciplina.nome; b) SELECT Disciplina.nome, sum(nota)/count(nota) FROM Disciplina, NotaAluno WHERE Disciplina.cod_disciplina = NotaAluno.cod_disciplina AND Aluno.cod_ aluno = NotaAluno.cod_aluno ORDER BY Aluno.cod_Aluno; c) SELECT Disciplina.nome, count(nota)/sum(nota) FROM Disciplina, NotaAluno WHERE Disciplina.cod_disciplina = NotaAluno.cod_disciplina AND Aluno.cod_ aluno = NotaAluno.cod_aluno GROUP BY Disciplina.cod_disciplina; d) SELECT Disciplina.nome, avg(nota) FROM Disciplina, NotaAluno WHERE Disciplina.cod_disciplina = NotaAluno.cod_disciplina ORDER BY Disciplina.nome; e) SELECT Disciplina.nome, avg(nota) FROM Disciplina, NotaAluno WHERE Disciplina.cod_disciplina = NotaAluno.cod_disciplina GROUP BY Aluno.nome; 5) (Analista de Sistemas Júnior – Processos de Negócios/Petrobrás/ CESGRANRIO/2010) Considere as instâncias de relações R1 e R2 apresentadas abaixo, onde o cabeçalho de cada uma dessas instâncias de relações apresenta os respectivos nomes das colunas. R1 sno pno R2 pno 1 1 1 1 2 2 1 3 1 4 2 1 2 2 3 2 4 2 4 4 Considere a expressão em SQL: SELECT R1.sno FROM R1 WHERE R1.pno >= ALL (SELECT R2.pno FROM R2) 68
  • 69.
    Banco de Dados O resultado dessa consulta é: a) sno b) sno c) sno d) sno e) sno 1 1 1 1 1 2 1 2 2 1 2 1 3 3 1 2 2 3 3 2 4 2 4 4 3 4 3 4 4 4 4 4 4 6) (Analista de Sistemas Júnior – Processos de Negócios/Petrobrás/ CESGRANRIO/2010) Em SQL, a instrução que permite alterar vários registros é: a) Delete b) Create Index c) Update d) Change e) Atualize 7) (Técnico em Informática/Petrobrás/CESGRANRIO/2010) Na linguagem SQL, a estrutura básica da instrução select consiste em três cláusulas que são: a) Distinct, select e where b) Insert, update e select c) Replace, join e where d) Update, replace e include e) Select, from e where 8) (Técnico em Informática/Petrobrás/CESGRANRIO/2010) Considere a instrução : DELETE FROM Aluno WHERE idade < 21 AND nome like “*A”; Esta instrução: a) Elimina a tabela Aluno b) Elimina os registros da tabela que verifiquem, simultaneamente, as duas condições expressas. c) Elimina os registros da tabela em que a idade seja inferior a 21 ou o nome comece com a letra A. d) Elimina os registros da tabela que verifiquem pelo menos uma das condições expressas. e) Nenhuma das anteriores. 9) (Analista de Tecnologia da Informação – Banco de Dados /MPE-RN/FCC/2010) Para eliminar as linhas em duplicidade no resultado de uma consulta em uma tabela, no commando SELECT da linguagem SQL, utiliza-se: a) A cláusula ORDER BY 69
  • 70.
    Banco de Dados b) A cláusula HAVING. c) Uma condição da cláusula WHERE. d) A palavra-chave DISTINCT. e) As palavras-chave NOT DUPLICATE 10) Analista de Sistemas /TCE-AL/FCC/2008) Considere o seguinte resultado de uma consulta SQL a tabela chamada TabPessoa, onde Sobrenome é o nome da coluna da qual se deseja obter os dados (existem outras colunas): Sobrenome Francisco Inácio Na hipótese de ambos os sobrenomes estarem adequadamente cadastrados na TabPessoa, sem importar a ordem, a correta expressão que obtém tal resultado é: a) SELECT Sobrenome FROM TabPessoa WHERE Sobrenome = ‘Francisco’ AND ‘Inácio’ b) SELECT Sobrenome FROM TabPessoa WHERE Sobrenome IN (‘Francisco’,’Inácio’) c) SELECT FROM TabPessoa WHERE Sobrenome = (‘Francisco’ OR ‘Inácio’) d) SELECT IN TabPessoa WHERE Sobrenome IN (‘Francisco’,’Inácio’) e) SELECT FROM TabPessoa WHERE Sobrenome IN (‘Francisco’,’Inácio’) 11) (Analista de Sistemas Júnior – Engenharia de Software / Petrobrás / CESGRANRIO / 2008) Considere as tabelas de um banco de dados relacional descritas abaixo, onde os campos que compõem as chaves primárias estão assinalados com *. TABELA CAMPOS CLIENTE *CODIGO_C, CPF, NOME, CIDADE PRODUTO *CODIGO_P, DESCRICAO, PRECO VENDA *CODIGO_C, *CODIGO_P, CPF, DATA, QUANTIDADE Há uma chave estrangeira de VENDA para CLIENTE com base nos campos CODIGO_C e de VENDA para PRODUTO com base nos campos CODIGO_P. O campo CPF é chave candidata para CLIENTE e também é armazenado na tabela VENDA. Os campos NOME e DESCRICAO também são chaves candidatas de suas respectivas tabelas. Os campos CIDADE, PRECO, DATA e QUANTIDADE admitem valores repetidos. Considere o comando em SQL apresentado a seguir. SELECT C.CIDADE, AVG(P.PRECO) FROM CLIENTE C, PRODUTO P, VENDA V WHERE C.CODIGO_C = V.CODIGO_C AND P.CODIGO_P = V.CODIGO_P AND P.PRECO > 100 GROUP BY C.CIDADE HAVING AVG(P.PRECO) < 200 70
  • 71.
    Banco de Dados a) Para cada cidade, a média de preço de produtos vendidos a clientes da cidade com valores acima de 100, se a média for menor que 200. b) Para cada cidade, a média de preço dos produtos vendidos a clientes da cidade com valores entre 100 e 200. c) Para cada cidade, a quantidade de produtos vendidos com valores entre 100 e 200. d) Para cada cidade, a média de preço dos produtos vendidos a clientes da cidade que compraram produtos de valores maiores do que 100 e cuja média de compra é menor do que 200. e) Apenas a cidade cuja média de preço dos produtos vendidos é a mais alta dentre as que tiveram média menor do que 200 e produtos vendidos com valores acima de 100. 12) (Analista Judiciário – Análise de Sistemas - Suporte /TJ-PA/FCC/2009) Dada uma linha de tabela relacional: TABELA: Turma_Alunos Codigo_Turma Alpha ADM1 Num_Aluno Number 16 Media_Final Number 7,5 Após a execução do comando SQL: Select Codigo_Turma, count(*) as Total_Alunos from Turma_Alunos group by Codigo_Turma; será apresentado como resultado: a) a quantidade de alunos de cada turma. b) o número de alunos de todas as turmas. c) os códigos das turmas existentes. d) a quantidade de turmas de cada curso. e) a quantidade total de turmas existentes. 13) (Analista Judiciário – Análise de Sistemas - Desenvolvimento /TJ-SE/FCC/2009) A expressão SQL-ANSI: SELECT coluna FROM tabela WHERE coluna LIKE ‘literal%’ ; recupera todas as: a) linhas com coluna cujo conteúdo termina com literal. b) linhas com coluna cujo conteúdo inicia com literal. c) linhas com coluna cujo conteúdo contém literal em qualquer posição. d) colunas de tabela cujo nome termina com literal. e) colunas de tabela cujo nome inicia com literal. 14) (Analista de Sistemas /CAMARA-SJC/FIP/2009) Uma consulta feita a uma tabela de CLIENTE de um banco de dados relacional retornou o seguinte resultado: 71
  • 72.
    Banco de Dados Empresa Faturamento Anabiotíca 190.044,09 Petrobana 234.511,23 Canalservice 123.387,34 Anablematica 734.576,00 O comando SQL que pode ter gerado tal resultado é: a) SELECT Empresa, Faturamento FROM CLIENTE WHERE Empresa LIKE “ana” b) SELECT Empresa, Faturamento FROM CLIENTE WHERE Empresa LIKE “%ana%” c) SELECT Empresa, Faturamento FROM CLIENTE WHERE Empresa = “%ana%” d) SELECT Empresa, Faturamento FROM CLIENTE WHERE Empresa BETWEEN “ana%ana” e) SELECT Empresa, Faturamento FROM CLIENTE WHERE Empresa BETWEEN “%ana%” Atividade Prática (Mini-Projeto): Resolva as atividades, a seguir, em um documento texto e poste o mesmo no ambiente virtual, no local indicado. Essa atividade é para ser realizada em DUPLA (escolha seu companheiro de trabalho!) e fará parte da avaliação somativa de vocês. Dado o modelo conceitual da figura abaixo, faça o que se pede. 72
  • 73.
    Banco de Dados a) Apresente o modelo relacional correspondente deste diagrama conceitual. b) Normalize o modelo relacional obtido até a 3FN. c) Crie as tabelas e os índices, de acordo com o modelo normalizado d) Insira dados nas tabelas (pelo menos 3 linhas em cada tabela). e) Elabore pelo menos 3 SQLs de atualização para qualquer uma das tabelas, a sua escolha. f) Elaborar pelo menos três SQLs de exclusão para qualquer uma das tabelas, a sua escolha. g) Elaborar pelo menos cinco consultas que envolvam seleção condicional de dados usando, em pelo menos uma delas, ordenação. h) Elaborar pelo menos cinco consultas que envolvam junção de duas ou mais tabelas; i) Elaborar pelo menos duas consultas que envolvam agrupamento de dados. j) Elaborar pelo menos duas consultas que envolvam subconsultas. Vamos Revisar? Neste capítulo foi estudada a DML (Data Manipulation Language), que é a parte da linguagem SQL que possui comandos para manipulação de dados. Ou seja, possui comandos para inserção (INSERT), atualização (UPDATE), deleção (DELETE) e consulta (SELECT) aos dados. Adicionalmente, neste capítulo também foram vistas operações com conjuntos de dados, tais como união (UNION), interseção (INTERSECT) e exceção (EXCEPT) e, brevemente, a DCL (Data Control Language), que contém comandos para autorizar ou não o acesso aos dados (GRANT e REVOKE, respectivamente). 73
  • 74.
    Banco de Dados Considerações Finais Olá, cursista! Esperamos que você tenha aproveitado este quarto e último módulo da disciplina Banco de Dados, assim como a disciplina como um todo. Com tudo que foi estudado nesta disciplina, você já tem o conhecimento necessário para modelar, projetar, criar o seu banco de dados e trabalhar com ele, armazenando, alterando, deletando e consultado os dados armazenados. Claro que o aprimoramento desse conhecimento adquirido recentemente só virá com a prática e com leituras adicionais para aprofundamento. Assim sendo, quem quiser saber mais sobre banco de dados ou quiser trabalhar com os mesmos, aproveite as referências indicadas em cada capítulo e bons estudos! Adicionalmente, procure fazer uso de algum SGBD para praticar o uso de SQL e divirta-se! Foi um prazer ter estado com vocês nessa jornada de conhecimento! Até mais! Sandra de Albuquerque Siebra Autora 74
  • 75.
    Banco de Dados Referências ALVES, W.P. Fundamentos de Bancos de Dados. Editora Érica, 2004. BATINI, C.; CERI, S.; NAVATHE, S. B. Conceptual database design: an entity- relationship approach. San Francisco: Benjamim Cummings, 1992. BEIGHLEY, Lynn. Use a Cabeça SQL. Starlin Alta Consult, 1ª Edição, 2008 COUGO, Paulo Sérgio. Modelagem Conceitual e Projeto de Banco de Dados. Elsevier Editora, 1997. DAMAS, Luís. Sql - Structured Query Language. Editora LTC, 6ª edição, 2007. DATE, C. J. Banco de dados: tópicos avançados. Rio de Janeiro : Campus, 1988. DATE, C. J. Introdução a Sistemas de Banco de Dados. Elsevier Editora, 2004. ELMASRI, Ramez;NAVATHE, Shamkant B. Sistemas de banco de dados. Traduzido por: Marilia Guimarães Pinheiro et al. 4a. ed. São Paulo: Pearson Education do Brasil, 2005. HEUSER, Carlos Alberto. Projeto de Banco de Dados. 3. Edição., Porto Alegre : Sagra- Luzzatto, 2004. KLINE, Daniel; KLINE, Kelvin E. Sql - O Guia Essencial - Manual de Referência Profissional. Alta Books, 2010. KORTH, H. F.; SILBERSCHATZ, A.; SUDARSHAN, S. Sistema de Banco de Dados. Elsevier Editora, 2006. KROENKE, David M. Banco de Dados: Fundamentos, Projeto e Implementação. 6ª Edição. Editora LTC, 1999. LAENDER, A. H. F. ; CASANOVA, M. A. ; TUCHERMAN, L. . On the Design and Maintenance of Optimized Relational Representations of Entity-Relationship Schemas. Data & Knowledge Engineering, Amsterdam, v. 11, n. 1, p. 1-20, 1993 Revista SQL Magazine - http://www.sqlmagazine.com.br SETZER, V. W. Banco de dados. 3.ed. São Paulo : Revista Edgard Blucher, 1989. SHELDON, Robert; OPPEL, Andy. SQL – Um Guia para Iniciantes. Editora Ciência Moderna, 3ª Edição, 2009 SILBERSCHATZ, Abraham; KORTH, Henry F;SUDARSHAN, S. Sistema de banco de dados. Traduzido por Daniel Vieira. Rio de Janeiro: Elsevier;Campus, 2006. 75
  • 76.
    Banco de Dados Conheça a Autora Sandra de Albuquerque Siebra Doutora em Ciência da Computação, pelo Centro de Informática da UFPE onde trabalhou com Ambientes Virtuais de Aprendizagem e Ambientes Colaborativos em Geral. Ensinou na Faculdade Integrada do Recife (FIR) e na Universidade Católica de Pernambuco (UNICAP), além de ter trabalhado como gerente de projetos no Centro de Estudos e Sistemas Avançados do Recife (CESAR). Atualmente, é professora da Universidade Federal Rural de Pernambuco (UFRPE). Atua na equipe de Educação a Distância da UFRPE e no Departamento de Estatística e Informática (DEINFO), como professora autora de materiais didáticos para cursos a distância, já tendo também atuado como coordenadora de curso e professora executora de disciplinas. Tem experiência, trabalhos desenvolvidos e artigos publicados nas áreas de Educação a Distância, Interfaces Homem- Máquina, Sistemas Colaborativos, Banco de Dados, Análise e Projeto de Sistemas Orientados a Objetos, Sistemas de Informação e Engenharia de Software. Atualmente, desenvolve pesquisas sobre contextualização de interações em ambientes virtuais de aprendizagem e trabalho cooperativo. 76