SQL Álvaro Vinícius de Souza Coêlho [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_numero from deposito where saldo >= 90000 and saldo <= 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 acrescentar Order 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: Delete Delete 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: Insert Insert 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 deposito Values (select “Cruzeiro”, e.emp_numero, e.cliente_nome, 200 From empréstimos e Where e.agencia_nome = “Cruzeiro”) SQL • Atualização. Update Update 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 view Create 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