Você está na página 1de 0

INTRODUO A SISTEMAS DE BANCO DE DADOS

BANCO DE DADOS
Aplicao da Structure Query Language

Este e-book visa, atravs de exemplos prticos, aplicar os conceitos da Structure
Query Language (SQL) na manipulao de Banco de Dados relacionais.
2012
Ricardo R. Barcelar
http://www.ricardobarcelar.com.br
ricardobarcelar@email.com.br


APRESENTAO

APRESENTAO



objetivo deste material apresentar a Structure Query Language como linguagem
padro para manipulao de bancos de dados relacionais, norteando o estudo de
banco de dados atravs de exemplos prticos aplicados a um Sistema Gerenciador de
Banco de Dados amplamente conhecido e utilizado, o PostgreSQL.
CELSO HENRIQUE PODEROSO DE OLIVEIRA, NAVATE e ELMASRI so referncias
para os estudos traados neste material. Dessa forma, o contedo apresentado certamente
poder ser utilizado como referncia na vida prtica do profissional de computao que lida
diariamente com Banco de Dados.

Ricardo R. Barcelar
O
PROJETO FSICO DE BANCO DE DADOS


3







PROJETO FSICO DE BANCO DE DADOS

primeira etapa a fazer ao comea a trabalhar com banco de dados estudar as tcnicas
utilizadas para se criar um projeto de banco de dados: Modelo Entidade-
Relacionamento, Modelo Lgico usando ferramenta Case, Normalizao, Estratgias de
Projeto de Banco de Dados, etc.
Conhecedores dos conceitos de Codd, Chen, e outros autores que definiram o padro
relacional para banco de dados relacionais, ento, possvel avanar mais um passo:
implementar o banco de dados em uma ferramenta apropriada. Mas antes, necessrio
conhecer alguns conceitos do Projeto Fsico e dos Sistemas Gerenciadores de Banco de
Dados especificamente.
O Modelo Fsico de Dados a especificao em SQL - Structure Query Language
Linguagem de Consulta Estruturada - do esquema relacional para o Sistema Gerenciador de
Banco de Dados escolhido. Nesta fase, as estruturas de armazenamento e de recuperao de
informaes, bem como os mecanismos de acesso devem ser escolhidos, visando sempre o
aprimoramento da performance dos aplicativos de Banco de Dados.
Nesta fase devem ser especificados no apenas as tabelas criadas, mas tambm os
ndices necessrios, as restries de integridade (checks e triggers), algumas operaes de
incluso, excluso e atualizao de dados para cada tabela, bem como as consultas que a
aplicao deve realizar.

1.1 FATORES QUE INFLUENCIAM O PROJETO FSICO DE BANCO DE DADOS
Esta fase do projeto de Banco de Dados objetiva no s propor uma apropriada
estruturao de dados, mas faz-lo de maneira que garanta um bom desempenho. Sendo
assim, no possvel tomar decises significativas sobre projetos fsicos e anlises de
desempenho, at que conheamos as consultas, as transaes e as aplicaes que devem ser
executadas no banco de dados.
Dessa forma, vamos discutir alguns fatores:
a. Analisar as consultas e transaes do Banco de Dados
importante ter uma ideia das intenes de uso do banco de dados, definindo as
consultas e transaes que esperamos que sejam realizadas em alto nvel, especificando o
seguinte:
- Os arquivos que sero acessados pela consulta;
A
Parte
PROJETO FSICO DE BANCO DE DADOS


4

- Os atributos nos quais quaisquer condies de seleo para a consulta estejam
especificadas;
- Os atributos nos quais quaisquer condies de juno ou condies para ligar
mltiplas tabelas ou objetos para a consulta estejam especificadas;
- Os atributos cujos valores sero trazidos atravs da consulta.
Para cada operao ou transao de atualizao, devemos especificar o seguinte:
- Os arquivos que sero atualizados;
- O tipo de operao em cada arquivo (insert, update, delete);
- Os atributos nos quais as condies de seleo para uma excluso ou atualizao
estejam especificadas.
- Os atributos cujos valores sero alterados atravs de uma operao de atualizao.

b. Analisar a frequncia esperada de solicitao (execuo) de consultas e transaes
necessrio considerar as taxas de solicitao (execuo), usadas de forma estatstica
em situaes prticas para grandes volumes de processamento.

c. Analisar as restries de tempo de consulta e transaes
Neste caso, algumas consultas e transaes podem ter rigorosas restries de
desempenho. Por exemplo, uma transao que deve ser interrompida se no for concluda em
20 segundos.

d. Analisar as frequncias esperadas de operaes de atualizao
Um nmero mnimo de caminhos de acesso aos dados deve ser especificado para um
arquivo que seja frequentemente atualizado, uma vez que atualizar os prprios caminhos de
acesso desacelera as operaes de atualizao.

e. Analisar as restries de Unicidade em Atributos
Caminhos de acesso aos dados devem ser especificados em todos os atributos
candidatos a chave ou chave primria. A existncia de um ndice facilita a pesquisa nos
arquivos de dados, pois este define um caminho de dados.
Realizadas as anlises iniciais, outra deciso importante definir qual Sistema
Gerenciador de Banco de Dados usar. relevante levar em considerao vrios fatores, como:
- O modelo fsico, visto que determinar qual a carga de trabalho que ser exigida pelo
Sistema Gerenciador de Banco de Dados, isso j eliminar algumas opes.
- O custo. Uma locadora, por exemplo, ir adquirir uma licena Oracle ou SQL Server?
- Plataforma de Sistema Operacional. Esta uma deciso que no ser analisada neste
momento.

PROJETO FSICO DE BANCO DE DADOS


5


1.2 SQL - STRUCTURE QUERY LANGUAGE - LINGUAGEM ESTRUTURADA DE
CONSULTA
Como visto no mdulo passado, muito simples criar um script SQL atravs de uma
ferramenta Case. No entanto, este no ser o foco desta sesso. Aqui aprenderemos a cri-lo
sem auxlio de ferramentas case. Para tanto, necessrio conhecermos a linguagem SQL.
Apesar do nome, fazer consultas a bancos de dados no a nica funo de SQL. Ela
utilizada para criar tabelas, inserir, excluir e alterar dados no banco de dados, alm de
outras utilizaes.
A SQL foi desenvolvida na dcada de 70 pela IBM em uma das primeiras tentativas de
desenvolver um banco de dados relacional. Tornou-se padro de fato depois de 1986, quando
a ANSI (American National Standards Institute) endossou como linguagem padro para
Banco de Dados relacionais e desde ento, j sofreu trs atualizaes oficiais: em 1989,
1992 e 1999. Nesta ltima, algumas das mudanas mais significativas esto relacionadas com
a definio dos padres para Banco de Dados Objeto-Relacionais.
Devido ao sucesso da forma de consultar e manipular dados da SQL, dentro de um
ambiente de banco de dados, a utilizao da SQL foi se tornando ainda maior. Cabe ressaltar
que cada implementao de SQL possui uma adaptao da sintaxe para resolver determinados
problemas, portanto, qualquer comando mostrado pode ser usado de forma diferente em um
determinado Sistema Gerenciador de Banco de Dados.
Recomenda-se a leitura do manual do fabricante para maiores informaes sobre o uso
da linguagem SQL em Sistema Gerenciador de Banco de Dados comerciais.
Atualmente, a linguagem SQL assume um papel muito importante nos sistemas de
gerenciamento de banco de dados, podendo ter muitos enfoques. Atravs de comandos SQL,
possvel montar consultas poderosas sem a necessidade da criao de um programa, ou
utilizar comandos SQL embutidos em programas de aplicao que acessam os dados
armazenados.
Devido ao fato de possuir vrias aplicaes, a linguagem SQL prov suporte a vrias
funes. Que consiste em:
- DDL (Linguagem de definio de dados), onde os dados a serem armazenados so
definidos e estruturados; (Create, Alter e Drop).
- DML (Linguagem de manipulao de dados), que permite a incluso, remoo,
seleo ou atualizao de dados armazenados no banco de dados; Controle de acesso,
permitindo proteo dos dados de manipulaes no autorizadas; (Select, Insert, Update,
Delete, Commit e Rollback).
- DCL (Linguagem de controle de dados) uma subclasse da DML responsvel pelas
permisses de acesso ao banco; (Grant e Revoke).
Restries de Integridade, que auxiliam no processo de definio da integridade dos
dados, protegendo contra corrupes, inconsistncias e falhas do sistema de computao.
Alm dessas caractersticas principais, ainda podemos citar:
- Vises, onde so especificadas as consultas disponveis atravs de tabelas virtuais
(Views).
PROJETO FSICO DE BANCO DE DADOS


6

- Gatilhos a fim de automatizar processos no banco (Triggers).
Outra caracterstica a capacidade de cancelar uma srie de atualizaes ou gravar
depois de concluir uma srie de atualizaes.

1.3 CRIANDO UM BANCO DE DADOS
Esta etapa trata da Data Definition Language (DDL). O processo bsico consiste
simplesmente em atribuir tipo de dado e tamanho para cada um dos atributos que foram
identificados.
Ateno:
- Cada Sistema Gerenciador de Banco de Dados adota um terminador de comando. O
mais comum o ponto e vrgula (;)
- Quanto aos comandos apresentados, os Sistemas Gerenciadores de Banco de Dados
no so sensveis a letras maisculas ou minsculas. Contudo, o contedo das colunas
normalmente sensvel, portanto muito cuidado.

1.3.1 Desnormalizao de dados
Em uma anlise mais profunda, muitas vezes conveniente avaliar a necessidade de
alguns campos redundantes na tabela. Esse processo chamado de desnormalizao de
dados. Ocorre que, quando idealizamos o modelo de dados, utilizamos o conceito de
processador perfeito, em que as informaes so transmitidas sem custo instantaneamente.
No entanto, mesmo bancos de dados avanados possuem limitaes.
Esta tcnica pode ser exemplificada pelo caso dos campos calculados que so
eliminados na 3 Forma Normal. Quando se tem um grande banco de dados que trata de Notas
Fiscais, por questes de performance costuma-se driblar um pouco a regra e coloca-se o
valor total da nota como um campo na tabela. Isso pode ser feito quando o banco de dados
possui mecanismo de controle de transaes, em que uma eventual gravao no banco de
dados implique necessariamente a gravao na outra ponta. Esta operao deve ser feita por
meio de gatilhos (triggers) para garantir a integridade das informaes.

1.3.2 Definio de dados
Antes de criar as tabelas no banco de dados, preciso definir quais so as
caractersticas de cada um dos campos. As caractersticas que o SQL exige so o tipo do dado
e o tamanho de cada campo. As informaes aqui apresentadas so utilizadas pela maioria
dos bancos de dados. Eventuais mudanas devem ser consultadas na documentao do
Sistema Gerenciador de Banco de dados adotado.
TIPO DE DADO DESCRIO
Integer ou Int
Nmero positivo ou negativo inteiro. O nmero de bytes utilizado varia de
acordo com o banco de dados utilizado.
Smallint Mesma funo do Inteiro, mas ocupa cerca da metade do espao
PROJETO FSICO DE BANCO DE DADOS


7

Numeric
Nmero positivo ou negativo de ponto flutuante. Deve-se informar
tamanho do campo e a quantidade de casas decimais.
Decimal
Semelhante ao Numeric, mas, em alguns bancos de dados, poder ter
uma maior preciso aps a vrgula.
Real
Nmero de ponto flutuante de simples preciso. A diferena bsica que
os valores sero armazenados em representao exponencial, portanto
ser arredondado para o nvel mais prximo de preciso.
Double Precision
Nmero de ponto flutuante de dupla preciso. Comporta-se como o Real,
mas permite maior aproximao de resultados.
Float
Nmero de ponto flutuante em que voc define o nvel de preciso
(nmero de dgitos significativos)
Bit
Armazenamento de um nmero fixo de bits. O nmero de bits deve ser
indicado, do contrrio o padro ser 1.
Bit Varying
Igual ao Bit, permitindo armazenar valores maiores. Normalmente, utiliza-
se para armazenar imagens.
Date Permite armazenar datas
Time Permite armazenar horrios
Timestamp Permite armazenar uma combinao de data e hora
Character ou char
Permite armazenar cadeias de caracteres (letras, smbolos e nmeros). O
tamanho informado fixo e indica o tamanho mximo da cadeia de
caracteres.
Character Varying
ou Varchar
Permite armazenar cadeias de caracteres, mas com tamanho varivel.
Neste caso, especifica-se o tamanho mximo da coluna. Se for utilizado
menos espao que o mximo definido, o espao restante no ser
ocupado.
Interval Intervalo de data ou hora

1.3.3 Adaptando o modelo de dados
Com base nas informaes acima, adaptaremos nosso modelo de dados. Para nossos
estudos utilizaremos o modelo lgico abaixo:
PROJETO FSICO DE BANCO DE DADOS


8


Figura 1- Modelo de dados

Notao dos relacionamentos







1.3.4 Criao de Tabelas
Tabelas so as estruturas mais importantes de um banco de dados. Nas tabelas estar
o contedo que representa cada objeto do mundo real.
As tabelas criadas no banco de dados ficam armazenadas em outras tabelas internas
do gerenciador de banco de dados denominadas Dicionrio de Dados.


1:n FK obrigatria. Parte da chave primria

1:n FK no obrigatria

n:m Muitos para muitos (cria-se a tabela associativa)
PROJETO FSICO DE BANCO DE DADOS


9

Sintaxe:
CREATE TABLE nome_da_tabela
(coluna1 tipo_de_dado constraint,
coluna2 tipo_de_dado constraint,
coluna3 tipo_de_dado constraint);

Exemplo:
CREATE departamento
(dep_id INTEGER NOT NULL,
dep_nome VARCHAR(100),
dep_atividade VARCHAR(100),
empr_id INTEGER NOT NULL);

1.3.5 Constraints Integridade Referencial Restrio de Integridade (RI)
Constraints so regras agregadas a colunas ou tabelas. Assim, pode-se definir um
campo como obrigatrio ou no, ou aceitar apenas alguns valores predefinidos. No caso de
regras aplicadas a tabelas, tem-se a definio de chaves primrias (PK) e estrangeiras (FK).
Um bom Sistema Gerenciador de Banco de Dados deve evitar a entrada de informao
incorreta ou inconsistente em sua base de dados, garantindo, com isso, a qualidade da
informao inserida. Uma restrio de integridade (RI) uma condio especificada no
esquema da base de dados para restringir a informao a ser armazenada.
As RI so especificadas e conferidas em dois momentos diferentes:
- Na especificao da RI: se d na definio do esquema da base de dados pelo
usurio ou pelo administrador da base de dados (DBA);
- Na conferncia da RI: feita pelo banco de dados toda vez que uma relao
modificada por uma aplicao sendo executada.

1.3.5.1 TIPOS DE CONSTRAINTS MAIS COMUNS
As constraints podem variar muito de um banco para outro.
a) Chave Primria: a coluna identificadora de um registro na tabela. Para represent-
la basta acrescentar a palavra chave PRIMARY KEY seguida do nome da coluna.
Exemplo:
...
PRIMARY KEY (cliente_id),
...

b) Chave Estrangeira: o campo que estabelece o relacionamento entre duas tabelas.
Dessa forma, deve-se especificar na tabela que contm a chave estrangeira quais so essas
colunas e a qual tabela est relacionada.
Ao determinar este tipo de relacionamento, fica garantida a integridade das
informaes. Os valores presentes na coluna definida com chave estrangeira devem ter um
correspondente na outra tabela.

PROJETO FSICO DE BANCO DE DADOS


10


Exemplo1:
...
FOREING KEY(coluna)
REFERENCES (tabela)
ON UPDATE ao
ON DELETE ao
Ao: Determina qual ao o banco de dados deve tomar quando for excluda ou alterada uma
linha da tabela que contm referncia a esta chave. Pode ser:
- SET NULL: Altera o contedo da coluna para nulo, perdendo a referncia, sem deixar
valores inconsistentes.
- SET DEFAULT: Altera o contedo da coluna pra um valor especificado na clusula
DEFAULT, se houver.
- CASCATE: Exclui ou altera todos os registros que se relacionam com a ele.
- NO ACTION: Em caso de alterao, no modifica os valores que se relacionam a eles.
- RESTRICT: No permite a excluso da PK.
Exemplo2:

CREATE TABLE funcionario (fun_id INTEGER, fun_nome VARCHAR(50),
fun_admissao DATE, dept_id INTEGER,
PRIMARY KEY (fun_id),
FOREIGN KEY (dept_id) REFERENCES departamento ON DELETE CASCADE ON
UPDATE NO ACTION

c) DEFAULT: Atribui um contedo padro a uma coluna da tabela.
Exemplo:
...
prod_quantidade INTEGER DEFAULT 1,
...

d) NOT NULL: Indica que o contedo de uma coluna no poder ser Nulo. Lembre-se,
em banco de dados SQL, colunas sem valor atribudo possuem contedo Nulo.

PROJETO FSICO DE BANCO DE DADOS


11


Exemplo:
...
cliente_nome VARCHAR(50) NOT NULL,
...

e) UNIQUE: Indica que no pode haver repetio no contedo da coluna. No a
mesma coisa que chave primria. A chave primria, alm de no permitir repetio, no pode
conter valores nulos, dentre outras caracterstica no existentes nesta restrio.
Exemplo:
...
cliente_CPF NUMERIC(11) UNIQUE,
...

f) CHECK: Definio de domnio: Um domnio uma expresso de valores possveis
para o contedo de uma coluna.
Exemplo:
...
sexo CHAR(1) CHECK (UPPER(sexo) = M OR UPPER(sexo) = F),
!

1.3.6 Alterao da estrutura da tabela
Para alterar a estrutura de uma tabela, utilizamos o comando ALTER TABLE.

1.3.6.1 ACRESCENTAR NOVAS COLUNAS
O comando utilizado para acrescentar novas colunas muito semelhante ao da criao
de colunas em uma tabela:
Sintaxe:
ALTER TABLE nome_da_tabela ADD
coluna1 tipo_de_dado constraint,
coluna2 tipo_de_dado constraint,
...
Exemplo:
ALTER TABLE departamento
ADD dep_ramal NUMERIC(4) UNIQUE

1.3.6.2 ACRESCENTAR NOVAS CONSTRAINTS
PROJETO FSICO DE BANCO DE DADOS


12

O comando utilizado para acrescentar novas constraints muito semelhante ao da
criao de constraints em uma tabela:
Sintaxe:
ALTER TABLE nome_da_tabela
ADD (constraint)
Exemplo:
ALTER TABLE departamento
ADD PRIMARY KEY (dep_id)

