sql Álvaro vinícius de souza coêlho [email protected]
TRANSCRIPT
SQL
Álvaro Vinícius de Souza Coê[email protected]
SQL
• Sigla de Structured Query Language
• Desenvolvida no hoje Centro de Pesquisa Almadem (IBM)
• Início dos anos 70
• 1o Produto comercial, Oracle RDBMS (Oracle Co), 1979
• 1o Padrão publicado pelo Ansi em 1986
SQL
• Estrutura básica
Select a1, a2, ... an
From r1, r2, …, rn
Where P
SQL
• “Mostrar as agências onde há depósito”
select agencia_nome
from deposito
SQL
• Para suprimir as repetições
Select distinct agencia_nome
From deposito
SQL
• “Mostrar a cidade e o nome dos clientes com empréstimo em alguma agência”
select distinct cliente.cliente_nome, cliente_cidade
from empréstimo, cliente
where cliente.cliente_nome = empréstimo.cliente_nome
SQL
• O nome da tabela na cláusula From é desnecessário quando não há ambigüidade
• Pode-se substituir o nome da tabela por variáveis tipo tupla...
from empréstimo e, cliente c
where c.cliente_nome = e.cliente_nome
SQL
• O nome das colunas é desnececssário quando todas as colunas forem selecionadas. Usa-se o *select * from agencia
SQL
• Os conectores lógicos são and, or e not
• “Mostrar o nome e a cidade dos clientes com empréstimo na agência Cruzeiro”select distinct c.cliente_nome, c.cliente_cidade
from empréstimo e, cliente c
where e.cliente_nome = c.cliente_nome and
e.agencia_nome = “Cruzeiro”
SQL
• Pode-se usar os comparadores =, <>, >, >=, <, <=, like e between
• “Mostrar as contas com saldo entre 90000 e 100000”select conta_numerofrom depositowhere saldo >= 90000 andsaldo <= 100000
SQL
• O operador between simplifica consultas deste tipo:...
where saldo between 90000 and 100000
SQL
• MetaCaracteres
• Substituição de cadeias de caracteres: % e _
• % substitui uma seqüência qualquer de caracteres
• _ substitui um único caractere
SQL
• like “Santo%” aceita qualquer nome começado assim
• Santos, Santo Estêvão, Santo André, etc.
• like “Dom Pedro _” aceita qualquer caractere (logo não pode formar Dom Pedro II)
• Usa-se o comparador like
SQL
• “Mostre o nome de todos os clientes começados com a letra A” (sic)select cliente_nome
from clientes
where cliente_nome like “A%”
SQL
• Comparação de conjuntos: IN
• “Mostrar todas as agências que ficam em Ilhéus ou em Itabuna”select agencia_nome
from agencia
where agencia_cidade in (“Ilhéus”, “Itabuna)
SQL
• Pode-se usar in para verificar a pertinência em conjuntos formados a partir de outras consultas (subquery)
• Característica de SQL não presente em QBE ou Quel
SQL
• “Mostrar as agências com ativos maiores que algum dos ativos de Ilhéus”select agencia_nome
from agencia
where ativos > Some (select ativos
from agencia
where agencia_cidade = “Ilhéus”)
SQL
• “Mostrar as agências com ativos maiores do que qualquer agência no Ilhéus”select agencia_nome
from agencias
where ativos > All (select ativos
from agencia
where agencia_cidade = “Ilhéus”)
SQL
• Some: algum. All: qualquer (todos)
• Poderia-se usar, conforme será mostrado, Min e Max. Qual a diferença?
SQL
• Exists: “Mostre os clientes e as cidades que possuem pelo menos uma conta em Cruzeiro”Select distinct cliente_nome, cliente_cidade
From cliente c
Where exists (select cliente_nome from depositos
Where agencia_nome = “Cruzeiro”)
SQL
• Exists pára a verificação e retorna TRUE se algum elemento surge na seleção, ou segue até o fim caso contrário.
SQL
• Ordenação - order by: “Mostre os clientes em ordem alfabética”Select cliente_nome
From cliente
Order by cliente_nome
SQL
• O SQL Ordena, por padrão, em ordem crescente. Caso se deseje ordenação inversa, usa-se desc após o nome da coluna
SQL
• Pode-se ordenar mais de uma coluna: “Mostrar os clientes em ordem crescente, com os respectivos saldos de conta em ordem decrescente”Select cliente_nome, saldo
From depósitos
Order by cliente_nome, saldo desc
SQL
• Agregação
• O SQL contém as funções de agregação AVG, MIN, MAX, SUM e COUNT
• “Mostrar a média dos saldos em Cruzeiro”select avg(saldo)
from deposito
where agencia_nome – “Cruzeiro”
SQL
• “Mostrar também quantas contas tem a agência Cruzeiro”select avg(saldo), count(distinct conta_numero)
from deposito
where agencia_nome = “Cruzeiro”
SQL
• Agrupamento: Group by
• “Mostre a media dos saldos e o número de contas de todas as agências”select agencia_nome,avg(saldo), count(distinct
conta_numero)
from deposito
group by agencia_nome
SQL
• Caso se desejasse ordenar pelo nome da agência, era necessário acrescentarOrder by agencia_nome
SQL
• Condicionando grupos: having
• Having é como um where, mas serve para as funções de agrupamento.
SQL
• “Mostrar a média dos saldos e o número de contas de todas as agências com média inferior a 1200”select agencia_nome,avg(saldo), count(distinct
conta_numero)
from deposito
group by agencia_nome
having avg(saldo) < 1200
order by agencia_nome
SQL
• DML em SQL
• Exclusão: DeleteDelete r
Where p
• “Remover todos os empréstimos cadastrados”delete emprestimo
SQL
• “Remover os depositos da cidade de Ilhéus”delete depósitos
where agencia_nome in (select agencia_nome
from agencias
where agencia_cidade = ”Ilhéus”)
SQL
• Inclusão: InsertInsert into t (a1, a2, ..., an)
Values (v1, v2, … vn)
SQL
• A lista (a1, a2, …, an) pode ser dispensada se todas as colunas forem valoradas e a ordem dos dados for a mesma da estrutura da tabela
SQL
• “Incluir o depósito de 1200 em nome de Sandra na agência Cruzeiro, conta número 9732”insert into deposito
values (“Cruzeiro”, 9732, “Sandra”, 1200)
SQL
• “Incluir o depósito em nome de Sandra na agência Cruzeiro, conta número 2997. Não especificar valor”insert into deposito (agencia_nome,
conta_numero, cliente_nome)
values (“Cruzeiro”, 2997, “Sandra”)
SQL
• Incluir a partir de outras tabelas – O velho exemplo: “Incluir um depósito de 200 para clientes de Cruzeiro, com número da conta igual ao número do empréstimo”Insert into depositoValues (select “Cruzeiro”, e.emp_numero,
e.cliente_nome, 200From empréstimos eWhere e.agencia_nome = “Cruzeiro”)
SQL
• Atualização. UpdateUpdate t
Set c1 = u1, c2 = u2, ..., cn = un
Where P
SQL
• “Pagar juros de 5% a todas as contas”update deposito
set saldo = 1.05*saldo
• “Pagar juros de 5% às contas com saldo inferior a 10000 e 6% às demais” – duas operações (não esquecer: a ordem é relevante).
SQL
update depósitos
set saldo = 1.06*saldo
where saldo > 10000
update depósitos
set saldo = 1.05*saldo
where saldo <= 10000
SQL
• Recursos adicionais
• Teste de nulo (is null) ou não nulo (is not null)...
where saldo is (not) null
SQL
• Visões: create viewCreate view v as (consulta)
• Caso seja necessária uma visão com todos os clientes cujas contas tem saldo sem valor (nulo):
SQL
• Create view Cliente_Conta as (Select cliente_nome
From depósitos
Where saldo is null
Order by cliente_nome)
SQL
• Uma consulta a esses clientes agora pode ser feita assim:Select Cliente_Nome from Cliente_Conta
O que são Bancos de Dados.
FIM!
“ Melhor cair em contradição do que cair do oitavo andar”Barão de Itararé
Escher