Sei sulla pagina 1di 76

UNIVERSIDADE FEDERAL RURAL DE PERNAMBUCO (UFRPE)

COORDENAO GERAL DE EDUCAO A DISTNCIA (EAD/UFRPE)

Banco de Dados

Sandra de Albuquerque Siebra

Volume 4

Recife, 2010

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

Apresentao
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

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

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

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

Banco 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 CPF 1001 1002 1003 Nome Ana Maria Joo Pedro Tabela 2 - Relao Aluno CPF 1002 1116 1900 Nome Joo Mrcia 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.

Banco de Dados

Tabela 3 Relao Resultante de Professor Aluno CPF 1001 1002 1003 1116 1900 Nome Ana Maria Joo Pedro Mrcia 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 1002 Nome 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 1001 1003 Nome Ana Maria 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.

Banco de Dados

Tabela 6 - Relao Resultante de Aluno Professor CPF 1116 1900 Nome Mrcia 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 Cdigo 1 2 3 Nome Recife Manaus Joo Pessoa Tabela 8 - Relao Estado UF PB AM Regio Nordeste Norte

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.

10

Banco de Dados

Tabela 9 - Relao Resultante Cdigo 1 2 3 1 2 3 Nome Recife Natal Joo Pessoa Recife Natal Joo Pessoa UF PB PB PB AM AM AM Regio Nordeste Nordeste Nordeste Norte Norte 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, podese 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).

11

Banco de Dados

Tabela 10 - Relao Cidade Cdigo 1 2 3 4 Nome Recife Natal Joo Pessoa Patos _capital S S S N UF PE RN PB 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 3 4 Nome Joo Pessoa Patos _capital S N UF PB 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 4 Nome Patos _capital N UF 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: <cond1> ( <cond2> (Relao)) = <cond2> ( <cond1> (Relao)) Sempre possvel combinar uma propagao de operaes de seleo dentro de uma nica operao de seleo, fazendo uso de uma condio conjuntiva (AND): <cond1> ( <cond2> (Relao)) = <cond1> and <cond2> (Relao) <cond1> ( <cond2> ( ... ( <condN> (Relao)) ...)) = <cond1> AND <cond2> AND ... AND <condN> (Relao)

12

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 Recife Natal Joo Pessoa Patos UF PE RN PB 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 <lista2> conter os mesmos atributos de <lista1> pode-se observar comutatividade. <lista_atributos1> ( <lista_atributos2> (Relao)) <lista_atributos 2> (<lista_atributos1> (Relao))

13

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 1234 2345 3765 4987 9876 Nome Ana Gomes Pedro Nunes Maria Lima Igor Matos Las Ramos Sexo F M F M F Salario 1500 1000 2000 3500 3000 Num_Dep 2 4 2 5 4

Tabela 16 - Relao Resultante Nome Pedro Nunes Las Ramos Salario 1000 3000

Tabela 17 - Relao Gerente CPF 5678 2345 Nome Joo Teixeira Pedro Nunes Sexo M M Salario 1800 1000 Num_Dep 2 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)

14

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| <condio de juno> 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 1 2 3 Nome Recife Manaus Joo Pessoa Sexo PE AM PB

Tabela 19 - Relao Estado UF PB AM Regio Nordeste Norte

Tabela 20 - Relao Resultante Cdigo 2 3 Nome Manaus Joo Pessoa Cidade.UF AM PB Estado.UF AM PB Regio Norte Nordeste

15

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

16

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 {=, >, <, , >=, <=}, ti e tj so variveis de tuplas, A um atributo da relao na qual ti se encontra, B um atributo da relao na qual tj se encontra. Uma frmula atmica ti.A op c ou c op tj.B, onde op um dos operadores de comparao no conjunto {=, >, <, , >=, <=}, ti e tj so variveis de tuplas, A um atributo da relao na qual ti se encontra, B um atributo da relao na qual tj se encontra e c um valor constante. Nos dois casos acima, se as variveis de tupla forem designadas de forma que os valores dos atributos especificados satisfaam o predicado, a frmula assumir valor verdade TRUE. Cada uma das frmulas atmicas anteriormente especificadas tem seu valor verdade avaliado como TRUE ou FALSE para uma combinao especfica de tuplas.

17

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 1234 2345 3765 4987 9876 Nome Ana Gomes Pedro Nunes Maria Lima Igor Matos Las Ramos Sexo F M F M F Salario 1500 1000 2000 3500 3000 Cod_Depto 2 4 2 5 4

Tabela 22 - Relao Departamento Cod 2 4 5 Descricao Vendas Suporte 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

18

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: { <x1, x2, ... , xn > | 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 CPF 1234 2345 3765 4987 9876 b Nome Ana Gomes Pedro Nunes Maria Lima Igor Matos Las Ramos c Sexo F M F M F d Salario 1500 1000 2000 3500 3000 e Cod_Depto 2 4 2 5 4

19

Banco de Dados

Tabela 24 - Relao Departamento m Cod 2 4 5 n Descricao Vendas Suporte Gerncia

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

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) }

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)

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.

20

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.

21

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: {<b, d> | <b, d> 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 Ana Gomes Pedro Nunes Maria Lima Num_Emprestimo 01 03 05 Sexo F M F

Tabela 26 - Relao Emprstimo Agencia 3456 2123 2123 Num_Emprestimo 01 03 05 Valor 1500 5000 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

22

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)

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) DEPENDENTE CPF (PK) Nome_Depen Sexo Parentesco Cod_Proj (PK) Horas

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!

24

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.

25

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,

26

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.

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

Comentrio
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).
4

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):

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 (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,

29

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

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

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) );

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

CREATE TABLE EDITORA( CodEditora INTEGER NOT NULL, Razao CHAR(50), Endereco CHAR(50), Cidade CHAR(30) PRIMARY KEY(CodEditora ));

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

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);

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

Comentrio
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)
9

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,

30

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.

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.

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

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

Comentrio
12 O valor default para o departamento 1.

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
13

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

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

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 bsica desse comando : ALTER TABLE Tabela {

Comentrio
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.
16

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] [, ...] ) |

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.

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.

32

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

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

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 CodigoIDX ON Autor (CodAutor);
19

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

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;

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

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.

33

Banco de Dados

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

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

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


Comentrio
22 Para criar tabelas usado o comando CREATE TABLE.

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 */

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

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, 1Edio, 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, 3Edio, 2009 DAMAS, Lus. Sql - Structured Query Language. Editora LTC, 6 edio, 2007.

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.

34

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.

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.

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,

35

Banco de Dados

CHECK qntde > 0)29;

Comentrio
Aqui especificado que a quantidade de itens deve ser maior que zero, conforme foi especificado no enunciado.
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 { ADD Dt_Venda DATE NOT NULL30 } ALTER TABLE VENDA { 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);

