Você está na página 1de 16

Artigo

Invista em você! Saiba como a DevMedia pode ajudar sua


carreira.

SQL Avançado
Veja nesse artigo algumas funções avançadas de SQL, assim como trabalhar com

datas, conversões e relacionamento entre tabelas.

Anotar Marcar como concluído

Artigos

Banco de Dados

SQL Avançado

Após vermos algumas funções básicas em SQL, podemos começar a nos aprofundar mais no
assunto.

Como sabemos o SQL é uma linguagem de comunicação com Banco de dados e é a mais
utilizada do mundo.

Trabalhando
Utilizamos cookies paracom
fornecerFunções
uma melhor experiência para nossos usuários.
Para saber mais sobre o uso de cookies, consulte nossa política de privacidade. Ao Aceitar

continuar navegando em nosso site, você concorda com a nossa política.


NVL 76
A função NVL é utilizada para substituir O código abaixo apenas para exibição. o valor nulo
do campo pesquisado por outro valor determinado.

O código abaixo seleciona o campo punit dos registros da tabela pcmov, atribuindo valor 0
se for nulo.

Listagem 1: NVL

1 select nvl(punit,0) from pcmov

NVL2

A função NVL2 é utilizada para substituir O código abaixo apenas para exibição. o valor do
campo, sendo este nulo ou não.

O código abaixo seleciona o campo vpago dos registros da tabela pcprest, atribuindo valor 0
se NÃO for nulo, e atribuindo 2 se for nulo.

Listagem 2: NVL2

1 select nvl2(vpago,0,2) from pcprest

NULLIF

A função NULLIF compara dois valores. Se os valores forem iguais, a função retornará valor
nulo. Se os valores dos campos valor e vpago forem iguais, a função retornará valor nulo. Se
os valores desses campos forem diferentes, a função retornará o primeiro valor.

Listagem 3: NULLIF

1 select valor, vpago, nullif(valor, vpago) from pcprest;

COALESCE
Utilizamos cookies para fornecer uma melhor experiência para nossos usuários.
Para saber mais sobre o uso de cookies, consulte nossa política de privacidade. Ao Aceitar
A função COALESCE verifica os valores da expressão e retorna o primeiro valor não nulo.
continuar navegando em nosso site, você concorda com a nossa política.
76
O código abaixo seleciona dos registros da tabela pcprest, dentre os campos vldesconto,
vpago e valor o primeiro que apresentar valor não nulo.

Listagem 4: Usando a função COALESCE

1 select coalesce(vldesconto, vpago, valor) from pcprest;

DECODE

A função Decode tem como objetivo ‘decodificar’ o valor do campo selecionado, atribuindo
um valor de resposta para cada valor de condição estipulado.

O código abaixo mostra como selecionar dos registros da tabela pcmov o campo numnota, e
exibe mensagem de acordo com as condições: se o campo numnota for igual a 100, exibe
‘CEM’, se for 200, exibe ‘DUZENTOS’, se for 300, exibe ‘TREZENTOS’, se não for nenhum dos
anteriores, exibe ‘NENHUM’.

Listagem 5: Usando função decode