1.3.6.3 MODIFICAR COLUNAS
O comando utilizado para modificar qualquer caracterstica de uma coluna.
Sintaxe:
ALTER TABLE nome_da_tabela
ALTER COLUMN (coluna tipo_dado
constraint)
Exemplo:
ALTER TABLE departamento
ALTER COLUMN dep_nome TYPE
VARCHAR(150);

ALTER TABLE dep_nome
ALTER COLUMN dep_nome SET NOT
NULL;

Os comandos de alterao da estrutura/caractersticas de um banco de dados pode
variar de um Sistema Gerenciador de Banco de Dados para outro. Portanto, importante, em
caso de dvidas, consultar o manual da ferramenta. O manual do PostgreSql pode ser
encontrado em: <http://www.postgresql.org/docs/9.1/static/sql.html>

1.3.6.4 EXCLUINDO ELEMENTOS
Pelo padro SQL, deveria ser possvel excluir colunas ou constraints de uma tabela.
Alguns bancos de dados no permitem a excluso de colunas.
Sintaxe:
ALTER TABLE nome_da_tabela
DROP elemento
Exemplo:
ALTER TABLE departamento
DROP dep_ramal;

ALTER TABLE departamento
DELETE PRIMARY KEY;

Abaixo um exemplo onde vrias alteraes esto sendo realizadas em um s comando:
ALTER TABLE fornecedores
ADD cgc NUMERIC(14),
DROP tipofornecedor,
PROJETO FSICO DE BANCO DE DADOS


13

ADD CONSTRAINT ck_email CHECK (e_mail CONTAINING @ OR e_mail IS
NULL)

1.3.7 Eliminando uma Tabela
Para eliminar uma tabela do banco de dados, utilizamos o comando DROP TABLE
seguido do nome da tabela. Alguns bancos somente permitiro esta operao se esta no
estiver relacionada outra tabela.

Sintaxe:
DROP TABLE nome_da_tabela
Exemplo:
DROP TABLE departamento;

5. EXERCCIOS
Usando a Linguagem SQL crie o Schema de banco de dados para o seguinte modelo lgico:



NDICE


14









NDICE

uando criamos a estrutura de um banco de dados temos que usar artifcios que
melhorem a performance na recuperao dos dados que l sero armazenados.
Dentre vrias tcnicas existentes para melhorar a esta performance existe a criao de
ndices.
O ndice um arquivo auxiliar associado a uma Tabela. Sua funo acelerar o tempo
de acesso s linhas de uma Tabela, criando ponteiros para os dados armazenados em colunas
especificas. O Banco de dados usa o ndice de maneira semelhante ao ndice remissivo de um
livro, verifica um determinado assunto no ndice e depois localiza a sua posio em uma
determinada pgina.

1.1 CRIAO DE NDICE

O ndice serve para prover um acesso rpido a linhas das tabelas. Por meio dele
possvel unir uma ou mais colunas por onde o acesso mais frequente.

Exemplo:
Temos uma tabela de pessoas e normalmente queremos fazer buscas em ordem
alfabtica. O nome, no uma boa chave primria para a tabela por ser alfanumrica, o que
deixa as pesquisas mais lentas e tambm pela repetio de nomes. Dessa forma, cria-se um
ndice para o nome da pessoa. Assim, garante-se um acesso mais rpido aos nomes, visto que
os dados buscados estariam fora de sequncia.
Os valores indexados so armazenados em um objeto do banco de dados em ordem, o
que permite ao Sistema Gerenciador de Banco de Dados pesquisar primeiro no ndice, para
depois buscar na tabela. importante ressaltar que alguns bancos de dados necessitam de
ndices constantemente atualizados, pois eventualmente estes perdem a referncia ao dado.
O ndice quando criado com critrios bem definidos traz uma enorme vantagem, mas
por outro lado pode trazer enormes problemas, visto que todo trabalho de um Sistema
Gerenciador de Banco de Dados envolve um custo. No conveniente sair criando ndices
para cada um dos campos da tabela sem que haja uma razo para isto.
Quando um ndice criado uma das tarefas do Sistema Gerenciador de Banco de
Dados mant-lo atualizado a cada nova incluso, excluso e alterao nos dados. Alm do
mais, o ndice tambm ocupa espao no banco de dados, pois criado um novo objeto que
manter informaes indexadas e armazenar a referncia linha fsica da tabela.

Q
Parte
NDICE


15

NOTA:
Se so criados muitos ndices, pode-se prejudicar o desempenho do banco de dados
Se so criados poucos ndices, pode-se prejudicar o desempenho da aplicao.

Quando criar ndices?

a) Chaves Primrias: se o banco de dados no cri-las automaticamente, necessrio
faz-lo manualmente.
b) Chave Estrangeira: sempre recomendvel criar, principalmente, quando a tabela
que faz referncia muito grande.
c) Colunas utilizadas frequentemente na clusula WHERE ou JOIN do comando
SELECT.

Quando no criar ndices?

a) Colunas com muitos valores iguais.
b) Colunas com muito contedo NULO (no inicializados).
c) Tabelas pequenas.

NOTA:
Sempre que uma consulta estiver muito lenta, verifique a possibilidade de criar ndice
para facilitar a busca.

Para criar um ndice, utilize a seguinte sintaxe:

Sintaxe:

CREATE INDEX nome_index
ON nome_tabela (coluna [ASC|DESC])
Exemplo:

CREATE INDEX idx_dep_nome
ON departamento(dep_nome)

CREATE INDEX idx_dep_varios
ON departamento(dep_nome,dep_ramal)

Para excluir um ndice, utilize a seguinte sintaxe:

Sintaxe:

DROP INDEX nome_index
Exemplo:

DROP INDEX idx_dep_varios

No possvel modificar ndices. Para alterar um ndice, elimine-o e, depois, recrie-o.

NOTA:
Ao eliminar uma tabela, os ndices e as constraints so eliminados automaticamente.




NDICE


16

1.2 ACESSO A DADOS EM UM SISTEMA GERENCIADOR DE BANCO DE DADOS
Para compreender melhor a utilizao de ndices importante conhecer a estrutura de
acesso dados em um Sistema Gerenciador de Banco de Dados.


Figura 2 - Organizao de um SGBD
Neste contexto, observamos que os bancos de dados so armazenados fisicamente
como arquivos de registros, que so geralmente armazenados em discos magnticos. Assim,
os meios de armazenamento formam uma hierarquia de armazenamento que inclui duas
categorias principais:
- Armazenamento Principal: Operados diretamente pela CPU, como a Memria
Principal e Memria Cache.
- Armazenamento Secundrio: Inclui os discos magnticos, ticos e fitas. Geralmente
possuem uma capacidade maior, porm so mais lentos e no podem ser acessados
diretamente pela CPU.


Figura 3 - Estrutura de armazenamento
NDICE


17

A maioria dos bancos de dados est armazenada sob maneira permanente (ou
persistente) sob a forma de armazenamento secundrio.
Geralmente, o Sistema Gerenciador de Banco de Dados possui diversas opes
disponveis para organizar os dados, e o processo relativo ao projeto de banco de dados fsico
envolve escolher entre as opes, as tcnicas de organizao de dados.
Os dados armazenados em disco so organizados na forma de arquivos de registros.
Cada qual uma coleo de valores de dados que podem ser interpretados como fatos sobre
entidades, seus atributos e seus relacionamentos.
Para acessar uma informao no banco de dados considera-se o tipo de requisio e a
estrutura utilizada para organizao e acesso s chamadas pginas de dados.

1.2.1 Organizao dos dados em Memria Secundria

- Arquivos Heap ou pile (aglomerado): Melhor opo quando o acesso tpico uma
busca sequencial, sem ordem, recuperando todos os registros. Os registros so posicionados
no arquivo pela ordem na qual foram includos. So utilizados pelos ndices secundrios e
utilizados para coletar e armazenar registros de dados para utilizao futura.
Exemplo: um simples arquivo de registros de dados.

- Arquivos Ordenados: Melhor opo se os registros devem ser recuperados em
alguma ordem, ou quando somente uma poro contgua dos registros ordenados
necessria.
Exemplo: Arquivo de dados, possivelmente ordenado, alm de vrios ndices.

- Arquivos Hashed: Melhor para selees de igualdade. Uma funo hash aplicada
ao valor do campo de um registro e retorna o endereo do bloco do disco no qual o registro
est armazenado. Para a maioria dos registros, precisamos somente do acesso a um nico
bloco para recuperar aquele registro. No adequado para acesso sequencial ordenado.

Existem outras maneiras ou possibilidades para organizar arquivos, como rvores-B e
arquivos de registro mistos, que implementam relacionamentos entre registros de diferentes
tipos fisicamente como parte da estrutura de armazenamento.

1.3 INDEXAO
Como visto, os ndices so estrutura de dados que recebem como entrada uma
propriedade de registro (por exemplo, um valor de um ou mais campos) e os encontra com
essa propriedade rapidamente. Um ndice permite localizar um registro sem ter que examinar
mais que uma pequena frao dos registros possveis. Assim sendo, podemos concluir que os
campos cujos valores o ndice se baseia formam a chave de pesquisa.

NOTA
ndices so estruturas de dados auxiliares cujo nico propsito tornar mais rpido o
acesso a registros baseado em certos campos, chamados campos de indexao.




NDICE


18

1.3.1. Tipos de ndices

- ndices primrios - baseado na chave de ordenao;
- ndices de agrupamentos (clustering) - baseado no campo de ordenao no-chave de
um arquivo;
- ndices secundrios - baseado em qualquer campo no ordenado de um arquivo;
- ndices multinveis;
- rvores B e B+;
- Tabelas Hash;

Um dos mais antigos esquemas de ndice utilizados em sistema de banco de dados
chamado de arquivo indexado sequencialmente, que so projetados para aplicaes que
requerem tanto o processamento sequencial de um arquivo inteiro quanto o acesso aleatrio a
registros individuais.

Estes ndices podem ser:

- Densos: quando o nmero de entradas do ndice igual ao nmero de registros no
arquivo de dados. Cada registro no arquivo de ndice contm o endereo de um registro no
arquivo de dados.


Figura 4 - ndice denso sobre um arquivo de dados sequenciais
- Esparos: Usa-se menos espao de armazenamento que o ndice denso ao custo de
um tempo um pouco maior para localizar um registro dada a sua chave. quando o nmero de
entradas do ndice igual ao nmero de blocos do arquivo de dados. Apenas alguns
registros de dados so representados no arquivo de ndices. Em geral, aponta para o 1
registro de bloco.


Figura 5 - ndice esparso sobre um arquivo de dados sequenciais
P
o
n
t
e
i
r
o
s

P
o
n
t
e
i
r
o
s

NDICE


19

1.3.1.1 NDICE PRIMRIO

o ndice associado a uma chave primria. Nada mais do que um arquivo ordenado,
cujos registros so de tamanho fixo com dois tampos. O primeiro, do mesmo tipo do campo
chave de ordenao (chave primria) e o segundo um ponteiro para um bloco do disco ou
arquivo de dados.
Utiliza ndice esparo.


Figura 6 - ndice Primrio
1.3.1.2 NDICE DE AGRUPAMENTO (CLUSTERING)

Se os registros de um arquivo estiverem ordenados fisicamente por um campo que no
seja chave, ou seja, que no possui um valor distinto, esse campo chamado de campo
clustering. Semelhante ao ndice primrio possui dois campos de ordenao, no entanto o
primeiro campo do mesmo tipo do campo clustering e o segundo um ponteiro para o bloco.
Neste sentido sempre h a reserva de um bloco inteiro para cada valor de campo clustering,
melhorando operaes de incluso e excluso. Em simples palavras um ndice associado a
um campo no chave.
Utiliza ndice esparo.
NDICE


20


Figura 7 - ndice de Agrupamento
1.3.1.3 NDICE SECUNDRIO

No ndice secundrio o campo de indexao um campo no ordenado do arquivo de
dados. Pode haver muitos ndices secundrios para um mesmo arquivo.
Dois casos:
- O campo de indexao um campo chave (s vezes chamado de chave secundria).
- O campo de indexao no chave.

NDICE


21

possvel que mais de um registro tenha o valor da chave. Isso ocorre, por exemplo,
quando a chave de pesquisa no a chave primria;
Um ndice secundrio um ndice denso, normalmente com duplicatas. O ndice
consiste em pares de chaves-ponteiro. Neste caso, sempre que so permitidas chaves de
pesquisas duplicadas.

Figura 8 - ndice Secundrio

Outra possibilidade para ndices secundrios a entrada de ndice para um bloco de
dados onde a menor chave de pesquisa nova, isto , a chave no apareceu em um bloco
anterior;
Se no h chave de pesquisa nova no bloco, ento sua entrada de ndice contm a
nica chave de pesquisa encontrada nesse bloco;
Pode-se encontrar os registros de uma chave de pesquisa K examinando-se o ndice
para a primeira entrada cuja chave :
- Igual a K
- Menor que K, mas a prxima chave maior que K

Segue-se o ponteiro da entrada. Se for encontrado pelo menos um registro com a chave
de pesquisa K, ento a busca continua em blocos adicionais, at encontrar todos os registros
com a chave de pesquisa K.


Figura 9 - ndice Secundrio
NDICE


22


Usa o ndice esparso indicando a nova chave de pesquisa mais baixa em cada bloco.

ORGANIZANDO AS IDIAS:

Campos ordenados Campos no ordenados
Campo chave ndice primrio ndice Secundrio (chave)
Campo no chave ndice de agrupamento ndice Secundrio (no
chave)

Tipo de ndice Nmero de Entradas
Denso ou
Esparo
Primrio N de blocos no arquivo de dados Esparo
Agrupamento
N de valores distintos do campo de
indexao
Esparo
Secundrio (chave) N de registros no arquivo de dados Denso
Secundrio (no
chave)
N de registros no arquivo de dados Denso
N de valores distintos de indexao Esparo


1.3.1.4 NDICES MULTINVEIS

Uma pesquisa binria aplicada ao ndice para localizar ponteiros para um bloco do
disco ou para um registro no arquivo que possui um valor de campo ndice especfico.
Se o arquivo de ndices se torna muito grande para ser armazenado em bloco de disco,
interessante index-lo em mais de um nvel. A vantagem que um ndice pequeno pode ser
mantido em memria e o tempo de busca mais baixo; por outro lado, muitos nveis de ndices
podem aumentar a complexidade do sistema, sendo mais recomendado a utilizao de outra
estrutura como a que veremos mais a frente: rvore-B.

Figura 10 - ndices Multinveis
NOTA
Um ndice multinvel um ndice de ndice.
NDICE


23


- Primeiro nvel: arquivo ordenado pela chave de indexao, valores distintos, entradas
de tamanho fixo.
- Demais nveis: ndice primrio sobre o ndice do nvel anterior e assim
sucessivamente at que no ltimo nvel o ndice ocupe apenas um bloco.
- Nmero de acessos a bloco: um a cada nvel de ndice, mais um ao bloco do arquivo
de dados.

Figura 11 - ndice Primrio de dois Nveis
A figura acima exemplifica um ndice primrio de dois nveis que se parece com a
organizao ISAM (Indexed Sequential Acess Method - Mtodo de Acesso Seqencial
Indexado).
O problema dos ndices multinveis que so arquivos fisicamente ordenados, portanto,
ineficientes na insero e remoo. Para solucionar este problema podem-se adotar as
seguintes solues:
- Deixar algum espao em cada um dos blocos para insero de novas entradas.
- Estruturas de dados: rvores B e suas variaes.

a) Gerenciamento de ndices nas Modificaes de Dados

Os arquivos sequenciais apresentam problemas com o tempo, visto que um bloco no
mais suficiente para armazenar o contedo que era antes armazenado. Para contornar esse
problema possvel adotar as seguintes solues:
- Criar blocos de estouro (overflow). Blocos de estouro no tm entradas em um ndice
esparso;
NDICE


24

- Inserir novos blocos na ordem sequencial;
- Se no houver lugar para inserir informao em um bloco, alguma informao poder
ser transferida para outro bloco. De igual forma, blocos vazios podero ser combinados.

1.3.1.5 RVORE B


rvores B e B
+
so casos especiais de estruturas de dados bastantes conhecidas do
tipo rvore. Uma rvore formada por ns, e cada n na rvore, exceto um n especial
denominado raiz, possui um n pai e diversos ns filhos. Um n que no possui filhos
chamado de n folha.
Um modo de implementar uma rvore possuir tantos ponteiros em cada n quantos
forem os ns filhos daquele n. E para percorrer todos os ns, da rvore e da sub-rvore
necessrio fazer uso da recursividade.


Figura 12 - rvore de Grau 3

a) rvore de Pesquisa

Uma rvore de pesquisa um tipo especial de rvore que se utilizada para guiar a
pesquisa por um registro, dado o valor de um dos campos do registro.
A rvore de busca projetada com dois objetivos:
- Manter a rvore balanceada; e
- Evitar o desperdcio de espao dentro de um n, custa de maior complexidade nos
algoritmos de insero e remoo.

Regras:
- Os ns da sub-rvore esquerda contm valores menores que a raiz;
- Os ns da sub-rvore direita contm valores maiores ou iguais a raiz;
- As sub-rvores so rvores binrias de pesquisa.

NDICE


25


Figura 13 - Distribuio nos ns

b) rvore B

Em computao, rvore B ou B-Tree uma estrutura de dados rvores que so muito
utilizadas em banco de dados e sistema de arquivos.
Para inserir ou remover variveis de um n, o n no poder ultrapassar sua ordem e
nem ser menor que sua ordem dividida por dois. rvores B no precisam ser rebalanceadas
como so frequentemente as rvores de busca binria com rvore AVL. rvores B tm
vantagens substanciais em relao a outros tipos de implementaes quanto ao tempo de
acesso e pesquisa aos ns.
Uma rvore B de ordem "m" (mximo de filhos para cada n) uma rvore que atende
as seguintes propriedades:
- Cada n tem no mximo "m" filhos
- Cada n (exceto a raiz e as folhas) tem pelo menos "m/2" filhos
- A raiz tem pelo menos dois filhos se a mesma no for uma folha
- Todas as folhas aparecem no mesmo nvel e no carregam informao
- Um n no-folha com "k" filhos deve ter k-1 chaves

As vantagens da rvore B so:
- Melhor desempenho por ter um nmero menor de ns do que uma rvore binria. Por
exemplo: Menos ns significa menor altura que resulta em menos acessos ao disco.
- Por garantir poucos ponteiros entre os ns, h uma economia de espao.
- Maior rapidez em buscas pela utilizao de chaves primrias.
- Sua estrutura dinmica, ajustando automaticamente o balanceamento da rvore, a
cada incluso/excluso.
- Permite um tempo de acesso de dados menor, em uma busca aleatria, por causa de
suas ramificaes.