Comentrio
Adicionamos o atributo tabela VENDA.
30

Atividades e Orientaes de Estudo


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

Comentrio
Aumentamos o tamanho para 50.
31

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
32 Como estamos fazendo neste captulo, voc pode adotar um sufixo para indicar o nome do ndice, como no caso IDX.

36

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.

37

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.

38

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,
33

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

39

Banco de Dados

pois esses atributos nunca podero ficar vazios.

Comentrio
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.
34

Para inserir mais de uma tupla (linha): INSERT INTO nome_tabela [(atrib1,atrib2,...)] <comando SELECT>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)

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

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);

Comentrio
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.
36

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(

Comentrio
112 o cdigo do autor anteriormente cadastrado.
37

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
O Valor 1 o cdigo da editora anteriormente cadastrada.
38

40

Banco de Dados

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

Atualizando Dados em Tabelas


39

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

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;

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)

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

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.

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
A clusula WHERE especifica quais linhas da tabela sero excludas.
43

41

Banco de Dados

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

Comentrio
44 Voc pode especificar os atributos desejados

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 prexistentes 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

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

FROM Onde a pesquisa ser feita (uma ou mais tabelas) WHERE Condies da SELEO

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

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)]

42

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) 1 2 3 Razao Sextante Fantasy Bookman Endereco Av. Hortncias, 234 R. 24 horas, 55 Av. das Ubaias, 303 Cidade Porto Alegre So Paulo Recife

Tabela 28 - Relao Autor Cod_Autor (PK) 110 111 112 Nome Pedro Alves Carolina Dantas Olvia Duncan Nascimento 18/03/1955 22/02/1970 10/01/1968

43

Banco de Dados

Tabela 29 - Relao Livro TitLivro (PK) Banco de Dados O Estranho Sucesso Arquitetura de BD O Conhecido BD Distribudos CodAutor (FK) 110 111 112 110 111 110 CodEditora (FK) 3 1 2 3 1 3 Valor 150,00 45,00 35,00 110,00 55,00 98,00 Ano_Publicacao 2009 2010 2000 2007 2009 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 1 2 3 Razao Sextante Fantasy Bookman Endereco Av. Hortncias, 234 R. 24 horas, 55 Av.das Ubaias, 303 Cidade Porto Alegre So Paulo Recife

Outra opo seria selecionar apenas alguns atributos das editoras. Para isso, necessrio na clusula SELECT especificar os nomes dos atributos que se deseja na tabela resultante. Por exemplo, selecionar a razo 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 razo e cidade foram selecionados. Porm, observe que todas as tuplas da tabela aparecem, pois no h condio de filtragem.
Tabela 31 - Relao Resultante Razao Sextante Fantasy Bookman Cidade Porto Alegre So Paulo Recife

44

Banco de Dados

Uma coluna (atributo), tambm 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 opo 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 clusula AS, da 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), ao invs do nome original da coluna. Por exemplo, selecionar a razo de todas as editoras cadastradas, chamando a razo de nome_empresa. SELECT razao AS Nome_empresa FROM Editora;
Tabela 32 - Relao Resultante Nome_empresa48 Sextante Fantasy Bookman Observe que na relao resultante o nome da coluna que aparece o nome dado a coluna com a renomeao.
48

Comentrio
47 A relao resultante seria tambm a Tabela 31.

Comentrio

Renomear um atributo, tambm, til quando realizamos algum tipo de operao sobre o resultado do atributo selecionado. Por exemplo, selecionar todos os ttulos dos livros e seus valores em dobro. Para isso, podemos realizar uma seleo e no atributo valor, aplicar a operao de multiplicar por dois, resultando na relao da tabela 33. SELECT Titulo, Valor * 2 AS Dobro49 FROM Livro;
Tabela 33 - Relao Resultante TitLivro Banco de Dados O Estranho Sucesso Arquitetura de BD O Conhecido BD Distribudos Dobro50 300,00 90,00 70,00 220,00 110,00 196,00
49 Cada valor retornado seria multiplicado por dois e apareceria em uma coluna chamada DOBRO, devido a renomeao.

Comentrio

Comentrio
50 Se avaliar a relao original, vai verificar que essa coluna justamente o valor calculado na clusula SELECT, ou seja, o dobro.

No caso de uso de operadores aritmticos, se a coluna no for renomeada, aparecer como ttulo da coluna a frmula utilizada. Ou seja, criada uma coluna na relao resultante que no pertence tabela a partir dos clculos realizados sobre um ou mais atributos da tabela (vide Tabela 34). Por exemplo, selecionar todos os ttulos dos livros e seus valores com 10% de desconto. SELECT Titulo, Valor - (Valor * 0.1) FROM LIVRO;

45

Banco de Dados

Tabela 34 - Relao Resultante TitLivro Banco de Dados O Estranho Sucesso Arquitetura de BD Valor - (Valor * 0.1) 135,00 40.50 31.50 99,00 55,00 98,00

Comentrio
51 Como o ALL o default, ele no precisa ser especificado. Logo, esse comando equivalente ao anterior.

O Conhecido BD Distribudos

Em SQL a eliminao de linhas duplicadas no feita automaticamente, devendo a mesma ser especificada explicitamente, se desejada. Para isso usamos a clusula DISTINCT no SELECT. Pois, se ela no for especificada, o padro ALL, ou seja, selecionar tudo, inclusive valores repetidos. Por exemplo, selecionar todas os anos de publicao de livros da tabela LIVRO, resultaria na relao da tabela 34, onde podem ser observados valores reptidos. SELECT ALL Ano_Publicacao FROM Livro; ou SELECT Ano_Publicacao51 FROM Livro;
Tabela 35 - Relao Resultante

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

Ano_Publicacao 2009 2010 2000 2007 2009 2010

Comentrio
53 Observe que nessa tabela resultante, diferente da tabela 34, no existem valores repetidos.

Agora, se quisssemos realizar a mesma consulta, agora, sem valores repetidos, deveramos usar a clusula DISTINCT, resultando na relao da Tabela 35. SELECT DISTINCT Ano_Publicacao FROM Livro52;
Tabela 36 - Relao Resultante Ano_Publicacao53

2009 2010 2000 2007

Consultas usando Funes de Agregao


Na clusula SELECT, possvel utilizar funes de agregao (vide Tabela 37), para

46

Banco de Dados

projetar clculos relacionados a atributos de uma ou mais relaes.


Tabela 37 - Funes de Agregao no SQL Funes de Agregao AVG MIN MAX COUNT SUM Calcula a mdia dos valores selecionados Calcula o menor valor entre os selecionados Calcula o maior valor entre os selecionados Conta quantos valores foram selecionados Calcula o somatrio dos valores selecionados

