Você está na página 1de 72

Ementrio

Viso geral do gerenciamento de banco de dados.


Modelo Entidade-Relacionamento (E-R)
Modelo Relacional
lgebra relacional
SQL
Outras Linguagens Relacionais
Regras de Integridade
Especificar os dados de um Sistema de Informao
utilizando as formas normais. Definir o modelo
conceitual dos dados normalizados.
Linguagens de Consulta (1/2)
Uma linguagem de consulta (query language) a
linguagem por meio da qual os usurios obtm
informaes do banco de dados.
As linguagens de consulta podem ser categorizadas
como procedurais ou no-procedurais.
Em uma linguagem procedural, o usurio deve ensinar
ao sistema a realizao de um seqncia de operaes
no banco de dados para obter o resultado desejado.
Em uma linguagem no-procedural (ou declarativa), o
usurio descreve a informao desejada sem fornecer
um procedimento especfico para a obteno dessas
informaes.
Linguagens de Consulta (2/2)
Os sistemas de banco de dados comerciais
oferecem uma linguagem de consulta que
incorpora elementos de ambos os enfoques:
procedurais e no-procedurais.
Exemplos de linguagens comerciais: SQL,
Query-by-Example, Quel, Datalog.
Como exemplo de linguagem procedural pura:
lgebra relacional.
Essas linguagens so concisas e formais, mas
ilustram as tcnicas fundamentais para a extrao
de dados do banco de dados.
MODELO ENTIDADE-RELACIONAMENTO PROJETO CONCEITUAL
ATRIBUTO ENTIDADE CONJUNTO DE ENTIDADES
CONJUNTO DE RELACIONAMENTOS

COLUNA
TUPLA, OU
LINHA

RELAO
CAMPO REGISTRO TABELA
MODELO RELACIONAL PROJETO LGICO
NA PRTICA
Sinnimos
RELACIONAMENTO
SQL - Introduo

SQL- Structured Query Language
(Linguagem de Consulta Estruturada)

A lgebra relacional e o clculo relacional so linguagens formais
que proporcionam uma notao concisa para a representao de
consultas. Entretranto, sistemas de banco de dados comerciais
precisam de uma linguagem de consulta mais fcil para o usurio.

Embora seja definida como uma linguagem de consulta a
linguagem SQL possui muitos outros recursos alm de consulta ao
banco de dados, como meios para a definio da estrutura de dados
(esquema), para modificao de dados no banco de dados e para a
especificao de restries de segurana.
SQL - Histrico
Certamente a SQL tem representado o padro para linguagens de
banco de dados relacionais. Existem diversas verses de SQL. A
verso original foi desenvolvida pela IBM no incio dos anos 70.

Em 1986, o American National Standards Institute (ANSI) e a
International Standards Organization (ISO) publicaram os padres
para a SQL, chamada de SQL-86. A IBM publicou seus prprios
padres para a SQL, a Systems Application Architecture Database
Interface (SAA-SQL) em 1987. Uma extenso para o padro SQL, a
SQL-89, foi publicada em 1989. A verso em uso do padro
ANSI/ISO SQL o padro SQL-92.

importante lembrar que algumas implementaes da SQL podem
dar suporte somente SQL-89 e assim no aceitar a SQL-92.
As Partes da Linguagem SQL (1/2)
Linguagem de definio de dados (DDL- Data
Definition Language): comandos para a definio de
esquemas de relaes, excluso de relaes, modifio
nos esquemas de relaes e criao de domnios.
create table, alter table, drop table e create domain

Linguagem interativa de manipulao de dados (DML-
Data Manipulation Language): abrange uma linguagem
de consulta baseada tanto na lgebra relacional quanto
no clculo relacional de tuplas. Engloba tambm
comandos para insero, excluso e modificao de
tuplas no banco de dados.
select, insert, delete e update
As Partes da Linguagem SQL (2/2)
Incorporao DML (Embedded DML): comandos SQL
incorporados foi projetada para aplicao em linguagens de
programao de uso geral, como PL/I, Cobol, Pascal, Fortran e C.
Definio de vises: a SQL DDL possui comandos para definio
de vises (relao virtual).
Autorizao: a SQL DDL emgloba comandos para especificao
de direitos de acesso a relaes e vises.
Integridade: a SQL DDL possui comandos para especificao de
regras de integridade que os dados armazenados no banco de
dados devem satisfazer. Atualizaes que violarem as regras de
integridade sero desprezadas.
Controle de transaes: a SQL inclui comandos para a
especificaes de incio e fim de transaes. Algumas
implementaes tambm permitem explicitar bloqueios de dados
para controle de concorrncia.
Os exemplos do uso da linguagem SQL a seguir sero demonstrados, usando o banco
de dados Firebird Employee.gdb, atravs do recurso SQL Editor disponvel na
ferramenta administrativa IBExpert. O Firebird um Sistema Gerenciador de Banco de
Dados Cliente/Servidor Relacional que est baseado no padro SQL ANSI-92.
Comentrios
A utilizao de comentrios em sentenas SQL
faz-se utilizando a combinao /* e */ para
delimitar uma ou mais linhas de texto considerado
como um comentrio.
/* comentrio
de mltiplas linhas */
DDL- Data Definition Language
A Linguagem de definio de dados abrange
comandos para:
Create table, Alter table e Drop table:
comandos para a definio de esquemas de relaes
(criao e modificao) e excluso de relaes.

