76
Recife, 2010 Banco de Dados UNIVERSIDADE FEDERAL RURAL DE PERNAMBUCO (UFRPE) COORDENAÇÃO GERAL DE EDUCAÇÃO A DISTÂNCIA (EAD/UFRPE) Sandra de Albuquerque Siebra Volume 4

Livro Banco de Dados Volume 04

Embed Size (px)

DESCRIPTION

Livro muito bom sobre banco de dados. Últimos da série de 4 volumes.

Citation preview

  • Recife, 2010

    Banco de Dados

    UNIVERSIDADE FEDERAL RURAL DE PERNAMBUCO (UFRPE)

    COORDENAO GERAL DE EDUCAO A DISTNCIA (EAD/UFRPE)

    Sandra de Albuquerque Siebra

    Volume 4

  • Universidade Federal Rural de Pernambuco

    Reitor: Prof. Valmar Corra de Andrade

    Vice-Reitor: Prof. Reginaldo Barros

    Pr-Reitor de Administrao: Prof. Francisco Fernando Ramos Carvalho

    Pr-Reitor de Extenso: Prof. Paulo Donizeti Siepierski

    Pr-Reitor de Pesquisa e Ps-Graduao: Prof. Fernando Jos Freire

    Pr-Reitor de Planejamento: Prof. Rinaldo Luiz Caraciolo Ferreira

    Pr-Reitora de Ensino de Graduao: Prof. Maria Jos de Sena

    Coordenao Geral de Ensino a Distncia: Prof Marizete Silva Santos

    Produo Grfica e Editorial

    Capa e Editorao: Rafael Lira, Italo Amorim e Arlinda Torres

    Reviso Ortogrfica: Elias Vieira

    Ilustraes: Mrio Frana

    Coordenao de Produo: Marizete Silva Santos

  • Sumrio

    Apresentao ................................................................................................................. 4

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

    Captulo 10 lgebra e Clculo Relacional ..................................................................... 7

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

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

    Captulo 11 Criando e Mantendo um Banco de Dados ............................................... 26

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

    Captulo 12 Consultas em Banco de Dados Relacionais .............................................. 39

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

    Consideraes Finais .................................................................................................... 74

    Conhea a Autora ........................................................................................................ 76

  • 4Apresentao

    Caro(a) cursista,

    Seja bem-vindo(a) ao quarto mdulo do curso Banco de Dados!

    Neste quarto mdulo, 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 clculo relacional que so formas de

    representar matematicamente as operaes que podem ser aplicadas a um Banco de Dados.

    Bons estudos!

    Sandra de Albuquerque Siebra

    Autora

  • 5Banco de Dados

    Conhecendo o Volume 4

    Neste quarto volume, voc ir encontrar o Mdulo 4 da disciplina de Banco de

    Dados. Para facilitar seus estudos, veja a organizao deste quarto mdulo.

    Mdulo 4 Criao, Manuteno e Consulta a Banco de Dados

    Carga horria do Mdulo 4: 15 h/aula

    Objetivo do Mdulo 4:

    Introduzir os principais conceitos referentes a lgebra relacional e o cclulo

    relacional como formas de manipulao e consulta a BD.

    Examinar os principais comandos em SQL para criao e manuteno de banco de

    dados.

    Examinar os principais comandos em SQL para consultas simples e aninhadas a

    banco de dados.

    Contedo Programtico do Mdulo 4:

    lgebra Relacional.

    Clculo Relacional de Tupla e Clculo Relacional de Domnio.

    SQL Conceitos bsicos, comandos para criao e atualizao do banco de dados.

    SQL - Consultas bsicas e Consultas Aninhadas.

  • 6Banco de Dados

    Captulo 10

    O que vamos estudar neste captulo?

    Neste captulo, vamos estudar os seguintes temas:

    lgebra Relacional.

    Clculo Relacional de Tupla.

    Clculo Relacional de Domnio.

    Metas

    Aps o estudo deste captulo, esperamos que voc:

    Compreenda o que lgebra relacional e clculo relacional.

    Consiga diferenciar o clculo relacional de tupla e de domnio.

    Consiga fazer uso de alguns comandos da lgebra relacional.

  • 7Banco de Dados

    Captulo 10 lgebra e Clculo 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 relaes. Uma relao pode ser pensada como uma tabela de valores, onde cada

    linha na tabela representa uma coleo 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 clculo relacional) e as linguagens comerciais,

    que so baseadas nas linguagens formais (tal como a SQL Structured Query Language). As

    linguagens formais so justamente as que daremos uma olhada nesse captulo e uma das

    linguagens comerciais mais utilizadas (a SQL) ser assunto dos dois captulos finais desse

    volume.

    Neste captulo, vamos estudar as linguagens formais para consulta e manipulao

    dos dados em um banco de dados: a lgebra relacional e o clculo relacional.

    lgebra Relacional

    A lgebra Relacional uma linguagem de consulta formal, porm procedimental

    (procedural), ou seja, o usurio d as instrues ao sistema para que o mesmo realize uma

    sequncia de operaes na base de dados para calcular o resultado desejado. Ela consiste

    de um conjunto de operaes que tm como entrada uma ou duas relaes e produzem,

    como resultado, uma nova relao.

    Os operadores da lgebra relacional podem ser divididos em dois grupos:

    Operadores de Conjuntos: so operadores tpicos definidos pela lgebra para

    conjunto, tais como unio, interseo, diferena e produto cartesiano. As operaes

    com esses operadores se aplicam a duas relaes que obedeam compatibilidade

    de unio, ou seja, ambas as relaes devem apresentar atributos que pertenam

    respectivamente aos mesmos domnios.

    Operadores de Tabelas: so operadores definidos especialmente para a

    manipulao de tuplas, em bases de dados relacionais tais como: Select, Project

    e Join, entre outras. As operaes com esses operadores se aplicam a quaisquer

    relaes.

    Esses operadores sero detalhados nas sees a seguir.

    Observao

    As linguagens disponveis para acesso a BDs relacionais, inclusive o SQL, no 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.

  • 8Banco de Dados

    lgebra Relacional: Operadores de Conjuntos

    So operadores binrios e para utiliz-los, preciso se assegurar de que as duas

    relaes envolvidas nas operaes tenham o mesmo tipo de tuplas, ou seja, pertenam

    ao mesmo domnio. Essa condio chamada unio compatvel. Em outras palavras, duas

    relaes R1 (A1, A2,..., An) e R2 (B1, B2, ..., Bn) so unio compatvel se elas tiverem o

    mesmo grau n, e dom(Ai) = dom(Bi) para 1 i n. Isso significa que as duas relaes tm

    o mesmo nmero de atributos e que cada par de atributos correspondentes pertence ao

    mesmo domnio.

    Pode-se definir as operaes de unio, interseo, diferena e produto cartesiano

    sobre duas relaes que sejam unio compatvel R1 e R2. Resumidamente:

    Unio (R1 R2) - todas as tuplas de R1 e todas as tuplas de R2, sendo que tuplas duplicadas so eliminadas.

    Interseo (R1 R2) - todas as tuplas comuns a R1 e R2.

    Diferena (R1 R2) - todas as tuplas de R1 que no esto em R2.

    Produto Cartesiano (R1 x R2) - combinao das tuplas de R1 com as de R2.

    Vamos detalhar e exemplificar, a seguir, cada uma dessas operaes. Mas, antes,

    algumas observaes sobre essas operaes:

    As operaes de unio e interseo so operaes comutativas. Ou seja:

    R1 R2 = R2 R1 e R1 R2 = R2 R1.

    J a operao de diferena no comutativa: R - S S - R.

    As operaes de unio e interseo so binrias, mas podem ser aplicadas a

    qualquer nmero de relaes e ambas so operaes associativas. Assim:

    R (S T) = (R S) T e R (S T) = (R S) T.

    Considere como base para os exemplos das operaes as relaes Professor e Aluno

    representadas pelas Tabelas 1 e 2.

    Tabela 1 - Relao Professor Tabela 2 - Relao Aluno

    CPF Nome CPF Nome

    1001 Ana Maria 1002 Joo

    1002 Joo 1116 Mrcia

    1003 Pedro 1900 Ronaldo

    Unio: A B

    Unio a operao entre duas relaes unio compatvel (mesmo nmero de

    atributos e com domnio compatvel) que gera uma relao resultante contendo todas

    as tuplas (linhas) das duas relaes originais, com eliminao das tuplas duplicadas.

    Ela denotada pelo smbolo . Por exemplo, a unio das relaes Professor e Aluno representadas pelas Tabelas 1 e 2 a relao representada pela Tabela 3.

  • 9Banco de Dados

    Tabela 3 Relao Resultante de Professor Aluno

    CPF Nome

    1001 Ana Maria

    1002 Joo

    1003 Pedro

    1116 Mrcia

    1900 Ronaldo

    Interseo: A B

    Interseo a operao entre duas relaes unio compatvel que gera uma

    relao resultante contendo todas as tuplas (linhas) presentes em ambas as relaes

    originais. Ela denotada pelo smbolo . Por exemplo, a interseo das relaes Professor e Aluno representadas pelas Tabelas 1 e 2 a relao representada pela Tabela 4.

    Tabela 4 - Relao Resultante de Professor Aluno

    CPF Nome

    1002 Joo

    Diferena: A B

    Diferena a operao entre duas relaes unio compatvel que gera uma relao

    resultante contendo todas as linhas que esto na primeira relao, e que no aparecem na

    segunda. Ela denotada pelo smbolo . Por exemplo, a diferena das relaes Professor e

    Aluno representadas pelas Tabelas 1 e 2 (Professor Aluno) a relao representada pela

    Tabela 5, que contm as tuplas das relao Professor que no esto na relao Aluno.

    Tabela 5 - Relao Resultante de Professor Aluno

    CPF Nome

    1001 Ana Maria

    1003 Pedro

    Para mostrar que a operao de diferena no comutativa, vamos agora fazer

    Aluno Professor, ou seja, as tuplas que esto na relao Aluno, mas que no esto na

    relao Professor. Veja pela relao resultante representada na Tabela 6 que os resultados

    da diferena, mudando a ordem das relaes so diferentes.

  • 10

    Banco de Dados

    Tabela 6 - Relao Resultante de Aluno Professor

    CPF Nome

    1116 Mrcia

    1900 Ronaldo

    Produto Cartesiano: A x B

    O produto cartesiano combina duas relaes gerando uma terceira cujas linhas

    representam todas as possveis combinaes das linhas (tuplas) das relaes originais. Um

    esquema dessa combinao pode ser vista na Figura 1.

    Figura 1 - Esquema de combinaes do Produto Cartesiano

    O produto cartesiano uma operao binria e representado pelo smbolo X. O

    formato geral da operao : relao_1 X relao_2 . Vamos dar um exemplo. Qual seria o

    resultado do produto cartesiano Cidade x Estado (vide Tabelas 7 e 8)?

    Tabela 7 - Relao Cidade Tabela 8 - Relao Estado

    Cdigo Nome UF Regio

    1 Recife PB Nordeste

    2 Manaus AM Norte

    3 Joo Pessoa

    O resultado seria a relao resultante apresentada na Tabela 9. Veja que esta

    relao resultante apresenta a combinao de todas as tuplas da relao Cidade, com todas

    as tuplas da relao Estado.

  • 11

    Banco de Dados

    Tabela 9 - Relao Resultante

    Cdigo Nome UF Regio

    1 Recife PB Nordeste

    2 Natal PB Nordeste

    3 Joo Pessoa PB Nordeste

    1 Recife AM Norte

    2 Natal AM Norte

    3 Joo Pessoa AM Norte

    Renomear para diferenciar: O Produto Cartesiano entre duas relaes R1 e R2 (R1 x R2) apresenta

    problemas quando:

    * As relaes tm mesmo nome;

    * Se se quer fazer o produto de uma relao com ela mesma ou

    * O produto cartesiano est envolvido com a relao resultante de expresses (que vamos ver o

    que so 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 relao resultante. Para isso, pode-

    se anexar ao atributo o nome da relao a qual ele pertena: nome_relacao.nome_atributo. Por

    exemplo, se fizssemos o produto cartesiano entre as relaes Professor e Aluno (vide Tabelas 1 e

    2), como as duas tabelas possuem atributos de mesmo nome, a relao 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 relaes. A seguir, descreveremos cada uma das operaes.

    Seleo

    O operador de seleo usado para selecionar tuplas que satisfaam uma

    determinada condio. Essas tuplas selecionadas geram uma relao resultante. O esquema

    da relao resultante o mesmo da relao original. O operador de seleo representado

    pela letra grega sigma () e seu formato geral : condio(tabela ou relao). O operador

    da seleo unrio, ou seja, seleciona tuplas de somente uma relao. Vamos dar alguns

    exemplos a partir da relao Cidade (vide Tabela 10).

  • 12

    Banco de Dados

    Tabela 10 - Relao Cidade

    Cdigo Nome _capital UF

    1 Recife S PE

    2 Natal S RN

    3 Joo Pessoa S PB

    4 Patos N PB

    UF = PB(cidade) daria como resultado a relao da Tabela 11, que atenderia a

    algo como: selecione da relao cidade, as tuplas cuja UF seja igual ao valor PB.

    Tabela 11 - Relao Resultante

    Cdigo Nome _capital UF

    3 Joo Pessoa S PB

    4 Patos N PB

    Para especificar as condies da seleo podemos utilizar: valores constantes, nome

    de atributos (colunas), operadores relacionais (=, , =, ) ou operadores lgicos (and,

    or, not). Por exemplo, UF=PB and E_Capital=N(CIDADE) daria como resultado a relao

    da Tabela 12, que atenderia a algo como: selecione da relao cidade, as tuplas cuja UF seja

    igual ao valor PB e o campo E_Capital tenha o valor N.

    Tabela 12 - Relao Resultante

    Cdigo Nome _capital UF

    4 Patos N PB

    Vamos a outro exemplo, suponha o esquema de relao Empregado (CPF, Nome,

    DataNasc, Endereo, 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 operao de seleo comutativa, ou seja, uma sequncia de seleo pode ser

    aplicada em qualquer ordem:

    ( (Relao)) = ( (Relao))

    Sempre possvel combinar uma propagao de operaes de seleo dentro de

    uma nica operao de seleo, fazendo uso de uma condio conjuntiva (AND):

    ( (Relao)) = and (Relao)

    ( ( ... ( (Relao)) ...)) = AND

    AND ... AND (Relao)

  • 13

    Banco de Dados

    Projeo

    A operao de projeo unria e opera sobre uma nica relao gerando outra

    relao resultante que conter todas as linhas da relao original, mas apenas as colunas

    (atributos) que se deseja projetar (e que foram especificadas na operao). Ou seja, retorna

    parte da relao deixando de fora os atributos que no foram solicitados. Na relao

    resultante as tuplas (linhas) duplicadas so eliminadas. O formato geral da operao de

    projeo : A1, A2, , An (Relao) onde A1, A2, ..., An so nomes de atributos da relao.

    Vamos dar um exemplo. Tomando como base a relao Cidade (vide Tabela 10), vamos

    supor que queremos selecionar (projetar) apenas os atributos Nome e UF. Da precisaramos

    da seguinte operao: Nome, UF (Cidade). A relao resultante dessa projeo seria a

    apresentada na Tabela 13. Observe que a relao resultante tem todas as tuplas da relao

    original, mas s apresenta os atributos especificados na operao de projeo. Alm disso,

    observe que estes atributos aparecem na mesma ordem em que foram especificados.

    Tabela 13 - Relao Resultante da Projeo

    Nome UF

    Recife PE

    Natal RN

    Joo Pessoa PB

    Patos PB

    Na verdade, se observarmos bem, o operador de projeo tambm serve para

    selecionar. Porm, enquanto o operador de SELEO seleciona tuplas de uma relao, o

    operador de PROJEO seleciona colunas de uma Relao.

    O nmero de tuplas na relao resultante sempre ser igual ou menor que a

    quantidade de tuplas na relao original. Isto porque tuplas duplicadas so eliminadas. Por

    exemplo, observe a seguinte operao de projeo Nome, UF (Cidade) aplicada relao

    Cidade (vide Tabela 10). Veja que PB aparece apenas uma vez na relao resultante (vide

    Tabela 14). Mesmo que ela aparea duas vezes na relao original (Tabela 10).

    Tabela 14 - Relao Resultante da Projeo

    UF

    PE

    RN

    PB

    A operao de projeo no comutativa. Apenas no caso especfico de

    conter os mesmos atributos de pode-se observar comutatividade.

    ( (Relao))

    ( (Relao))

  • 14

    Banco de Dados

    Combinando Operaes

    Em geral, existe a necessidade de se aplicar vrias operaes da lgebra relacional

    uma aps a outra. Pode-se escrever essas operaes em apenas uma nica expresso da

    lgebra relacional, combinando as operaes, usando tanto operadores de conjunto, quanto

    de tabela. Vamos dar alguns exemplos a seguir.

    Tomando como base as relaes Professor(CPF, Nome) e Aluno (CPF, Nome) -

    vide Tabelas 1 e 2 se desejssemos encontrar o nome de todos os professores

    que tambm so alunos, poderamos usar a expresso: nome(Professor) nome(Aluno)

    A partir da relao Empregado (CPF, Nome, Sexo, Salario, Num_Dep), vide Tabela

    15, selecione o nome e o salrio de todos os empregados que trabalhem no

    departamento de nmero 4. Para isso, poderamos usar a expresso:

    nome, salario ( Num_Dep=4(Empregado))

    Isso daria origem a tabela 16.

    Tabela 15 - Relao 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 Las Ramos F 3000 4

    Tabela 16 - Relao Resultante

    Nome Salario

    Pedro Nunes 1000

    Las Ramos 3000

    Tabela 17 - Relao Gerente

    CPF Nome Sexo Salario Num_Dep

    5678 Joo Teixeira M 1800 2

    2345 Pedro Nunes M 1000 4

    A partir da relao Empregado (Tabela 15) e da relao Gerente (Tabela 17),

    encontre o nome de todos os empregados que no so gerentes. Para isso,

    poderamos usar a expresso:

    nome (Empregado) - nome (Gerente)

  • 15

    Banco de Dados

    Outra forma de combinar operaes aplicar uma nica operao por vez e criar

    relaes intermedirias. Neste caso, preciso dar nomes s relaes intermedirias. Por

    exemplo, vamos tomar o exemplo anteriormente visto de tomar a relao Empregado como

    base (Tabela 15) e dela recuperar o nome e o salrio de todos os empregados que trabalham

    no departamento 4. J apresentamos como fazer isso com uma nica expresso. Agora,

    alternativamente, seria possvel explicitar a sequncia de operaes, dando um nome para

    cada relao intermediria:

    Empregados_Dep4 Num_Dep=4(Empregado)

    nome, salario (Empregados_Dep4)

    Juno

    O operador de juno combina as linhas de duas tabelas (relaes) segundo uma ou

    mais condies. A condio de juno deve ser baseada em uma ou mais colunas (atributos)

    de cada uma das tabelas cujos valores compartilhem um domnio comum. As linhas das

    tabelas sero combinadas sempre que a condio de juno for verdadeira. (geralmente

    a condio uma igualdade entre atributos equivalentes). O join representado pelo

    operador binrio |x| e o formato geral de utilizao : Relao1 |x|

    Relao2. Por exemplo, Cidade |x| cidade.UF = Estado.UF Estado. Vai combinar os valores

    das relaes Cidade (Tabela 18) e Estado (Tabela 19), de acordo com a igualdade do atributo

    comum s duas relaes: a UF. Dessa forma, seria gerada a relao representada na Tabela

    20. Veja que a primeira tupla da relao Cidade (vide Tabela 18) no faz parte da relao

    resultante, por que ela no tem equivalente na relao Estado (j que est sendo feita a

    igualdade com base no atributo UF). Ou seja, tuplas cujos atributos de juno so nulos no

    aparecem na relao resultante.

    Tabela 18 - Relao Cidade

    Cdigo Nome Sexo

    1 Recife PE

    2 Manaus AM

    3 Joo Pessoa PB

    Tabela 19 - Relao Estado

    UF Regio

    PB Nordeste

    AM Norte

    Tabela 20 - Relao Resultante

    Cdigo Nome Cidade.UF Estado.UF Regio

    2 Manaus AM AM Norte

    3 Joo Pessoa PB PB Nordeste

  • 16

    Banco de Dados

    Quando a condio de uma juno a igualdade, a juno chamada de equijoin.

    O equijoin gera duas colunas idnticas na relao resultante (vide as colunas UF na Tabela

    20). Uma Juno Natural um equijoin onde uma das colunas idnticas eliminada. Como

    assim? O operador de juno natural combina as linhas de duas tabelas que tem atributos

    comuns (mesmo nome), resultando numa tabela que contm apenas as linhas onde todos

    os atributos comuns apresentam o mesmo valor. Na relao resultante, uma das colunas

    idnticas eliminada, evitando a duplicidade.

    A juno natural equivale a uma seleo precedida de um produto cartesiano.

    Assim:

    Cidade |x| cidade.UF = Estado.UF Estado equivalente a

    cidade.UF = Estado.UF (Cidade x Estado)

    Se duas relaes envolvidas em uma juno natural no tm atributos em comum,

    ento a juno natural produz um resultado igual ao produzido pelo produto cartesiano.

    EQUIJOIN: juno onde somente operadores de comparao = so utilizados. Gera colunas

    idnticas.

    JUNO NATURAL: requer que os dois atributos de juno tenha o mesmo nome em ambas as

    relaes. Nesse tipo de join outras condies podem ser utilizadas alm da igualdade. A relao

    resultante no gera nenhuma duplicidade.

    Clculo Relacional

    O Clculo Relacional (CR) uma linguagem de consulta formal. Utilizando-se de uma

    expresso declarativa pode-se especificar uma consulta. Uma expresso de clculo permite

    a descrio da consulta desejada sem especificar os procedimentos para obteno dessas

    informaes, ou seja, no-procedural. Contudo, tal consulta deve ser capaz de descrever

    formalmente a informao desejada, com exatido.

    No Clculo Relacional existem variveis, constantes, operadores lgicos, de

    comparao e quantificadores. As expresses de Clculo so chamadas de frmulas. Uma

    tupla de respostas essencialmente uma atribuio de constantes s variveis que levam a

    frmula a um estado verdadeiro. Existem dois tipos de clculo relacional: Clculo Relacional

    de Tuplas (CRT) e Clculo Relacional de Domnio (CRD), ambos subconjuntos simples de

    lgica de primeira ordem. No CRT, as variveis so definidas sobre (isto , associam) tuplas.

    J em CRD, variveis so definidas sobre o domnio dos elementos (ou seja, sobre os valores

    dos campos).

    Como o clculo relacional pouco utilizado, vamos apenas apresentar algumas

    definies e exemplos, a ttulo informativo, de cada um dos tipos de clculo. Adicionalmente,

    importante saber que todas as expresses de consulta descritas no Clculo Relacional

    possuem equivalentes em lgebra Relacional, que mais utilizada e possui mais ferramentas

    para dar suporte a construo de suas expresses.

    Clculo Relacional de Tupla

    O Clculo Relacional de Tupla (CRT) baseado na especificao de um nmero de

    variveis de tuplas. Cada varivel de tupla pode assumir como seu valor qualquer tupla da

    relao especificada. Uma consulta em CRT especificada da seguinte forma:

    {varivel tupla | predicado} ou { t | P(t) } que significa o conjunto de todas as tuplas

  • 17

    Banco de Dados

    t, tal que o predicado P seja verdadeiro para t. E temos que t uma varivel de tuplas. P

    uma expresso 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 variveis tuplas para as quais o predicado indicado

    como verdadeiro.

    Uma expresso genrica do clculo 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 so variveis de tuplas, cada Ai um

    atributo da relao na qual ti se encontra e o predicado uma frmula do clculo relacional

    de tuplas.

    Uma frmula definida, de forma recursiva, por uma ou mais frmulas atmicas.

    Essas frmulas podem ser conectadas por operadores lgicos (AND, OR ou NOT), como

    segue:

    Se F1 e F2 so frmulas atmicas, ento (F1 AND F2), (F1 OR F2), NOT (F1) e NOT

    (F2) tambm o so, 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 frmulas F1 e F2, for TRUE;

    NOT(F1) ser TRUE quando F1 for FALSE;

    NOT(F2) ser TRUE quando F2 for FALSE.

    Se F1 uma frmula atmica, ento ( t)(F1) tambm o , e seu valor verdade

    apenas ser TRUE se a frmula F for avaliada como verdadeira para pelo menos

    uma tupla atribuda para ocorrncias livres de t (que uma varivel de tupla) em F.

    Se F1 uma frmula atmica, ento ( t)(F1) tambm o , e seu valor verdade apenas ser TRUE se a frmula F for avaliada como verdadeira para todas as tuplas

    atribudas para ocorrncias livres de t em F.

    Adicionalmente, temos:

    Uma frmula atmica ti.A op tj.B, onde op um dos operadores de comparao no

    conjunto {=, >, =, , =,

  • 18

    Banco de Dados

    Todas as variveis tuplas abordadas so consideradas variveis livres (elas aparecem em

    uma expresso de clculo relacional esquerda da barra |), uma vez que estas no aparecem

    quantificadas. Porm, quando quantificadores (universal () ou existencial ()) aparecem nas

    frmulas, as variveis que os sucedem so denominadas variveis limite.

    Tabela 21 - Relao 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 Las Ramos F 3000 4

    Tabela 22 - Relao Departamento

    Cod Descricao

    2 Vendas

    4 Suporte

    5 Gerncia

    Vamos dar alguns exemplos para ilustrar. Tomando como base a relao Empregado

    (vide Tabela 21) e a relao Departamento (vide Tabela 22), suponha as seguintes consultas

    e como elas ficariam representadas em clculo relacional de tupla.

    Obtenha todos os empregados cujo salrio seja maior que 3000 reais: { t |

    EMPREGADO(t) AND t.SALARIO > 3000 }.

    Analisando a expresso podemos l-la da seguinte forma: considere uma tupla t,

    ela deve ser uma tupla da relao empregado, cujo atributo salrio dessa tupla deve

    ser maior que 3000. EMPREGADO(t) o mesmo que dizer que t EMPREGADO.

    A consulta acima resulta em uma relao que contm todas as tuplas t da relao

    EMPREGADO que satisfazem a condio (no caso, salrio > 3000).

    No CRT especificamos primeiro os atributos desejados. Se for usado apenas o t, sem

    especificao de atributos, todos os atributos da tupla so recuperados. Logo, na consulta

    acima, seriam recuperados os atributos CPF, Nome, Sexo, Salario e Cod_Depto (vide Tabela

    21). Agora, suponha que gostaramos de recuperar apenas os atributos CPF e Nome das

    tuplas que atendessem a condio. Como faramos?

    { t.CPF, t.Nome | EMPREGADO(t) AND t.SALARIO > 3000 }.

    Observe que os atributos desejados so especificados do lado esquerdo da barra

    (|).

    Vamos a outro exemplo. Obtenha o nome e o salrio dos empregados que

    trabalham para o departamento de Suporte.

    {t.NOME, t.SALARIO | EMPREGADO(t) AND ( d) (DEPARTAMENTO (d) AND

  • 19

    Banco de Dados

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

    Analisando a expresso podemos l-la da seguinte forma: obtenha o nome e o

    salrio de todas as tuplas da relao empregado e exista um departamento d, cuja

    descrio seja Suporte e o cdigo desse departamento de nome Suporte seja

    igual ao cdigo do departamento da tupla sendo avaliada na relao Empregado.

    Vamos exemplificar agora o quanto o CRT pode ser representado facilmente por

    uma expresso da lgebra relacional, levando em conta a relao 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)

    Clculo Relacional de Domnio (CRD)

    Trata-se de uma segunda forma de clculo relacional, equivalente ao CRT. Essa

    forma usa variveis de domnio que tomam valores do domnio de um atributo, em vez de

    valores da tupla inteira. Uma expresso neste clculo tem a forma:

    { | Predicado (x1, x2, ..., xn) }

    onde x1, x2, ..., xn representam variveis de domnio e Predicado representa uma

    frmula composta de tomos, como no clculo relacional de tupla.

    A diferena bsica entre CRT e CRD que neste ltimo as variveis estendem-se

    sobre valores nicos de domnios de atributos. Para formar uma relao de grau n para

    um resultado de consulta, faz-se necessrio criar n variveis de domnio, uma para cada

    atributo. Como em CRT, as frmulas so avaliadas em valores verdade para um conjunto

    especfico de valores.

    A seguir, para fins de comparao e para ilustrar o CRD, seguem em CRD os mesmos

    exemplos de consultas j escritos em CRT.

    Tabela 23 - Relao 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 Las Ramos F 3000 4

  • 20

    Banco de Dados

    Tabela 24 - Relao Departamento

    m n

    Cod Descricao

    2 Vendas

    4 Suporte

    5 Gerncia

    Tomando como base as tabelas 23 e 24 que representam, respectivamente, as

    relaes Empregado e Departamento (note que cada coluna dessas relaes recebeu uma

    letra para referenciar o domno do atributo representado por cada coluna), podemos

    realizar as seguintes consultas:

    Obtenha todos os empregados cujo salrio seja maior que 3000 reais: { t |

    EMPREGADO(t) AND t.SALARIO > 3000 }.

    { abcde1 | ( d2) EMPREGADO(abcde) AND d > 3000 }

    Se na consulta anterior quisssemos recuperar apenas o CPF e o nome dos

    empregados, teramos:

    { ab | ( d) EMPREGADO(abcde) AND d > 3000 }

    Obtenha o nome e o salrio dos empregados que trabalham para o departamento

    de Suporte.

    { bd | ( e) ( m)( n) (EMPREGADO(abcde) AND DEPARTAMENTO(mn) AND

    n = Suporte AND m = e) }

    Consideraes Finais

    A lgebra relacional uma forma de clculo sobre conjuntos ou relaes. Uma

    aplicao prtica da lgebra relacional na execuo de consultas a bancos de dados

    relacionais. A lgebra relacional recebia pouca ateno at a publicao do modelo

    relacional de dados de E.F Codd, em 1970. Codd props tal lgebra como uma base para

    linguagens de consulta em banco de dados. As operaes da lgebra relacional podem ser

    resumidas de forma ilustrada na Figura 2.

    Comentrio

    1 Observe que as letras esquerda da barra (|) representam o domno dos atributos desejados (vide Tabela 23), como conseqncia, eles referenciam as colunas desejadas.

    Comentrio

    2 Somente necessrio quantificar as variveis que participam de uma condio.

    Ou seja, s usamos o operador existencial na varivel de domnio d, porque apenas essa varivel usada na condio expressa no predicado (d > 3000)

  • 21

    Banco de Dados

    Figura 2 - Resumo das Operaes da lgebra Relacional

    O Clculo Relacional uma linguagem formal, no-procedural, para consulta a

    relaes. A lgebra relacional tem poder de expresso essencialmente equivalente ao do

    clculo relacional, esse resultado conhecido como teorema de Codd. Em geral, a lgebra

    relacional bem mais utilizada do que o clculo relacional.

    Conhea Mais

    Para obter mais informaes sobre o assunto estudado nesse captulo voc pode

    consultar qualquer um dos livros listados a seguir. Todos eles possuem captulos dedicados a

    lgebra Relacional e o Clculo Relacional (de Tupla e de Domnio):

    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. So

    Paulo: Pearson Education do Brasil, 2005.

    DATE, C. J. Introduo a sistemas de bancos de dados. Rio de Janeiro: Campus,

    2000.

    ALVES, W.P. Fundamentos de Bancos de Dados. Editora rica, 2004.

  • 22

    Banco de Dados

    Voc Sabia?

    O Clculo relacional dependendo do autor pode ter sua notao ligeiramente modificada. A notao que fizemos uso nesse captulo a notao de Navathe (ELMASRI e NAVATHE, 2005). Porm, existe tambm a notao de Korth (KORTH, SILBERSCHATZ e SUDARSHAN, 2006). Para ilustrar as diferenas, vamos repetir a mesma consulta anteriormente realizada:

    Obtenha o nome e o salrio dos empregados que trabalham para o departamento de Suporte. Na notao de Navathe, que j utilizamos, ficaria:

    {bd | ( e) ( m) ( n) (EMPREGADO(abcde) AND DEPARTAMENTO(mn) AND n = Suporte AND m = e)}

    J na notao de Korth, a mesma sentena ficaria da seguinte forma:

    { | empregado departamento(mn) n = Suporte m = e)}

    Veja que o formato geral da expresso muda um pouco, mas o que muda mesmo a simbologia dos operadores lgicos: AND (), OR (), NOT (), a forma de expressar as variveis de tupla (observe o comeo das duas expresses e veja a diferena) e ao invs de aspas simples em constantes, usa-se aspas duplas.

    Aprenda Praticando

    Como a lgebra relacional mais utilizada, vamos avaliar alguns exerccios

    resolvidos para que, logo depois, voc possa resolver os seus exerccios 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 - Relao Devedor

    Nome Num_Emprestimo Sexo

    Ana Gomes 01 F

    Pedro Nunes 03 M

    Maria Lima 05 F

    Tabela 26 - Relao Emprstimo

    Agencia Num_Emprestimo Valor

    3456 01 1500

    2123 03 5000

    2123 05 2500

    Em geral, na realizao de consultas as operaes mais utilizadas so a projeo

    (representada pelo smbolo ) que seleciona quais colunas (atributos) se deseja na relao

    resultante e a seleo (representada pelo smbolo ) que seleciona quais tuplas da relao

    atendem a uma determinada condio. Se a projeo no for utilizada, todos os atributos da

    relao original faro parte da relao resultante. Quando necessitamos de dados que esto

  • 23

    Banco de Dados

    em duas relaes diferentes, devemos utilizar a operao de juno |x|.

    Apresentar os dados de todos os devedores do sexo feminino. Cada vez que

    desejamos selecionar tuplas da relao de acordo com uma determinada condio,

    usamos a seleo.

    sexo = F (devedor)

    Apresentar o nome e o nmero do emprestimo de todos os devedores do sexo

    masculino. Como especificado o que deve ser mostrado nome e nmero

    emprstimo necessrio usar a projeo antes da seleo)

    nome,num_emprestimo ( sexo = M (devedor))

    Mostrar o nome das pessoas que possuem emprstimo acima de trs mil reais

    na agncia 2123. Como o nome da pessoa est na relao devedor e o valor do

    emprstimo na relao emprstimo, necessrio fazer a juno dessas duas

    relaes, para ser possvel selecionar o que foi pedido. A juno feita equiparando

    os atributos que as relaes tm em comum.

    nome ( valor > 3000 and agencia = 2123 (Devedor |x| devedor.num_emprestimo

    = emprstimo.num_emprestimo Emprestimo))

    Apresentar as pessoas cujo nmero do emprstimo igual a 5 e o nmero da

    agncia igual a 2123 ou que o nmero do emprstimo seja igual a 3 e o valor do

    emprstimo maior do que 1000 reais. um caso de seleo onde necessrio usar

    operadores lgicos para montar as condies.

    (num_emprestimo = 5 and agencia = 2123) or (num_emprestimo = 3 and valor >

    1000) (Emprestimo))

    Atividades e Orientaes de Estudo

    Agora vamos exercitar o que foi estudado neste captulo. Assim sendo, faa as

    atividades sugeridas a seguir. Lembre que exercitar vai lhe ajudar a fixar melhor o contedo

    estudado. Mos obra!

    Atividades Prticas

    Responda as questes a seguir em um documento de texto (doc)3 e poste as

    respostas no ambiente virtual, no local indicado. Esse trabalho deve ser feito em DUPLA.

    Especifique usando a lgebra relacional as consultas a seguir, tomando como base

    as relaes cujos esquemas esto representados a seguir.

    EMPREGADO

    CPF (PK) Nome DtNasc Endereco Sexo Salario Cod_Dep (FK)

    Dica

    3 No Word, a simbologia usada na lgebra relacional pode ser inserida no documento atravs do seguinte caminho: Inserir -> Smbolo, fazendo uso da fonte Symbol (da voc escolhe na tabela que apresentada o smbolo apropriado)

  • 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 cdigos 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 no trabalham em quaisquer projetos.

    h) Recuperar o nome e o sexo de todos os dependentes do empregado de CPF de

    nmero 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 captulo, 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 clculo relacional (tanto de tupla, quanto de domno). A maneira de raciocionar fazendo

    uso dessas linguagens ir facilitar a compreenso do uso da linguagem comercial a ser

    estudada nos captulos seguintes: a SQL. At l!

  • 25

    Banco de Dados

    Captulo 11

    O que vamos estudar neste captulo?

    Neste captulo, vamos estudar os seguintes temas:

    A Linguagem SQL.

    Subdivises da SQL.

    Como criar um Banco de Dados usando SQL.

    Metas

    Aps o estudo deste captulo, esperamos que voc:

    Conhea a linguagem SQL.

    Conhea as subdivises da linguagem.

    Consiga criar e manter a estrutura de um banco de dados usando SQL.

    Consiga criar ndices para um banco de dados.

  • 26

    Banco de Dados

    Captulo 11 Criando e Mantendo um Banco de Dados

    Vamos conversar sobre o assunto?

    No captulo anterior vimos linguagens formais para consulta a banco de dados

    relacionais. Porm, na rea comercial, essas linguagens no so muito utilizadas, ao invs

    delas, so usadas linguagens comerciais para criao, manuteno 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 captulo e no

    captulo seguinte.

    Neste captulo, comearemos 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, tambm 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, no-procedural, fundamentada na lgebra e no clculo

    relacional de tupla. Apesar de ser chamada linguagem de consulta (Query), ela no apenas

    de consulta, ela inclui comandos para definio, manuteno e consulta em bancos de dados

    relacionais. Alm disso, ela define mecanismos para criao de vises, especificaes de

    segurana, autorizaes, definies de restries e controle de transaes. Adicionalmente,

    ela possui regras para embutir os comandos SQL em linguagens de programao genricas

    como Java, PHP, C# ou C/C++.

    A SQL foi desenvolvida pelo laboratrio 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 razes

    Jurdicas. Em 1986, em um esforo conjunto da ANSI (American Nacional Standars Institute)

    e da ISO (International Standards Organization) criou-se a primeira verso padro da SQL, a

    SQL-86 (SQL1), substituda posteriormente pela SQL-92 (SQL2) e depois pela SQL-99 (SQL3).

    O atual projeto da SQL o padro 200n.

    A SQL padro suportada por todos os SGBDs relacionais comerciais. Porm,

    mesmo padronizada, existem variaes, ou seja, cada fornecedor pode incluir comandos

    prprios na SQL utilizada pelo seu SGBD. Em outras palavras, cada implementao do SQL

    de cada fornecedor possui os comandos do SQL padro (tambm chamado SQL ANSI)

    e, tambm, algumas adaptaes 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

    padro no ter problemas com migrao 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 padro,

  • 27

    Banco de Dados

    no haver problemas ou necessidade de adaptaes.

    O SQL usado nesta disciplina ser o baseado no Padro ANSI e nenhuma

    caracterstica especfica de SGBD ser abordada. Dessa forma, para praticar os comandos de

    SQL aqui ensinados, voc poder fazer uso de qualquer SGBD comercial.

    Subdiviso da SQL

    A SQL composta por grupos de instrues que so utilizadas no processo de

    administrao e controle de bancos de dados. Esses grupos sero descritos a seguir (vide

    Figura 3).

    DDL (Data Definition Language - Linguagem de Definio de Dados) - as instrues

    do tipo DDL permitem efetuar a criao das estruturas (esquemas) de tabelas

    (relaes) onde os dados sero armazenados, ndices e os bancos de dados como

    um todo. Permitem tambm efetuar alteraes nas estruturas criadas, bem

    como remover estruturas existentes. Neste grupo esto as instrues: CREATE

    TABLE, DROP TABLE, ALTER TABLE, CREATE INDEX e DROP INDEX. O resultado da

    compilao dos parmetros/comandos DDL geram os dicionrios de dados (arquivo

    de metadados). Adicionalmente, a DDL inclui comandos para definio de vises e

    para especificao de direitos de acesso s relaes/vises.

    Figura 3 - Subdivises da SQL

    DML (Data Manipulation Language - Linguagem de Manipulao de Dados) - as

    instrues do tipo DML permitem efetuar a manipulao dos dados que estejam

    armazenados nas tabelas de um determinado banco de dados. Desta forma

    possvel cadastrar, alterar e excluir registros (tuplas) existentes. Neste grupo

    encontram-se as instrues: INSERT, SELECT, UPDATE e DELETE. De todos os

    comandos existentes, o comando SELECT o mais importante e utilizado, pois

    com ele que se obtm a extrao de informaes a partir do banco de dados.

    DCL (Data Control Language - Linguagem de Controle de Dados) as instrues

    do tipo DCL permitem controlar o acesso e os privilgios dos usurios s relaes e

    vises, protegendo os dados de manipulaes no autorizadas;

    TML (Transactions Manipulation Language - Linguagem de Manipulao de

    Transaes) as intrues do tipo TML especificam as transaes atravs de

    comandos de iniciao e finalizao das mesmas, garantindo o compartilhamento e

    a integridade dos dados.

  • 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 domnios

    de cada um deles. Isso feito atravs da especificao do tipo do dado. Nesse ponto

    importante ressaltar que cada SGBD tem um conjunto prprio 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 mximo permitido de caracteres

    e esse tamanho fixo. Ou seja, se for especificado, por exemplo, um tamanho de

    50 caracteres, sempre ser ocupado na memria 50 posies, independente da

    palavra sendo armazenada.

    Varchar(X): Idem o anterior, mas o tamanho armazenado varivel. Se ocupar

    memria apenas para o que for digitado, tendo o X apenas como referncia para

    tamanho mximo.

    Integer : Para dados numricos inteiros positivos ou negativos

    Decimal(X,Y): Pada dados numricos decimais, onde X o tamanho mximo

    permitido da parte inteira e Y o tamanho mximo da parte fracionria

    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 lgicos TRUE ou FALSE.

    Comandos SQL para Definio de Dados (DDL)

    A DDL serve para expressar a especificao do esquema do BD. O resultado da

    compilao dos parmetros DDLs um conjunto de tabelas que so armazenadas em um

    arquivo especial chamado dicionrio de dados4.

    Os comandos SQL para definio de dados so: CREATE, DROP e ALTER. Vamos

    dar uma olhada em cada um desses comandos, a seguir e, para exemplificar o uso deles,

    vamos tomar a modelagem da Figura 4 como base. Nela temos especificado o MER para

    uma Editora.

    Figura 4 - Modelo base para exemplos

    O MR para este diagrama o seguinte (baseado nas regras de converso do MER

    para o MR, anteriormente vistas):

    Comentrio

    4 Relembrando: o Dicionrio de Dados um arquivo de metadados (dados a respeito de dados) no SGBD. Ou seja, ele contm a semntica dos dados do BD (o que eles significam).

  • 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 (relao), dando o seu nome

    e especificando as colunas (atributos), cada uma com seu nome, tipo e restries iniciais.

    A forma geral do comando : create table nome_tabela. Por exemplo: create table

    Empregado. Porm, 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 (Primria1[, Primria2 [, ...]])]

    [UNIQUE (Candidata1[, Candidata2[, ...]])]

    [FOREIGN KEY (Estrangeira1[, Estrangeira2 [, ...]]) REFERENCES

    TabelaExterna [(AtributoExterno1 [, AtributoExterno2 [, ...]])]

    [CHECK (condio)]

    )

    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: domnio do atributo ou seja o tipo do dado do atributo.

    Tamanho : alguns tipos de dados necessitam de especificao do tamanho do dado.

    Por exemplo, o tipo CHAR

    NOT NULL: expressa que o atributo no pode receber valores nulos

    DEFAULT valor: indica um valor a ser atribudo ao atributo caso no seja

    determinado um valor durante a insero

    PRIMARY KEY (Primria1, Primria2, ...) serve para especificar a(s) chave(s)

    primria(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 secundrias (chaves candidatas). Em Candidata1, Candidata2 devem ser

    especificados os atributos que tero esse valor nico na tabela.

    FOREIGN KEY (Estrangeira1[, Estrangeira2 [, ...]]) REFERENCES TabelaExterna

    [(AtributoExterno1 [, AtributoExterno2 [, ...]]) serve para especificar os atributos que

    so chaves estrangeiras na relao, j relacionando-os s tabelas onde eles so chave

    primria (Integridade Referencial). Em Estrangeira1, Estrangeira2, ... especificam-se os

    atributos que so chave estrangeira. Em TabelaExterna se especifica o nome da tabela onde

    o atributo chave primria e, por fim, o nome desse atributo nessa TabelaExterna (porque

    os atributos na relao e na tabela externa original podem ter nomes diferentes). Se os

    atributos da relao e da tabela externa tiverem o mesmo nome, esses AtributoExterno1,

  • 30

    Banco de Dados

    AtributoExterno2, ... no precisam ser especificados.

    CHECK (condio) aqui so especificadas condies que devem ser checadas na

    insero de dados na tabela (validaes).

    Vamos agora dar exemplos de uso dessa sintaxe tomando o nosso modelo base

    (Figura 4). Primeiro, vamos criar as tabelas Autor e Editora que so tabelas simples (sem

    chaves estrangeiras ou checagens a serem feitas):

    CREATE TABLE AUTOR(

    CodAutor INTEGER NOT NULL,

    Nome CHAR(50)5 NOT NULL,

    Nascimento DATE NOT NULL,

    PRIMARY KEY (CodAutor),

    UNIQUE (Nome) );

    CREATE TABLE EDITORA(

    CodEditora INTEGER NOT NULL,

    Razao CHAR(50),

    Endereco CHAR(50),

    Cidade CHAR(30)

    PRIMARY KEY(CodEditora ));

    Agora, podemos partir para a definio da tabela Livro que faz uso das duas tabelas

    anteriormente definidas:

    CREATE TABLE LIVRO(

    Titulo CHAR(50) NOT NULL,

    CodAutor INTEGER NOT NULL,

    CodEditora INTEGER NOT NULL,

    Valor DECIMAL(3.2)6,

    Publicacao DATE,

    Volume INTEGER,

    Idioma CHAR (15) DEFAULT = Portugus 7,

    PRIMARY KEY (Titulo, CodAutor8),

    FOREIGN KEY (CodAutor) REFERENCES AUTOR9,

    FOREIGN KEY (CodEditora) REFERENCES EDITORA,

    CHECK Valor > 10.010);

    S pra ilustrar melhor o uso da clusula CHECK vamos dar outro exemplo de criao

    de tabela, fora do exemplo do modelo base (Figura 4). Suponha que desejamos criar a tabela

    estudante que contenha os atributos matricula, nome e nvel.

    CREATE TABLE estudante (

    matricula char(10) NOT NULL,

    nome char(15) NOT NULL,

    nivel char(15) NOT NULL,

    Comentrio

    5 Como tipo de dados estamos deduzindo os tipos possveis baseados na explicao da seo anterior sobre tipos de dados.

    Comentrio

    6 Valor ser do tipo DECIMAL, ou seja, um valor de ponto flutuante, tendo 3 casas na parte inteira e duas casas decimais.

    Comentrio

    7 Aqui est sendo especificado o valor default para o atributo idioma. Se esse campo no for informado, o valor Portugus ser assumido.

    Comentrio

    8 Veja que est sendo especificada uma chave primria composta, uma vez que dois atributos fazem parte da especificao.

    Comentrio

    9 Veja que estamos espeficifando que CodEditora chave estrangeira na tabela sendo definida e um atributo pertencente a tabela Autor (sendo chave primria nessa outra tabela tabela externa)

  • 31

    Banco de Dados

    PRIMARY KEY (matricula),

    CHECK (nivel IN (Bacharelado, Mestrado, Doutorado)))11

    O SQL-89 obrigava os atributos da chave primria a serem declarados como NOT NULL e UNIQUE.

    SQL-92 e posteriores j assumem essas condies, assim, sua declarao redundante.

    Uma clusula FOREIGN KEY pode incluir regras de remoo / atualizao:

    FOREIGN KEY (coluna) REFERENCES tabela

    [ON DELETE {RESTRICT | CASCADE | SET NULL | SET DEFAULT}]

    [ON UPDATE {RESTRICT | CASCADE | SET NULL | SET DEFAULT}]

    Suponha que T2 tem uma chave estrangeira para T1, ou seja, tem um atributo que

    chave primria em T1. Vejamos as clusulas ON DELETE e ON UPDATE

    ON DELETE

    RESTRICT: (default) significa que uma tentativa de se remover uma linha de T1

    falhar se alguma linha em T2 combinar com a chave da tupla de T1 que est sendo

    deletada.

    CASCADE: a remoo de uma linha de T1 implica em remoo de todas as linhas de

    T2 que combinam com a chave da tupla de T1 sendo deletada.

    SET NULL: remoo 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.

    SET DEFAULT: remoo de linha em T1 implica em colocar valores DEFAULT nos

    atributos da chave estrangeira de cada linha de T2 que combina

    ON UPDATE

    RESTRICT: (default) a atualizao de um atributo de T1 falha se existem linhas em

    T2 combinando com a tupla sendo modificada.

    CASCADE: a atualizao de atributo em T1 implica que linhas que combinam em T2

    tambm sero atualizadas

    SET NULL: a atualizao de T1 implica que valores da chave estrangeira em T2, nas

    linhas que combinam com a tupla de T1 sendo atualizada, so postos para NULL.

    SET DEFAULT: a atualizao de T1 implica que valores da chave estrangeira de T2

    nas linhas que combinam tero valores default aplicados.

    Vamos dar um exemplo de uso dessas clusulas:

    CREATE TABLE empregado (

    matricula char(10) NOT NULL,

    nome char(15) NOT NULL,

    cod_depto INT NOT NULL DEFAULT 112,

    PRIMARY KEY(matricula)13,

    FOREIGN KEY(supervisor) REFERENCES Empregado(matricula)14

    ON DELETE SET NULL15

    ON UPDATE CASCADE16,

    FOREIGN KEY (cod_depto) REFERENCES Departamento(codigo)

    ON DELETE SET DEFAULT17

    Comentrio

    10 Aqui especificado que os livros que forem criados devem ter seu valor maior que 10. Essa uma validao que ser feita a cada insero / alterao de dados na tabela.

    Comentrio

    11 Veja que aqui estamos especificando os valores possveis para o atributo nvel.

    Comentrio

    12 O valor default para o departamento 1.

    Comentrio

    13 A chave primria a matrcula.

    Comentrio

    14 Veja que aqui o atributo da tabela sendo definida tem nome diferente do atributo na sua tabela externa de origem. Por isso, o nome do atributo na tabela externa precisa ser especificado.

    Comentrio

    15 Aqui especificado que, se a tupla que contm a matrcula sendo utilizada nesta tabela for deletada, o atributo SUPERVISOR dever receber o valor NULL.

  • 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 bsica desse comando :

    ALTER TABLE Tabela {

    ADD (NomeNovoAtributo NovoTipo [BEFORE Nome_Atributo] [, ...] ) |

    DROP (Nome_Atributo [, ...] ) |

    MODIFY ( Nome_Atributo NovoTipo [ NOT NULL ] [DEFAULT, ... ] )

    }

    Onde: | Indica escolha de vrias opes e { } Indica obrigatoriedade de escolha de

    uma opo entre as vrias. Agora, vamos explicar cada parte do comando.

    Adicionando um novo atributo (nova coluna) na Tabela

    ADD (NomeNovoAtributo NovoTipo [BEFORE Nome_Atributo] [, ...] ) |

    Usando o ADD possvel adicionar um novo atributo na Tabela. Dessa forma, o novo

    atributo deve ser especificado (nome e tipo). possvel ainda dizer antes de qual atributo

    se deseja que esse novo atributo seja inserido (BEFORE nome_atributo). Por exemplo, se

    desejssemos adicionar o campo E-MAIL na tabela Autor, do nosso exemplo base (Figura 4),

    usaramos:

    ALTER TABLE AUTOR ADD EMAIL CHAR(40);

    Observao

    Os novos atributos tero valores nulos em todas as linhas. Por isso, no se pode usar NOT NULL juntamente com ADD (na definio do novo atributo), quando a tabela j contiver registros (lembre, com o uso de ADD a nova coluna carregada com NULLs).

    Deletando um atributo (uma coluna) da Tabela

    DROP (Nome_Atributo [, ...] ) |

    Para usar a clusula DROP necessrio apenas especificar o nome do atributo que

    se deseja remover da tabela. Porm, ateno, a clusula DROP no remove atributos da

    chave primria. Por exemplo, se desejssemos eliminar o campo E-MAIL (anteriormente

    adicionado) da tabela Autor, usaramos:

    ALTER TABLE AUTOR DROP EMAIL;

    A clusula DROP pode ser usada com algumas configuraes 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 vises).

    RESTRICT: no permitiria a remoo do atributo se este estivesse sendo usado em

    uma viso ou como chave estrangeira em outra tabela.

    Comentrio

    16 Aqui especifricado que, se a matrcula for atualizada na tabela de origem, todas as tuplas da tabela onde o atributo chave estrangeira devem ser atualizadas tambm.

    Comentrio

    17 Aqui especificado que, se a tupla que contm o cdigo do departamento sendo utilizado nesta tabela for deletada, o atributo cod_depto dever receber o valor default especificado para este atributo. No caso, o nmero 1.

  • 33

    Banco de Dados

    Ex: ALTER TABLE AUTOR DROP EMAIL RESTRICT;

    Modificando um atributo (uma coluna) da Tabela

    MODIFY18 ( Nome_Atributo NovoTipo [ NOT NULL ] [, ... ] )

    Esta clusula serve para modificar as informaes de um atributo como, por

    exemplo, seu tamanho, sua nulidade, etc. Quando se altera o tipo de dados de uma coluna,

    os dados so convertidos para o novo tipo. Por exemplo, se desejssemos modificar o

    campo E-MAIL na tabela Autor, diminuindo seu tamanho de 40 para 30, usaramos:

    ALTER TABLE AUTOR MODIFY EMAIL CHAR(25);

    O detalhe que, se se diminuir o tamanho de um atributo do tipo CHAR, os dados

    existentes sero truncados, havendo assim, perda de informao.

    DDL Criando e Removendo ndices

    ndices so estruturas que permitem agilizar a busca e ordenao 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,

    no deve permitir repeties (restrio 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

    (o) parte do ndice. Por exemplo, se desejssemos criar um ndice para o campo cdigo do

    autor da tabela Autor, usaramos:

    CREATE UNIQUE INDEX CodigoIDX19 ON Autor (CodAutor);

    Agora, se desejssemos criar um ndice para pesquisar pelo cdigo do autor e pelo

    cdigo da editora ao mesmo tempo, usaramos:

    CREATE INDEX AutorEditoraIDX ON Livro (CodAutor,CodEditora);

    O default indexar em ordem ascendente, se quisermos uma ordem descendente

    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

    maiores (mais rescentes) para as menores (mais antigas). Assim, ficaramos com:

    CREATE INDEX NascIDX20 ON Autor (Nascimento) DESC;

    Observao

    Uma consulta que envolva atributos indexados realizada com um tempo de execuo melhor do que com atributos no-indexados. Agora, cuidado, voc tambm no pode indexar TODOS os atributos de uma tabela. Voc dever usar o bom-senso para escolher quais aqueles que sero indexados de acordo com o problema sendo modelado e a freqncia de uso do atributo em consultas.

    Alguns SGBDs (por exemplo, o Oracle) criam, automaticamente, ndices para as

    chaves primrias das tabelas, fazendo uso da clusula UNIQUE.

    Comentrio

    18 Em alguns SGBDs ao invs de MODIFY usada a clusula ALTER.

    Comentrio

    19 Foi usado o sufixo IDX para indicar que um ndice para o cdigo do autor.

    Comentrio

    20 Foi usado o sufixo IDX para indicar que um ndice para o nome do autor.

  • 34

    Banco de Dados

    Para eliminarmos um ndice usamos o comando DROP INDEX, cuja sintaxe :

    DROP INDEX Nome-ndice21

    Por exemplo, suponha que sejamos deletar o ndice criado para a data de

    nascimento do autor, ficaramos com:

    DROP INDEX NascIDX

    DDL - Excluindo Tabelas

    Para excluir uma tabela existente do SGBD utilizado o comando DROP. Agora,

    necessrio muito cuidado com este comando, pois ao deletar a tabela (esquema da

    mesma), automaticamente, TODOS os dados da tabela tambm sero excludos. A sintaxe

    desse comando :

    DROP TABLE Nome_Tabela

    Exemplo:

    /* Excluir a tabela livro */

    DROP TABLE LIVRO;

    Conhea Mais

    Em geral, os livros de banco de dados trazem um ou mais captulo 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. So

    Paulo: Pearson Education do Brasil, 2005.

    DATE, C. J. Introduo a sistemas de bancos de dados. Rio de Janeiro: Campus,

    2000.

    ALVES, W.P. Fundamentos de Bancos de Dados. Editora rica, 2004.

    Alm destes, h livros especficos sobre SQL, independente de SGBD, tais como:

    BEIGHLEY, Lynn. Use a Cabea SQL. Starlin Alta Consult, 1 Edio, 2008

    KLINE, Daniel; KLINE, Kelvin E. Sql - O Guia Essencial - Manual de Referncia

    Profissional. Alta Books, 2010.

    SHELDON, Robert; OPPEL, Andy. SQL Um Guia para Iniciantes. Editora Cincia

    Moderna, 3 Edio, 2009

    DAMAS, Lus. Sql - Structured Query Language. Editora LTC, 6 edio, 2007.

    Comentrio

    21 Deve ser usado o nome que foi dado ao ndice na criao do mesmo.

    Comentrio

    22 Para criar tabelas usado o comando CREATE TABLE.

    Comentrio

    23 Integer indica um valor numrico inteiro e como o cdigo a chave, ele deve ser NOT NULL.

    Comentrio

    24 A descrio deve ser um atributo do tipo caractere. Usando o bom-senso voc define o tamanho do campo. Optei pela descrio ser tambm not null.

    Comentrio

    25 O preo um valor decimal . Optei por ele poder assumir o valor NULL (suponha que no momento do cadastro voc ainda no saiba por quanrto vai vender o produto.

  • 35

    Banco de Dados

    Voc Sabia?

    Alm da SQL outra linguage comercial para manipulao de SGBDs a QBE (Query-by-Example). A verso experimental da linguagem foi descrita formalmente (publicada) por Moshe Zloof em 1977. A verso comercial foi descrita em 1978 pela IBM e usada mais tarde na Query Management Facility (QMF). A QBE tem por base o clculo relacional de domnio e possui sintaxe bidimensional: as consultas parecem tabelas. Nesta linguagem as consultas so expressas por exemplo. Em vez de determinar um procedimento para obteno da resposta desejada, o usurio d um exemplo do que desejado. A partir da, o sistema generaliza o exemplo para o processamento da resposta da consulta.

    Comentrio

    26 Voc no pode deixar para especificar a quantidade de itens depois. Por isso, NOT NULL.

    Aprenda Praticando

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

    Produto (cod_prod (PK), descricao, preco)

    Item_Venda (cod_venda (PK), cod_prod(PK), qntde)

    Venda (cod_venda (PK), nome_cliente)

    1) Crie as tabelas acima usando o comando, sabendo que os cdigos devem ser

    valores nmricos, preco deve ser um valor de ponto flutuante e qntde (quantidade

    comprada do produto) deve ser um valor inteiro, obrigatoriamente, maior que zero

    (afinal, ningum compra zero produto!).

    Devemos comear a criao pelas tabelas mais simples (sem chave estrangeira).

    Dessa forma, vamos criar primeiro a tabela PRODUTO e, depois, a tabela VENDA.

    CREATE TABLE22 PRODUTO(

    cod_prod integer23 NOT NULL,

    descricao CHAR(45) NOT NULL24,

    preco DECIMAL25(5,2),

    PRIMARY KEY (cod_prod) )

    Seguindo o mesmo raciocnio 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,

    Comentrio

    27 Veja que est sendo especificada uma chave primria composta, uma vez que dois atributos fazem parte da especificao.

    Comentrio

    28 Veja que estamos espeficifando que cod_prod chave estrangeira na tabela e um atributo pertencente a tabela Produto.

  • 36

    Banco de Dados

    CHECK qntde > 0)29;

    2) Altere a Tabela VENDA para incluir o atributo Dt_Venda e, depois, para mudar o

    tamanho do atributo nome para 50 caracteres.

    ALTER TABLE VENDA { ALTER TABLE VENDA {

    ADD Dt_Venda DATE NOT

    NULL30 MODIFY Nome_Cliente CHAR(50)31

    } }

    3) Criar um ndice para o atributo nome_cliente da tabela VENDA

    CREATE INDEX clienteIDX32 ON VENDA (nome_cliente);

    Atividades e Orientaes de Estudo

    Agora a sua vez de fazer as atividades! Lembre-se praticar muito importante pra

    fixar o contedo estudado!

    Atividades Prticas:

    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 avaliao somativa de vocs.

    I) A partir do modelo relacional especificado a seguir, escreva os comandos SQL que

    realizem as operaes solicitadas.

    Professor (CPF_Prof (PK), Nome_Prof, Titulacao)

    Disciplina (Cod_Disc (PK), CPF_Prof (FK), Nome_Disc, carga_horaria)

    Aluno (Matricula (PK), Nome)

    Turma (Cod_Disc (PK), Matricula (PK), sala)

    1) Faa a criao das tabelas do modelo relacional especificado acima. Algumas

    observaes so: o atributo TITULACAO deve ser caractere de tamanho 30, deve

    permitir nulos e os valors permitidos so graduado, especialista, mestre ou

    doutor. A carga horria da disciplina deve ser maior que zero.

    2) Altere a tabela PROFESSOR para para incluir o atributo tempo de servio, do tipo

    inteiro e que deve ser not null. E modifique o atributo titulao para que passe a

    no 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 no deve permitir nulos. O valor default desse

    atributo deve ser Informtica.

    5) Crie ndices para os atributos Nome_Prof (tabela professor) e Nome_Disc (tabela

    Disciplina).

    Comentrio

    29 Aqui especificado que a quantidade de itens deve ser maior que zero, conforme foi especificado no enunciado.

    Comentrio

    30 Adicionamos o atributo tabela VENDA.

    Comentrio

    31 Aumentamos o tamanho para 50.

    Comentrio

    32 Como estamos fazendo neste captulo, voc pode adotar um sufixo para indicar o nome do ndice, como no caso IDX.

  • 37

    Banco de Dados

    Vamos Revisar?

    Nos captulos 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 captulo. Esses comandos fazem parte da DDL (Data

    Definition Language) da SQL e incluem, entre outros, comandos para criar, alterar e deletar

    tabelas, alm de comandos para criao e deleo de ndices de tabela. Os comandos aqui

    estudados podero 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 prximo captulo.

  • 38

    Banco de Dados

    Captulo 12

    O que vamos estudar neste captulo?

    Neste captulo, vamos estudar os seguintes temas:

    Insero de dados em Tabelas.

    Deleo de dados de Tabelas.

    Consultas em Tabelas.

    Metas

    Aps o estudo deste captulo, 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.

  • 39

    Banco de Dados

    Captulo 12 Consultas em Banco de Dados Relacionais

    Vamos conversar sobre o assunto?

    No captulo anterior voc aprendeu como criar fisicamente o seu banco de dados

    atravs dos comandos da DDL (Data Definition Language) da SQL. Ou seja, voc aprendeu

    como fazer a criao de tabelas, ndices para determinados atributos das tabelas e fazer a

    manuteno de tudo que foi criado em termos de esquema (definio da tabela). Agora, que

    as tabelas j esto criadas, resta saber como inserir dados nas mesmas, como atualizar ou

    deletar esses dados inseridos, alm de como fazer para buscar informaes em uma ou mais

    tabelas atravs de consultas simples ou aninhadas. justamente isto que voc ir estudar

    neste captulo.

    Neste captulo estudaremos a DML (Data Manipulation Language) da SQL que

    engloba justamente os comandos da SQL para insero, deleo, atualizao 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, ... so os nomes dos atributos que recebero os valores na insero.

    Se for omitida essa lista de nomes de atributos sero selecionadas todas as colunas

    da tabela, pela sua ordem de criao33. Se for especificada uma lista de nomes

    de atributos, os valores para os dados devero ser especificados para insero na

    ordem em que aparecem na lista.

    Valor1, valor2, ... so os valores que sero atribudos aos atributos. Esses valores

    devem ser especificados seguindo a ordem dos atributos (ou da lista de atributos

    especificada no comando ou a ordem de criao dos atributos na tabela). Na

    especificao dos valores tambm deve-se atentar que: 1) Valores de atributos do

    tipo caracter (CHAR ou VARCHAR) e do tipo DATE devem estar entre apstrofos.

    2) A entrada de dados baseada em caracteres deve ser efetuada, de preferncia

    com caracteres em maisculo e sem acentuao, pois se algum acento for utilizado,

    pode criar problemas no momento de uma pesquisa com uma palavra idntica que

    no possua acento. 3) Os atributos especificados como NOT NULL devem sempre

    receber algum valor seno um erro ser gerado e o comando no ser executado,

    Comentrio

    33 Importante atentar para isto porque voc dever especificar os valores a serem inseridos tambm pela ordem de criao dos atributos. Seno, corre o risco de inserir dados nos campos errados.

  • 40

    Banco de Dados

    pois esses atributos nunca podero ficar vazios.

    Para inserir mais de uma tupla (linha):INSERT INTO nome_tabela [(atrib1,atrib2,...)] 34

    Vamos exemplificar o uso desses comandos. Para isso, tomaremos como base o

    modelo relacional usado nos exemplos do captulo anterior, mas com alguns atributos a

    menos, veja:

    AUTOR (CodAutor (PK), Nome, Nascimento)

    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.

    Como ficaria?

    INSERT INTO Autor ( CodAutor, Nome, Nascimento )

    VALUES (112, C. J. Date, 03/12/194135);

    Lembrando que a ordem dos valores deve ser a mesma ordem dos atributos para

    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 no dependem de nenhuma outra),

    vamos colocar um registro na tabela Livro, que depende de valores cadastrados nas duas

    tabelas anteriores

    INSERT INTO Livro36

    VALUES (Introduo a Sistemas de Banco de Dados, 11237, 138, NULL39, 2000);

    Chamamos a ateno para o fato que, na Tabela Livro, o cdigo do autor e o cdigo

    da editora so chaves estrangeiras e, para que tudo d certo, os valores utilizados, aqui, no

    insert, devem existir anteriormente nas tabelas de origem das chaves estrangeiras, no caso,

    nas tabelas Autor e Editora.

    Para finalizar os exemplos, vamos fazer a criao de uma nova tabela no nosso

    modelo, chamada AUTOR_JOVEM com os mesmos campos da tabela AUTOR. Depois,

    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 aes? Comecemos pela

    criao da nova tabela.

    CREATE TABLE AUTOR_JOVEM(

    CodAutor INTEGER NOT NULL,

    Nome CHAR(50) NOT NULL,

    Nascimento DATE NOT NULL,

    PRIMARY KEY (CodAutor),

    UNIQUE (Nome, Nascimento) );

    Agora vamos preencher essa tabela com os autores com nascimento posterior a

    01/01/1980.

    INSERT INTO AUTOR_JOVEM

    Comentrio

    34 O comando SELECT sera explicado posteriormente. Por hora, o importante saber que podemos inserir em uma tabela, vrias tuplas, resultado de uma consulta usando SELECT.

    Comentrio

    35 Observe que, como mencionado, valores do tipo caracter e valores do tipo DATE devem vir entre apstrofos.

    Comentrio

    36 Lembre que, quando no especificamos a ordem dos atributos, tomada a ordem de criao dos atributos na tabela. Assim, os valores dos atributos deveriam vir nessa mesma ordem de criao que est especificada no esquema da tabela Livro, do modelo relacional exemplo.

    Comentrio

    37 112 o cdigo do autor anteriormente cadastrado.

    Comentrio

    38 O Valor 1 o cdigo da editora anteriormente cadastrada.

    Comentrio

    39 Como o atributo VALOR pode receber valores nulos (ele no NOT NULL) pela definio feita na tabela, no captulo anterior, podemos preench-lo com o valor NULL.

  • 41

    Banco de Dados

    pois esses atributos nunca podero ficar vazios.

    Para inserir mais de uma tupla (linha):INSERT INTO nome_tabela [(atrib1,atrib2,...)] 34

    Vamos exemplificar o uso desses comandos. Para isso, tomaremos como base o

    modelo relacional usado nos exemplos do captulo anterior, mas com alguns atributos a

    menos, veja:

    AUTOR (CodAutor (PK), Nome, Nascimento)

    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.

    Como ficaria?

    INSERT INTO Autor ( CodAutor, Nome, Nascimento )

    VALUES (112, C. J. Date, 03/12/194135);

    Lembrando que a ordem dos valores deve ser a mesma ordem dos atributos para

    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 no dependem de nenhuma outra),

    vamos colocar um registro na tabela Livro, que depende de valores cadastrados nas duas

    tabelas anteriores

    INSERT INTO Livro36

    VALUES (Introduo a Sistemas de Banco de Dados, 11237, 138, NULL39, 2000);

    Chamamos a ateno para o fato que, na Tabela Livro, o cdigo do autor e o cdigo

    da editora so chaves estrangeiras e, para que tudo d certo, os valores utilizados, aqui, no

    insert, devem existir anteriormente nas tabelas de origem das chaves estrangeiras, no caso,

    nas tabelas Autor e Editora.

    Para finalizar os exemplos, vamos fazer a criao de uma nova tabela no nosso

    modelo, chamada AUTOR_JOVEM com os mesmos campos da tabela AUTOR. Depois,

    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 aes? Comecemos pela

    criao da nova tabela.

    CREATE TABLE AUTOR_JOVEM(

    CodAutor INTEGER NOT NULL,

    Nome CHAR(50) NOT NULL,

    Nascimento DATE NOT NULL,

    PRIMARY KEY (CodAutor),

    UNIQUE (Nome, Nascimento) );

    Agora vamos preencher essa tabela com os autores com nascimento posterior a

    01/01/1980.

    INSERT INTO AUTOR_JOVEM

    Comentrio

    34 O comando SELECT sera explicado posteriormente. Por hora, o importante saber que podemos inserir em uma tabela, vrias tuplas, resultado de uma consulta usando SELECT.

    Comentrio

    35 Observe que, como mencionado, valores do tipo caracter e valores do tipo DATE devem vir entre apstrofos.

    Comentrio

    36 Lembre que, quando no especificamos a ordem dos atributos, tomada a ordem de criao dos atributos na tabela. Assim, os valores dos atributos deveriam vir nessa mesma ordem de criao que est especificada no esquema da tabela Livro, do modelo relacional exemplo.

    Comentrio

    37 112 o cdigo do autor anteriormente cadastrado.

    Comentrio

    38 O Valor 1 o cdigo da editora anteriormente cadastrada.

    Comentrio

    39 Como o atributo VALOR pode receber valores nulos (ele no NOT NULL) pela definio feita na tabela, no captulo anterior, podemos preench-lo com o valor NULL.

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

    Atualizando Dados em Tabelas

    Para modificar o valor de atributos de uma ou mais tuplas (linhas), dependendo

    dos critrios de seleo de quem ser modificado, o comando UPDATE deve ser utilizado. A

    sintaxe desse comando :

    UPDATE nome_tabela SET lista_atributos com atribuies de valores

    [WHERE condio de seleo das tuplas a serem modificadas]

    Onde: nome_tabela - a indicao da tabela em que se deseja efetuar a atualizao

    dos registros;

    lista_atributos com atribuies de valores a indicao de quais atributos

    devero ser atualizados e por qual valor. Esse trecho deve ter o seguinte formato: nome_

    atributo1 [, nome_atributo2, ....] = {valor ou expresso }

    A clusula WHERE especifica quais dados da coluna sero alterados. Quando

    a clusula WHERE (que opcional) omitida, o UPDATE deve ser aplicado a todas as

    tuplas da relao. Ou seja, todas as tuplas da relao sero modificadas. Por exemplo: se

    desejssemos reajustar o valor de todos os livros em 10%, usaramos o seguinte comando:

    UPDATE LIVRO SET Valor = Valor * 1.141

    Como no comando acima no foi especificada uma clusula WHERE, todos os livros

    cadastrados na tabela LIVRO seriam atualizados. Agora, vamos supor que desejssemos

    alterar o endereo e a cidade da editora com CodEditora = 10.

    UPDATE EDITORA SET endereco = Av. N.S. de Ftima, 456, cidade = Joo Pessoa42

    WHERE CodEditora = 1;

    Aqui no seriam atualizadas todas as editoras da tabela EDITORA, mas apenas a

    editora de cdigo 10.

    A clusula WHERE aceita como condio um comando SELECT. Daremos mais detalhes do que pode

    vir em uma clusula WHERE mais frente. Aguarde...

    Exluindo Dados de Tabelas

    Para excluir linhas (que satisfaam uma determinada condio) de uma ou mais

    tabelas, usa-se o comando DELETE FROM, cuja sintaxe :

    DELETE FROM Nome_Tabela

    [WHERE Condio43]

    Se omitirmos a clusula WHERE, ento o DELETE ser aplicado a todas as tuplas

    da relao, ou seja, TODOS os registros da tabela sero deletados (cuidado com esse

    comando!). Porm, a tabela permanece no BD como uma tabela vazia. Por exemplo, o

    comando: DELETE FROM LIVRO; Deletaria todos os registros da tabela livro, deixando a

    mesma vazia. Vale ressaltar que a tabela (seu esquema) permanece. Logo, esse comando

    no equivalente ao DROP TABLE (que apagaria o esquema da tabela do banco de dados e,

    por consequncia, todos os dados da tabela seriam deletados juntamente).

    Quando a clusula WHERE especificada, apenas os registros que obedecem a

    condio estabelecida so deletados. Por exemplo, excluir os registros da tabela autor cujo

    Comentrio

    40 Aqui fazemos a seleo dos autores com nascimento maior que 01/01/1980. Veremos o comando SELECT , o mais importante da DML, em detalhes, mais a frente.

    Comentrio

    41 O valor antigo de cada livro vai receber o valor antigo aumentado de 10% (representado na frmula pelo 1.1)

    Comentrio

    42 Veja que apenas os campos endereo e cidade, como solicitado, seriam atualizados. Os novos valores para os atributos vm entre apstrofos porque so do tipo caracter.

    Comentrio

    43 A clusula WHERE especifica quais linhas da tabela sero excludas.

  • 42

    Banco de Dados

    codAutor seja igual a 15.

    DELETE FROM AUTOR WHERE CodAutor = 15;

    Consultando Dados em Tabelas

    Chegamos, agora, no comando mais importante da SQL por ser o utilizado com mais

    frequncia: o SELECT. Este comando se tornou o mais importante da linguagem SQL devido

    ao seu poder de consulta. Pois com ele poderemos realizar, entre outras coisas, consultas

    em uma ou mais tabelas, realizar consultas aninhadas, fazer a aplicao de funes pr-

    existentes e utilizar operaes relacionais (unio, diferena, interseo e obviamente

    seleo) com extrema simplicidade na manipulao das tabelas. A estrutura bsica do

    comando SELECT :

    SELECT PROJEO da lgebra relacional

    FROM Onde a pesquisa ser feita (uma ou mais tabelas)

    WHERE Condies da SELEO

    Em resumo, a clusula SELECT corresponde operao de projeo da lgebra

    relacional. Usada para listar os atributos desejados do resultado de uma consulta. A

    clusula FROM corresponde A especificao de onde a pesquisa ser realizada. Em uma ou

    mais tabelas (quando for usada mais de uma tabela, ser aplicada a operao de produto

    cartesiano da lgebra relacional). A clusula WHERE corresponde operao de seleo

    da lgebra relacional, onde so especificadas as condies de pesquisa na(s) tabela(s)

    identificadas na clusula FROM.

    Vamos dar um exemplo. Selecione todas as informaes 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 informaes sobre o autor de cdigo 5.

    SELECT * FROM AUTOR WHERE CodAutor = 546;

    Alm dessa parte bsica o comando SELECT tem vrias outras que iremos explicando

    nas prximas sees, comeando da utilizao mais simples, at chegar na mais elaborada.

    Para dar uma ideia, a sintaxe completa do comando :

    SELECT [DISTINCT] nome_coluna,....

    FROM nome_tabela, ....

    [WHERE (condies)]

    [GROUP BY nome_coluna, ....] [HAVING (condies)]

    Comentrio

    44 Voc pode especificar os atributos desejados

    Comentrio

    45 Ou pode utulizar o * (asterisco) que indica que se quer projetar TODAS as colunas da(s) tabela(s) espedificada(s) na clusula FROM.

    Comentrio

    46 Veja que, na clusula WHERE espedificamos a condio de pesquisa que, no caso, o cdigo ser igual a 5.

  • 43

    Banco de Dados

    [{INTERSECT | MINUS | UNION} outro_comando_select]

    [ORDER BY nome_coluna {ASC | DESC}, ....];

    Cada clusula permite a especificao de algum elemento referente s operaes

    relacionadas a lgebra relacional :

    SELECT - o que deseja-se na tabela de resultado

    FROM - de onde retirar os dados necessrios

    WHERE - condies para busca dos resultados

    GROUP BY - agrupamento de resultados

    HAVING - condies para a definio de grupos na tabela de resultados

    INTERSECT - permite a interseo de tabelas

    MINUS - permite a diferena entre tabelas

    UNION - permite a unio de tabelas

    ORDER BY - estabelece a ordenao lgica da tabela de resultados (ASC ordenao

    ascendente, DESC ordenao descendente)

    importante ressaltar que o resultado de qualquer comando SELECT uma tabela

    com as tuplas (e os atributos destas) que atendam aos critrios especificados. Para mostrar

    esse ponto, alm de tomarmos como base o mesmo modelo exemplo que vem sendo

    utilizado para demonstrar as consultas das sees a seguir, vamos fazer uso das Relaes

    mostradas nas Tabelas 27, 28 e 29 que representam exemplos do modelo base preenchido.

    Tabela 27 - Relao Editora

    Cod_Editora (PK) Razao Endereco Cidade

    1 Sextante Av. Hortncias, 234 Porto Alegre

    2 Fantasy R. 24 horas, 55 So Paulo

    3 Bookman Av. das Ubaias, 303 Recife

    Tabela 28 - Relao Autor

    Cod_Autor (PK) Nome Nascimento

    110 Pedro Alves 18/03/1955

    111 Carolina Dantas 22/02/1970

    112 Olvia Duncan 10/01/1968

  • 44

    Banco de Dados

    Tabela 29 - Relao 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 Distribudos 110 3 98,00 2010

    Consultas Simples Sem Condio

    Como exemplificado na seo anterior, uma consulta simples, utiliza apenas as

    clusulas SELECT/FROM. Por exemplo, selecionar todas as informaes 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 - Relao Resultante

    Cod_Editora Razao Endereco Cidade

    1 Sex