1 select numnota, decode(numnota, 100, ‘CEM’, 200, ‘DUZENTOS’, 300, ‘TREZENTOS’

CASE

A função CASE é utilizada para determinar a exibição do resultado a partir de condições


especificadas dentro da função.

O código abaixo seleciona dos registros da tabela pcmov o campo numnota, e exibe
mensagem de acordo com as condições: caso o campo numnota seja menor que 100, exibe a
mensagem ‘MENOR QUE 100’, caso o campo numnota esteja entre 101 e 200, exibe a
mensagem ‘ENTRE 101 E 200’, caso contrário, exibe a mensagem ‘MAIOR QUE 200’.

Listagem 6: Usando Case


Utilizamos cookies para fornecer uma melhor experiência para nossos usuários.
Para saber mais numnota
select sobre o uso de cookies, consulte
, case nossa política
when numnota < 100de privacidade.
then ‘MENOR AoQUE 100’
Aceitar
1
continuar navegando em nosso site, você concorda com a nossa
when política.
numnota between 101 and 200 the
2
76
3
4 else ‘MAIOR QUE 200’ end “RESULTADO”

from pcmov;

Obs.: Para melhor entendimento da função: para todo ‘case’ deve existir um ‘end’, e para
todo ‘when’ deve existir um ‘then’. O ‘else’ existe sozinho, como última alternativa da função.

LOWER

O código abaixo seleciona dos registros da tabela pcempr os campos matricula e nome,
convertendo o conteúdo do campo nome para que seja exibido todo em caracterees
minúsculos.

Listagem 7: Usando função Lower

1 select matricula, lower(nome) from pcempr;

UPPER

O código abaixo seleciona dos registros da tabela pcempr os campos matricula e nome,
convertendo o conteúdo do campo nome para que seja exibido todo em caracterees
maiúsculos.

Listagem 8: Usando função Upper

1 select matricula, upper(nome) from pcempr;

INITCAP

O código abaixo seleciona dos registros da tabela pcempr os campos matricula e nome,
convertendo o conteúdo do campo nome para que seja exibido com as iniciais em
caracterees maiúsculos.

Listagem 9: Usando função initcap


Utilizamos cookies para fornecer uma melhor experiência para nossos usuários.
Para saber mais sobre o uso de cookies, consulte nossa política de privacidade. Ao Aceitar
1 select matricula, initcap(nome) from pcempr;
continuar navegando em nosso site, você concorda com a nossa política.
76
SUBSTR

A função SUBSTR tem como objetivo extrair parte do conteúdo do campo selecionado, de
acordo com os parâmetros informados na função, independente do tipo do campo
(numérico, texto ou data).

O código abaixo seleciona dos registros da tabela pcempr os campos matricula e nome,
exibindo, do campo nome, apenas o conteúdo a partir do primeiro caractere, os próximos 5
caracterees.

Listagem 10: Usando Substr

1 select matricula, substr(nome,1,5) from pcempr;

LENGTH

A função LENGTH tem como objetivo exibir o tamanho do valor que está gravado no campo
selecionado.

O código abaixo seleciona dos registros da tabela pcempr os campos matricula e nome, e
exibe, logo em seguida, o tamanho do conteúdo do campo nome.

Listagem 11: Usando Length

1 select matricula, nome, length(nome) from pcempr;

REPLACE

A função REPLACE tem como objetivo possibilitar a substituição de caracteres específicos


por outros.

O código abaixo seleciona dos registros da tabela pcempr os campos matricula e nome, e
exibe, logo em seguida, o campo nome, substituindo o caractere ‘A’ por ‘*’.
Utilizamos cookies para fornecer uma melhor experiência para nossos usuários.
Para saber12:
Listagem mais sobre oreplace
Usando uso de cookies, consulte nossa política de privacidade. Ao Aceitar

continuar navegando em nosso site, você concorda com a nossa política.


76
1 select matricula, nome, replace(nome,'A','*') from pcempr;

Obs.: Podem ser substituídos 1 caracteree por vários, vários caracterees por 1, vários por
vários, ou até mesmo 1 ou vários por nenhum caracteree. Para substituir por nenhum
caractere, basta abrir e fechar as aspas simples, não informando nenhum valor.

ROUND

A função ROUND tem como objetivo efetuar o arredondamento de números para a


quantidade de casas decimais determinada na função.

O código abaixo seleciona dos registros da tabela pctabpr os campos codprod, numregiao,
ptabela, e exibe, logo em seguida, o campo ptabela com seu valor arredondado para 2 casas
decimais.

Listagem 13: Usando Round

1 select codprod, numregiao, ptabela, roundO(ptabela,2) from pctabpr;

TRUNC

A função TRUNC tem como objetivo efetuar o truncamento(corte) de números para a


quantidade de casas determinada na função.

O código abaixo seleciona dos registros da tabela pctabpr os campos codprod, numregiao,
ptabela, e exibe, logo em seguida, o campo ptabela com seu valor truncado na segunda casa
decimal.

Listagem 14: Usando função Trunc

1 select codprod, numregiao, ptabela, trunc(ptabela,2) from pctabpr;

MOD
Utilizamos cookies para fornecer uma melhor experiência para nossos usuários.
Para saber mais sobre o uso de cookies, consulte nossa política de privacidade. Ao Aceitar

Acontinuar navegando
função MOD em nosso
tem como site, você
objetivo concorda
exibir o restocom a nossa política.
da divisão de um valor por outro.
76
O código abaixo seleciona dos registros ds tabela pcprest, o resto da divisão do campo valor
por 2.

Listagem 15: Usando MOD

1 select mod(valor,2) from pcprest;

Obs.: para facilitar o entendimento desta função, recomendamos utilizar a seleção da


divisão informada, com truncamento para nenhuma casa decimal.

Exemplo: select trunc(( valor/2),0) from pcprest;

Trabalhando com Datas

Função SYSDATE

O código abaixo seleciona a data do sistema.

Listagem 16: Selecionando data do sistema com Sysdate

1 select sysdate from dual;

Aritmética com Datas

O código abaixo seleciona a data do sistema adicionando 2 dias.

Listagem 17: Adicionando dias

1 select sysdate+2 from dual;

O código abaixo seleciona a data do sistema subtraindo 2 dias.

Listagem 18: Subtraindo dias

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários.
Para select
1 saber mais sysdate-2 from
sobre o uso de dual;
cookies, consulte nossa política de privacidade. Ao Aceitar

continuar navegando em nosso site, você concorda com a nossa política.


76
O código abaixo seleciona dos registros da tabela pcnfsaid os campos numnota, dtsaida,
dtentrega, e exibe, logo em seguida, a diferença entre os campos dtentrega e dtsaida,
apelidando o campo com o nome de ‘diferenca’.

Listagem 19: Diferença entre datas

1 select numnota, dtsaida, dtentrega, dtentrega-dtsaida diferenca from pcnfsaid

Funções de Conversão

O código abaixo seleciona dos registros da tabela pcmov os campos dtmov e numnota e,
logo em seguida, o campo numnota sendo convertido para caractere, no formato de 6
dígitos.

Listagem 20: NUMBER to VARCHAR

1 select dtmov, numnota, to_char(numnota,'000000') from pcmov;

O código abaixo seleciona dos registros da tabela pcmov os campos dtmov e numnota e,
logo em seguida, o campo dtmov sendo convertido para caractere, no formato ‘dd/mm’.

Listagem 21: DATE to VARCHAR

1 select dtmov, numnota, to_char(dtmov,'dd/mm') from pcmov;

Elementos para formatação de data

YYYY é ano completo em números


YEAR é ano escrito por extenso
MM é mês em dois dígitos
MONTH é mês escrito por extenso
MON é mês escrito com as 3 primeiras letras iniciais
Utilizamos cookies para fornecer uma melhor experiência para nossos usuários.
ParaDY
saber mais
é dia sobre o
escrito uso a
com deabreviação
cookies, consulte
em 3 nossa
letraspolítica de privacidade. Ao Aceitar

continuar navegando em nosso site, você concorda com a nossa política.


DAY é dia escrito por extenso
76
DD é dia em dois dígitos
D é dia da semana O código abaixo de 1 a 7.
DDD é dia do ano O código abaixo de 1 a 356.
WW é número da semana dentro do ano
W é número da semana dentro do mês

Funções de Grupo (AVG, COUNT, MAX, MIN, SUM)

AVG

A função AVG tem como finalidade efetuar o cálculo de média simples do campo informado
na função. O código abaixo seleciona a média dos valores do campo vltotal dos registros da
tabela pcnfsaid.

Listagem 22: Usando função AVG

1 select avg(vltotal) from pcnfsaid;

COUNT

A função COUNT tem como finalidade efetuar a contagem do campo informado na função.

O código abaixo efetua contagem do campo numnota dos registros da tabela pcnfsaid.

Listagem 23: Usando função Count

1 select count(numnota) from pcnfsaid;

MAX

A função MAX tem como finalidade exibir o maior valor encontrado no campo informado
na função.
Utilizamos cookies para fornecer uma melhor experiência para nossos usuários.
OPara
código abaixo
saber seleciona
mais sobre o maior
o uso de valor
cookies, encontrado
consulte no campo
nossa política vltotal dentre
de privacidade. Ao todos osAceitar
continuar navegando em nosso site, você concorda com a nossa política.
registros da tabela pcnfsaid.
76
Listagem 24: Usando função MAX

1 select max(vltotal) from pcnfsaid;

MIN

Assim como acontece na função MAX, a função MIN faz exatamente o inverso, ou seja,
exibe o menor valor encontrado no campo informado na função.

O código abaixo seleciona o menor valor encontrado no campo vltotal dentre todos os
registros da tabela pcnfsaid.

Listagem 25: Usando função MIN

1 select min(vltotal) from pcnfsaid;

SUM

A função SUM tem como finalidade efetuar a soma dos valores do campo informado na
função.

O código abaixo seleciona a soma dos valores do campo vltotal de todos os registros da
tabela pcnfsaid.

Listagem 26: Usando função SUM

1 select sum(vltotal) from pcnfsaid;

GROUP BY

Sempre que algumas das funções de grupo citadas no item 6 for utilizada, e também forem
selecionados campos ‘puros’ das tabelas utilizadas, é necessário utilizar a expressão ‘GROUP
BY’ para determinar o agrupamento das informações que serão exibidas.
Utilizamos cookies para fornecer uma melhor experiência para nossos usuários.
Para saber mais sobre o uso de cookies, consulte nossa política de privacidade. Ao Aceitar
O código abaixo seleciona dos registros da tabela pcmov os campos dtmov, codprod, a soma
continuar navegando em nosso site, você concorda com a nossa política.
do campo qt, onde o campo codprod for 0 ou 1, agrupando as informações
76 pelos campos
codprod e dtmov.

Listagem 27: Usando Group By

1 select dtmov, codprod, sum( qt)

2 from pcmov where codprod in (0,1)

3 group by codprod, dtmov;

Relacionamento entre tabelas

Em boa parte das pesquisas de dados, pode ser necessário exibir informações de campos
existentes em mais de uma tabela. Para que isso seja possível, é necessário determinar a
junção/relacionamento que será empregada nas tabelas que estão sendo utilizadas.

O código abaixo seleciona os campos codcli[pcnfsaid], cliente[pcclient] e


numnota[pcnfsaid], dos registros das tabelas pcnfsaid e pcclient, onde o valor do campo
codcli da tabela pcnfsaid for igual ao valor do campo codcli da tabela pcclient. Os resultados
serão exibidos apenas se essa condição for obedecida.

Listagem 28: Relacionamento entre tabelas

1 select pcnfsaid.codcli, pcclient.cliente, pcnfsaid.numnota

2 from pcnfsaid, pcclient

3 where pcnfsaid.codcli = pccleint.codcli;

O código abaixo seleciona os campos codcli[pcnfsaid], cliente[pcclient] e


numnota[pcnfsaid], dos registros das tabelas pcnfsaid e pcclient, onde o valor do campo
codcli da tabela pcnfsaid for igual ao valor do campo codcli da tabela pcclient. Caso os
valores dos campos não sejam iguais, as informações solicitadas da tabela pcnfsaid serão
exibidas, e os campos da tabela pcclient serão exibidos em branco.

Listagem 29: Exibindo resultados apenas se a condição for obedecida

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários.
1 select pcnfsaid.codcli, pcclient.cliente, pcnfsaid.numnota

Para saber mais sobre o uso de cookies, consulte nossa política de privacidade. Ao Aceitar
2 from pcnfsaid, pcclient

continuar navegando em nosso site, você concorda com a nossa política.


3 where codcli = codcli (+);
76
O código abaixo seleciona os campos codusur[pcnfsaid], nome[pcusuari],
codsupervisor[pcusuari] e nome[pcsuperv], dos registros das tabelas pcnfsaid, pcusuari e
pcsuperv, onde o valor do campo codusur da tabela pcnfsaid for igual ao valor do campo
codusur da tabela pcusuari, e o valor do campo codsupervisor da tabela pcusuari for igual
ao valor do campo codsupervisor da tabela pcsuperv. Os resultados serão exibidos apenas se
ambas as condições forem obedecidas.

Listagem 30: Exibindo campos em branco

1 select pcnfsaid.codusur, pcusuari.nome, pcusuari.codsupervisor, pcsuperv.nome

2 from pcnfsaid, pcusuari, pcsuperv

3 where pcnfsaid.codusur = pcusuari.codusur

4 and pcusuari.codsupervisor = pcsuperv.codsupervisor;

O código abaixo seleciona os campos codusur[pcnfsaid], nome[pcusuari],


codsupervisor[pcusuari] e nome[pcsuperv], dos registros das tabelas pcnfsaid, pcusuari e
pcsuperv, onde o valor do campo codusur da tabela pcnfsaid for igual ao valor do campo
codusur da tabela pcusuari, e o valor do campo codsupervisor da tabela pcusuari for igual
ao valor do campo codsupervisor da tabela pcsuperv. Caso os valores dos campos
codsupervisor[pcusuari] e codsupervisor[pcsuperv] não forem iguais, as demais
informações serão exibidas normalmente, porém, as informações da tabela pcsuperv não
serão exibidas.

Listagem 31: Exemplo de relacionamento

1 select pcnfsaid.codusur, pcusuari.nome, pcusuari.codsupervisor, pcsuperv.nome

2 from pcnfsaid, pcusuari, pcsuperv

3 where pcnfsaid.codusur = pcusuari.codusur

4 and pcusuari.codsupervisor = pcsuperv.codsupervisor( +);

Cláusula HAVING
Utilizamos cookies para fornecer uma melhor experiência para nossos usuários.
APara
cláusula
saber HAVING
mais sobretem funcionamento
o uso muito
de cookies, consulte parecido
nossa políticaao
de funcionamento
privacidade. Ao das cláusulas de
Aceitar

continuar navegando em nosso site, você concorda com a nossa política.


restrição WHERE, porém, com uma grande diferença. Enquanto a cláusula WHERE é
76
utilizada para efetuar restrições de informações baseadas em campos das tabelas, a cláusula
HAVING é utilizada para efetuar restrições de informações baseadas em resultados das
funções de grupo (SUM, AVG, MAX, MIN e COUNT).

O código abaixo seleciona dos registros da tabela pcnfsaid os campos codcli e a soma do
campo vltotal, agrupando as informações pelo campo codcli.

As informações só serão exibidas se o valor da soma do campo vltotal for maior que 10000.

Listagem 32: Usando Having

1 select codcli, sum(vltotal)

2 from pcnfsaid

3 group by codcli

4 having sum(vltotal) > 10000;

Sub-select’s

Como o próprio nome diz, sub-select’s são select’s que podem ser utilizados dentro de um
select maior, com o objetivo de auxiliar na extração de dados, seja através da consulta de
uma nova informação, ou através da utilização de seus resultados no processo de restrição
de dados.

O código abaixo seleciona todos os campos dos registros da tabela pcprodut, onde o valor do
campo codprod não existir na lista distinta de valores do campo codprod de todos os
registros da tabela pcmov.

Listagem 33: Usando sub-selects

1 select * from pcprodut

2 where codprod not in (select distinct(codprod) from pcmov);

Conclusão
Utilizamos cookies para fornecer uma melhor experiência para nossos usuários.
Para saber mais sobre o uso de cookies, consulte nossa política de privacidade. Ao Aceitar
Esses foram
continuar mais alguns
navegando comandos
em nosso importantíssimos
site, você no desenvolvimento
concorda com a nossa política. de profissionais
76
que vão atuar como programadores ou administradores de banco de dados.
Espero que tenham gostado e até a próxima.

Veja também

Cálculos avançados em SQL - Revista SQL Magazine 104

Escrevendo queries otimizadas - SQL Magazine 84

Anotar Marcar como concluído

Inicie agora sua carreira de


programador por apenas R$
54,90/mês
Ainda está em dúvida? Experimente a plataforma durante 3 dias sem cartão. Faça
um teste grátis

BENEFÍCIOS

Suporte em tempo real

Certificado de autoridade

Exercícios para praticar

Estudo gamificado

Planos de estudo para


cada carreira de
programador

Saiba
Utilizamos cookies para fornecer uma melhor mais
experiência para nossos usuários.
Para saber mais sobre o uso de cookies, consulte nossa política de privacidade. Ao Aceitar

continuar navegando em nosso site, você concorda com a nossa política.


76
Por Paulo
Em 2013

RECEBA NOSSAS NOVIDADES

Informe o seu e-mail Receber Newsletter

Suporte ao aluno Minhas dúvidas

Tecnologias

Exercicios

Cursos

Artigos

Revistas

Quem Somos

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários.
Fale conosco
Para saber mais sobre o uso de cookies, consulte nossa política de privacidade. Ao Aceitar

continuar
Planonavegando em nosso
para Instituição site, você concorda com a nossa política.
de ensino
76
Assinatura para empresas

Assine agora

Hospedagem web por Porta 80 Web Hosting

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários.
Para saber mais sobre o uso de cookies, consulte nossa política de privacidade. Ao Aceitar

continuar navegando em nosso site, você concorda com a nossa política.


76

Você também pode gostar