Create domain:
criao de domnio dos valores associados a
atributos.
Tipos de Domnios em SQL (1/3)
char(n) uma cadeia de caracteres de tamanho fixo
varchar(n) uma cadeia de caracteres e tamanho
varivel

integer um inteiro (4 bytes)
smallint um inteiro pequeno (2 bytes)

numeric(p, d) um nmero de ponto fixo cuja preciso
definida. Onde, p indica a quantidade de digitos
(incluindo o ponto decimal e o sinal) e d dos p dgitos
esto direita do ponto decimal. Por exemplo, para
representar o valor -3500,75 seria necessrio a seguinte
definio: numeric(8,2)
Tipos de Domnios em SQL (2/3)
real e double precision so nmeros de ponto flutuante e
ponto flutuante de preciso dupla
float(n) um nmero de ponto flutuante com a preciso
definida pelo usurio em pelo menos n digitos

date um calendrio contendo um ano (com 4 dgitos),
ms e dia do ms.
time representa horrio, em horas, minutos e segundos
Tipos de Domnios em SQL (3/3)
O valor nulo (null) um membro de todos os domnios.
Para certos atributos, entretanto, valores nulos podem
ser inadequados.
Como por exemplo, no valor de chaves primrias ou de
um atributo como o CPF.

A SQL permite que a declarao de domnios de um
atributo inclua a especificao de not null, proibindo,
assim, a insero de valores nulos para esse tipo de
atributo. Qualquer modificao que possa resultar na
insero de um valor nulo em um domnio not null gera
um diagnstico de erro.

Criando Domnios
A SQL-92 permite a definio de domnios usando a
clusula create domain:
create domain dom_mes as smallint
check(value between 1 and 12)
create domain dom_boolean as char(1)
check(value in('T', 'F'))
create domain dom_salario as numeric(8, 2)
default 380.00
check(value >= 380.00)
create domain nomeDoDomnio tipoDoDomnio
onde:
value representa o valor atribuido ao atributo
default define o valor padro para o atributo
check verifica se o valor informado para o atributo
satisfaz a condio especificada
para apagar um domnio
criado:
drop domain nomeDoDomnio
create domain dom_sexo as char(1)
check(value in('M', 'F'))
Criando Relaes (1/4)
create table r
(A
1
D
1
, A
2
D
2
, ..., A
n
D
n
,
<regras de integridade
1
>
...,
<regras de integridade
k
>)
onde: r o nome da relao, cada A
i
o nome de um atributo no
esquema da relao r e D
i
o tipo de domnio dos valores no
domnio dos atributos A
i
.

