Escolar Documentos
Profissional Documentos
Cultura Documentos
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/