Algoritmos

INSERO

1. Primeiro pesquise a chave, para ter a certeza de que esta no existe na rvore.
2. Busque a posio onde esta ser inserida. Teste para ver se o n est cheio.
3. Se n estiver vazio, insira o valor dentro dele, seno execute uma subdiviso do n da
seguinte forma:
3.1. Verifique se o n-pai est vazio, se sim execute
3.1.1. Passe o elemento do meio do n para seu pai.
3.1.2. Divida o n em dois ns iguais.
NDICE


26

3.2. Se o n pai estiver cheio, repita as duas linhas acima recursivamente. (Caso todos os
ns-pai estiverem cheios, inclusive a raiz, deve ser criada uma nova raiz aumentando assim a
altura da rvore.
3.3. Somente depois de satisfeita todas as divises necessrias, insira nova chave.

EXCLUSO

1. Primeiro pesquise a chave para ter a certeza de que esta existe na rvore.
2. Se existir, verifique se est em folha, e faa a excluso.
3. Se existir e no estiver em folha, substitua esta chave pela menor chave do filho a direita.
3.1. Se o nmero de chave no n, for maior do que (Ordem/2 - 1), ento termine a rotina.
3.2. Seno redistribua as chaves entre os ns vizinhos.

BUSCA

1. Indique a chave que ser procurada.
2. Pesquise desde a raiz at encontr-la, e ento retorne o n e a posio desta.
3. Se a chave no for encontrada, continue o lao at encontrar um nil das folhas.

Exemplo:


Figura 14 - Operaes na rvore
Para melhor compreenso do conceito de rvore B, visite o link http://www.cse.ohio-
state.edu/~bondhugu/acads/234-tree/index.shtml e simule a insero, excluso e busca de
valores na rvore.

1.3.1.5 HASHING


So particularmente adequados para pesquisas por igualdade. A idia principal usar
uma funo de hashing. Esta funo mapeia um valor da chave de pesquisa (atributo de uma
tabela) em um registro ou balde (bucket) de registros.
NDICE


27


Figura 15 - Hashing
A balde uma unidade de armazenamento que contm um ou mais registros (um balde
tipicamente um bloco do disco). Numa organizao de ficheiro em hashing, obtemos o
balde de um registro a partir do valor da sua chave de pesquisa. Mais concretamente, o balde
obtido atravs do clculo da funo de hash para aquela chave de pesquisa.
A funo de hash h uma funo do conjunto de todos os valores da chave K para o
conjunto dos endereos de todos os baldes B. A funo de hash usada para localizar
registros para as operaes de acesso, insero, bem como eliminao. Observe os exemplos
de busca, insero e excluso.
A desvantagem do hashing esttico pode conduzir a longas cadeias de transbordo.

Busca Insero



Excluso

NDICE


28

Longas cadeias de transbordo podem desenvolver-se e degradar o desempenho.

a) Hashing Esttico

O hashing esttico escolhe a funo hash com base no tamanho do arquivo atual, ou
com base no tamanho antecipado do arquivo com base em um ponto no futuro. Esta tcnica
reorganiza periodicamente a estrutura de hash.

b) Hashing Dinmico

Diferente do hashing esttico a funo hash modificada dinamicamente para
acomodar o crescimento ou encolhimento do banco de dados, usando o hashing extensvel.

c) Hashing Extensvel

Divide e une os buckets enquanto o banco de dados cresce e encurta. A Eficincia do
espao mantida e a funo hash gera valores por intervalos relativamente grandes. Outra
caracterstica que os buckets so criados por demanda.
DATA MANIPULATION LANGUAGE - DML


29









DATA MANIPULATION LANGUAGE - DML

ma vez criada a estrutura fsica do banco de dados necessrio popular as tabelas.
Para isso utilizam-se os comandos da DML (Data Manipulation Language). Nesta seara
encontramos comandos como Insert, Update, Delete, Commit e Rollback.

DML(Linguagem de Manipulao de Dados):
Permite a incluso, remoo, seleo ou atualizao de dados armazenados no banco
de dados; Controle de acesso, permitindo proteo dos dados de manipulaes no
autorizadas;

3.1 INSERT
Comando responsvel por adicionar um ou mais registros na tabela de Banco de
Dados. Os campos que forem omitidos recebem valores NULOS (NULL).

Sintaxe:
INSERT [TRANSACTION transaction] INTO <object> [(col [, col ])]
{VALUES (<val> [, <val> ]) | <select_expr>};
<object> = tablename | viewname
<val> = {:variable | <constant> | <expr>
| <function> | udf ([<val> [, <val> ]])
| NULL | USER | RDB$DB_KEY | ?
}

Exemplo:
INSERT INTO clientes (id, nome) VALUES (1, Nome do Cliente);


NOTE BEM:
! A lista de colunas opcional no comando Insert;
! Caso no seja definida, assume-se a sequncia da criao da tabela;
! Para maior clareza do cdigo e evitar erros em caso de reestruturao da tabela
recomenda-se utilizar a lista de colunas.
! Valores alfanumricos devem ser especificados entre aspas simples exemplo;
! Valores numricos no devem conter esse separador.
U
Parte
DATA MANIPULATION LANGUAGE - DML


30

! Valores do tipo data devem ser tratados de acordo com as especificaes do SGBD;
! Ao incluir uma linha no Banco de Dados, o gerenciador checar as restries de
integridade (Constraints). Assim chaves primrias, estrangeiras, domnios, etc so checadas no
momento da incluso.
! Caso alguma restrio for violada, a linha no ser includa e uma mensagem ser
emitida pelo SGBD.
! As colunas que no tiverem valores atribudos tero contedo NULL ou default, caso
no haja a restrio NOT NULL.
! Para inserir um valor nulo deve informar NULL no lugar correspondente a coluna.

3.1.1 Inserindo Vrias Linhas

Para incluir diversas linhas em uma tabela, utiliza-se o comando INSERT em conjunto
com o comando SELECT. Isso ir copiar as linhas de uma tabela para outra; A lista de colunas
do SELECT deve corresponder a totalidade de colunas da tabela.

Exemplo:
INSERT INTO vendas_old SELECT * FROM vendas WHERE data_venda =
CURRENT_DATE;

Outra forma usando o comando INSERT por vrias vezes consecutivas acompanhado
do finalizador ponto-e-virgula . Ou tambm aps o comando VALUES colocando os dados
entre parnteses separados por vrgula.

Exemplo:
INSERT INTO vendas_old (prod_id, prov_valor) VALUES (1, 2.00),
(2, 3.00), (3, 5.00), (4, 10.00);

3.1.2 Laboratrio

INSERT INTO autor (aut_id, aut_nome) VALUES (1, Renato Russo);
INSERT INTO autor (aut_id, aut_nome) VALUES (2, Ton Jobim);
INSERT INTO musica (mus_id, mus_nome, mus_duracao) VALUES (1,
sera, 00:02:28);
INSERT INTO musica (mus_id, mus_nome, mus_duracao) VALUES (2, Ainda
Cedo, 00:03:55);
INSERT INTO gravadora (grav_id, grav_nome, grav_tel, grav_contato)
VALUES (1, EMI, 1122334455, Jos Vitor);
INSERT INTO cd(cd_id, cd_nome, cd_preco, dt_lancamento, grav_id)
VALUES (1, Mais do Mesmo, 20.50, 21.12.1998, 1);

3.1.3 Exerccios

a) Popule as tabelas do banco de dados conforme representado abaixo:

DATA MANIPULATION LANGUAGE - DML


31







ATENO:
Observe a sequncia de insero dos dados.

3.2 UPDATE

Comando responsvel alterao de ou um mais registros na tabela de Banco de Dados.

Sintaxe:
UPDATE [TRANSACTION transaction] {table | view}
SET col = <val> [, col = <val> ]
[WHERE <search_condition> | WHERE CURRENT OF cursor];

Exemplo:
UPDATE cliente SET data_inclusao = CURRENT_DATE;


3.2.1 Where

Comando responsvel por especificar qual registro da tabela ser alterado quando
usado em conjunto com a clusula UPDATE.
DATA MANIPULATION LANGUAGE - DML


32


NOTE BEM:
! O contedo a ser atualizado deve respeitar o tipo de dado da coluna.
! A condio expressa no comando servir para definir quais linhas devem ser
atualizadas.
! Caso a clusula WHERE contenha a chave primria somente uma linha da ser
atualizada.
! Todas as restries de integridade (Constraints) sero avaliadas pelo SGBD.

3.2.2 Laboratrio

Se quisermos alterar o preo de um CD, podemos utilizar o seguinte comando filtrando
na clusula WHERE a chave primria da tabela CD:

Exemplo:
UPDATE cd SET cd_preco = 21,00 WHERE cd_id = 1;

Se o aumento for para todos os CDs de uma determinada gravadora, utilizaremos como
filtro da clusula WHERE grav_id:

Exemplo:
UPDATE cd SET cd_preco = 22,00 WHERE grav_id = 1;

Imagine que ocorra um aumento de preo generalizado para todos os CDs em 5%.
Assim multiplica-se o prprio preo do CD por 1,05.

Exemplo:
UPDATE cd SET cd_preco = cd_preco * 1,05;

Outros Exemplos:
UPDATE cd SET cd_preco = 15 WHERE cd_id = 1;
UPDATE autor SET aut_nome = B. Manilow WHERE aut_id = 2;
UPDATE cd SET cd_preco = cd_preco * 1,10 WHERE grav_id = 3;
UPDATE gravadora SET grav_nome = E.M.I, grav_tel = 2144332211
WHERE grav_id = 1;

3.3 DELETE

Comando responsvel pela excluso de ou um mais registros na tabela de Banco de
Dados.


Sintaxe:
DELETE [TRANSACTION transaciona] FROM table
{[WHERE <search_condition>] | WHERE CURRENT OF cursor};

DATA MANIPULATION LANGUAGE - DML


33

Exemplo:
DELETE FROM VENDAS WHERE DATA_VENDA <= 01-01-1999;

3.3.1 Where

Comando responsvel por especificar qual registro da tabela ser excludo quando
usado em conjunto com a clusula DELETE.

NOTE BEM:
! O comando DELETE pode, da mesma forma que o comando UPDATE, afetar uma ou
mais linhas de uma tabela. Desta forma o escopo da excluso ser definido pela clusula
WHERE.
! Se for especificado na clusula WHERE a chave primria, somente uma linha ser
excluda.
! Antes de uma excluso, o gerenciador sempre far uma checagem na integridade
referencial.

3.4 CONTROLE BSICO DE TRANSAES

Uma vez realizadas as operaes de incluso, alterao e excluso, a modificao
realizada no estar ainda no banco de dados. Ela visvel apenas na seo atual.
Para que os comandos de Insert, Update e Delete sejam enviados para o banco
necessrio utilizar os comandos COMMIT ou descartados pelo comando ROLLBACK.


3.5 LABORATRIO

Neste primeiro exemplo, apenas o autor com cdigo 1 ser excludo (desde que no
haja relacionamentos com outras tabelas):

Exemplo:
DELETE FROM autor WHERE aut_id = 1;

Neste caso todos os CDs da gravadora 2 sero excludos:

Exemplo:
DELETE FROM cd WHERE grav_id = 2;

PESQUISA BSICA EM TABELAS


34










PESQUISA BSICA EM TABELAS

gora que j sabemos criar, incluir, alterar e excluir informaes nas tabelas, veja como
podemos extrair informaes do banco de dados. Para tanto o comando utilizado o
SELECT. Junto dele h uma imensa possibilidade de comandos como veremos a
seguir.

4.1 SELECT
o comando utilizado para realizar buscas/pesquisas no banco de dados. Atrs dele h
uma extenso de possibilidades que vo desde a simples extrao do contedo de todas as
linhas e colunas de uma tabela at a unio de diversas tabelas, clculos, agrupamentos,
ordenaes e filtragem de linhas e colunas.

Sintaxe:
SELECT [DISTINCT | ALL] {* | Coluna [, coluna, ...]}
FROM tabela
Onde:
DISTINCT: No mostra eventuais valores repetidos;
ALL: Mostra todos os valores (Propriedade Default do comando select);
*: Mostra todas as colunas da tabela;

NOTE BEM:
Para execuo dos exemplos utilizaremos estrutura criada na parte 3 DML.


Exemplos:
O exemplo mais simples de uma consulta extrair todas as informaes de uma tabela:

SELECT * FROM cd;

O exemplo a seguir demonstra como filtrar apenas algumas colunas da tabela:

SELECT cd_id, cd_nome FROM cd;
SELECT grav_id, grav_nome, grav_tel FROM gravadora;




A
Parte
PESQUISA BSICA EM TABELAS


35

4.1.1 Ordenando o resultado

Em muitas situaes a ordem mostrada nem sempre a que esperamos. Para que os
dados sejam mostrados da maneira que melhor nos atende usa-se a clusula ORDER BY
seguida pela coluna que desejamos que seja ordenada:

Exemplo:
SELECT aut_id, aut_nome FROM autor
ORDER BY aut_nome;

SELECT cd_id, cd_nome FROM cd
ORDER BY cd_id;

Se forem especificadas mais de uma coluna a serem ordenadas, o gerenciador primeiro
ordenar pela primeira coluna e em seguida pelas demais:

Exemplo:
SELECT grav_id, cd_nome FROM cd
ORDER BY grav_id, cd_nome;

4.1.2. Filtrando linhas

Para filtrar linhas em uma pesquisa, utilizamos a clusula WHERE. Assim, definida
uma expresso lgica (condio) que ser validada e mostrar apenas as linhas que
atenderem ao critrio estabelecido.

Sintaxe:
SELECT [DISTINCT | ALL] {* | Coluna [, coluna, ...]}
FROM tabela
WHERE condio

Para um resultado satisfatrio devemos saber exatamente como construir condies
que satisfaam s nossas necessidades de busca para atingir nossos objetivos. Sempre que a
condio especificada for verdadeira o resultado ser mostrado. Para tanto necessrio
utilizar-se de alguns operadores como veremos a seguir.

4.1.2.1 OPERADORES RELACIONAIS

Estes operadores devem ser usados na definio das condies. Podemos testar
igualdade, diferena, maior, menor, maior ou igual, menor ou igual. Os operadores devem ser
colocados entre os argumentos que esto sendo comparados.

OPERADOR SIGNIFICADO EXEMPLO
= Igual aut_id = 2
< Menos que cd_preco < 10
<= Menor ou igual a cd_preco <= 10
PESQUISA BSICA EM TABELAS


36

> Maior que cd_preco > 10
>= Maior ou igual a cd_preco <= 10
!= ou <> Diferente aut_id != 2 ou aut_id <> 2

Exemplo:
SELECT cd_nome, cd_preco FROM cd
WHERE cd_preco > 12;

NOTE BEM:
! Da mesma forma que podemos comparar uma coluna com um valor, podemos
comparar com outra coluna.
! Sempre quando fazemos esse tipo de comparao, devemos obedecer ao tipo de dado
que estamos comparando.


4.1.2.2 OPERADORES LGICOS

Muitas vezes, apenas uma condio no suficiente para determinarmos o critrio de
busca. Sempre que isso ocorrer, podemos utilizar operadores lgicos.

OPERADOR SIGNIFICADO EXEMPLO
AND e Condio-1 AND Condio-2
OR ou Condio-1 OR Condio-2
NOT ou ! no/negao NOT Condio

AND
Indica que as duas condies devem ser verdadeiras para que seja mostrada a linha.

Exemplo:
SELECT cd_nome, cd_preco, grav_id FROM cd
WHERE cd_preco > 10 AND grav_id = 2;

OR
Utilizamos o operador OR sempre que quisermos que o resultado final seja verdadeiro.

Exemplo:
SELECT cd_nome, cd_preco, grav_id FROM cd
WHERE cd_preco > 11 OR grav_id = 2

NOTE BEM
! No h limitao no uso e na combinao de condies usando OR e AND.
! conveniente utilizar parnteses para determinar o que se quer comparar.



PESQUISA BSICA EM TABELAS


37

Exemplo:
SELECT cd_nome, grav_id, cd_preco FROM cd
WHERE (grav_id = 2 OR grav_id = 3) AND (cd_preco >= 17.50)

NOT ou !
utilizado para inverter o resultado de uma expresso lgica, negando o resultado da
condio. Caso a condio seja verdadeira, ser retornado falso e vice-versa.

Exemplo:
SELECT cd_nome, cd_preco FROM cd
WHERE NOT (cd_preco > 15);


4.1.2.3 OPERADORES ESPECIAIS

Existem alguns operadores que so utilizados para determinar melhor as linhas que
queremos filtrar. So eles: IS NULL, IS NOT NULL, BETWEEN, LIKE e IN.

IS NULL
Sabemos que nem todas as colunas tm valores inicializados. Logo esse comando
utilizado para saber os campos que no foram inicializados:

Exemplo:
SELECT * FROM gravadora
WHERE grav_tel IS NULL

IS NOT NULL
Compara a negao do comando anterior. Somente aqueles que tiverem contedo
sero mostrados:

Exemplo:
SELECT * FROM gravadora
WHERE grav_tel IS NOT NULL

BETWEEN
Esse operador serve para determinar um intervalo de busca. Quando desejarmos um
intervalo entre nmeros, datas, etc, utilizaremos o BETWEEN para simplificar a forma de
escrevermos o comando. Normalmente utilizado em conjunto com o AND.

Exemplo:
SELECT cd_nome, cd_dt_lancamento FROM cd
WHERE cd.cd_dt_lancamento BETWEEN '1979-01-01' AND '2000-12-31';





PESQUISA BSICA EM TABELAS


38

LIKE
Com esse operador podemos comparar cadeias de caracteres utilizando padres de
comparao para um ou mais caracteres. O caractere percentual (%) substitui zero, um ou
mais caracteres e sublinha (_) substitui um caractere.

EXPRESSO APLICAO
LIKE A% Todas as palavras que iniciem com a letra A
LIKE %A Todas as palavras que terminem com a letra A
LIKE %A% Todas as palavras que tenham a letra A em qualquer posio
LIKE A_ String de dois caracteres que tenha a primeira letra A
LIKE _A String de dois caracteres que tenha o ltimo caractere letra A
LIKE _A_ String de trs caracteres cuja segunda letra seja A
LIKE %A_ Todas as palavras que tenham a letra A na penltima posio
LIKE _A% Todas as palavras que tenha a letra A na segunda posio