As regras de integridade (constraint) permitidas:
primary key (chave primria)
foreing key (chave estrangeira)
Definio de Esquema em SQL:
Criando Relaes (2/4)
create table empregado (
nome_emp varchar(20),
rua varchar(20),
cidade varchar(20)
)
create table empregado_depto (
nome_emp varchar(20),
depto char(1),
salario dom_salario
)
create table cargo (
cdCargo integer not null,
nmCargo varchar(35),
vrSalario dom_salario,

constraint pk_cargo primary key(cdCargo)
)
Criando Relaes (3/4)
create table func (
nrMatric integer not null,
nmFunc varchar(35),
dtAdm date,
sexo dom_sexo,
cdCargo integer,
cdDepto integer,
constraint pk_func primary key(nrMatric),
constraint fk_func_cdCargo foreign key(cdCargo)
references cargo(cdCargo),
constraint fk_func_cdDepto foreign key(cdDepto)
references depto(cdDepto)
)
create table depto (
cdDepto integer not null,
nmDepto varchar(35),
ramal integer,
constraint pk_depto primary key(cdDepto)
)
Criando Relaes (4/4)
create table ficha (
cdCliente integer not null,
cdProduto integer not null,
saldo integer,
constraint pk_ficha primary key(cdCliente, cdProduto),

constraint fk_ficha_cdCliente foreign key(cdCliente)
references cliente(cdCliente),
constraint fk_ficha_cdProduto foreign key(cdProduto)
references produto(cdProduto)
)
create table produto (
cdProduto integer not null,
nomeProduto varchar(35),
constraint pk_produto primary key(cdProduto)
)
create table cliente (
cdCliente integer not null,
nomeCliente varchar(35),
constraint pk_cliente primary key(cdCliente)
)
Projetando um Banco de Dados (1/2)
Contratos
cdTime
nomeTime
Jogadorees
cdJogador nomeJogador
M N
Times
dtContrato
Modelo Entidade Relacionamento (projeto conceitual)
Modelo Relacional (projeto lgico)
Times (cdTime, nomeTime)
Jogadores (cdJogador, nomeJogador)
Contratos (cdTime, cdJogador, dtContrato, dtRescisao)
dtRescisao
Projetando um Banco de Dados (2/2)
create table contratos (
cdTime integer not null,
cdJogador integer not null,
dtContrato date not null,
dtRescisao date,
constraint pk_contratos primary key(cdTime, cdJogador, dtContrato),

constraint fk_contratos_cdTime foreign key(cdTime)
references times(cdTime),
constraint fk_contratos_cdJogador foreign key(cdJogador)
references jogadores(cdJogador)
)
create table times (
cdTime integer not null,
nomeTime varchar(35),
constraint pk_times primary key(cdTime)
)
create table jogadores (
cdJogador integer not null,
nomeJogador varchar(35),
constraint pk_jogadores primary key(cdJogador)
)
Removendo Relaes
Para remoo de uma relao deve-se usar o comando
drop table.

O comando: drop table r

uma ao mais drstica que: delete from r

onde:
delete from r mantm a relao r, mas remove todas as
suas tuplas.

drop table r no remove apenas todas as tuplas de r, mas
tambm seu esquema.
Modificando Relaes (1/3)
Para modificar uma relao deve-se usar o comando alter table.


para adicionar atributos a uma relao existente:
alter table r add A D

onde r o nome de uma relao existente, A o nome do novo
atributo que ser adicionado e D seu domnio. Ateno: todas as
tuplas da relao recebem valores null para seu novo atributo.


para remover atributos de uma relao existente:
alter table r drop A

onde r o nome de uma relao existente e A, o nome do atributo da
relao que ser removido.
Modificando Relaes (2/3)
Adicionando e Removendo atributos:
Acrescenta o atributo "nomeChefe" do tipo varchar(30) na
relao "depto".
alter table depto
add nomeChefe varchar(35)

Remove o atributo "sexo" da relao "func".
alter table func
drop sexo

Reacrescenta o atributo "sexo" usando o domnio criado
"dom_sexo" no final da estrutura de campos da relao "func".
alter table func
add sexo dom_sexo

Modifica a posio do atributo "sexo" em funo da estrutura
de campos da relao "func".
alter table func
alter sexo position 4
Modificando Relaes (3/3)
Adicionando e Removendo restries (constraint):
Remove a restrio de chave primria "pk_func_nrMatric" da relao
"func".
alter table func
drop constraint pk_func

Reacrescenta a restrio de chave primria "pk_func_nrMatric" na
relao "func".
alter table func
add constraint pk_func
primary key(nrMatric)

Remove a restrio de chave estrangeira "fk_func_cdDepto" da relao
"func".
alter table func
drop constraint fk_func_nrMatric

Reacrescenta a restrio de chave estrangeira "fk_func_cddepto"
usando o atributo "cddepto" fazendo a ligao com a relao "depto".
alter table func
add constraint fk_func_cddepto
foreign key(cddepto) references depto(cddepto)
DML- Data Manipulation Language
A Linguagem interativa de manipulao de
dados abrange:
Select, From e Where:
uma linguagem de consulta baseada tanto na lgebra
relacional quanto no clculo relacional de tuplas.

Insert, Delete e Update:
engloba tambm comandos para insero, excluso e
modificao de tuplas no banco de dados.
Consulta SQL Bsica
A estrutura bsica de uma consulta em SQL consiste em
trs clusulas: select, from e where.

A clusula select corresponde operao de projeo (t)
da lgebra relacional. Ela usada para relacionar os
atributos desejados no resultado de uma consulta.
A clusula from corresponde operao de produto
cartesiano () da lgebra relacional. Ela associa as relaes
que sero pesquisadas durante a evoluo de uma
expresso.
A clusula where corresponde seleo (o) do predicado
da lgebra relacional. Ela consiste em um predicado
envolvendo atributos da relao que aparece na clusula
from.
SELECT versus t (projeo) (1/2)
select A
1
, A
2
, ..., A
n
from r
1
, r
2
, ..., r
m
where P