Essas funes so utilizadas logo aps o SELECT, no local de especificao dos atributos a serem projetados na seleo. O resultado do uso dessas funes uma tabela contendo apenas o valor calculado. Vamos dar alguns exemplos. Projetar a mdia dos valores dos livros SELECT AVG (Valor)54 FROM LIVRO;
AVG (Valor) 82,16

Comentrio
54 Veja que o atributo do qual se deseja calcular a mdia vem entre parnteses. Fazendo isso, todos os valores de livro da tabela so recuperados e o AVG calcula a mdia deles.

Informar o valor do livro mais caro SELECT MAX (Valor) FROM LIVRO;
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;
QUANTIDADE 3

Comentrio
55 Nessa clusula, o COUNT conta quantas tuplas existem na tabela AUTOR. O AS renomeou a coluna para QUANTIDADE..

Somar todos os valores dos livros cadastrados SELECT SUM (Valor) FROM LIVRO;
SUM (Valor) 493,00

47

Banco de Dados

As funes de agregao no podem ser combinadas a outros atributos da tabela no resultado da consulta. Assim, a consulta a seguir no seria possvel:

Restringindo a Consulta de Dados em Tabelas


Para restringir as consultas realizadas com o SELECT, precisamos fazer uso da clusula WHERE. Essa clusula especifica quais linhas da(s) tabela(s) listada(s) na clusula FROM sero afetadas pela condio. Se nenhuma clusula WHERE for especificada, a consulta retornar todas as linhas da tabela, como visto nas sees anteriores. Na clusula WHERE especificada a condio de restrio fazendo uso de operadores lgicos (AND, OR e NOT) e relacionais (=, <>, >, <, >= e <=). A condio de WHERE pode ser de trs tipos: comparao, ligao entre tabelas (Join) e subconsultas (Sub-Queries). Vamos estudar cada uma delas.

Comparao
Em geral, a comparao realizada fazendo uso de uma condio composta por: Expresso Operador Relacional Expresso Onde, a condio verdadeira quando a 1a expresso atende ao operador relacional sobre a 2. Por exemplo, selecionar os livros publicados aps 2008 (vide resultado da consulta na Tabela 38): SELECT * FROM LIVRO WHERE Ano_Publicacao > 2008;
Tabela 38 - Relao Resultante TitLivro (PK) Banco de Dados O Estranho O Conhecido BD Distribudos CodAutor (FK) 110 111 111 110 CodEditora (FK) 3 1 1 3 Valor 150,00 45,00 55,00 98,00 Ano_Publicacao 2009 2010 2009 2010

Tambm, podem ser utilizadas na comparao algumas clusulas para trazer facilidades para a seleo 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 variao usar na frente do BETWEEN a clusula 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 - Relao Resultante TitLivro (PK) O Conhecido CodAutor (FK) 111 110 CodEditora (FK) 1 3 Valor 55,00 98,00 Ano_Publicacao 2009 2010

BD Distribudos

Se se desejasse os livros fora do intervalo (ou seja, mais baratos que 50 e mais caros que 100) seria usada a clusula NOT (Resultado na Tabela 40). SELECT * FROM LIVRO WHERE Valor NOT BETWEEN 50.00 AND 100.00;
Tabela 40 - Relao Resultante TitLivro (PK) CodAutor (FK) 110 111 112 110 CodEditora (FK) 3 1 2 3 Valor 150,00 45,00 35,00 110,00 Ano_Publicacao 2009 2010 2000 2007

Banco de Dados O Estranho Sucesso Arquitetura de BD

Comentrio
56 O caracter especial usado para representao de padres muda de SGBD para SGBD.

WHERE atributo [N OT] LIKE padro Esta clusula busca por padres em atributos do tipo CHAR. A condio satisfeita quando o valor do atributo igual ao valor do padro. Caracteres especiais56 so utilizados para construo do padro, tais como: % ou * Usados para representar zero ou mais caracteres. _ ou ? Usados para representar um nico caractere. [a-f] : busca por qualquer caractere entre a e f (usado no SQL-Server). Vamos dar alguns exemplos. Selecionar todos os livros cujo ttulo tenha 7 caracteres e inicie com a letra S (resultado na Tabela 41). SELECT * FROM Livro WHERE TitLivro LIKE S??????57;
Tabela 41 - Relao Resultante TitLivro (PK) CodAutor (FK) 112 CodEditora (FK) 2 Valor 35,00 Ano_Publicacao 2000

Comentrio
57 Observe que o padro vem entre apstrofos. Observe tambm que usada uma interrogao (?) para cada caractere do nome. Como se deseja que a letra S seja a primeira. Ela vem escrita no padro.

Sucesso

Comentrio
Aqui o smbolo % representa que pode existir qualquer nmero de caracteres antes ou depois da palavra BD.
58

Selecionar todos os livros que tenham a palavra BD no seu ttulo (resultado na Tabela 42). SELECT * FROM Livro WHERE TitLivro LIKE %BD%58;

49

Banco de Dados

Tabela 42 - Relao Resultante TitLivro (PK) Arquitetura de BD BD Distribudos CodAutor (FK) 110 110 CodEditora (FK) 3 3 Valor 110,00 98,00 Ano_Publicacao 2007 2010

Da mesma forma que se usa o LIKE, tambm pode ser usado o NOT LIKE. Neste ltimo caso, devolvida na consulta os valores que NO obedecem ao padro especificado. Uma observao importante que LIKE e NOT LIKE s se aplicam sobre atributos do tipo CHAR.

WHERE atributo IS [NOT] NULL Essa clusula testa a existncia de valores nulos (NULL) ou no nulos (NOT NULL). Ele faz com que a consulta retorne as tuplas da relao cujo atributo em questo seja nulo ou no nulo, conforme a clusula sendo utilizada. Para dar exemplo de uso dessa clusula, vamos supor que a relao LIVRO seja a da tabela 43. Assim, vamos a realizar a seguinte consulta: selecionar todos os livros que esto sem preo definido (resultado na Tabela 44). SELECT * FROM Livro WHERE Valor IS NULL59
Tabela 43 - Relao Livro TitLivro (PK) Banco de Dados O Estranho Sucesso Arquitetura de BD O Conhecido BD Distribudos CodAutor (FK) 110 111 112 110 111 110 CodEditora (FK) 3 1 2 3 1 3 Valor 150,00 45,00 NULL 110,00 55,00 NULL Ano_Publicacao 2009 2010 2000 2007 2009 2010

Comentrio
Vai checar entre todos os livros aqueles que tem no valor do livro NULL.
59

Tabela 44 - Relao Resultante TitLivro (PK) Sucesso BD Distribudos CodAutor (FK) 112 110 CodEditora (FK) 2 3 Valor NULL NULL Ano_Publicacao 2000 2010