Exemplos:
SELECT * FROM autor
WHERE aut_nome LIKE 'R%';

SELECT * FROM gravadora
WHERE grav_nome LIKE '_o%';

Um problema que pode surgir quando queremos fazer buscas utilizando os caracteres
de substituio t-los na cadeia de caracteres que est sendo pesquisada. Neste caso
devemos usar um caractere especial denominado ESCAPE.

Exemplo:
SELECT * FROM cd
WHERE cd_nome LIKE '%\_%'ESCAPE '\';

IN
Permite comparar o valor de uma coluna com um conjunto de valores. Utilizamos para
substituir uma srie de comparaes seguidas da clusula OR.

Exemplo:
SELECT * FROM autor
WHERE aut_id IN (1, 3);

Sua maior utilizao em subquerys (ser visto posteriormente).




PESQUISA BSICA EM TABELAS


39

4.2. EXERCCIOS

a) Liste todos os campos e linhas da tabela GRAVADORA;

b) Liste todas as linhas dos campos CD_ID, CD_NOME, CD_PRECO da tabela CD;

c) Liste todas as linhas dos campos AUT_ID, AUT_NOME da tabela AUTOR em ordem
alfabtica;

d) Repita o comando anterior em ordem alfabtica decrescente;

e) Liste todos os CDs da gravadora 3;

f) Liste as colunas CD_NOME, CD_PRECO dos CDs cujos preos de venda sejam
inferiores a 20,00 e sejam da GRAVADORA 3;

g) Liste as colunas da tabela gravadora cujo GRAV_CONTATO seja nulo;

h) Repita o comando anterior desta vez listando GRAV_CONTADO no nulo;

i) Liste os CDs cujos CD_PRECO esteja entre 15,00 e 30,00;

j) Liste todos os CDs cuja CD_DT_LANCAMENTO seja posterior ao ano 01/01/2000;

k) Liste as MUSICAS cujo nome comece com A da tabela MUSICA;

l) Liste os CDs cuja segunda letra do CD_NOME seja a letra E;

m) Liste os CDs que possuam a letra O em qualquer posio do CD_NOME;

n) Liste os CDs que possuam CD_PRECO inferior a 30,00 em ordem decrescente de
CD_DT_LANCAMENTO;

o) Liste as msicas cuja MUS_ID seja 1, 3, 5;

CLCULOS E FUNES USUAIS


40










CLCULOS E FUNES USUAIS

m recurso bastante til e importante de SQL a possibilidade de se realizar clculos e
totalizaes de valores unitrios. Podemos realizar clculos quando realizamos buscas
no banco de dados simplesmente aplicando um dos operadores aritmticos a coluna.

Exemplo:
Um aumento de 5% em todos os CDs:

SELECT cd_id, cd_nome, cd_preco, preco_venda * 1.05
FROM cd;

Em alguns Sistemas Gerenciadores de Banco de Dados existem outras funes alm
das aritmticas, como a funo POWER do Oracle e Sysbase que permite calcular
exponenciao.

5.1 OPERADORES
Estes so os operadores utilizados no SQL:

OPERADOR SIGNIFICADO
+ Soma
- Subtrao
* Multiplicao
/ Diviso

A precedncia igual a da matemtica, ou seja, a multiplicao e a diviso tm prioridade
sobre a soma e subtrao.
Para alterar a prioridade deve-se utilizar parnteses (Operao).

Exemplo:
15 / 5 * 3, Resultado = 9
15 / (5 * 3), Resultado = 1

SELECT cd_id, cd_nome, cd_preco - (cd_preco * 0.10)
FROM cd
U
Parte
CLCULOS E FUNES USUAIS


41

5.1.1. CHARACTER_LENGTH / LENGTH

Retorna o nmero de caracteres contidos em uma cadeia de caracteres. Esta funo no
existe em todos os SGBD, como acontece no Firebird.

Exemplo:
SELECT CHARACTER_LENGTH (Renato Russo);

SELECT CHARACTER_LENGTH (cd_nome)
FROM cd
WHERE cd_id = 10;

5.1.2. Alfanumricos

Em SQL possvel concatenar alfanumricos e existem algumas funes para manipul-los.
Para concatenar caracteres, utiliza-se dois pipes ( || ).

Exemplo:
SELECT grav_id || ' - ' || grav_contato
FROM gravadora;

5.1.3. UPPER e LOWER

Ao realizar buscas alfanumricas no banco de dados notamos que os parmetros so case
sensitives. Assim sendo, possvel usar os comandos UPPER E LOWER para transformar a
cadeia de caracteres para maisculo e/ou minsculo.

Exemplo:
SELECT * FROM autor
WHERE UPPER(aut_nome) = RENATO RUSSO;

SELECT UPPER(aut_nome) FROM autor;

5.1.4. SUBSTRING

Essa funo requisito para SQL-92 ao nvel intermedirio. Retorna uma parte da cadeia de
caracteres.

Exemplo:
SELECT SUBSTRING(aut_nome from 1 FOR 3), aut_nome
FROM autor;

5.1.5. Manipulao de Datas

Em colunas do tipo data podemos realizar uma srie de clculos e operaes cronolgicas,
como calcular o nmero de dias entre duas datas, somar, subtrair dias, meses etc.
O padro especifica 04 (quatro) tipos de dados relacionados data e hora:
CLCULOS E FUNES USUAIS


42


Tipo Descrio
Date Apenas data
Time Apenas Hora
Timestamp Data/Hora
Interval Intervalo entre dois tipos

O padro SQL definiu algumas funes acrescentando CURRENT_:
- CURRENT_DATE
- CURRENT_TIME
- CURRENT_TIMESTAMP

Exemplos:
SELECT * FROM cd
WHERE cd_dt_lancamento = CURRENT_DATE;

Para saber a quantidade de dias que j se passaram depois do lanamento do CD usaramos o
comando:

SELECT CURRENT_DATE, cd_dt_lancamento, (CURRENT_DATE
cd_dt_lancamento) FROM cd

Adicionar dias em uma data:

SELECT cd_dt_lancamento + 7 FROM cd;

SELECT cd_dt_lancamento + INTERVAL 7 DAY
FROM cd;

5.1.6. EXTRACT

Essa funo extrai e retorna um valor de um campo do tipo data. possvel extrair apenas o
dia, o ms, o ano, a hora, etc.

Exemplo:
SELECT cd_dt_lancamento, EXTRACT(MONTH FROM cd_dt_lancamento)
FROM cd;

SELECT cd_dt_lancamento, EXTRACT(DAY FROM cd_dt_lancamento)
FROM cd;

Caso seja necessrio realizar a concatenao de dados do tipo DATE necessrio utilizar o
comando CAST para converter o tipo do dado para um tipo STRING.

SELECT cd_dt_lancamento, CAST(EXTRACT(MONTH FROM
cd_dt_lancamento) AS VARCHAR) ||'/'||
CAST(EXTRACT(DAY FROM cd_dt_lancamento) AS VARCHAR) FROM cd;
CLCULOS E FUNES USUAIS


43


5.2. EXERCCIOS


a. Monte uma pesquisa que mostre a data atual.

b. Escreva uma busca que mostre CD_NOME, CD_PRECO e CD_PRECO com 20% de
aumento.

c. Escreva uma busca igual anterior, porm acrescente uma coluna mostrando a diferena
entre o CD_PRECO e CD_PRECO com 20% de aumento.

d. Escreva uma busca que mostre GRAV_NOME, GRAV_CONTATO em uma nica coluna
separados por um hfen.

e. Escreva uma busca que mostre todos os autores que tenham a letra A no nome.

f. Escreva uma busca que mostre a primeira letra da MUS_NOME e a MUS_DURACAO da
tabela msica.

g. Escreva uma busca que mostre o CD_NOME e o nmero de dias entre a data atual e a data
de lanamento.

h. Escreva uma busca semelhante anterior que mostre uma coluna com 15 dias aps a
CD_DT_LANCAMENTO.

i. Escreva uma busca que retorne o ano de lanamento do CD_ID = 1, 2 e 3;

j. Escreva uma consulta que retorne os 05 primeiro caracteres de MUS_NOME e outra coluna
com MUS_NOME.

PESQUISA EM MLTIPLAS TABELAS


44










PESQUISA EM MLTIPLAS TABELAS

os captulos anteriores as pesquisas foram realizadas em apenas uma tabela. No
entanto, observamos no modelo criado, assim como acontece sempre, que uma tabela
est relacionada outra, sendo necessrio extrair informaes de duas ou mais tabelas
relacionadas ao mesmo tempo. Esta tarefa recebe o nome de unio ou juno de tabelas.
Isso se d por meio das chaves primrias e chaves estrangeiras, que so no modelo
fsico as colunas que as tabelas tm em comum.
Para os exemplos utilizados nesta aula fundamental fazer uso do Modelo Lgico para
melhor visualizar os relacionamentos.


Figura 16 - Modelo Lgico de Dados
N
Parte
PESQUISA EM MLTIPLAS TABELAS


45

6.1. ALIAS

Ao realizar pesquisa em diversas tabelas so referenciadas colunas pertencentes s
tabelas da relao. Dessa forma, necessrio distinguir a qual tabela pertence dada coluna.
Podemos fazer isso de duas formas:
a) Colocando o nome da tabela na frente do nome da coluna.

Sintaxe:
SELECT tabela.coluna
FROM tabela;

b) Utilizando um alias ou apelido para a tabela e colocando-o na frente da coluna.

Sintaxe:
SELECT t.coluna
FROM tabela t;

ainda possvel usar alias em nome de colunas, fazendo uso da clusula AS;

Sintaxe:
SELECT coluna AS nome_desejado
FROM tabela;

6.2. UNIO DE TABELAS

Para realizar a unio de tabelas basta acrescentar aps a clusula FROM do comando
SELECT as tabelas que queremos unir utilizando aps a clusula WHERE a condio de unio
entre elas (Chave Primria e Chave Estrangeira).

Sintaxe:
SELECT [tabela1.]coluna [, [tabela2.]coluna, ...]
FROM tabela1, tabela2 [, ...]
WHERE tabela1.PK = tabela2.FK

Uma prtica recomendvel utilizar o mesmo nome nos campos de chave primria e
chave estrangeira, pois dessa forma facilita a identificao dos campos ao realizar a unio das
tabelas.
possvel colocar diversas tabelas na clusula FROM. No devemos esquecer, porm,
que necessrio especificar as chaves primrias e chaves estrangeiras de cada
relacionamento.
Em caso de dvidas, consulte o Modelo de Dados para estabelecer quais so as
colunas comuns entre as tabelas. Da a importncia de se ter um bom projeto de Banco de
Dados claro e preciso.
A clusula WHERE deve conter todo canal de relacionamento entre as tabelas listadas
na clusula FROM sob pena de ocorrer o Produto Cartesiano.

PESQUISA EM MLTIPLAS TABELAS


46


6.3. PRODUTO CARTESIANO

Ocorrer um produto cartesiano sempre que:
- A condio de unio entre as tabelas for omitida (no houver clusula WHERE);
- Condio de unio entre as tabelas for invlida (clusula WHERE incorreta);
- Todas as linhas da primeira tabela estiverem unidas a todas as linhas da segunda
tabela.
- Nesta situao, as linhas da primeira tabela sero combinadas com as linhas da
segunda, demonstrando um resultado na maior parte das vezes indesejado.
- Esse procedimento muito utilizado para efetuar testes de performance no banco
devido a grande quantidade dedados.

Exemplo:
SELECT cd.cd_id, cd.cd_nome, gravadora.grav_nome
FROM gravadora, cd

Ao invs de se mostrar todos os dados, deseja-se visualizar os CDs e suas respectivas
gravadoras. Emprega-se ento, a Unio entre tabelas.

Exemplo:
SELECT cd.cd_id, cd.cd_nome, gravadora.grav_nome
FROM gravadora, cd
WHERE cd.grav_id = gravadora.grav_id

Usando alias:

SELECT c.cd_id, c.cd_nome, g.grav_nome
FROM gravadora g, cd c
WHERE c.grav_id = g.grav_id

6.4. UNIO REGULAR (INNER JOIN OU EQUI-JOIN)

Denomina-se unio regular as unies que tm a clusula WHERE unindo chave
primria e chave estrangeira como visto anteriormente.
O padro determina uma sintaxe alternativa para esse comando. Quando a chave
primria e a chave estrangeira tm o mesmo nome em ambas as tabelas possvel
simplificar o comando usando o comando NATURAL JOIN.

Exemplo:
SELECT cd.cd_id, cd.cd_nome, gravadora.grav_nome
FROM cd
NATURAL JOIN gravadora;

Outras duas maneiras definidas no padro SQL determinar qual(is) coluna(s) utilizar
na unio usando a clusula USING e caso o nome das colunas no sejam iguais, determinar
quais so as colunas com a clusula ON. Ambas produzindo o mesmo efeito.
PESQUISA EM MLTIPLAS TABELAS


47


Exemplo:
SELECT cd.cd_id, cd.cd_nome, gravadora.grav_nome
FROM cd JOIN gravadora USING (grav_id);

SELECT cd.cd_id, cd.cd_nome, gravadora.grav_nome
FROM cd JOIN gravadora ON gravadora.grav_id = cd.grav_id;


6.5. UNIO DE MAIS DE DUAS TABELAS

Frequentemente necessrio unir mais de duas tabelas para obter uma informao
consistente.
Suponha que queira saber o nome da msica, a faixa e o nome do CD em que est a
msica. No modelo de dados observamos a necessidade de se consultar trs tabelas no Banco
de Dados.

Exemplo:
SELECT c.cd_nome, f.fai_numero, m.mus_nome
FROM cd c, faixa f, musica m
WHERE c.cd_id = f.cd_id AND
m.mus_id = f.mus_id

O cdigo abaixo produziria o mesmo efeito:
SELECT c.cd_nome, f.fai_numero, m.mus_nome
FROM faixa f
INNER JOIN cd c ON c.cd_id = f.cd_id
INNER JOIN musica m ON m.mus_id = f.mus_id

Observe que possvel realizar a unio de tantas tabelas quanto forem necessrias.
SELECT a.aut_nome, g.grav_nome
FROM autor a, cd c, gravadora g, faixa f, musica_autor ma, musica
m
WHERE a.aut_id = ma.aut_id AND
m.mus_id = ma.mus_id AND
m.mus_id = f.mus_id AND
c.cd_id = f.mus_id AND
g.grav_id = c.grav_id


6.6. UNIES EXTERNAS (OUTER-JOIN)

Observa-se na unio entre tabelas que quando uma linha no satisfaz a condio de
unio entre as tabelas, ela no ser mostrada no resultado da busca. Isto acontece porque o
banco de dados, no podendo estabelecer a relao entre as colunas que esto sendo unidas
na busca, coloca NULL onde o dado no existe.

PESQUISA EM MLTIPLAS TABELAS


48


Exemplo:
SELECT cd.cd_id, cd.cd_nome, gravadora.grav_nome
FROM gravadora, cd
WHERE cd.grav_id = gravadora.grav_id

No resultado observamos que alguns dados de gravadora so omitidos.
Define-se Unio Externa como aquela que inclui linhas no resultado da busca mesmo
que no haja relao entre as duas tabelas.
Para que os dados omitidos sejam mostrados utilizaremos o comando SELECT
utilizando Unio Externa.

6.6.1. Unio Externa Esquerda (Left Outer-Join)

Como o nome diz, a unio pela esquerda incluir todas as linhas da primeira tabela na
expresso, ou seja a tabela da esquerda ser a tabela base para a unio.
Observe esse comando e depois inverta a posio das tabelas GRAVADORA e CD.

Exemplo:
SELECT cd.cd_id, cd.cd_nome, gravadora.grav_nome
FROM gravadora
LEFT OUTER JOIN cd ON (gravadora.grav_id = cd.grav_id)

Neste caso, todas as gravadoras so mostradas independente de haver ou no dados
relacionados na tabela CD.

6.6.2. Unio Externa Direita (Right Outer-join)

Ao contrrio da anterior, a unio realizada pela direita, pois incluir todas as linhas da
tabela da direita na expresso da unio, ou seja a tabela da direita ser a tabela base para a
unio.

Exemplo:
SELECT cd.cd_id, cd.cd_nome, gravadora.grav_nome
FROM gravadora
RIGHT OUTER JOIN cd ON (gravadora.grav_id = cd.grav_id)

NOTA:
Se a tabela da referncia (direita ou esquerda) for a que contm a chave estrangeira,
ocorrer uma unio regular entre as tabelas.

6.6.3. Unio Externa Total (Full Outer-join)

Realiza uma unio independente da coluna opcional estar direita ou esquerda.
Neste caso, so geradas linhas que no existem em uma ou em ambas as tabelas.


PESQUISA EM MLTIPLAS TABELAS


49


Exemplo:
SELECT cd.cd_id, cd.cd_nome, gravadora.grav_nome
FROM gravadora
FULL OUTER JOIN cd ON (gravadora.grav_id = cd.grav_id)

Neste caso a consulta age como uma unio externa a direita ou a esquerda por no
haver campos nulos na coluna de chave estrangeira de CD.

6.7. EXERCCIOS

a. Faa uma busca que mostre todos os CDs e o nome de suas respectivas
gravadoras.

b. Faa uma pesquisa que mostre o produto cartesiano das tabelas MUSICA e CD.

c. Realize uma consulta se utilizando da sintaxe JOIN que mostre todas MUSICAS e o
nome de seus respectivos CDs.

d. Crie uma pesquisa que retorne como resultado todas as gravadoras e seus
respectivos CDs mesmo que estes no possuam CDs associados.

e. Crie uma pesquisa que mostre o AUTOR e suas MUSICAS ordenadas por AUTOR.

f. Acrescente a pesquisa anterior o nome do CD que foi gravado a msica.

g. Crie uma pesquisa que mostre em quais gravadoras os autores tem realizado suas
gravaes.
FUNES DE GRUPO E AGRUPAMENTO


50










FUNES DE GRUPO E AGRUPAMENTO

t agora trabalhamos com funes que tratavam apenas de uma linha. Contudo, em
diversas situaes necessrio trabalhar com vrias linhas da consulta. Dessa forma,
necessrio conhecer funes especiais denominadas funes de grupo e agrupamento.

7.1. FUNES DE GRUPO

Funes de grupo operam conjuntos de linhas visando a fornecer um resultado para o grupo.
Estes grupos podem ser constitudos desde toda a tabela at subgrupos da tabela. Existem
diversas funes de grupo que so implementadas pelo padro SQL.
As principais funes so:

FUNO DESCRIO
COUNT Retorna nmero de linhas afetadas pelo comando.
SUM Retorna o somatrio do valor das colunas especificadas
AVG Retorna a mdia aritmtica dos valores das colunas
MIN Retorna o menor valor da coluna de um grupo de linhas
MAX Retorna o maior valor da coluna de um grupo de linhas
STDDEV Retorna o desvio-padro da coluna
VARIANCE Retorna a varincia da coluna

7.1.1. COUNT

Diferente das outras funes de grupo, o COUNT retorna o nmero de linhas que
atende a uma determinada condio.
Podemos utiliz-lo com um asterisco entre parnteses, para indicar que queremos saber
a quantidade total de linhas independente de haver linhas com colunas nulas ou no.

Exemplos:
SELECT COUNT(*)
FROM gravadora;

SELECT COUNT(grav_contato)
FROM gravadora;

Efeito semelhante pode ser conseguido com o seguinte comando:

A
Parte
FUNES DE GRUPO E AGRUPAMENTO


51

Exemplos:
SELECT COUNT(grav_contato)
FROM gravadora
WHERE grav_contato IS NOT NULL;

Diferente de:
SELECT COUNT(*)
FROM gravadora
WHERE grav_contato IS NULL;

Outra maneira utilizando o comando DISTINCT. Observe a diferena entre os dois
comandos:

Exemplos:
SELECT COUNT(DISTINCT aut_id)
FROM musica_autor;

SELECT COUNT(aut_id)
FROM musica_autor;

7.1.2. SUM

Retorna o valor total de uma determinada coluna em um determinado grupo de linhas.

Assim se quisermos saber o total do preo de venda dos CDs, utilizamos o comando:

Exemplo:
SELECT SUM(cd_preco)
FROM cd;

possvel realizar clculos baseados na somatria ou mesmo incluir outras colunas e
operaes no comando.

Exemplo:
SELECT SUM(cd_preco) * 1.2
FROM cd;

7.1.3. AVG

Extrai a mdia aritmtica de um determinado grupo de linhas.

Para saber o preo mdio dos CDs da loja execute o seguinte comando:

Exemplo:
SELECT AVG(cd_preco)
FROM cd;

FUNES DE GRUPO E AGRUPAMENTO


52

7.1.4. MIN

Retorna o menor valor de uma coluna em um grupo de linhas. Podemos utiliz-la em
colunas do tipo data ou alfanumricas.

Para saber o preo de venda do CD mais barato execute o seguinte comando:

Exemplos:
SELECT MIN(cd_preco)
FROM cd;

SELECT MIN(cd_dt_lancamento)
FROM cd;

SELECT MIN(cd_nome)
FROM cd;

7.1.5. MAX

Retorna o maior valor de uma coluna em um grupo de linhas. Podemos utiliz-la em
colunas do tipo data ou alfanumricas.

Para saber o preo de venda do CD mais caro execute o seguinte comando:

Exemplos:
SELECT MAX(cd_preco)
FROM cd;

SELECT MAX(cd_dt_lancamento)
FROM cd;

SELECT MAX(cd_nome)
FROM cd;

7.1.6. STDDEV (No funciona em alguns bancos de dados.)

Retorna o desvio padro de uma determinada coluna.
Para saber o desvio padro dos preos de venda dos CDs da loja execute o seguinte
comando:

Exemplo:
SELECT STDDEV(cd_preco)
FROM cd;

7.1.7. VARIANCE (No funciona em alguns bancos de dados.)

Retorna a varincia de uma determinada coluna.

FUNES DE GRUPO E AGRUPAMENTO


53

Para saber a varincia do preo de venda dos CDs da loja execute o seguinte
comando:

Exemplo:
SELECT VARIANCE(cd_preco)
FROM cd;

7.2. AGRUPANDO RESULTADOS

possvel agrupar valores com base em determinadas colunas. Desta forma,
estaremos trabalhando um pequeno grupo de dados. Para isso usamos a clusula GROUP BY.

7.2.1. GROUP BY

O comando GROUP BY deve vir antes da clusula ORDER BY e depois do WHERE (se
houver necessidade de utiliz-lo). utilizado com uma funo de grupo (COUNT, SUM, AVG,
MIN ou MAX).

Para saber quantas msicas h em cada CD:

Exemplo:
SELECT cd_id, COUNT(*)
FROM faixa
GROUP BY cd_id;

Para o preo mdio de venda de cada CD agrupado por gravadora:

Exemplo:
SELECT grav_id, AVG(cd_preco)
FROM cd
GROUP BY grav_id;

possvel realizar mais de uma funo de grupo dentro de um mesmo SELECT. Neste
exemplo, alm do preo de venda, temos a quantidade de CDs de cada gravadora:

Exemplo:
SELECT grav_id, AVG(cd_preco), COUNT(*)
FROM cd
GROUP BY grav_id;

7.3. AGRUPAMENTOS COM MAIS DE UMA TABELA

Podemos unir mais de uma tabela com as regras j citadas.




FUNES DE GRUPO E AGRUPAMENTO


54

Exemplo:
SELECT c.grav_id, g.grav_nome, AVG(c.cd_preco)
FROM cd c, gravadora g
WHERE c. grav_id = g.grav_id
GROUP BY c.grav_id, g.grav_nome

NOTA
necessrio colocar todas as colunas que fazem parte do comando SELECT na clusula
GROUP BY.
Caso se deseje ordenar o resultado, basta acrescentar o comando ORDER BY no final do
comando aps o comando GROUP BY:

Exemplo:
SELECT c.grav_id, g.grav_nome, AVG(c.cd_preco)
FROM cd c, gravadora g
WHERE c. grav_id = g.grav_id
GROUP BY c.grav_id, g.grav_nome
ORDER BY g.grav_nome desc

7.4. RESTRINGINDO O RESULTADO

Em algumas situaes os dados agrupados podem ser restringidos ou filtrados. At
agora vimos que toda tabela era afetada pelo comando GROUP BY. Contudo, nem sempre
isso desejvel.
Para isso podemos utilizar a clusula WHERE em conjunto com GROUP BY ou utilizar
a clusula HAVING.
Retornar o total de autores agrupados por MUS_ID sendo este menor que 3:

Exemplo:
SELECT mus_id, COUNT(*)
FROM musica_autor
WHERE mus_id < 3
GROUP BY mus_id;
ou
SELECT mus_id, COUNT(*)
FROM musica_autor
GROUP BY mus_id
HAVING mus_id < 3;

NOTE BEM

Usando o filtro da clusula WHERE as linhas so filtradas antes do agrupamento;
Usando HAVING, as linhas so filtradas depois do agrupamento.
A nica restrio que a clusula HAVING s pode usar as colunas que fazem parte do
GROUP BY. Para o WHERE isso no acontece.
Nunca use na clusula WHERE uma funo de grupo para filtrar os grupos. Dessa forma, o
comando abaixo invlido:
FUNES DE GRUPO E AGRUPAMENTO


55



Exemplos:
SELECT GRAV_ID, AVG(cd_preco) FROM cd
WHERE AVG(cd_preco) > 12
GROUP BY grav_id

A forma correta seria:
SELECT grav_id, AVG(cd_preco) FROM cd
GROUP BY grav_id
HAVING AVG(cd_preco) > 12


7.5. EXERCCIOS

a. Verifique o maior e menor valor entre os preos de venda dos CDs.

b. Verifique a diferena entre o maior e menor valor dos preos de venda dos CDs.

c. Verifique a quantidade de dias compreendidos entre a data mais atual e a data mais
antiga das datas de lanamento dos CDs;

d. Mostre atravs de uma consulta o tempo total do CD 1 (cd_id = 1);

e. Mostre atravs de uma consulta a mdia de durao das msicas cujo nome comece
com a letra A;

f. Faa uma consulta que retorne a quantidade de CDs cadastrados.

g. Faa uma consulta que retorne a o nome do CD e a mdia de durao das msicas
em cada CD, desde que esta mdia no seja superior a 4.

h. Faa uma consulta que retorne os autores que so autores de mais de uma msica.
SUBCONSULTAS


56










SUBCONSULTAS SUBQUERIES

as sesses anteriores exploramos largamente o comando SELECT utilizando-o em
conjunto com uma gama de funes. Ainda neste contexto, possvel incluir
subconsultas dentro das consultas principais.

8.1. SUBQUERY

As subqueries fazem parte do padro SQL-86 logo, todos os bancos de dados
relacionais que utilizam SQL devem permitir essa utilizao.

Sintaxe:
SELECT colunas
FROM tabela
WHERE expresso operador (SELECT colunas FROM tabela
WHERE ...)

H trs tipos de subquery:
a) Subquery de uma linha: o retorno do SELECT interno ser uma nica linha.
b) Subquery de mltiplas linhas: o retorno do SELECT interno ser mais de uma
linha.
c) Subquery de mltiplas colunas: o retorno do SELECT interno ser conter mais de
uma linha e coluna.

8.1.1. Subquery de uma linha

Neste caso, primeiro realizada a busca em uma tabela e, com base no resultado,
pesquisada a outra tabela.

Exemplo:
SELECT cd_nome, cd_preco FROM cd
WHERE cd_preco > (SELECT AVG(cd_preco) FROM cd)

Acima utilizada uma subquery para verificar a mdia de preo dos CDs e, com base
nesse resultado, extrado o resultado da busca do primeiro SELECT.



N
Parte
SUBCONSULTAS


57

Exemplo:
SELECT grav_id, cd_nome, cd_preco FROM cd c
WHERE cd_preco > (SELECT AVG(cd_preco) FROM cd
WHERE grav_id = c.grav_id)

Acima so buscados apenas os CDs que tenham preo de venda superior a mdia da
prpria gravadora.
Muito cuidado ao usar essa construo, porque ele tende a consumir muito recurso do
banco de dados, pois a cada linha do primeiro SELECT ser extrado a mdia no segundo
SELECT.
Assim necessrio saber qual a gravadora do primeiro SELECT, para poder calcular o
segundo SELECT.

NOTA
- Coloque as subqueries entre parnteses.
- Coloque a subquery direita do operador.
- No use a clusula ORDER BY em uma subquery. Se for necessrio ordenar faa-o
no SELECT principal.
- Use operadores de grupo apenas em buscas que potencialmente retornem mais de
uma linha.
- Use operadores de linha apenas em buscas que retornem uma nica linha.

Exemplo:
SELECT grav_id, cd_nome, cd_preco FROM cd
WHERE grav_id = (SELECT grav_id FROM cd WHERE cd_id = 2) AND
cd_preco > (SELECT cd_preco FROM cd WHERE cd_id = 5);


8.1.1.1. SUBQUERY EM CLUSULA HAVING

A utilizao semelhante a clusula WHERE. A subquery ser executada primeiro e o
resultado da busca servir de base para filtrar as linhas do GROUP BY.

Exemplos:
SELECT grav_id, MIN(cd_preco) FROM cd
GROUP BY grav_id
HAVING MIN(cd_preco) > (SELECT cd_preco FROM cd
WHERE cd_id = 2)

SELECT grav_id, MAX(cd_preco) FROM cd c
GROUP BY grav_id
HAVING MAX(cd_preco) > (SELECT AVG(cd_preco) FROM cd
WHERE grav_id = c.grav_id)




SUBCONSULTAS


58


8.1.1.2. COMANDO EXISTS

Verifica o nmero de linhas retornadas pela subquery. Caso contenha uma ou mais
linhas, ento o resultado ser mostrado.

Exemplo:

SELECT grav_id, grav_nome FROM gravadora
WHERE EXISTS (SELECT * FROM cd
WHERE cd.grav_id = gravadora.grav_id)

Note que quando se est utilizando esse operador, no importa o que o comando
SELECT interno ir buscar. Interessa apenas se ele retorna ou no linhas, Por esse motivo
usado o * em vez de uma coluna em especial.

8.1.2. Subquery de mltiplas linhas

Neste caso o SELECT interno retorna mais de uma linha. No possvel utilizar
operadores simples como igualdade, diferena, maior ou menor.
Utilizam-se operadores de grupo para realizar a comparao, como:
- ANY
- ALL
- IN

8.1.2.1. IN

Imagine que queremos saber quais CDs tm o preo igual ao menor preo de cada
gravadora. Inicialmente devemos saber qual o menor preo de cada gravadora.

SELECT MIN(cd_preco) FROM cd
GROUP BY grav_id

Para saber quais so os CDs escreveramos o seguinte comando:

SELECT cd_id, cd_nome, cd_preco FROM cd
WHERE cd_preco IN (19, 23, 11)

Para fazer isso em um nico comando, escreveramos o comando da seguinte forma:

SELECT cd_id, cd_nome, cd_preco FROM cd
WHERE cd_preco IN (SELECT MIN(cd_preco) FROM cd
GROUP BY grav_id)




SUBCONSULTAS


59


8.1.2.2. ANY (Compara com qualquer valor)

Esse operador permite comparar operadores simples (=,<,>,!=) com um grupo de linhas.
Imagine que desejamos saber quais CDs tm preo inferior a qualquer outro da gravadora com
cdigo 2, mas que no sejam da gravadora 2.
Inicialmente preciso saber qual o preo de venda de cada CD que no seja da
gravadora 2:

SELECT cd_id, cd_nome, cd_preco FROM cd
WHERE grav_id != 2

Depois precisamos saber quais os preos dos CDs da gravadora 2 com o comando da
seguinte forma:

SELECT cd_preco FROM cd
WHERE grav_id = 2

Agora realizamos a pesquisa na tabela de CD para comparar os preos inferiores a
esses:

SELECT cd_id, cd_nome, cd_preco FROM cd
WHERE cd_preco < ANY (SELECT cd_preco FROM cd
WHERE grav_id = 2)
AND grav_id != 2

8.1.2.3. ALL

Esse operador usado em combinao com operadores simples (<,>) para que os
valores retornados de todas as linhas do SELECT interno sejam comparados com o SELECT
externo.
Imagine que queiramos saber quais CDs tm o preo de venda menor que a mdia de
preo de venda de todas as gravadoras.
Inicialmente necessrio saber a mdia de preos por gravadora:

SELECT AVG(cd_preco) FROM cd
GROUP BY grav_id;

Depois verificamos quais so os CDs com preo inferior a todos anteriores.

SELECT cd_id, cd_nome, cd_preco FROM cd
WHERE cd_preco < ALL (SELECT AVG(cd_preco) FROM cd
GROUP BY grav_id)




SUBCONSULTAS


60


8.1.3. Subquery de mltiplas colunas

A tcnica consiste em colocar as colunas unidas na clusula WHERE do SELECT
externo e realizar a busca no SELECT interno dessas colunas unidas da mesma forma. Essa
tcnica tende a ser muito lenta, mas pode ser feita em qualquer banco de dados.
Temos vrios CDs indicados no cadastro e queremos conhecer os dados do CD dentre
os menores CDs indicados de cada gravadora. Para isso temos que saber o menor CD
indicado de cada gravadora. Utilizamos o || para unir as colunas.

Exemplo:
SELECT grav_id || cast(MIN(cd_indicado) as varchar)
FROM cd
GROUP BY grav_id

Agora realizamos a busca dos dados que atendem essas caractersticas:

SELECT cd_id, cd_nome, grav_id, cd_indicado
FROM cd
WHERE (grav_id || cast (cd_indicado as varchar)) IN
(SELECT grav_id || cast(MIN(cd_indicado) as varchar) FROM cd
GROUP BY grav_id)

Outra tcnica consiste em colocar as colunas de busca entre parnteses no SELECT
externo, entretanto no est disponvel em alguns bancos de dados.

Exemplo:
SELECT cd_id, cd_nome, grav_id, cd_indicado FROM cd
WHERE (grav_id, cd_indicado) IN
(SELECT grav_id, MIN(cd_indicado) FROM cd
GROUP BY grav_id)

NOTA:
Quando um SELECT interno contiver valores nulos, no deve ser utilizado NOT IN
como operador de comparao. Isso porque qualquer comparao com nulo retorna nulo.


8.1.4. Subquery na Clusula FROM

Podemos utilizar uma subquery na clusula FROM de um comando SELECT.
Essa estrutura no est disponvel para todos os bancos de dados, mas faz parte do
padro SQL. Sua utilizao muito parecida com as vises (Views).
Imagine que queremos extrair o nome do CD, seu preo e o preo mdio da gravadora,
e o preo mdio da gravadora extrado por uma subquery na prpria clusula FROM:



SUBCONSULTAS


61


Exemplo:
SELECT a.cd_nome, a.cd_preco, b.preco_medio
FROM cd a, (SELECT grav_id, AVG(cd_preco) as preco_medio FROM cd
GROUP BY grav_id) b
WHERE a.grav_id = b.grav_id
AND a.cd_preco > b.preco_medio

Veja que foi substituda a segunda tabela por um comando SELECT e que a tabela
recebeu o apelido de b.

8.2. EXERCCIOS

a) Faa uma lista de CDs usando subquery que foram gravados pela gravadora 2.

b) Faa uma lista que mostre os CDs que custam mais que a mdia de preo dos CDs
gravados pela gravadora 1.

c) Faa uma consulta usando a clusula HAVING que retorne o CD mais barato que a
mdia de preo dos CDs.

d) Faa uma lista que mostre os CDs cujas msicas tem durao maior que 00:02:00.

e) Faa uma lista que mostre quais CDs tem preos superiores a qualquer CD da
gravadora 1 excluindo os da prpria gravadora 1.

VISES/VIEW


62







VISES/VIEW

nteriormente aprendemos a criar consultas em bancos de dados com a linguagem SQL
usando uma srie de funes que permitem a extrao dos dados de diversas formas.
Nesta sesso veremos a utilizao de vises (Views), tambm chamadas de tabelas
virtuais em sistemas de bancos de dados.
As views so um modo especial de enxergar dados de uma ou vrias tabelas. um
objeto de banco de dados criado a partir de um comando SELECT.
importante saber que ela armazenada no dicionrio de dados e possui a mesma
estrutura de uma tabela.
As views permitem restringir o acesso aos dados, por exemplo, utilizando o comando
SELECT podemos filtrar linhas e coluna que no devam ser mostradas a todos os usurios.
As buscas complexas tornam-se simples, pois ao DBA possvel criar consultas
complexas em forma de vises e ao usurio realizar as buscas necessrias nessa viso.
Outro aspecto a independncia de dados: as vises podem ser criadas visando
atender necessidades genricas e no apenas s relacionadas a pessoa ou programas.
Podemos buscar dados em diversas tabelas.
A eliminao de cdigos outra razo: normalmente os cdigos no devem ser
mostrados aos usurios, pois so utilizados apenas para estabelecer relacionamento entre as
tabelas. Dessa forma facilita a compreenso dos dados pelo usurio.