Onde, cada Ai representa um atributo e cada r
i
,
uma relao. P um predicado. A consulta acima
equivalente seguinte expresso em lgebra
relacional:
t (o
P
(r
1
r
2
... r
m
))
A
1
, A
2
, ..., A
n
SELECT versus t (projeo) (2/2)
Se a clusula where for omitida, o predicado P
verdadeiro. Entretanto, de modo diferente das expresses
em lgebra relacional, o resultado de uma consulta em
SQL pode conter cpias mltiplas de algumas tuplas.


Semntica de uma consulta SQL:

A SQL forma um produto cartesiano das relaes
indicadas na clusula from, executa uma seleo em
lgebra relacional usando o predicado da clusula where e,
ento, projeta o resultado sobre os atributos da clusula
select.
Encontre todas as tuplas da relao employee, ordenando o
resultado pelo atributo first_name.
A Clusula SELECT (1/6)
select * from employee
order by first_name
O asterisco * pode ser usado para denotar todos os atributos da
relao selecionada. O resultado de uma consulta SQL ,
naturalmente, uma relao.
Encontre todas as tuplas da relao employee, com dupla
ordenao: primeiro pelo atributo dept_no e as tuplas com valor
igual para o atributo dept_no ficam ordenadas pelo atributo
first_name.
A Clusula SELECT (2/6)
select * from employee
order by dept_no, first_name
Encontre todas as tuplas da relao employee, ordenando o
resultado pelo atributo first_name e apresentando (ou projetando)
somente os atributos: first_name, last_name, dept_no.
A Clusula SELECT (3/6)
select first_name, last_name, dept_no
from employee
order by first_name
t
first_name, last_name, dept_no
(employee)
Encontre todas as tuplas da relao employee, ordenando o resultado pelo atributo
dept_no e apresentando (ou projetando) somente o atributo dept_no.
A Clusula SELECT (4/6)
select dept_no
from employee
order by dept_no
select distinct dept_no
from employee
order by dept_no
Linguagens formais de consulta apiam-se na noo matemtica de uma relao ser um
conjunto. Assim, tuplas duplicadas nunca aparecem nas relaes. Na prtica, a eliminao
da duplicidade consome um tempo relativo. Portanto, a SQL (como a maioria das
linguagens comerciais de consulta) permite duplicidade nas relaes. Para eliminar as
duplicidades deve-se inserir a palavra chave distinct depois da clusula select.
t
dept_no
(employee)
Encontre todas as tuplas da relao employee, ordenando o
resultado pelo atributo dept_no e apresentando (ou projetando)
somente o atributo dept_no.
A Clusula SELECT (5/6)
select all dept_no
from employee
order by dept_no
A SQL permite o uso da palavra-chave all
para especificar explicitamente que as
duplicidades no sero elimindas.
Encontre todas as tuplas da relao employee, ordenando o resultado pelo
atributo first_name e apresentando (ou projetando) somente os atributos:
first_name, last_name, salary e salary / 12.
A Clusula SELECT (6/6)
select first_name, last_name, salary, salary / 12
from employee
order by first_name
A clusula select pode conter
expresses aritmticas envolvendo
os operados +, -, * e /, e operandos
constantes ou atributos das tuplas.
t
first_name, last_name, salary, salary / 12
(employee)
Encontre todas as tuplas da relao employee para as quais o valor
do atributo dept_no seja igual a 120.
A Clusula WHERE (1/5)
select * from employee
where dept_no = 120
A SQL usa conectores lgicos and, or e not, em vez dos smbolos
matemticos ., v e , na clusula where. Os operandos dos
conectivos lgicos podem ser expresses envolvendo operadores de
comparao <, <=, >, >=, = e <> (diferente de).
o
dept_no = 120
(employee)
Encontre todas as tuplas da relao employee para as quais o valor
do atributo salary esteja no intervalo fechado de 80000.00 at
90000.00.
A Clusula WHERE (2/5)
select * from employee
where (salary >= 80000.00) and
(salary <= 90000.00)
o
salary > 80000.00 . salary s 90000.00
(employee)
Encontre todas as tuplas da relao employee para as quais o valor
do atributo salary esteja no intervalo fechado de 80000.00 at
90000.00.
A Clusula WHERE (3/5)
select * from employee
where salary between 80000.00 and 90000.00
A SQL possui o operador de comparao between para simplificar a
clusula where que especifica que um atributo possa ter um valor
maior ou igual a algum valor e menor ou igual a algum outro valor.
Encontre todas as tuplas da relao employee para as quais o valor do atributo
job_country seja igual a Canada ou igual a England e apresentando (ou
projetando) somente os atributos: last_name, first_name, job_country.
A Clusula WHERE (4/5)
select last_name, first_name, job_country
from employee
where job_country in ('Canada', 'England')
A SQL possui o operador de teste de pertinncia in que verifica se um dado valor
membro (ou pertence) a um conjunto de valores. No exemplo acima as tuplas
que aparecero no resultado da consulta so aquelas cujo valor do atributo
job_country pertena ao conjunto (Canada, England).
Encontre todas as tuplas da relao employee para as quais o valor do atributo
hire_date seja um valor de data pertencente ao ano de 1991, ou seja, de
01/01/1991 at 31/12/1991, ordenando o resultado pelo atributo hire_date e
apresentando (ou projetando) somente os atributos: full_name, salary,
hire_date.
A Clusula WHERE (5/5)
select first_name, salary, hire_date
from employee
where hire_date between '01/01/1991' and '12/31/1991'
order by hire_date
A o
hire_date > 01/01/1991 . hire_date s 31/12/1991
(employee)