WHERE expresso [NOT] IN (Valores) Teste de pertinncia elemento-conjunto. O teste da condio verdadeiro se o valor da expresso for igual (ou diferente, se for usado o NOT) a um dos valores especificados entre parnteses. Por exemplo, selecionar as editoras com sede em So Paulo ou Rio de Janeiro (resultado na Tabela 45).

50

Banco de Dados

SELECT * FROM editora WHERE Cidade IN (So Paulo, Rio de Janeiro)60;


Tabela 45 - Relao Resultante Cod_Editora (PK) 2 Razao Fantasy Endereco R. 24 horas, 55 Cidade So Paulo Veja que como a comparao se refere a um campo caracter , os valores devem vir entre apstrofos. Cada valor comparado com o atributo envolvido na comparao. Veja que nesse caso o IN equivalente a uma condio do tipo (Cidade = So Paulo OR cidade = Rio de Janeiro).
60

Comentrio

possvel misturar os vrios tipos de comparao aqui explicados em uma nica clusula WHERE interligada por operadores lgicos. Vamos dar um exemplo: Selecionar todos os livros que iniciam com a letra O, esto com preo definido e foram publicados depois de 2009 (resultado na Tabela 46, de consulta aplicada na Tabela 43). SELECT * FROM Livro WHERE Titulo LIKE O% AND Valor IS NOT NULL AND Ano_Publicacao > 2009
Tabela 46 - Relao Resultante TitLivro (PK) CodAutor (FK) 111 CodEditora (FK) 1 Valor Ano_Publicacao

O Estranho

45,00

2010

Ligao Entre Tabelas - Join


Diz-se que tabelas esto relacionadas se tiverem campos comuns (em uma tabela chave primria e em outra chave estrangeira). O efeito do JOIN a criao de uma tabela temporria em que cada par de linhas (de tabelas diferentes) que satisfaa a condio de ligao, seja interligada para formar uma nica linha. A ligao sempre estabelecida na clusula WHERE atravs da igualdade de campos de tabelas diferentes, tabelas essas que precisam ter sido especificdas na clusula FROM. O FROM estabelece o produto cartesiano entre as tabelas listadas e a clusula WHERE filtra as linhas teis segundo a condio especificada. possvel misturar as clusulas de comparao, vistas anteriormente, juntamente com AND, OR e NOT para formar condies de ligaes mais complexas. Vamos aos exemplos, para deixar tudo mais claro. Selecione todos os ttulos dos livros e o nome de seus respectivos autores. Veja que, para responder a essa consulta, no seria possvel consultar apenas a tabela livro, pois esta no possui o nome do autor, mas apenas o cdigo do mesmo. Para obter o nome do autor seria necessrio fazer um JOIN das tabelas LIVRO e AUTOR. Ento, como fazer isso? Fazendo a igualdade entre os campos que as tabelas possuem em comum: SELECT autor.Nome, livro.TitLivro FROM autor, livro61 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

Comentrio
61 Para cada atributo identificamos a qual tabela ele pertence.

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 relao resultante a apresentada na Tabela 47.
Tabela 47 - Relao Resultante TitLivro Banco de Dados O Estranho Sucesso Arquitetura de BD O Conhecido BD Distribudos Nome Pedro Alves Carolina Dantas Olvia Duncan Pedro Alves Carolina Dantas Pedro Alves

No JOIN podem ser unidas duas ou mais tabelas. Para se ligar vrias tabelas, usa-se o operador lgico AND entre as condies do JOIN. Vamos dar outro exemplo. Selecionar todos os nomes de autores, o ttulo dos seus livros e a razo 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 trs 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 - Relao Resultante Nome Pedro Alves TitLivro Banco de Dados Razao Bookman

Observao
preciso ter muito cuidado com os JOINs, pois exigem alto custo de execuo (implicam diretamente na performance). Alm disso, quando os JOINs forem utilizados, deve-se ter cuidado para fazer corretamente a montagem da condio de juno.

52

Banco de Dados

Subconsultas (Sub-Queries)
Na condio especificada na clusula 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 funes de agregao (AVG,MIN,MAX,...). Esse tipo de subconsulta utilizado para fazer a comparao elemento-elemento e tem o seguinte formato: WHERE expresso {= | <> | > | >= | < | <=} (Subconsulta) Onde: subconsulta outra consulta (SELECT) que pode conter qualquer uma das clusulas anteriormente estudadas. Por exemplo, selecionar os ttulos dos livros mais caros que a mdia de preo dos livros. Veja que primeiro precisamos calcular a mdia de preo dos livros para depois buscar por aqueles livros que tem seu preo acima da mdia. 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 execuo da subconsulta, seria calculado o valor da mdia dos livros (a partir da Tabela 43), que seria o valor 60. Depois, a mesma tabela seria avaliada pela consulta externa, para obter os ttulos de livros cujos valores fossem maiores do que a mdia calculada na subconsulta, resultando na Tabela 49.
Tabela 49 - Relao Resultante TitLivro Banco de Dados Arquitetura de BD

Subconsultas que retornam um conjunto de valores


Usadas para fazer comparao elemento-conjunto. Em outras palavras, elas estabelecem uma relao de pertinncia () entre elementos e conjuntos (tabelas). Sua avaliao retorna um valor booleano. Esse tipo de subconsultas pode ser definido atravs das clusulas IN, ANY, ALL e EXISTS. Vamos dar uma olhada em cada uma dessas clusulas. WHERE expresso [NOT] IN (Sub-Consulta) j estudamos o IN anteriormente neste captulo em consultas simples. Agora, estamos vendo o uso do mesmo com subconsultas. Essa clusula verificaria se o resultado da expresso est contido no subconjunto de valores retornado pela subconsulta. Por exemplo, selecionar o nome e a data de nascimento dos autores de livros que no 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 relao resultante da consulta pode ser vista na Tabela 50.


Tabela 50 - Relao Resultante Nome Pedro Alves Olvia Duncan Nascimento 18/03/1955 10/01/1968

WHERE expresso { = | <> | > | >= | < | <= } ANY (Sub-consulta) o ANY verifica se a condio de comparao 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 - Relao Resultante Nome Carolina Dantas Olvia Duncan Nascimento 22/02/1970 10/01/1968

Quando na comparao utilizada a igualdade ( = ANY), a clusula passa a ter o mesmo efeito que a clusula 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 no 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 expresso { = | <> | > | >= | < | <= } ALL (Sub-consulta) - verifica se a condio verdadeira para todos os valores retornados pela subconsulta. o oposto de ANY. Por exemplo, selecionar o titulo dos livros que tm 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 - Relao Resultante TitLivro (PK) Banco de Dados Arquitetura de BD

54

Banco de Dados