9.1. CLASSIFICAO

As vises podem ser classificadas de duas formas:

a) Simples:
- Os dados so extrados de uma nica tabela;
- No contm funes.
- No possuem dados agrupados.
- Podem utilizar comandos DML para manipular os dados.

b) Complexas:
- Os dados so extrados de vrias tabelas.
- Podem conter funes.
- Podem conter dados agrupados.
- No podem utilizar comandos DML para manipulao de dados, exceto no Oracle,
pois possui recursos especficos para isso.

A
Parte
VISES/VIEW


63

9.2. CRIAO DA VISO

Para criar uma viso, utilizamos o comando CREATE VIEW:

Sintaxe:
CREATE VIEW nome
AS query/subquery

Exemplo:
CREATE VIEW vCD AS
SELECT cd_id, cd_nome, cd_preco FROM cd;

Como visto anteriormente esta uma viso simples.
Como uma viso sempre baseada em um comando SELECT, podemos criar vises
extremamente complexas.

Exemplos:
CREATE VIEW vPRECO_CD AS
SELECT grav_id, cd_nome, cd_preco FROM cd
WHERE grav_id = (SELECT grav_id FROM cd
WHERE cd_preco > 10.00)

CREATE VIEW vCD_FAIXA AS
SELECT cd_id, item_faixa FROM item_cd
WHERE mus_id IN (SELECT mus_id FROM musica
WHERE UPPER(mus_nome) LIKE %A)

CREATE VIEW VGRAV_MAX AS
SELECT grav_id, cd_preco FROM cd a
WHERE cd_preco > (SELECT AVG(cd_preco) FROM cd
WHERE grav_id = a.grav_id)


9.3. BUSCANDO CONTEDO DE VISES

Utilizamos o comando SELECT para buscar o contedo de vises exatamente como
fazemos com qualquer tabela.

Exemplo:
SELECT * FROM vCD;
SELECT * FROM vCD_FAIXA;

Podemos, ainda, incluir qualquer outra clusula do comando SELECT, mesmo em
pesquisa realizadas em vises.



VISES/VIEW


64

Exemplo:
SELECT * FROM VPRECO_CD
WHERE cd_preco > 8;

9.4. UTILIZAO DE COMANDOS DML EM VISES

Somente em vises simples possvel utilizar comandos DDL. O padro SQL
determina as condies em que uma viso pode ser atualizada:
- Deve ser criada em uma nica tabela;
- Deve conter apenas um SELECT;
- Se foi criada com base em outra viso, a primeira viso dever ser passvel de
atualizao;
- O comando SELECT no pode conter colunas calculadas;
- No deve utilizar GROUP BY;
- No deve conter a clusula DISTINCT;
- Pode conter uma subquery, desde que o SELECT interno tenha como base a mesma
tabela do SELECT externo;
- Incluses s podem ser feitas caso a viso contenha a chave primria da tabela base.
- Excluses e alteraes em vises sem a chave primria da tabela base so
permitidas, porm desaconselhveis, pois no se sabe ao certo o resultado que pode aparecer.
Isso chamado de Materializao de Views.

9.5. EXCLUINDO UMA VISO

Para excluir uma viso, utilizamos o comando DROP VIEW;
Ao excluir uma viso no estamos excluindo os dados (linhas e colunas), visto que
apenas uma tabela virtual.

Sintaxe:
DROP VIEW nome;

Exemplo:
DROP VIEW vCD;


9.6. EXERCCIOS

a) Crie uma viso que mostre uma lista de CDs que foram gravados pela gravadora 2.

b) Crie uma viso que mostre os CDs e suas respectivas gravadoras.

c) Crie uma viso que mostre as msicas e seus respectivos autores.

d) Construa uma viso que mostre as msicas sua durao e a que CD pertence.

e) Construa uma viso que mostre os autores e em quais gravadoras possuem CD
gravado.
PROCEDIMENTOS ARMAZENADOS/STORED PROCEDURES


65










PROCEDIMENTOS ARMAZENADOS


m muitas situaes ser necessrio armazenar procedimentos escritos com a finalidade
de se utilizar recursos como loop, estruturas de deciso, etc. Para isso, utiliza-se os
procedimentos armazenados o qual definimos como um programa escrito em uma
linguagem prpria que armazenado como parte do banco de dados.
Em outras palavras Procedimento Armazenado ou Stored Procedure uma
coleo de comandos em SQL disponveis em Banco de dados. Encapsula tarefas repetitivas,
aceita parmetros de entrada e retorna um valor de status (para indicar aceitao ou falha na
execuo). O procedimento armazenado pode reduzir o trfego na rede, melhorar a
performance, criar mecanismos de segurana, etc. (Wikipdia, a enciclopdia livre, 2009).

10.1. VANTAGENS DO USO DE STORED PROCEDURES

- Reduo de trfico de rede.
- Aumenta a performance da aplicao, particularmente em uma WAN ou em uma
conexo de baixa velocidade.
- Utilizando stored procedure, elimina-se o processo de parsed, ou seja, da query ter
que ser analisada gramaticalmente e submetido ao otimizador para formulao de um plano de
execuo.
- So analisadas, otimizadas e armazenadas em uma forma executvel no momento em
que so adicionadas ao banco de dados.
- possvel executar operaes muito mais complexas que uma simples query.
- Pode ser usada por aplicaes distintas.
- Facilita a manuteno, pois possvel alter-la sem ter que recompilar a aplicao.
- Proporciona mais segurana ao banco de dados, acessando tabelas que o usurio
no tem acesso.

10.2. QUANDO USAR STORED PROCEDURES

- Sempre que a metodologia de desenvolvimento do software permitir.
- No existem desvantagens em usar procedimentos armazenados, entretanto existem
duas limitaes:
- Deve ser possvel passar qualquer informao varivel para a stored procedure
(parmetros).
- Operaes complexas podem ser limitadas.


E
Parte
PROCEDIMENTOS ARMAZENADOS/STORED PROCEDURES


66

10.3. STORED PROCEDURES NO POSTGRESQL

Como visto, Stored Procedures so programas desenvolvidos em determinada
linguagem de script e armazenados no servidor, local onde sero processados. Tambm so
conhecidos como funes, este o motivo pelo qual as Stored Procedures no PostgreSQL so
referenciadas como Function.
O PostgreSQL conta com trs formas diferentes de criar funes:
a) Funes em Linguagem SQL: So funes que utilizam a sintaxe SQL e se
caracterizam por no possurem estruturas de condio (if, else, case), estruturas de repetio
(while, do while, for), no permitirem a criao de variveis e utilizam sempre algum dos
seguintes comandos SQL: SELECT, INSERT, DELETE ou UPDATE.

b) Funes de Linguagens Procedurais: Ao contrrio das funes SQL, aqui
permitido o uso de estruturas de condio e repetio e o uso de variveis. As funes em
linguagens procedurais caracterizam-se tambm por no possurem apenas uma possibilidade
de linguagem, mas vrias. Normalmente a mais utilizada conhecida como PL/PgSQL,
linguagem semelhante ao conhecido PL/SQL da Oracle. Existem outras linguagens como, por
exemplo, o PL/Perl, PL/Python e PL/Tcl, que possuem sintaxe igual ou semelhante s
linguagens que lhes deram origem.

c) Funes em Linguagens Externas ou de Rotinas Complexas: So funes
normalmente escritas em C++ que trazem consigo a vantagem de utilizarem uma linguagem
com diversos recursos, na qual pode-se implementar algoritmos com grande complexidade.
Tais funes so empacotadas e registradas no Sistema Gerenciador de Banco de Dados para
seu uso futuro.
Existem ainda outras linguagens como PL/Ruby, PL/sh e PL/Java, no entanto, estas so
definidas por projetos independentes. Dentre elas destacam-se as funes criadas com
PL/Java devido a sua crescente demanda entre usurios do PostgreSQL.
Para criar uma funo utilizando SQL no PostgreSQL utiliza-se o comando CREATE
FUNCTION:

Sintaxe:
CREATE [OR REPLACE] FUNCTION nome ([tipo_do_parametro1],[...])
RETURNS tipo_retornado AS '
Implementao_da_funo;
'
LANGUAGE 'SQL';

- CREATE FUNCTION o comando que define a criao de uma funo, [OR
REPLACE] informa que se acaso existir uma funo com este nome, a atual funo dever
sobrescrever a antiga.
- RETURNS tipo_retornado informa o tipo de dado que ser retornado ao trmino da
funo. Tais tipos de retornos so os convencionais como o INTEGER, FLOAT, VARCHAR,
etc. As funes em SQL tambm permitem o retorno de mltiplos valores e para isso informa-
se como retorno SETOF. Na implementao haver as linhas de programao para a
implementao da stored procedure.
- LANGUAGE indica para a funo em qual linguagem ela est sendo implementada.
PROCEDIMENTOS ARMAZENADOS/STORED PROCEDURES


67

Na passagem de parmetros funo no se utiliza o nome nas variveis declaradas
nos parnteses da assinatura da funo. Utiliza-se o tipo da varivel de parmetro separado
por vrgula. Para acessar o valor dos parmetros, utiliza-se o $ mais o nmero da posio que
ocupa nos parmetros, seguindo a ordem da esquerda para a direita.

Exemplo:
CREATE FUNCTION soma(INTEGER, INTEGER)
RETURNS INTEGER AS '
SELECT $1 + $2;
'
LANGUAGE 'SQL';

O fato de que as funes utilizando SQL sempre retornam valor faz com que seja
sempre necessrio que a ltima linha de comando da funo utilize o comando SELECT.

Exemplo:
CREATE FUNCTION cubo(INTEGER)
RETURNS FLOAT AS '
SELECT $1 ^ 3;
'
LANGUAGE 'SQL';

Tambm possvel criar funes que fazem interao entre uma determinada consulta
e parmetros utilizados na funo. Na funo abaixo se obtm o total de CDs gravados por
determinada gravadora, passando como parmetro o id da gravadora (grav_id):

Exemplos:
CREATE FUNCTION cdGravados(INTEGER)
RETURNS INTEGER AS '
SELECT COUNT(cd_id) FROM cd WHERE grav_id = $1; '
LANGUAGE 'SQL';

CREATE OR REPLACE FUNCTION cdGravados2(in INT, out f1 INT, out f2
TEXT, out f3 NUMERIC)
AS $$ SELECT CAST(cd_id as integer), CAST(cd_nome AS text),
CAST(cd_preco AS numeric)
FROM cd WHERE GRAV_id = $1 $$
LANGUAGE SQL;

NOTA:
Dependendo da configurao escolhida na instalao do PostgreSQL ser necessrio
ajustar o tipo do retorno fazendo uso da funo CAST.

Exemplo:
CAST(COUNT(cd_id) as INTEGER)


PROCEDIMENTOS ARMAZENADOS/STORED PROCEDURES


68


Para usar a funo utiliza-se a clusula SELECT.
Exemplo:
SELECT cdGravados(4);

Como mencionado, tambm possvel retornar vrias linhas de uma consulta em uma
funo. Para isso, utilizamos o tipo de retorno SETOF. No prximo exemplo criada uma
funo em que retorna todos os CDs mais caros que determinado valor passado por
parmetro.

Exemplo:
CREATE OR REPLACE FUNCTION precoMaior(NUMERIC(10,2))
RETURNS SETOF cd AS'
SELECT * FROM cd WHERE cd_preco > $1;
'
LANGUAGE 'SQL';

Quando as funes possuem o seu retorno referenciado em uma tabela ou uma View,
ou seja, quando a funo retorna um resultset, devemos utilizar a funo da seguinte maneira:

Exemplo:
SELECT * FROM precoMaior(5.2);

A excluso de uma funo se faz atravs do comando DROP, como visto na DDL.

Sintaxe:
DROP FUNCTION nome_da_funcao();

Quando a funo, na sua assinatura contiver parmetros no ser possvel sua
excluso atravs do comando DROP FUNCTION nome_da_funcao(), ou seja, para excluir uma
funo necessrio passar toda a sua assinatura.

Exemplo:
DROP FUNCTION precoMaior(NUMERIC(10,2));

Ainda existe o fato que no momento da excluso poder excluir a funo passando mais
um parmetro, como no exemplo a seguir:

Exemplo:
DROP FUNCTION cd_grav (psql INTEGER) RESTRICT;
DROP FUNCTION cd_grav (psql INTEGER) CASCADE;

Passando o RESTRICT como parmetro, a excluso da funo ser recusada caso
existam dependncias de objetos em torno da funo (como por exemplo, Triggers e
operadores). Com o CASCADE esses objetos sero excludos juntamente com a funo.


PROCEDIMENTOS ARMAZENADOS/STORED PROCEDURES


69


Nota:
Se a funo for removida e recriada, a nova funo no mais a mesma entidade que
era antes. Ficaro invlidas as regras, vises, gatilhos, etc. existentes que fazem referncia
antiga funo. Use o comando CREATE OR REPLACE FUNCTION para mudar a definio de
uma funo, sem invalidar os objetos que fazem referncia funo.

10.4.1. PL/pgSQL

A PL/pgSQL uma linguagem estrutural estendida da SQL que tem por objetivo auxiliar
as tarefas de programao no PostgreSQL. Ela incorpora SQL caractersticas procedurais,
como os benefcios e facilidades de controle de fluxo de programas que as melhores
linguagens possuem como loops estruturados (for, while) e controle de deciso (if, then, else).
Dessa forma, programar em PL/pgSQL significa ter a disposio um ambiente procedural
totalmente desenvolvido para aplicaes de bancos de dados, beneficiando-se do controle
transacional inerente das aplicaes deste tipo.

10.4.2. Elementos da Linguagem

A criao de Stored Procedures inclui todas as construes de uma linguagem de
programao estruturada, como:
- Comentrios: -- Este um comentrio
- Bloco de comandos (BEGIN/END): possvel usar construes como IF-THEN-ELSE
e loops WHILE que somente podem conter um comando.
- Comandos de atribuio: var1 := var2 * var3
- Operador de concatenao: || (duas barras verticais)
Alm desses elementos possvel usar as expresses condicionais:
- BETWEEN
- LIKE IN
- EXISTS
- ANY
- ALL
- IS NULL
- IS NOT NULL

10.4.3. Estrutura da Linguagem

A PL/pgSQL estruturada em blocos, assim, todo o texto de definio de uma funo
precisa estar em um bloco.

Sintaxe:
[<<label>>]
[DECLARE
declaraes]
BEGIN
contedo 1;
contedo 2;
contedo n;
PROCEDIMENTOS ARMAZENADOS/STORED PROCEDURES


70

END;
- DECLARE a rea para declarao de variveis. As variveis declaradas nessa
sesso so inicializadas recebendo seus valores default sempre que existe uma entrada nesse
bloco. Como na maior parte das linguagens existentes, na PL/pgSQL, variveis com o mesmo
nome possuem o seu escopo definido para o bloco imediatamente posterior sua declarao.

Exemplo:
CREATE OR REPLACE FUNCTION mostra_valor(valor INT)
RETURNS INTEGER AS
$$ DECLARE
valor INTEGER := $1;
BEGIN
RAISE NOTICE 'O valor da varivel aqui %', Valor;
RETURN valor;
END; $$
LANGUAGE 'PLPGSQL';

Executando a funo:
SELECT mostra_valor(12);

Como visto possvel usar as mesmas estruturas de controle disponveis nas
linguagens de programao:

Exemplo:
CREATE OR REPLACE FUNCTION formatarCPF(cpf VARCHAR(11))
RETURNS VARCHAR(14) AS $$
BEGIN
IF char_length(cpf) != 11 THEN
RAISE NOTICE 'Formato invlido: %', $1;
RETURN 'ERRO';
END IF;
RETURN SUBSTRING(cpf FROM 1 FOR 3) || '.' || SUBSTRING(cpf
FROM 4 FOR 3) || '.' || SUBSTRING(cpf FROM 7 FOR 3) || '-' ||
SUBSTRING(cpf FROM 10 FOR 2);
END;
$$
LANGUAGE PLPGSQL;

SELECT formatarCPF('11111111111');

Alm de todos os recursos advindos da estrutura de programao permitido fazer
interao com a estrutura do banco de dados nas operaes da DML como no exemplo abaixo:






PROCEDIMENTOS ARMAZENADOS/STORED PROCEDURES


71


Exemplo:
CREATE OR REPLACE FUNCTION alteraPreco(id INTEGER, preco
NUMERIC(10,4))
RETURNS VARCHAR(50) AS $$
DECLARE
valorMax NUMERIC(10,4) := 100;
valorMin NUMERIC(10,4) := 1;
BEGIN
IF $2 >= valorMin and $2 <= valorMax THEN
UPDATE CD SET cd_preco = $2 WHERE cd_id = $1;
RETURN 'Preo alterado com sucesso';
ELSE
RETURN 'O valor inserido est fora da faixa delimitada
para preos de CDs';
END IF;
END;
$$
LANGUAGE PLPGSQL;

SELECT alteraPreco(1, 16.5);
SELECT alteraPreco(2, 120);

As verses 8.3 e posteriores do PostgreSQL permitem o retorno de conjuntos de linhas
e colunas de uma funo atravs da funcionalidade RETURN QUERY. O RETURN QUERY
aceita o tipo RECORD como valor de retorno tornando fcil retornar resultados de consultas
genricas.

Exemplo:
CREATE OR REPLACE FUNCTION cd_grav (psql integer)
RETURNS SETOF RECORD AS $$
BEGIN
RETURN QUERY SELECT cd_nome, grav_nome FROM cd, gravadora WHERE
cd.grav_id = gravadora.grav_id AND gravadora.grav_id = $1; -- Consulta
RETURN; -- Retorna as linhas
END;
$$ LANGUAGE plpgsql;

A diferena desta forma de programar est na chamada da funo. Ao utilizar valor de
retorno do tipo RECORD, deve ser indicada a lista de campos a serem retornados e seus tipos.
Esta pode ser vista como uma limitao, embora na prtica tambm seja uma forma de se
garantir a confiabilidade dos resultados retornados na execuo de comandos SQL dentro de
funes pela validao dos valores retornados.

Exemplo:
SELECT * FROM cd_grav(2) AS ( c1 VARCHAR(50), c2 VARCHAR(50) );

PROCEDIMENTOS ARMAZENADOS/STORED PROCEDURES


72

Esses so alguns recursos possveis com Stored Procedures/Functions no PostgreSQL.
Contudo, importante saber que existe um gama de outros recursos possveis fazendo uso do
PgSQL, assim como acontece com outros bancos de dados, como o Oracle.