t
full_name, salary, hire_date
(A)

A clusula from por si s define um produto cartesiano das relaes na clusula. Encontre
todas as tuplas da relao customer relacionadas (ou juntadas) com todas as tuplas
correspondentes na relao sales ordenando pelo atributo cust_no.
A Clusula FROM
select customer.cust_no, customer, po_number,
sales.cust_no, total_value
from customer, sales
where customer.cust_no = sales.cust_no
order by customer.cust_no
A mesma consulta em lgebra relacional:
t
customer.cust_no, customer, po_number, sales.cust_no, total_value
(customer sales)
A SQL usa a notao:
NomeDaRelao.NomeDoAtributo, como
na lgebra relacional, para evitar
ambigidades nos casos em que um
atributo aparece no esquema de mais de
uma relao.
A SQL proporciona um mecanismo para rebatizar tanto relaes
(variveis tuplas) quanto atributos, usando a clusula as da seguinte
forma:

nome_antigo as nome_novo
A Operao Rename (as)
select salary
from employee
where dept_no = 120
select sum(salary) as tot_salary
from employee
where dept_no = 120
t (o
dept_no = 120
(employee))

tot_salary
(sum(salary))
A clsula as particularmente til na definio do conceito de varivel tupla. Uma
varivel tupla em SQL precisa estar associada a uma relao da clusula from em
particular. Encontre todas as tuplas da relao customer relacionadas (ou
juntadas) com todas as tuplas correspondentes na relao sales ordenando pelo
atributo cust_no.
Variveis Tuplas
select c.cust_no, customer, po_number,
s.cust_no, total_value
from customer c, sales s
where c.cust_no = s.cust_no
order by c.cust_no
Define-se a varivel tupla, neste caso, as
variveis c e s, na clusula from
colocando-a depois do nome da relao
qual est associada.
Ateno: o uso da palavra-chave as
opcional.
As operaes em strings mais usadas so as checagens para verificao de
coincidncias de pares, usando o operador like combinado com os caracteres
especiais: porcentagem (%) e sublinhado (_).
Operaes em Strings (1/3)
Expresso Resultado
LIKE A% Qualquer string que iniciem com a letra A.
LIKE %A Qualquer string que terminem com a letra A.
LIKE %A% Qualquer string que tenha a letra A em qualquer posio.
LIKE A_ String de dois caracteres que tenham a primeira letra A e o segundo caractere seja
qualquer outro.
LIKE _A String de dois caracteres cujo primeiro caractere seja qualquer um e a ltima letra
seja a letra A.
LIKE _A_ String de trs caracteres cuja segunda letra seja A, independentemente do primeiro
ou do ltimo caractere.
LIKE %A_ Qualquer string que tenha a letra A na penltima posio e a ltima seja qualquer
outro caractere.
LIKE _A% Qualquer string que tenha a letra A na segunda posio e o primeiro caractere seja
qualquer outro caractere.
Comparaes com strings so sensveis ao tamanho da letra; isto , minsculas
no so iguais a maisculas, e vice-versa.
Operaes em Strings (2/3)
Expresso Resultado
LIKE ___ Qualquer string com exatamente trs caracteres.
LIKE ___% Qualquer string com pelo menos trs caracteres.
select full_name
from employee
where full_name like 'Johnson%'
select full_name
from employee
where full_name like '%Le%'
Para comparaes que envolvam caracteres especiais (isto , % e _), a SQL
permite o uso de um caractere de escape (\). Esse caractere usado imediatamente
antes do caractere especial que dever ser tratado como um caractere normal.
Operaes em Strings (3/3)
Expresso Resultado
LIKE ab\%cd Qualquer string que comece por ab%cd.
LIKE ab\\cd Qualquer string que comece por ab\cd.
LIKE %% Qualquer string que tenha o caractere em qualquer posio.
A SQL permite pesquisar diferenas em vez de coincidncias, por meio do uso do
operador de comparao not like.
select full_name
from employee
where upper(full_name) like '%LE%'
A SQL tambm permite uma variedade de funes com strings de caracteres,
como concatenao (usando ||), extrao de substrings, indicao de tamanhos
de strings, converso de minsculas para maisculas (upper) e assim por diante.
Utiliza-se a funo extract com as palavras-chave: day, month e year.
Operaes em Datas (1/2)
Encontre todas as tuplas da relao employee para as quais o valor do atributo
hire_date seja um valor de data pertencente ao ms de agosto de qualquer ano e
apresentando (ou projetando) somente os atributos: full_name, salary,
hire_date.
select full_name, salary, hire_date
from employee
where extract(month from hire_date) = 8
Operaes em Datas (2/2)
Encontre todas as tuplas da relao employee para as quais o valor do atributo
hire_date seja um valor de data pertencente ao ano de 1991, ordenando o
resultado pelo atributo full_name e apresentando (ou projetando) somente os
atributos: full_name, salary, hire_date.
select full_name, salary, hire_date
from employee
where extract(year from hire_date) = 1991
order by full_name
Ateno:
No banco de dados MS Access
day, month e year so funes.
E devero ser usadas como no
exemplo a seguir:

select * from employee
where year(hire_date) = 1991
A SQL oferece ao usurio algum controle sobre a ordenao por meio da qual as
tuplas de uma relao sero apresentadas. A clusula order by faz com que as
tuplas do resultado de uma consulta apaream em uma determinada ordem. Por
padro, a relao ordenada apresentada em ordem ascendente. Para
especificao da forma de ordenao, deve-se indicar desc para ordem
descendente e asc para ordem ascendente. Alm disso, a ordenao pode ser
realizada por diversos atributos.
Ordenao de Tuplas (1/3)
select full_name, salary
from employee
order by salary asc
select full_name, salary
from employee
order by salary desc
Para exibir as 10 primeiras tuplas do resultado, ou seja, os 10
salrios mais altos deve-se usar a clusula first.
Ordenao de Tuplas (2/3)
select first 10 full_name, salary
from employee
order by salary desc
1
2
3
4
5
6
7
8
9
10
Para pular as tuplas iniciais do resultado deve-se usar a clusula
skip. Por exemplo, para exibir do 5 ao 10 maiores salrios, ou seja,
pulando (skip 4) as 4 primeiras tuplas.
Ordenao de Tuplas (3/3)
select first 6 skip 4 full_name, salary
from employee
order by salary desc
1
2
3
4
5
6
7
8
9
10
5
6
7
8
9
10
As funes agregadas so funes que tomam uma coleo (um conjunto ou um
subconjunto) de valores como entrada, retornando um valor simples.
Funes Agregadas (1/3)
select avg(salary) as salario_avg
from employee
Mdia (average): avg
select min(salary) as salario_min
from employee
Mnimo valor: min
select max(salary) as salario_max
from employee
Mximo valor: max
Funes Agregadas (2/3)
select sum(salary) as salario_total
from employee
Soma Total: sum
select c.cust_no,
sum(total_value) as tot
from customer c, sales s
where c.cust_no = s.cust_no
group by c.cust_no
order by c.cust_no
Funes Agregadas (3/3)
select count(*) as ct
from employee
Contagem: count
select c.cust_no,
sum(total_value) as tot,
count(*) as ct
from customer c, sales s
where c.cust_no = s.cust_no
group by c.cust_no
order by c.cust_no
select count(distinct cust_no) as ct
from sales
Existem circunstncias em que seria necessrio aplicar uma funo agregada
(count, sum, avg, ...) no somente a um conjunto de tuplas, mas tambm a um
grupo de conjunto de tuplas o que possvel usando a clusula SQL group by.