Quando na comparao utilizado <> ALL, a clusula passa a ter o mesmo efeito que a clusula NOT IN. WHERE expresso [NOT] EXISTS (Sub-consulta) - verifica a existncia de dados numa lista de valores da subconsulta. Retorna VERDADEIRO ou FALSO, conforme a subconsulta retorne ou no linhas de resultado. Por exemplo, selecione o nome de todos os autores que tm 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 - Relao Resultante Nome Pedro Alves Olvia Duncan

Ordenando Resultados
Para ordenar os resultados das consultas pelos valores de uma ou mais colunas (atributos), utiliza-se a clusula ORDER BY. As linhas so ordenadas pela primeira coluna (atributo) especificada aps o ORDER BY. Quando as linhas de uma coluna possuem valores iguais, estas sero classificadas pelo valor da segunda coluna especificada aps o ORDER BY e assim por diante. H dois tipos de ordenao: 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 alfabtica do nome do autor (resultado na Tabela 54). SELECT Nome, Nascimento FROM Autor ORDER BY Nascimento DESC, Nome ASC;
Tabela 54 - Relao Resultante Nome Carolina Dantas Olvia Duncan Pedro Alves Nascimento 22/02/1970 10/01/1968 18/03/1955

55

Banco de Dados

Agrupando Resultados
lgumas vezes, na apresentao dos resultados da consulta, preciso organizar a seleo dos dados em grupos ou apresentar informaes adicionais ou totalizadoras sobre determinados grupos de dados. Para isso, usada a clusula GROUP BY. Ela agrupa os resultados por valores idnticos. Ela usada, muitas vezes, com as funes de agregao, mas pode ser usada, tambm, sem estas. Vamos a alguns exemplos de uso: Calcular a mdia dos valores dos livros cadastrados, separados por editora. Veja que para poder realizar esse clculo, necessitamos agrupar os livros de acordo com as editoras dos mesmos. Por isso, precisamos da clusula GROUP BY. SELECT Editora.Razao, AVG (Livro.Valor) FROM Livro, Editora WHERE Livro.CodEditora=Editora.Cod_Editora GROUP BY Editora.Razao ;
Tabela 55 - Relao Resultante Razao Sextante Fantasy Bookman AVG(Livro.Valor) 50,00 NULL 86,66

Observe que a relao resultante (Tabela 55) apresenta cada editora apenas uma vez e a mdia dos livros de cada uma delas. Em outras palavras, a relao resultante apresenta as tuplas da relao Livro separadas em grupos (de acordo com as editoras) e a funo AVG aplicada a cada grupo separadamente.
Uma observao importante que os campos do GROUP BY devem, obrigatoriamente, aparecer no SELECT.

Vamos dar outro exemplo. Contar quantos livros foram publicados por ano de publicao (vide resultado na Tabela 56). SELECT Ano_Publicacao, COUNT(Ano_Publicacao) FROM Livro GROUP BY Ano_Publicacao ORDER BY Ano_Publicacao;
Tabela 56 - Relao Resultante Ano_Publicacao 2000 2007 2009 2010 COUNT(Ano_Publicacao) 1 1 2 2

At agora, usamos funes de agregao. Agora, vamos dar um exemplo de uso do

56

Banco de Dados

GROUP BY sem fazer uso de funes de agregao: Selecionar o nome do autor, o ttulo 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 - Relao Resultante Nome Pedro Alves Pedro Alves Pedro Alves Carolina Dantas Carolina Dantas Olvia Duncan TitLivro (PK) Arquitetura de BD Banco de Dados BD Distribudos O Estranho O Conhecido Sucesso Valor 110,00 150,00 NULL 45,00 55,00 NULL

Tambm, possvel agrupar os resultados da seleo por mais de um atributo. Nesse caso, eles sero agrupados na ordem em que aparecem no GROUP BY (tal qual ocorre na clusula ORDER BY), criando algo como um grupo dentro de outro grupo. Por exemplo, selecionar o nome do autor, o ano de publicao e o ttulo dos livros, organizando-os pelo nome do autor e depois pelo ano de publicao. 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 - Relao Resultante Nome Pedro Alves Pedro Alves Pedro Alves Carolina Dantas Carolina Dantas Olvia Duncan Ano_Publicacao 2009 2007 2010 2010 2009 2000 TitLivro Banco de Dados Arquitetura de BD BD Distribudos O Estranho O Conhecido Sucesso

Em alguns momentos, ser necessrio agrupar informaes de forma condicional, ou seja, especificar (filtrar) quais grupos devero ser mostrados. Para isso, utilizada a clusula HAVING. Voc poderia perguntar, e por que no usar a clusula WHERE? No caso de filtragem de grupos, no possvel usar o WHERE, pois ela usada somente para

57

Banco de Dados

restringir as linhas que sero selecionadas para a formao dos grupos. Enquanto a clusula HAVING usada para restringir os grupos j formados, ou seja, ela s atendida depois do agrupamento realizado. A clusula HAVING s pode ser utilizada em conjunto com a clusula GROUP BY. Ou seja, ela s existe se associada clusula GROUP BY (mas o oposto no). Assim, ela vem depois do GROUP BY e antes do ORDER BY. A condio do HAVING s pode envolver os campos/funes do SELECT. Vamos a um exemplo: Selecione o cdigo das editoras cujo preo mdio dos livros maior do que 60. Veja que nesse caso, primeiro tem de ser feito o agrupamento (para poder calcular o preo mdio dos livros por editora) e depois que a condio dever ser aplicada, para indicar quais dos grupos devero ser apresentados na relao resultante. Esse um caso tpico de uso do HAVING. A relao resultante da consulta sem usar a clusula HAVING seria a da Tabela 59. Porm, 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 - Relao Resultante sem HAVING CodEditora 1 2 3 MediaValor 50,00 NULL 86,66

Tabela 60 - Relao Resultante com HAVING CodEditora 3 MediaValor 86,66

Outro exemplo seria: Selecionar o nome dos autores que publicaram mais de 2 livros. Vide a relao 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 - Relao Resultante Autor.Nome Pedro Alves COUNT(DISTINCT Livro.TitLivro) 3

58

Banco de Dados

Operaes sobre Conjuntos


Algumas operaes de conjunto foram incorporadas linguagem SQL. Existem as operaes de Unio (UNION), Interseo (INTERSECT) e Subtrao (EXCEPT). As relaes resultantes dessas operaes so sempre um conjunto de tuplas, sendo que tuplas duplicadas so eliminadas do resultado. A SQL tambm possui operaes sobre multiconjuntos (conjuntos que permitem repetio de elementos): UNION ALL, INTERSECT ALL e EXCEPT ALL. Todas essas operaes so aplicadas apenas s relaes que sejam compatveis.
Essas operaes so teis em queries que referenciam diferentes tabelas. Essas operaes combinam resultados de dois ou mais comandos select em um nico resultado. Por isso, so tambm conhecidos como joins verticais.