10.4. EXERCCIOS

a) Crie uma Stored Procedure no PostgreSQL que faa inseres na tabela de msica.

b) Crie uma Stored Procedure no PostgreSQL que retorne quais msica foram gravadas
em determinado CD passando como parmetro o id do CD (cd_id).
TRIGGERS (GATILHOS OU AUTOMATISMOS)


73










TRIGGERS (GATILHOS OU AUTOMATISMOS)

esenvolver uma aplicao para gerenciar os dados significa criar uma aplicao que
faa o controle sobre todo ambiente desde a interface, passando pela manuteno dos
dados e as regras de negcios do sistema.
Assim, o sistema que deve controlar e tomar as decises sobre o que fazer em
determinadas situaes. Em um programa para controlar os produtos de uma empresa, quando
a quantidade de um produto atingir certa quantidade o sistema dever avisar o
operador/usurio para providenciar a reposio do mesmo.
Ao trabalhar com base de dados Cliente/Servidor como SQL Server, Oracle, Informix,
PostgreSQL dentre outras, possvel usar um recurso muito poderoso chamado Trigger.
Triggers so rotinas armazenadas no banco de dados e utilizadas quando um comando
Insert, Update ou Delete executado em uma tabela ou at mesmo uma viso (view).
Trigger significa gatilho e disparada quando os comandos da DML so disparados.
So executadas automaticamente sem a interferncia do usurio, ou seja, so procedimentos
armazenados que so acionados por algum evento e em determinado momento.
As principais aplicaes das triggers esto relacionadas s validaes, restries de
acesso, rotinas de segurana e consistncia de dados.
Triggers so iguais a stored procedures com as seguintes excees:
- So chamadas automaticamente;
- No tem parmetros;
- No retornam valores.

A criao de uma trigger envolve duas etapas:
- Um comando SQL que vai disparar o Trigger (INSERT, DELETE, UPDATE)
- A ao que a trigger vai executar (Geralmente um bloco de cdigos SQL)

O gatilho fica associado com uma tabela e executa uma funo especifica. Na maioria
dos bancos de dados estes eventos podem ser inseres (INSERT), atualizaes (UPDATE) e
excluses (DELETE), e podem ser executadas em dois momentos:
- Antes da execuo do evento (BEFORE);
- Depois da execuo do evento (AFTER).

Uma trigger executada automaticamente mediante seis eventos da DML:
- BEFORE UPDATE (Antes da atualizao);
- AFTER UPDATE (Aps a atualizao);
- BEFORE INSERT (Antes da insero);
- AFTER INSERT (Aps a insero);
D
Parte
TRIGGERS (GATILHOS OU AUTOMATISMOS)


74

- BEFORE DELETE (Antes da excluso);
- AFTER DELETE (Aps a excluso);

11.1. BEFORE OU UPDATE

Uma trigger deve ser disparada antes de o registro ser atualizado caso queira alterar o
valor de uma ou mais colunas antes que a linha seja atualizada, ou queira bloquear a alterao
da linha gerando uma exceo, como por exemplo: usar uma trigger BEFORE UPDATE para
evitar que o usurio apague o registro de um cliente que tenha comprado nos ltimos dois
anos.
Triggers do tipo AFTER quando se deseja garantir que a atualizao que disparou a
trigger seja completada com sucesso antes de executar outras aes, como por exemplo:
inserir uma linha em uma tabela de salario_historico sempre que o salrio de um funcionrio for
alterado.

11.2. USANDO OLD E NEW

No corpo de uma trigger possvel usar tanto os valores antigos ou novos de qualquer
registro. Para isso basta utilizar os comandos OLD e NEW.

Exemplo:
old.aut_nome
new.aut_nome

Com esses comandos possvel criar registros de histrico, calcular percentual de
alterao de valores, etc.

11.3. TRIGGERS NO POSTGRESQL

Um diferencial das triggers no PostgreSQL que elas so sempre associadas a
funes de triggers e em outros Bancos de Dados elas so criadas no corpo da trigger.

11.3.1. Tipos de Triggers

O PostgreSQL possui dois tipos de triggers:
- Triggers-por-linha
- Triggers-por-instruo

A trigger-por-linha disparada uma vez para cada registro afetado pela instruo que
disparou a trigger.
A trigger-por-instruo disparada somente uma vez quando a instruo
executada.

11.3.2. Funes de Trigger e Linguagens Procedurais

TRIGGERS (GATILHOS OU AUTOMATISMOS)


75

Funes de triggers so funes que no recebem nenhum parmetro e retornam o tipo
trigger. Essas funes recebem uma estrutura chamada TriggerData, e esta passada
internamente para a funo pelo PostgreSQL.
O PostgreSQL disponibiliza duas variveis importantes para serem usadas em conjunto
com as triggers-por-linha: NEW e OLD.
A varivel NEW, no caso do INSERT, armazena o registro que est sendo inserido. No
caso do UPDATE, armazena a nova verso do registro depois da atualizao.
A varivel OLD, no caso do DELETE, armazena o registro que est sendo excludo. No
caso do UPDATE, armazena a antiga verso do registro depois da atualizao.
As funes de triggers devem ser escritas em alguma linguagem procedural disponvel
no banco de dados
1
.
Cada linguagem, que suporta triggers, possui o seu prprio mtodo para tornar os
dados de entrada da trigger disponveis para a funo. Estes dados de entrada incluem o tipo
de evento da trigger, assim como as opes informadas na criao da trigger. Para uma trigger
no nvel de linha, os dados de entrada tambm incluem as linhas NEW para as triggers de
INSERT e UPDATE, e a linha OLD para os triggers de UPDATE e DELETE.

Sintaxe:
CREATE TRIGGER nome { BEFORE | AFTER } { evento [OR ...] }
ON tabela FOR EACH { ROW | STATEMENT }
EXECUTE PROCEDURE funo ( argumentos )

Onde:
Nome: O nome da Trigger.
Tabela: O nome da tabela na qual a trigger estar vinculada.
Evento: INSERT, DELETE ou UPDATE.
Funo: Pode-se usar, neste caso, uma stored procedure para execuo de
determinada tarefa.
row|statement: especifica se a trigger deve ser disparada uma vez para cada linha
afetada pelo evento ou apenas uma vez por comando SQL. Se no for especificado nenhum
dos dois, o padro FOR EACH STATEMENT.

Exemplo:
Para este primeiro exemplo necessrio alterar nosso banco de dados:
ALTER TABLE autor
ADD aut_cpf CHAR(14);


Prximo passo criar a funo que faz a insero de determinado valor nesta tabela:






1
Essas linguagens podem ser vrias, como Ruby, Perl, Python, entre outras. Atualmente existem quatro linguagens
procedurais disponveis na distribuio padro do PostgreSQL: PL/pgSQL, PL/Tcl, PL/Perl e PL/Python. Mas
possvel que o usurio defina outras linguagens. Para instalar novas linguagens no PostgreSQL, consulte a
documentao oficial do PostgreSQL, que pode ser obtida no seguinte endereo: http://pgdocptbr.sourceforge.net/.
TRIGGERS (GATILHOS OU AUTOMATISMOS)


76




Exemplo:
CREATE OR REPLACE FUNCTION ftFormataCPF()
RETURNS trigger AS
$$
BEGIN
IF char_length(new.aut_cpf) = 11 THEN
new.aut_cpf := SUBSTRING(new.aut_cpf FROM 1 FOR 3) ||
'.' || SUBSTRING(new.aut_cpf FROM 4 FOR 3) || '.' ||
SUBSTRING(new.aut_cpf FROM 7 FOR 3) || '-' || SUBSTRING(new.aut_cpf
FROM 10 FOR 2);
RETURN new;
END IF;
END;
$$
LANGUAGE plpgsql;

Por fim, criando a trigger:

Exemplo:
CREATE TRIGGER tFormataCpf BEFORE INSERT
ON autor FOR EACH ROW
EXECUTE PROCEDURE ftFormataCPF ();