O atributo ou atributos fornecidos na clusula group by so usados para formar
grupos. Tuplas com os mesmos valores em todos os atributos da clusula group by
so colocadas em um grupo.
A Clusula Group By (1/2)
\* aplicando a funo agregada a um
grupo de conjunto de tuplas *\
select dept_no, avg(salary) as salario_avg
from employee
group by dept_no
\* aplicando a funo agregada a um
conjunto de tuplas *\
select avg(salary) as salario_avg
from employee
s vezes, mais interessante definir condies e aplic-las a grupos de que
aplic-las a tuplas. Por exemplo, encontrar quais dept_no possuem mdia (avg)
do atributo salary maior que a mdia de todas as tuplas da relao employee.

Essa condio no se aplica a uma nica tupla, mas em cada grupo determinado
pela clusula group by.

Para exprimir tal consulta, deve-se usar a clusula having da SQL. Os predicados
da clusula having so aplicados depois da formao dos grupos, assim podero
ser usadas funes agregadas.
A Clusula Group By (2/2)
select dept_no, avg(salary) as salario_avg
from employee
group by dept_no
having avg(salary) > (select avg(salary) from employee)
Operaes de Conjuntos
Os operadores SQL-92 union, intersect e except
operam relaes e correspondem s operaes de
unio (), interseo () e diferena () da lgebra
relacional, e portanto, as relaes participantes
devem ser compatveis, ou seja, apresentar o
mesmo conjunto de atributos (ou esquema).

A SQL-89 possui diversas restries para o uso de
union, intersect e except.

Certos produtos no oferecem suporte para essas
operaes.
Una todas as tuplas da relao employee para as quais o valor do atributo
dept_no seja igual a 120 com as tuplas da relao employee cujo o valor do
atributo dept_no seja igual a 600.
A Operao de Unio ()
select full_name, salary, dept_no from employee
where dept_no = 120
union
select full_name, salary, dept_no from employee
where dept_no = 600
A t
full_name, salary, hire_date
(o
dept_no = 120
(employee))
B t
full_name, salary, hire_date
(o
dept_no = 600
(employee))
A B
Valores Nulos
O valor null indica a ausncia de informao sobre o valor
de um atributo. Sendo assim, pode-se usar a palavra-chave
null como predicado para testar a existncia de valores
nulos.
select * from customer
inner join sales
on customer.cust_no = sales.cust_no
where phone_no is null
O predicado not null testa a ausncia de valores nulos.
Alm de fornecer o mecanismo bsico do produto cartesiano para a
composio das tuplas de uma relao disponvel nas primeiras
verses da SQL, a SQL-92 tambm oferece diversos outros
mecanismos para composio de relaes como as junes
condicionais e as junes naturais, assim como vrias formas de
junes externas.

juno interna (ou juno condicional): inner join

juno externa esquerda: left outer join
juno externa direita: right outer join
juno externa total: full outer join
Composio de Relaes
select c.cust_no, customer,
po_number, ship_date, total_value, sales_rep,
full_name
from customer c

inner join sales s on c.cust_no = s.cust_no

inner join employee e on s.sales_rep = e.emp_no
Relaciona (ou junta) atravs do atributo cust_no cada tupla da relao
customer com as suas tuplas correspondentes na relao sales. Cada tupla
resultante dessa primeira relao juntada com a tupla correspondente na relao
employee atravs do predicado on s.sales_rep = e.emp_no.
Juno Interna (inner join)
Juno Externa Esquerda (left outer join)
As operaes de juno externa so uma extenso da operao de
juno interna (inner join) para tratar informaes omitidas.
select * from empregado e
inner join empregado_depto d
on e.nome_emp = d.nome_emp
Juno Interna
Os empregados Alzemiro e Tadeu
na participam da relao resultado
porque no possuem valores nas duas
relaes envolvidas.
Juno Externa Esquerda
Acrescenta a relao resultado todas
as tuplas da relao esquerda que
no encontram par entre as tuplas da
relao direita, preenchendo com
valores nulo todos os outros atributos
da relao a direita.
select * from empregado e
left outer join empregado_depto d
on e.nome_emp = d.nome_emp
empregado empregado_depto
A juno externa direita acrescenta a relao resultado todas as tuplas da relao
direita que no encontram par entre as tuplas da relao esquerda, preenchendo com
valores nulo todos os outros atributos da relao a direita.
Juno Externa Direita (right outer join)
empregado empregado_depto
select * from empregado e
inner join empregado_depto d
on e.nome_emp = d.nome_emp
Juno Interna
Os empregados Alzemiro e Tadeu
na participam da relao resultado
porque no possuem valores nas duas
relaes envolvidas.
select * from empregado e
right outer join empregado_depto d
on e.nome_emp = d.nome_emp
A juno externa total acrescenta a relao resultado as tuplas da relao esquerda que
no encontram par entre as tuplas da relao direita, assim como as tuplas da relao
direita que no encontram par entre as tuplas da relao esquerda.
Juno Externa Total (full outer join)
select * from empregado e
inner join empregado_depto d
on e.nome_emp = d.nome_emp
Juno Interna
Os empregados Alzemiro e Tadeu
na participam da relao resultado
porque no possuem valores nas duas
relaes envolvidas.
select * from empregado e
full outer join empregado_depto d
on e.nome_emp = d.nome_emp
empregado empregado_depto
As instrues para modificar a instncia de banco de dados
sero demonstradas, basicamente, sobre o seguinte
esquema:

Modelo Relacional (modelo lgico):
Modificaes no Banco de Dados (1/7)
CdCargo NmCargo VrSalario
cargo
CdDepto NmDepto Ramal
depto
NrMatric NmFunc DtAdm Sexo CdCargo CdDepto
funcionario
Modificaes no Banco de Dados (2/7)
Insero (insert)
Para inserir dados em uma relao podemos especificar
uma tupla a ser inserida ou escrever uma consulta cujo
resultado um conjunto de tuplas a inserir. Obviamente,
os valores dos atributos para as tuplas a inserir devem
pertencer ao domnio desses atributos. Similarmente,
tuplas a inserir devem possuir a ordem correta (mesmo
esquema).
insert into NomeDaRelao
values (ValorDoAtributo1, ValorDoAtributo2, ...,
ValorDoAtributoN)
Modificaes no Banco de Dados (3/7)
Inserindo uma tupla.
insert into cargo
values(1, 'Programador Analista', 2500.00)

insert into cargo
values(2, 'DBA', 4700.00)

insert into cargo
values(3, 'Suporte', 800.00)
Insero (insert)
select * from cargo
Inserindo um conjunto de tuplas.
insert into newcargo
select * from cargo
Modificaes no Banco de Dados (4/7)
Inserindo uma tupla e usando apenas alguns atributos.
insert into newcargo(cdcargo, nmcargo)
values(1, 'Programador Analista')

Seria equivalente a seguinte instruo.
insert into newcargo
values(1, 'Programador Analista', null)


Inserindo uma tupla e usando apenas alguns atributos.
insert into newcargo(cdcargo, vrsalario)
values(2, 5000.00)

Seria equivalente a seguinte instruo.
insert into newcargo
values(2, null, 5000.00)
Insero (insert)
select * from newcargo
Modificaes no Banco de Dados (5/7)
Remoo (delete)
Um pedido de remoo de dados expresso muitas vezes
do mesmo modo que uma consulta. Pode-se remover
somente tuplas inteiras; no possivel, por exemplo,
excluir valores de um atributo em particular.
delete from r
where P
em que P representa um predicado e r, uma relao. O
comando delete encontra primeiro todas as tuplas t em r
para as quais P(t) verdadeira e ento remove-as de r. A
clusula where pode ser omitida nos casos de remoo de
todas as tuplas de P.
Modificaes no Banco de Dados (6/7)
Remove todos os funcionrios com CdCargo = 1.
delete from func
where CdCargo = 1

Remove todos os funcionrios com CdCargo = 1 e
com CdDepto = 1.
delete from func
where (CdCargo = 1) and (CdDepto = 1)

Remove todos os funcionrios.
delete from func


O pedido delete por conter um select aninhado, como por
exemplo, para remover todos os funcionrios com o valor do
atributo Salary maior que a mdia do prprio atributo.
delete from employee
where salary > (select avg(salary) from employee)
Remoo (delet)
Modificaes no Banco de Dados (7/7)
Atualizaes (update)
Aumenta 10% os salrio de todos os cargos.
update cargo
set vrSalario = vrSalario * 1.10

Aumenta em R$ 50,00 os salrio inferiores a R$ 1.000,00.
update cargo
set vrSalario = vrSalario + 50.00
where vrSalario < 1000.00

Modifica o nome e o salrio do CdCargo = 1.
update cargo
set nmCargo = 'Programador Analista Senior',
vrSalario = 4500.00
where cdCargo = 1

Aumenta 5% os salrio dos cargos com salrio abaixo da mdia.
update cargo
set vrSalario = vrSalario * 1.05
where vrSalario < (select avg(vrSalario) from cargo)
Referncias
Sistema de Banco de Dados.
Abraham Silberschatz; Henry F. Korth; S.
Sudarshan.
Captulo 4: SQL
So Paulo: Makron Books, 3 ed., 1999.

Prof. Francisco Reverbel
http://www.ime.usp.br/~reverbel/

Você também pode gostar