Algumas observaes sobre essas operaes so: comandos SELECT devem selecionar o mesmo nmero de colunas e as colunas correspondentes devem ser do mesmo tipo. As linhas duplicadas so, automaticamente, eliminadas e a clusula DISTINCT no pode ser usada. Os nomes das colunas da primeira query (consulta) so os que aparecem na relao resultante da operao. Vamos exemplificar, a seguir, cada uma dessas operaes. Nos exemplos, considere o seguinte modelo relacional:

MEDICO (CodMedico (PK), Nome, CRM) e PACIENTE (CodPaciente (PK), Nome);

DEPOSITANTE (CPF Agencia, Conta) e

(PK),

Nome,

DEVEDOR (CPF (PK), Nome, Agencia, Conta).

Unio (UNION)
Faz a unio entre duas relaes compatveis, eliminando linhas repetidas. Em outras palavras, gera-se uma nova relao com todas as tuplas das duas relaes resultantes envolvidas na unio, sem repetir tuplas. Acrescenta-se ALL operao para manter as linhas repetidas. Vamos aos exemplos. Selecionar todos os clientes da agncia A1 que tenham emprstimo ou tenham feito depsito. Para isso, so realizadas duas consultas e os resultados so unidos em uma nica tabela. (SELECT * FROM Depositante WHERE Agencia = A1) UNION (SELECT * FROM Devedor WHERE Agencia = A1); Mesmo quando duas relaes completas no so compatveis, tais como MEDICO e PACIENTE, podemos realizar unio entre parte delas, tornando-as compatveis pela escolha dos atributos em comum. Por exemplo, selecionar o nome de todas as pessoas cadastradas no hospital, independente da posio que ocupem. (SELECT Nome FROM Medico) UNION (SELECT Nome FROM Paciente);

59

Banco de Dados

Interseo (INTERSECT)
Retorna apenas as linhas que pertencem s duas relaes resultantes, se elas forem compatveis, sem repetio. Por exemplo, selecionar o nome de todas as pessoas que so mdicos e pacientes ao mesmo tempo. (SELECT Nome FROM Medico) INTERSECT (SELECT Nome FROM Paciente); Selecionar todos os clientes da agncia A1 com emprstimo e depsito. (SELECT * FROM Depositante WHERE Agencia = A1) INTERSECT (SELECT * FROM Devedor WHERE Agencia = A1);

Exceo (EXCEPT ou MINUS)


Retorna apenas as linhas que pertencem primeira tabela, com exceo das que aparecem na segunda. Em outras palavras, retorna somente as linhas da primeira query (consulta) que no esto presentes no resultado da segunda query. Por exemplo, selecionar o nome de todas as pessoas que so mdicos e no so pacientes. (SELECT Nome FROM Medico) EXCEPT (SELECT Nome FROM Paciente); Selecionar todos os clientes da agncia A1 que possuem conta, mas no fizeram emprstimo. (SELECT * FROM Depositante WHERE Agencia = A1) EXCEPT (SELECT * FROM Devedor WHERE Agencia = A1);

Manipulando Vises
Vises so tabelas virtuais que no ocupam espao fsico e so criadas a partir de tabelas reais. Elas permitem criar tabelas personalizadas, de acordo com o perfil do usurio. Vises so timas para substituir consultas frequentemente usadas. Para criar uma viso utilizamos o seguinte comando: CREATE VIEW Nome_Viso (ExpressoConsultaPreenchimentoVisao) banco. CREATE VIEW TodosClientes AS (SELECT * FROM Depositante) UNION (SELECT * FROM Devedor); [Colunas_viso] AS

Por exemplo, criar uma viso com os clientes que tem conta ou emprstimo no

Outro exemplo, criar uma viso 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); Tambm, possvel criar uma nova viso a partir de uma outra viso anteriormente criada. Por exemplo, criar uma viso para todos os clientes da agncia A1. J criamos uma viso com os clientes que tem conta ou emprstimo no banco. Vamos utilizar essa viso criada para atender ao que se pede: CREATE VIEW TodosClientesA1 AS (SELECT * FROM TodosClientes WHERE Agencia = A1); Aps definida uma viso, qualquer operao de consulta pode ser aplicada sobre ela. Consultas sobre vises so escritas da mesma forma como para uma tabela qualquer e as operaes realizadas sobre uma viso refletem nas tabelas fsicas das quais elas derivam. Por exemplo, selecionar o ttulo e o valor dos livros da viso LivrosBookmanDesconto que tenham valor acima de 50 reais. SELECT Titulo, Valor_Desconto FROM LivrosBookmanDesconto WHERE Valor_Desconto > 50; Para remover uma viso, utilizamos o comando: DROP VIEW Nome_Viso A remoo de uma viso feita em cascata. Por exemplo, remover a viso chamada TodosClientes: DROP VIEW TodosClientes; Como a remoo feita em cascata, a viso TodosClientesA1, que foi criada a partir da viso TodosClientes, tambm removida. Outro exemplo, remover a viso LivrosBookmanDesconto: DROP VIEW LivrosBookmanDesconto;.

Uma Noo da DCL (Data Control Language)


A DCL cuida das autorizaes de acesso. Isso porque um SGBD Relacional pode ser acessado por diversos usurios e cada usurio possui um determinado perfil em relao aos dados das tabelas ou vises. Alguns usurios 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 usurio atravs da configurao de privilgios por usurio. Os privilgios garantem segurana e integridade dos dados, bem como a responsabilidade de cada usurio sobre seus dados especficos. Dois comandos fazem parte da DCL: GRANT e REVOKE. O comando GRANT atribui privilgios de utilizao de tabelas ou vises de uma base de dados. A sintaxe desse comando : GRANT Privilgios ON Tabelas/Vises TO LoginUsurios Os privilgios podem ser: Select: pode executar uma consulta sobre a tabela Insert: pode executar uma insero sobre a tabela

61

Banco de Dados

Delete: pode apagar registros da tabela Update: pode modificar registros da tabela All Privileges: pode executar qualquer operao sobre a ela Alguns exemplos so: 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 privilgios de acesso dos usurios. A sintaxe desse comando : REVOKE Privilgios ON Tabelas/Vises FROM LoginUsurios Alguns exemplos de uso so: REVOKE Select ON Livro, Autor FROM Paulo, Joao REVOKE Select, Insert, Update ON TodosClientes FROM Ana REVOKE All Privileges ON Depositante FROM PUBLIC

Consideraes Finais
Pronto! Agora voc tem o poder de criar, manipular, deletar e consultar o seu banco de dados. Porm, 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 captulos anteriores e possa inserir, atualizar e consultar os dados desse banco de dados. A prtica a chave para o sucesso, no esquea disso!