Verificando seu funcionamento:
INSERT INTO autor (aut_id, aut_nome, aut_cpf) VALUES (102, 'teste
function2', '00000000002');

11.3.3. Parmetros Especiais

Dentre as funes que foram apresentadas para triggers possvel utilizar uma grande
quantidade de argumentos com a finalidade de criar controles e mtodos de auditoria nos
bancos de dados PostgreSQL. Todas elas so facilmente encontradas no manual do
PostgreSQL.
Desses, um dos argumentos mais importantes o TG_OP que permite identificar qual
operao est sendo realizada: INSERT, UPDATE e DELETE. Muito til para criar mecanismos
de auditoria nos dados contidos em determinada tabela.
Acompanhe atentamente o exemplo abaixo:

Exemplo:
Primeiramente vamos criar uma tabela de histrico:

CREATE TABLE historico_cd (
hcd_id INTEGER,
hcd_preco_novo NUMERIC(14,2),
hcd_preco_antigo NUMERIC(14,2),
TRIGGERS (GATILHOS OU AUTOMATISMOS)


77

hcd_data_hora TIMESTAMP,
hcd_operacao VARCHAR(50) );

Depois criamos a funo:

CREATE OR REPLACE FUNCTION auditaCD()
RETURNS trigger AS
$$
BEGIN
IF (TG_OP = 'INSERT') THEN
INSERT INTO historico_cd (hcd_id, hcd_preco_novo,
hcd_preco_antigo, hcd_data_hora, hcd_operacao) VALUES (NEW.cd_id,
NEW.cd_preco, NULL, CURRENT_TIMESTAMP, INSERT);
RETURN NEW;

ELSIF (TG_OP = 'UPDATE') THEN
INSERT INTO historico_cd (hcd_id, hcd_preco_novo,
hcd_preco_antigo, hcd_data_hora, hcd_operacao) VALUES (OLD.cd_id,
NEW.cd_preco, OLD.cd_preco, CURRENT_TIMESTAMP, UPDATE);
RETURN NEW;

ELSIF (TG_OP = 'DELETE') THEN
INSERT INTO historico_cd (hcd_id, hcd_preco_novo,
hcd_preco_antigo, hcd_data_hora, hcd_operacao) VALUES (OLD.cd_id,
NULL, OLD.cd_preco, CURRENT_TIMESTAMP, DELETE);
RETURN NEW;
END IF;
END;
$$
LANGUAGE plpgsql;

Por fim, criamos a Trigger:

CREATE TRIGGER tg_auditaCD AFTER INSERT OR UPDATE OR DELETE
ON cd
FOR EACH ROW EXECUTE PROCEDURE auditaCD();

Verificando seu funcionamento:

INSERT INTO cd (cd_id, grav_id, cd_nome, cd_preco,
cd_dt_lancamento) VALUES (100, 1, 'teste trigger1', 10.00, '2009-11-
15');
UPDATE cd SET cd_preco = 20.00 WHERE cd_id = 100;
DELETE FROM cd WHERE cd_id = 100;

11.3.4. Triggers Recursivas

TRIGGERS (GATILHOS OU AUTOMATISMOS)


78

Se uma funo de trigger executar comandos SQL, estes comandos podem disparar
triggers novamente. Isto conhecido como cascatear triggers. No existe limitao direta do
nmero de nveis de cascateamento. possvel que o cascateamento cause chamadas
recursivas da mesma trigger; por exemplo, um trigger para INSERT pode executar um
comando que insere uma linha adicional na mesma tabela, fazendo com que a trigger para
INSERT seja disparada novamente. responsabilidade de o programador evitar recurses
infinitas nestes casos.

11.3.5. Alterando uma Trigger

possvel alterar o nome de trigger usando a sintaxe abaixo:

Sintaxe:
ALTER TRIGGER nome ON tabela RENAME TO novo_nome;

11.3.6. Excluindo uma Trigger

Para excluir uma trigiger basta executar o comando abaixo:

Sintaxe:
DROP TRIGGER nome ON tabela [ CASCADE | RESTRICT ]

Onde:
Nome: o nome da trigger a ser removida.
Tabela o nome da tabela para a qual a trigger est definida.
[ CASCADE | RESTRICT ]: indica que ao remover a trigger vamos remover tambm
todos os objetos que dependem dela (CASCADE) ou recusaremos sua excluso (RESTRICT).

11.3.7. Desabilitando/Habilitando uma Trigger

Para desabilitar/habilitar uma trigger execute o comando abaixo:

Sintaxe:
ALTER TABLE nome_tabela [DISABLE|ENABLE] TRIGGER nome_trigger;

Para desabilitar todas as triggers da tabela, execute o seguinte comando:

Sintaxe:
ALTER TABLE nome_tabela [DISABLE|ENABLE] TRIGGER ALL;


11.4. EXERCCIO

a) Crie uma trigger responsvel por verificar, no momento da insero na tabela de CD,
se o preo do CD maior de 1,00 e inferior a 100,00.
SEGURANA DE BANCO DE DADOS


79











SEGURANA DE BANCO DE DADOS

odemos dizer que segurana em banco de dados garante que os usurios tenham
permisso para fazer o que realmente precisam fazer. Para tanto, os Sistemas
Gerenciadores de Banco de Dados precisam de certas limitaes, na qual os usurios
no podero violar. Estas especificaes so criadas pelo DBA (Administrador de Banco de
Dados).
Todas as decises acerca dos direitos que devem ser concedidos a determinado
usurio so decises polticas e no tcnicas. Assim sendo, tais competncias fogem a alada
dos Sistemas Gerenciadores de Banco de Dados.

12.1. VISO DE SEGURANA

O Sistema Gerenciador de Banco de Dados deve fornecer ao usurio uma
representao conceitual dos dados (viso), sem fornecer muitos detalhes de como as
informaes esto armazenadas.
Muitas verificaes de autorizao podem aplicar-se ao tempo de execuo, entretanto
a abordagem de segurana de que se baseia uma viso um tanto inbil, pois um usurio
pode precisar de direitos diferentes sobre subconjuntos diferentes da mesma tabela.
Existem muitos aspectos relativos aos problemas de segurana, dentre eles os
aspectos legais, sociais e ticos. O que deve ser analisado se quem faz a solicitao da
informao tem direito legal sobre ela.
Outro aspecto a se analisar so os controles fsicos. Considera-se a sala a sala do
servidor um lugar inviolvel, pois l esto todas as informaes.
Para que o sistema seja capaz de decidir que limitaes se aplicam a determinada
solicitao necessrio reconhecer a fonte daquela solicitao, isto , deve ser capaz de
reconhecer de que usurio especfico partiu aquela demanda. Neste sentido necessrio
atribuir mecanismos de autenticao para os responsveis pela solicitao sejam identificados,
como um meio de garantir a auditoria sobre os feitos daquele usurio nos dados armazenados.

12.2. INSTRUES GRANT E REVOKE

O mecanismo de viso possibilita dividir o banco de dados em partes conceituais de
modo que a informao sensvel fique oculta aos usurios no autorizados.
Por meio das instrues GRANT e REVOKE possvel atribuir restries aos usurios
de acordo com um perfil previamente estabelecido. Esses representam a principal interface que
P
Parte
SEGURANA DE BANCO DE DADOS


80

concede ao usurio capacidade de desempenhar qualquer operao atravs de comandos
SQL.

12.3. OUTROS ASPECTOS DE SEGURANA

As vises e o mecanismo de GRANT e REVOKE no so os nicos meios de se
implementar segurana em banco de dados. Na verdade, no existe nenhum ponto no Sistema
Gerenciador de Banco de Dados que proporcione um conjunto amplo de controles de
segurana. Dessa forma, um suposto infiltrador suficientemente determinado capaz de
passar por todos os controles j mencionados.
Para situaes em que os dados sejam sensveis, torna-se necessrio um arquivo ou
banco de dados especial, onde o sistema registra automaticamente todas as operaes
desempenhadas por determinado usurio. A isso chamamos de Log.
Outro nvel de segurana pode ser proporcionado pela codificao de dados. A idia
bsica consiste no armazenamento fsico dos dados no disco e antes de serem transmitidos
so codificados (Criptografados).

12.4. CRIAO DE USURIOS NO POSTGRESQL

Para possibilitar a utilizao da base de dados por usurios distintos, cada um
trabalhando em uma sesso diferente necessrio realizar a criao de um usurio no
Sistema Gerenciador de Banco de Dados atribuindo-lhe um nome para autenticao e senha.
A este usurio criado podero ser concedidas permisses diversas assegurando-lhe acesso
aos dados, bem como concedendo e restringindo operaes sobre as informaes.
O comando usando no PostgreSQL para criar usurio o CREATE USER. No entanto,
nas verses mais modernas possvel faz-lo diretamente atravs do comando CREATE
ROLE, possibilitando a utilizao de mais recursos.

Sintaxe:
CREATE USER|ROLE nome [ [ WITH ] opo [ ... ] ]
Onde, opo pode ser:
SYSID id_do_usurio
| CREATEDB | NOCREATEDB
| CREATEUSER | NOCREATEUSER
| IN GROUP nome_do_grupo [, ...]
| [ ENCRYPTED | UNENCRYPTED ] PASSWORD 'senha'
| VALID UNTIL 'data_e_hora'

Parmetros:

- Nome: O nome do usurio.
- id_do_usurio: A clusula SYSID pode ser utilizada para escolher o identificador de
usurio do PostgreSQL do novo usurio. Normalmente no necessrio, mas pode ser til se
for necessrio recriar o dono de um objeto que ficou rfo. Se no for especificado, ser
utilizado por padro o maior identificador de usurio atribudo acrescido de um (com mnimo de
100).
SEGURANA DE BANCO DE DADOS


81

- CREATEDB NOCREATEDB: Estas clusulas definem a permisso para o usurio criar
banco de dados. Se for especificado CREATEDB, o usurio sendo definido ter permisso
para criar seus prprios bancos de dados. Se for especificado NOCREATEDB, nega-se ao
usurio a permisso para criar banco de dados. Se nenhuma destas clusulas for especificada,
o padro NOCREATEDB.
- CREATEUSER NOCREATEUSER : Estas clusulas determinam se o usurio pode ou
no criar novos usurios. CREATEUSER tambm torna o usurio um superusurio, o qual
pode passar por cima de todas as restries de acesso. Se nenhuma destas clusulas for
especificada, o padro NOCREATEUSER.
- nome_do_grupo: O nome de um grupo existente onde o usurio ser includo como
um novo membro. Podem ser especificados nomes de vrios grupos.
- Senha: Define a senha do usurio. Se no se pretende utilizar autenticao por senha
esta opo pode ser omitida, mas o usurio no poder mais se conectar se for decidido mudar
para autenticao por senha. A senha poder ser definida ou mudada posteriormente atravs
do comando ALTER USER.
- ENCRYPTED UNENCRYPTED: Estas clusulas controlam se a senha ser
armazenada criptografada, ou no, nos catlogos do sistema; Se no for especificada
nenhuma destas clusulas, o comportamento padro ser determinado pelo parmetro de
configurao password_encryption. Se a cadeia de caracteres da senha j estiver criptografada
no formato MD5, ento a cadeia de caracteres ser armazenada como est,
independentemente de ser especificado ENCRYPTED ou UNENCRYPTED (porque o sistema
no pode descriptografar a cadeia de caracteres criptografada contendo a senha). Esta
funcionalidade permite a restaurao de senhas criptografadas efetuadas por uma operao de
dump/restore. Deve ser observado que os clientes antigos podem no possuir suporte para o
mecanismo de autenticao MD5, necessrio para trabalhar com as senhas que so
armazenadas criptografadas.
- data_e_hora: A clusula VALID UNTIL define uma data e hora aps a qual a senha do
usurio no mais vlida. Se esta clusula for omitida, a conta ser vlida para sempre.
A clusula VALID UNTIL define uma data de expirao para a senha apenas, e no para a
conta do usurio per se. Em particular, a obedincia data de expirao no imposta ao se
conectar utilizando um mtodo de autenticao no baseado em senha.

Deve ser usado o comando ALTER USER para mudar os atributos de um usurio, e
DROP USER para remover um usurio. Deve se usado ALTER GROUP para adicionar ou
remover usurios de grupos de forma semelhante como acontece com a criao do usurio.
O PostgreSQL inclui o programa createuser que possui a mesma funcionalidade do
CREATE USER (na verdade, chama este comando), mas pode ser executado a partir da linha
de comando.










SEGURANA DE BANCO DE DADOS


82

Exemplos:
Criar um usurio sem senha:
CREATE USER Jonas;
CREATE ROLE Jonas;

Criar um usurio com senha:
CREATE ROLE manuel WITH PASSWORD 'jw8s0F4';

Criar um usurio com uma senha vlida at o fim de 2009. Aps o primeiro segundo de
2010 a senha no ser mais vlida:
CREATE ROLE miriam WITH PASSWORD 'jw8s0F4' VALID UNTIL '2010-01-
01';

Criar uma conta onde o usurio pode criar bancos de dados:
CREATE ROLE manuel WITH PASSWORD 'jw8s0F4' CREATEDB;

Criar um usurio com poderes de superusurio:
CREATE ROLE administrador WITH SUPERUSER ENCRYPTED PASSWORD
xxxxx;

Para alterar determinado usurio, basta utilizar o comando ALTER ROLE de maneira
semelhante como ocorre com o comando CREATE ROLE:

Exemplo:
Conceder permisso para o usurio criar outro usurios e bancos dedados:
ALTER ROLE miriam CREATEROLE CREATEDB;

Para excluir usurio do banco de dados utiliza-se o comando DROP:
DROP ROLE Manoel;

Para saber quais usurio esto cadastrados no PostgreSQL basta fazer uma consulta
na tabela do sistema pg_user:
SELECT username FROM pg_user;


12.5. CRIANDO GRUPOS DE USURIOS

No PostgreSQL possvel criar grupos de usurios. Lembrando que todas as
permisses atribudas ao grupo sero repassadas aos usurios pertencentes a ele.

Sintaxe:
CREATE GROUP nomedogrupo;

Exemplos:
CREATE GROUP adm;


SEGURANA DE BANCO DE DADOS


83

Adicionar e remover usurio de um grupo:

Exemplo:
ALTER GROUP adm ADD USER miriam, administrador;
ALTER GROUP adm DROP USER miriam;

Para excluir um grupo, basta usar o comando padro para excluso de objetos no
banco de dados, DROP. Lembrando que o comando DROP remove apenas o grupo e no os
usurios do grupo.

Exemplo:
DROP GROUP adm;

Para listar todos os grupos criados necessrio consultar a tabelas do sistema
pg_group:

SELECT gronome FROM pg_group;

12.6. CONCEDENDO PRIVILGIOS AOS USURIOS

Nesta etapa importante lembrar que o superusurio tem o direito de fazer o que bem
entender nos bancos de dados existentes. Outro aspecto relativo ao proprietrio de um objeto
no banco de dados. Sendo ele o dono do objeto ele tambm tem todas as permisses para
fazer o que bem entender com esse objeto.
So vrios os privilgios que um usurio pode receber, dentre eles:
- SELECT - INSERT - UPDATE
- DELETE - RULE - REFERENCES
- TRIGGER - CREATE - TEMPORARY
- EXECUTE - USAGE - LOGIN
- CONNECT

A concesso de privilgios se d atravs do comando GRANT e sua revogao atravs
do comando REVOKE.

Sintaxe:
GRANT privilgio ON objeto TO usurio;
REVOKE privilgio ON objeto FROM usurio;

Exemplos:
GRANT SELECT, INSERT, UPDATE ON cliente TO miriam;

Para atribuir e retirar permisso ao grupo:
GRANT SELECT, DELETE ON cliente TO adm;
REVOKE UPDATE ON cliente FROM miriam;

Para remover os privilgios de todos os usurios:
REVOKE ALL ON cliente FROM PUBLIC;
SEGURANA DE BANCO DE DADOS


84


Os privilgios especiais do dono da tabela so sempre inerentes condio de ser o
dono, no podendo ser concedidos ou revogados. No entanto, o dono do objeto pode revogar
seus prprios privilgios, tornando-se um usurio comum como os demais no que se refere ao
objeto na qual proprietrio.
Em geral, somente o dono e o superusurio podem conceder ou revogar privilgios para
um objeto.

12.7. OBSERVAES IMPORTANTES

O usurio do sistema (superusurio) deve ser um usurio criado exclusivamente para o
PostgreSQL. Nunca devemos torn-lo dono de um executvel.
Os nomes de usurio so globais para todos os bancos de dados.
TRANSAES EM BANCO DE DADOS


85













TRANSAES EM BANCO DE DADOS

termo transao refere-se a uma coleo de operaes que formam uma nica
unidade de trabalho lgica. Por exemplo, a transferncia de dinheiro de uma conta
para outra uma transao consistindo de duas atualizaes, uma para cada conta.
Uma transao uma unidade de execuo do programa que acessa e possivelmente
atualiza vrios itens de dados. Para garantir a integridade dos dados, necessrio que o
SGBD mantenha as seguintes propriedades das transaes: atomicidade, consistncia,
isolamento e durabilidade.
- Atomicidade: uma transao uma unidade atmica de processamento; ou ela ser
executada em sua totalidade ou no ser de modo nenhum.
- Consistncia: uma transao deve ser preservadora de consistncia se sua execuo
completa fizer o banco de dados passar de um estado consistente para outro tambm
consistente.
- Isolamento: uma transao deve ser executada como se estivesse isolada das
demais. Isto , a execuo de uma transao no deve sofrer interferncia de quaisquer outras
transaes concorrentes.
- Durabilidade: as mudanas aplicadas ao banco de dados por uma transao
efetivada devem persistir no banco de dados. Essas mudanas no devem ser perdidas em
razo de uma falha.

Essas propriedades normalmente so conhecidas como propriedades ACID. Esse
acrnimo derivado da primeira letra de cada uma das quatro propriedades.
Quando se trabalham com transaes, necessrio que se faa pelo menos duas
ressalvas. A primeira que em certas situaes interessante se agregar vrios comandos
como sendo integrantes de uma mesma transao, como, por exemplo, em uma transferncia
bancria que envolve a retirada de dinheiro de uma conta e o acrscimo em outra como se
fosse apenas uma nica operao lgica. A segunda ressalva que em outras situaes se faz
necessrio sacrificar ou flexibilizar as caractersticas ACID em virtude da necessidade de maior
desempenho.

13.1. ESTADOS DE UMA TRANSAO

Na ausncia de falhas, todas as transaes so completadas com sucesso. Porm,
uma transao nem sempre pode completar sua execuo com sucesso. Caso isso ocorra,
essa transao considerada abortada.
O
Parte
TRANSAES EM BANCO DE DADOS


86

Se houver necessidade de garantir a propriedade de atomicidade, uma transao
abortada no pode ter efeito sobre o estado do banco de dados. Assim, qualquer mudana que
a transao abortada tenha feito no banco de dados deve ser desfeita. Quando as mudanas
causadas por uma transao abortada tiverem sido desfeitas, dizemos que a transao foi
revertida (rolled back). Se uma transao foi executada com sucesso, diz-se que foi confirmada
(committed). Assim, possvel estabelecer vrios estados para as transaes:
- Active: corresponde ao estado inicial. A transao fica neste estado enquanto est
sendo executada.
- Partially Committed: Aps a ltima instruo ter sido executada.
- Failed: Depois de se descobrir que a execuo normal no pode continuar.
- Aborted: quando a transao foi revertida e a base de dados voltou ao estado anterior
a transao
- Committed: como dito antes, aps uma concluso da transao com xito.



Figure 17 Estado das Transaes


13.2. CONTROLE DE CONCORRNCIA

Aps uma abordagem inicial sobre transaes, fcil verificar que estas fazem sentido
num mbito concorrente. O controle de concorrncia uma das coisas mais importantes em
bases de dados grandes. Tomemos novamente como exemplo o caso de um banco, em que
vrias pessoas podem acessar aos mesmos dados simultaneamente, fazendo vrias
operaes iguais ou diferentes. Caso no haja um controlo de concorrncia forte, poderiam
existir problemas srios.
TRANSAES EM BANCO DE DADOS


87

Para lidar com este problema, foram desenvolvidas tcnicas especficas para lidar com
esta concorrncia:

- Protocolos Baseados em Locks: Estes protocolos baseiam-se, tal como o nome
indica, na utilizao de locks. Atravs destas propriedades, podemos garantir que o acesso a
determinados dados so feitos de acordo com estes locks, mas basicamente a idia que se
uma transao est acessando determinados dados, mais nenhuma outra transao pode
acessar estes (modo exclusivo). Atravs de propriedades de locks e unlocks conseguimos
estabelecer estas regras. Note que estes locks podem ser do tipo exclusivo, em que se uma
transao obtm um exclusive-mode lock mais nenhuma transao poder ler ou escrever
sobre esses dados, ou tambm podem ser do tipo shared, em que se uma transao obtm o
shared-mode lock qualquer outra transao poder ler os mesmos dados, mas nunca escrever
neles. Um protocolo deste gnero muito conhecido o Two-Phase Locking Protocol, que
consiste em duas fases distintas, Growing Phase, onde so obtidos os locks sem nunca os
libertar, e a shrinking phase, onde uma transao liberta os locks, no os podendo obter mais.

- Protocolos Baseados em Time-Stamps: Para cada transao no sistema, atribudo
um time-stamp, antes de esta comear a execuo. H ento duas formas de funcionamento: a
atribuio do time-stamp pode ser com a utilizao do clock do sistema ou utilizando um
contador lgico, que incrementado sempre que uma nova transao entra no sistema.
Atravs destes time-stamps conseguem-se fazer um controle de concorrncia.

- Protocolos Multi-Verses: De forma a maximizar ainda mais a concorrncia, este tipo
de protocolo cria vrias cpias do mesmo item. Assim, cada write (Q) cria uma nova verso de
Q e quando Q chamado para leitura, o sistema elege a verso do Q mais apropriada,
garantida a serializao. neste mbito que surgem ento os protocolos Multiversion
Timestamp Ordering e o conhecido Two-Phase Locking.

Existem muitos outros protocolos, no entanto esses se destacam como mais utilizados.

13.3. GESTO DE CONCORRNCIA NO POSTGRESQL

O PostGreSQL implementa uma poltica de auto-commit. Desta forma, cada instruo
tratada como uma transao. Um read uma transao, um write outra, etc! H ento duas
formas de contornar esta situao: uma simplesmente desligar o auto-commit, atravs da
instruo \SET AUTOCOMMIT OFF. Assim, tudo considerado uma transao at que a
instruo commit seja executada. A outra soluo passa por indicar explicitamente o incio e o
fim de uma transao usando o comando BEGIN no incio da transao e o comando
COMMIT; no final desta. Caso se pretenda anular a transao, ao invs do comando COMMIT
possvel introduzir o comando ROLLBACK.

13.3.1. Garantia de Isolamento

O PostgreSQL, diferente de muitos outros Sistemas Gerenciadores de Banco de Dados,
mantm os dados coerentes atravs da utilizao de modelos multiverso (Multiversion
Concurrency Control, MVCC). Assim, cada transao v uma verso da base de dados
(snapshot) tal como era em algum tempo atrs, independentemente do estado atual dos dados,
evitando assim o problema de uma transao poder ver os dados incoerentes. Protocolos em
TRANSAES EM BANCO DE DADOS


88

nvel de locks de tabela e tupla tambm so possveis no PostgreSQL para aplicaes que no
se adaptem bem ao funcionamento do modelo MVCC, sendo que necessrio estabelecer
manualmente o nvel de granularidade desejado. Contudo, um uso cuidado no MVCC melhor
que a utilizao de locks.

13.3.2. Isolamento nas Transaes

O SQL standard define quatro nveis de isolamento de transaes de acordo com trs
fenmenos que no devem acontecer entre transaes concorrentes, sendo os fenmenos os
seguintes: dirty reading, nonrepeatable read e phantom read.
- Dirty reading: uma transao l dados que foram modificados por uma outra
transao concorrente que ainda no realizou o comando commit;
- Nonrepeatable read: uma transao re-l dados e descobre que os estes foram
modificados por uma outra transao;
- Phantom read: uma transao executa novamente uma pergunta e descobre que os
valores que satisfazem a pergunta so diferentes da anterior, devido a um commit de uma
outra transao.
Os quatro nveis de isolamento das transaes SQL so as seguintes:

Tabela 1- Nvel de isolamento das transaes SQL
Isolation level Dirty Read Nonrepeatable Read Phantom Read
Read uncommitted Possible Possible Possible
Read committed Not Possible Possible Possible
Repeatable read Not Possible Not Possible Possible
Serializable Not Possible Not Possible Not Possible


O PostgreSQL suporta o Read Commited e o Serializable. Como o padro SQL tem
mais dois elementos, o Read Uncommitted tratado como um Repetable Read que tratado
como Serializable. O Read Commited o grau de isolamento padro do sistema em questo.

13.3.3. Nveis de Granularidade (Locks)

O PostgreSQL permite a utilizao de locks com vrios nveis de granularidade (explicit
locking), em nvel de tabela, em nvel de tuplas e, em verses mais recentes, os chamados
advisory locks. Para criar locks em nvel de tabela, a instruo utilizada a seguinte:

LOCK [ TABLE ] [ ONLY ] name [, ...] [ IN lockmode MODE ] [ NOWAIT ]

Sendo que lock mode um dos seguintes:

ACCESS SHARE | ROW SHARE | ROW EXCLUSIVE | SHARE UPDATE EXCLUSIVE |
SHARE | SHARE ROW EXCLUSIVE | EXCLUSIVE | ACCESS EXCLUSIVE




TRANSAES EM BANCO DE DADOS


89


13.3.4. Consistncia de Dados no PostgreSql

Como no sistema PostgreSQL um leitor nunca realiza locks sobre os dados, dados lido
numa transao podem ser escritos por cima por uma outra corrente transao, ou seja, os
dados lidos podem no ser sempre os mais atuais. Para resolver este problema surge um
pouco necessidade de se utilizarem os locks, SELECT FOR UPDATE, SELECT FOR
SHARE, ou fazendo locks sobre toda a tabela, como forma de impossibilitar a modificao dos
dados em questo.
Porm, a utilizao excessiva de locks pode limitar, e muito, a concorrncia de uma
base de dados, que, bastante proveitosa em inmeras situaes.

13.3.5. Atomicidade e Durabilidade no PostgreSql

De acordo com as propriedades anteriores, justo dizer que as transaes funcionam
como um todo. Ou a transao executada na sua totalidade, ou nada dela executada. Caso
haja falha, a base de dados restaurada, atravs de mecanismos de rollback, que sero
abordados no seguinte tpico. O mesmo acontece com a durabilidade. Caso a transao se
concretize os dados so guardados em memria estvel e o utilizador notificado do sucesso
da operao. Em caso de falha, os dados no so guardados e o utilizador notificado da falha
que ocorreu.

13.3.6. Mecanismos de Rollback e Recuperao no PostgreSql

Por vezes, em transaes complexas e grandes, h necessidade de estabelecer save
points. Estas so pontos de restaurao do sistema, considerado um ponto especial na
transao que permite a execuo de todos os comandos aps ter existido um rollback,
restaurando o estado da transao para o estado atual no save point. Para criar um save point,
basta introduzir o seguinte comando:

SAVEPOINT savepoint_name

Desta forma ento possvel estabelecer um save point. Para se retornar ao estado
atual num save point, necessrio invocar comandos de rollback, que podem seguir as
seguintes definies:

ROLLBACK [ WORK | TRANSACTION ]
ROLLBACK [ WORK | TRANSACTION ] TO [ SAVEPOINT ] savepoint_name

A primeira opo restaura o sistema todo, ou seja, volta para o incio da transao,
anulando todas as operaes efetuadas. A segunda efetua um rollback para um determinado
save point. A seguir um exemplo concreto bem como os resultados de operaes com save
points e rollbacks:





TRANSAES EM BANCO DE DADOS


90


Exemplo:

CREATE TABLE teste (id INTEGER, PRIMARY KEY (id));
COMMIT;
INSERT INTO teste VALUES (1);
COMMIT;
INSERT INTO teste VALUES (2);
SAVEPOINT y;
DELETE FROM teste;
SELECT * FROM teste; //nada mostrado
ROLLBACK TO y;
SELECT * FROM teste; //so mostrados os valores 1 e 2
ROLLBACK;
SELECT * FROM teste; // mostrado o valor 1

REFERNCIAS


91


REFERNCIAS


ELMASRI, Ramez; Sistema de Banco de Dados - Fundamentos e Aplicaes - 4 Edio,
Pearson Education, 2005.

OLIVEIRA, Celso Henrique Poderoso; SQL Curso Prtico; Novatec, 2002.

MOMJIAN, Bruce; PostgreSQL: Introduction and Concepts. E-Book; Addison-Wesley, 2001.

PostgreSQL Manual (With user comments) do PostgreSQL 8.3. Disponvel em
<http://www.postgresql.org/files/documentation/pdf/8.3/postgresql-8.3-A4.pdf>

PostgreSQL Manual (The SQL Language) do PostgreSQL 9.1. Disponvel em
<http://www.postgresql.org/docs/9.1/static/sql.html>