Conhea Mais
Como mencionado no captulo anterior, 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, 1Edio, 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, 3Edio, 2009.

62

Banco de Dados

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

Aprenda Praticando
Tomando como base as tabelas abaixo, vamos executar algumas consultas SQ.
PRODUTO Cod_Prod (PK) 001 002 003 004 005 Nm_prod Photoshop Coreldraw Flash CAB Adobe Valor 150,00 250,00 30,00 100,00 NULL

PRODUTOS_PEDIDO Numero (PK) 111 111 111 222 222 222 333 Cod_Prod (PK) 001 002 003 002 003 004 004 Qtd 02 03 02 03 05 10 03

PEDIDO Numero (PK) 111 222 333 Data 10/02/2010 23/03/2010 20/05/2010 Cod_Fornec (FK) F1 F2 F1

63

Banco de Dados

FORNECEDOR Cod_Fornec (PK) F1 F2 Nome (PK) InfoSoft BRSofts Endereco R. Flor, 25 Av. Itu, 33

Vamos comear demonstrando algumas consultas bem simples, sem condio alguma, usando a estrutura base SELECT atributos FROM nome_tabela e apresentando tambm o uso de operadores aritmticos na apresentao 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 tambm 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 funes. Lembre-se que essas funes que vimos existem no SQL-ANSI, ou seja, na parte bsica do SQL que toda verso deve oferecer. Alguns SGBDs podem oferecer funes adicionais, alm do bsico. d) Calcule a quantidade de pedidos realizados SELECT Count(Numero) FROM Pedido;

e) Qual a mdia de preo 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 incluso da parte condicional (clusula 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 comeam com a letra C. SELECT Nm_prod FROM Produto WHERE Nm_prod LIKE C%;

k) Selecione o nome dos produtos que ainda no possuem valor definido. SELECT Nm_prod FROM Produto WHERE Valor IS NULL

64

Banco de Dados

Junes (JOINS) so usada em boa parte das consultas reais. Por isso, vamos ilustrar alguns casos de juno. l) Apresente o nmero 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 nmero 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 nmero 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 esto 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 so construdas 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 no for muito tarde): Uma m performance pode tambm ser resultado de uma modelagem ruim. importante se preocupar com a modelagem correta do problema e em realizar a normalizao do modelo relacional produzido pelo menos at a 3FN (Terceira Forma Normal). Use ndices, mas no 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 no utilizar SELECT * porque o gerenciador de consultas deve ler primeiro a estrutura da tabela antes de executar a sentena. Se utilizar vrias 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 invs 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 possvel, procure usar nas condies da clusula WHERE aqueles campos que fazem parte da chave da relao ou relaes sendo consultada(s). Quando for usar operadores de comparao, evite usar NOT em condies de pesquisa. Eles podem diminuir a velocidade de recuperao de dados porque todos os registros em uma tabela so avaliados. Sempre use condies de pesquisa positivas ao invs de negativas. As condies 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 necessrio, pois um tempo a mais gasto para organizar os dados da tabela resultante. Ao fazer a montagem da clusula WHERE interessante que a condio 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 condio mais restritiva deve ficar por ltimo na clausula WHERE. Adicionalmente, quando se utilizam vrias tabelas dentro da consulta h que ter cuidado com a ordem das tabelas na clusula 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 matrculas e devolver as correspondentes. Porm, se escrevermos: FROM Matricula, Aluno WHERE Matricula.Ano = 1996 AND Matricula.IdAluno = Aluno. IdAluno - o gerenciador filtra as matrculas e depois seleciona os alunos, desta forma tem que percorrer menos registros, melhorando o desempenho. Nem sempre lembramos dessas recomendaes quando estamos montando os SQLs. Porm, recomendado que voc procure otimizar, pelo menos, os SQL mais crticos (mais utilizados ou que envolvam mais tabelas). Por exemplo, revisando os SQLs montados em um programa antes dele ir para produo.

Atividades e Orientaes de Estudos


Agora a sua vez de fazer as atividades! Lembre que praticar muito importante pra fixar o contedo estudado! SQL, tal como qualquer linguagem de programao, 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 avaliao somativa. Usamos nesse exerccio questes que fizeram parte de vrios concursos da rea de informtica. 1) (Judicirio/Programao de Sistemas/TRE-MG/FCC/2005) Os comandos bsicos do SQL, pertencentes a classe de linguagem de manipulao de dados so: a) drop e delete b) update e drop c) alter e delete d) alter e drop e) update e delete 2) (Judicirio/Programao de Sistemas/TRE-MG/FCC/2005) Uma subconsulta SQL uma instruo SELECT que NO pode estar aninhada dentro de uma instruo: a) Create b) Select c) Insert d) Delete e) Update 3) (Analista Judicirio/Anlise 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 acadmico. 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 mdia 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 Jnior Processos de Negcios/Petrobrs/ CESGRANRIO/2010) Considere as instncias de relaes R1 e R2 apresentadas abaixo, onde o cabealho de cada uma dessas instncias de relaes apresenta os respectivos nomes das colunas.
R1 sno 1 1 1 1 2 2 3 4 4 pno 1 2 3 4 1 2 2 2 4 R2 pno 1 2

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

68

Banco de Dados


a)

O resultado dessa consulta :


sno 1 2 2 2 4 4 b) sno 1 1 1 2 2 3 4 c) sno 1 2 3 3 4 4 4 d) sno 1 2 3 3 4 4 e) sno 1 1 1 2 3 4 4

6) (Analista de Sistemas Jnior Processos de Negcios/Petrobrs/ CESGRANRIO/2010) Em SQL, a instruo que permite alterar vrios registros : a) Delete b) Create Index c) Update d) Change e) Atualize 7) (Tcnico em Informtica/Petrobrs/CESGRANRIO/2010) Na linguagem SQL, a estrutura bsica da instruo select consiste em trs clusulas que so: 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) (Tcnico em Informtica/Petrobrs/CESGRANRIO/2010) Considere a instruo : DELETE FROM Aluno WHERE idade < 21 AND nome like *A; Esta instruo: a) Elimina a tabela Aluno b) Elimina os registros da tabela que verifiquem, simultaneamente, as duas condies 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 condies expressas. e) Nenhuma das anteriores. 9) (Analista de Tecnologia da Informao 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 clusula ORDER BY

69

Banco de Dados

b) A clusula HAVING. c) Uma condio da clusula 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 Incio

Na hiptese de ambos os sobrenomes estarem adequadamente cadastrados na TabPessoa, sem importar a ordem, a correta expresso que obtm tal resultado : a) SELECT Sobrenome FROM TabPessoa WHERE Sobrenome = Francisco AND Incio b) SELECT Sobrenome FROM TabPessoa WHERE Sobrenome IN (Francisco,Incio) c) SELECT FROM TabPessoa WHERE Sobrenome = (Francisco OR Incio) d) SELECT IN TabPessoa WHERE Sobrenome IN (Francisco,Incio) e) SELECT FROM TabPessoa WHERE Sobrenome IN (Francisco,Incio)

11) (Analista de Sistemas Jnior Engenharia de Software / Petrobrs / CESGRANRIO / 2008) Considere as tabelas de um banco de dados relacional descritas abaixo, onde os campos que compem as chaves primrias esto assinalados com *.
TABELA CLIENTE PRODUTO VENDA CAMPOS *CODIGO_C, CPF, NOME, CIDADE *CODIGO_P, DESCRICAO, PRECO *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 tambm armazenado na tabela VENDA. Os campos NOME e DESCRICAO tambm so 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 mdia de preo de produtos vendidos a clientes da cidade com valores acima de 100, se a mdia for menor que 200. b) Para cada cidade, a mdia de preo 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 mdia de preo dos produtos vendidos a clientes da cidade que compraram produtos de valores maiores do que 100 e cuja mdia de compra menor do que 200. e) Apenas a cidade cuja mdia de preo dos produtos vendidos a mais alta dentre as que tiveram mdia menor do que 200 e produtos vendidos com valores acima de 100. 12) (Analista Judicirio Anlise de Sistemas - Suporte /TJ-PA/FCC/2009) Dada uma linha de tabela relacional:
TABELA: Turma_Alunos Codigo_Turma Num_Aluno Media_Final Alpha Number Number ADM1 16 7,5

Aps a execuo 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 nmero de alunos de todas as turmas. c) os cdigos das turmas existentes. d) a quantidade de turmas de cada curso. e) a quantidade total de turmas existentes. 13) (Analista Judicirio Anlise de Sistemas - Desenvolvimento /TJ-SE/FCC/2009) A expresso SQL-ANSI: SELECT coluna FROM tabela WHERE coluna LIKE literal% ; recupera todas as: a) linhas com coluna cujo contedo termina com literal. b) linhas com coluna cujo contedo inicia com literal. c) linhas com coluna cujo contedo contm literal em qualquer posio. 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 Anabiotca Petrobana Canalservice Anablematica

Faturamento 190.044,09 234.511,23 123.387,34 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 Prtica (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 avaliao somativa de vocs. Dado o modelo conceitual da figura abaixo, faa 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 atualizao para qualquer uma das tabelas, a sua escolha. f) Elaborar pelo menos trs SQLs de excluso para qualquer uma das tabelas, a sua escolha. g) Elaborar pelo menos cinco consultas que envolvam seleo condicional de dados usando, em pelo menos uma delas, ordenao. h) Elaborar pelo menos cinco consultas que envolvam juno 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 captulo foi estudada a DML (Data Manipulation Language), que a parte da linguagem SQL que possui comandos para manipulao de dados. Ou seja, possui comandos para insero (INSERT), atualizao (UPDATE), deleo (DELETE) e consulta (SELECT) aos dados. Adicionalmente, neste captulo tambm foram vistas operaes com conjuntos de dados, tais como unio (UNION), interseo (INTERSECT) e exceo (EXCEPT) e, brevemente, a DCL (Data Control Language), que contm comandos para autorizar ou no o acesso aos dados (GRANT e REVOKE, respectivamente).

73

Banco de Dados

Consideraes Finais
Ol, cursista! Esperamos que voc tenha aproveitado este quarto e ltimo mdulo da disciplina Banco de Dados, assim como a disciplina como um todo. Com tudo que foi estudado nesta disciplina, voc j tem o conhecimento necessrio 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 prtica e com leituras adicionais para aprofundamento. Assim sendo, quem quiser saber mais sobre banco de dados ou quiser trabalhar com os mesmos, aproveite as referncias indicadas em cada captulo 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 vocs nessa jornada de conhecimento! At mais! Sandra de Albuquerque Siebra Autora

74

Banco de Dados

Referncias
ALVES, W.P. Fundamentos de Bancos de Dados. Editora rica, 2004. BATINI, C.; CERI, S.; NAVATHE, S. B. Conceptual database design: an entityrelationship approach. San Francisco: Benjamim Cummings, 1992.

BEIGHLEY, Lynn. Use a Cabea SQL. Starlin Alta Consult, 1Edio, 2008 COUGO, Paulo Srgio. Modelagem Conceitual e Projeto de Banco de Dados. Elsevier Editora, 1997. DAMAS, Lus. Sql - Structured Query Language. Editora LTC, 6 edio, 2007. DATE, C. J. Banco de dados: tpicos avanados. Rio de Janeiro : Campus, 1988. DATE, C. J. Introduo a Sistemas de Banco de Dados. Elsevier Editora, 2004. ELMASRI, Ramez;NAVATHE, Shamkant B. Sistemas de banco de dados. Traduzido por: Marilia Guimares Pinheiro et al. 4a. ed. So Paulo: Pearson Education do Brasil, 2005. HEUSER, Carlos Alberto. Projeto de Banco de Dados. 3. Edio., Porto Alegre : SagraLuzzatto, 2004. KLINE, Daniel; KLINE, Kelvin E. Sql - O Guia Essencial - Manual de Referncia 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 Implementao. 6 Edio. 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. So Paulo : Revista Edgard Blucher, 1989. SHELDON, Robert; OPPEL, Andy. SQL Um Guia para Iniciantes. Editora Cincia Moderna, 3Edio, 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

Conhea a Autora
Sandra de Albuquerque Siebra
Doutora em Cincia da Computao, pelo Centro de Informtica da UFPE onde trabalhou com Ambientes Virtuais de Aprendizagem e Ambientes Colaborativos em Geral. Ensinou na Faculdade Integrada do Recife (FIR) e na Universidade Catlica de Pernambuco (UNICAP), alm de ter trabalhado como gerente de projetos no Centro de Estudos e Sistemas Avanados do Recife (CESAR). Atualmente, professora da Universidade Federal Rural de Pernambuco (UFRPE). Atua na equipe de Educao a Distncia da UFRPE e no Departamento de Estatstica e Informtica (DEINFO), como professora autora de materiais didticos para cursos a distncia, j tendo tambm atuado como coordenadora de curso e professora executora de disciplinas. Tem experincia, trabalhos desenvolvidos e artigos publicados nas reas de Educao a Distncia, Interfaces Homem- Mquina, Sistemas Colaborativos, Banco de Dados, Anlise e Projeto de Sistemas Orientados a Objetos, Sistemas de Informao e Engenharia de Software. Atualmente, desenvolve pesquisas sobre contextualizao de interaes em ambientes virtuais de aprendizagem e trabalho cooperativo.

76

Potrebbero piacerti anche