Você está na página 1de 41

RECURSOS DE PROGRAMAÇÃO EM

SQL
Professores:
Esp. Eduardo Herbert Ribeiro Bona
Me. Jackson Luis Schirigatti
DIREÇÃO

Reitor Wilson de Matos Silva


Vice-Reitor Wilson de Matos Silva Filho
Pró-Reitor de Administração Wilson de Matos Silva Filho
Pró-Reitor de EAD William Victor Kendrick de Matos Silva
Presidente da Mantenedora Cláudio Ferdinandi

NEAD - NÚCLEO DE EDUCAÇÃO A DISTÂNCIA

Diretoria Executiva Pedagógica Janes Fidelis Tomelin


Diretoria Operacional de Ensino Kátia Coelho
Diretoria de Planejamento de Ensino Fabrício Lazilha
Head de Projetos Educacionais Camilla Barreto Rodrigues Cochia Caetano
Head de Produção de Conteúdos Celso Luiz Braga de Souza Filho
Gerência de Produção de Conteúdos Diogo Ribeiro Garcia
Gerência de Projetos Especiais Daniel Fuverki Hey
Supervisão do Núcleo de Produção de Materiais Nádila de Almeida Toledo
Projeto Gráfico Thayla Guimarães
Designer Educacional Rossana Costa Giani
Editoração Flávia Thaís Pedroso

C397 CENTRO UNIVERSITÁRIO DE MARINGÁ. Núcleo de Educação a


Distância; BONA, Eduardo Herbert Ribeiro; SCHIRIGATTI, Jackson Luis.

Programação SQL I. Eduardo Herbert Ribeiro Bona; Jackson Luis
Schirigatti.
Maringá-Pr.: UniCesumar, 2017.
41 p.
“Pós-graduação Universo - EaD”.
1. Programação. 2. SQL. 3. EaD. I. Título.
ISBN 978-85-459-1503-4
CDD - 22 ed. 005
CIP - NBR 12899 - AACR/2

As imagens utilizadas neste livro foram


obtidas a partir do site shutterstock.com

NEAD - Núcleo de Educação a Distância


Av. Guedner, 1610, Bloco 4 - Jardim Aclimação - Cep 87050-900
Maringá - Paraná | unicesumar.edu.br | 0800 600 6360
sumário
01 06| FUNÇÕES PRÉ-DEFINIDAS

02 14| CENÁRIOS PRÁTICOS PARA USO DE FUNÇÕES PRÉ-


DEFINIDAS

03 19| LÓGICA CONDICIONAL

04 31| FUNÇÕES PRÓPRIAS EM SQL


RECURSOS DE PROGRAMAÇÃO EM SQL

OBJETIVOS DE APRENDIZAGEM
•• Apresentar e compreender as funções pré-definidas.
•• Apresentar aplicações e exemplos práticos do uso das funções pré-definidas.
•• Apresentar e compreender a lógica condicional nas cláusulas SELECT, WHERE
e ORDER.
•• Conceituar e compreender as funções próprias SQL definidas pelo usuário.

PLANO DE ESTUDO

A seguir, apresentam-se os tópicos que você estudará nesta unidade:


•• Funções Pré-Definidas.
•• Cenários Práticos para Uso de Funções Pré-Definidas.
•• Lógica Condicional.
•• Funções Próprias em SQL.
INTRODUÇÃO

Na profissão do DBA e dos programadores de aplicações, é necessário


o entendimento aprofundado da linguagem SQL. Este estudo realiza uma
compreensão das funções pré-definidas do SQL, como as funções numéricas,
manipulação e conversão de caracteres e datas, apresentando um cenário prático
da aplicação destas funções nas diversas áreas da organizações modernas.
Veremos que existe uma grande coletânea de funções pré-definidas, mas existe
também a possibilidade da criação de novas funções, chamada de UDF (User-
Defined Functions), literalmente as funções definidas pelo usuário. No final
deste estudo serão apresentados alguns exemplos de criações de “funções de
tabelas” que retornam uma lista de valores, bem como as funções de retorno de
um único valor. Também aprenderemos a programação “condicional lógica” nas
cláusulas SELECT, WHERE e ORDER, através da instrução CASE WHEN, cuja função
é substituir códigos ou abreviações para valores mais legíveis e categorizar os
dados de forma mais organizada e compreensível. Veremos que a condicional
lógica CASE WHEN é mais utilizada na cláusula SELECT, mas pode ser usada
em quase todo o SQL, ou seja, em qualquer instrução ou cláusula que permita
uma expressão válida. A prática com o uso de lógicas condicionais CASE WHEN
vai levar você a um outro universo possível com a linguagem SQL, e isso sim
colocará você em um outro patamar como desenvolvedor. O entendimento das
funções pré-definidas, funções definidas pelo usuário e da lógica condicional
agregará uma avançada compreensão da programação SQL como possibilidade
de definição e manipulação de dados nas diversas bases de dados existentes.
Desejamos a todos bons estudos!

introdução
6 Pós-Universo

FUNÇÕES
PRÉ-DEFINIDAS
Pós-Universo 7

Para Freeman (2005, p. 321),

““
o Oracle inclui muitas funções de SQL construídas diretamente no banco
de dados, que podem ser utilizadas em uma variedade de maneiras em SQL
e PL/SQL. Essas funções podem aceitar qualquer número de parâmetros
e sempre retornam um resultado de um tipo de dado [...] as funções pré-
definidas podem ser funções de uma única linha, funções agregadas, funções
analíticas, funções de referência de objetos ou funções de modelo.

Veremos em nosso estudo as funções de uma única linha.


Funções funcionam de forma muito parecida aos operadores que manipulam
itens de dados e retornam um valor. Assim como em uma linguagem de programação
normal, funções recebem dados passados mediante parâmetros que podem ser
caracterizados por um ou mais argumentos e resultam em um retorno único.
Diferentemente de uma consulta SQL, uma função retornará um resultado apenas.
Exemplo disso pode ser uma função que recebe como parâmetro diversos argumentos
como as notas bimestrais dos alunos e por fim retorna se o aluno está aprovado ou
não, ou seja, mesmo recebendo N parâmetros, o retorno é sempre obtido em um
conjunto-resultado de uma linha e uma coluna.
Neste momento iremos compreender o tratamento das funções pré-definidas que
são as já existentes em um banco de dados Oracle. Entre os SGBDs, algumas coisas
mudam nesta lista, seja pelo nome diferente dado à função, à ordem de parâmetros
ou ao resultado, mas conhecendo bem estas funções, um profissional DBA não terá
dificuldades em identificar as mesmas funções em outros SGBDs.
8 Pós-Universo

Funções Numéricas
As funções numéricas basicamente recebem e retornam valores numéricos. Da lista
completa e oficial contida nas referências bibliográficas, a Tabela 1 ilustra as funções
numéricas.

Tabela 1 - Funções Numéricas

Função Descrição ou Uso Exemplo


select abs(-15)
Retorna o valor absoluto de um valor.
retorno: 15
Quando você salva valores negativos em uma
abs (n)
coluna, mas precisa converter ou levar em conta o
select abs(15)
valor absolute, você utiliza esta função.
retorno: 15
Retorna um número (inteiro ou decimal, caso
select round(15.9765, 2)
informado o número de casas) arredondado.
retorno: 15.98
É muito usado para divisões após valores
monetários ou obtenção de valores percentuais
select round(15.9745, 2)
round (n, ou medias, pois muitas vezes estas divisões
retorno: 15.97
casas) resultam em mais de 5 casas decimais e é
preciso diminuir as casas, mas arredondando.
select round(15.9745) ou
O arredondamento é obtido por meio de
select round(15.9765)
aproximação, podendo ser para baixo (até .5) ou
retorno: 16
para cima (a partir de .5).
select ceil(15.9745) ou
Retorna um valor inteiro a partir de um decimal,
ceil (n) select ceil(15.9765)
arredondando obrigatoriamente para cima o valor.
retorno: 16
select floor(15.9745) ou
Retorna um valor inteiro a partir de um decimal,
floor (n) select floor(15.9765)
arredondando obrigatoriamente para baixo.
retorno: 15
select trunc(15.9765, 2)
retorno: 15.97
Retorna um número (inteiro ou decimal, caso
select trunc(15.9745, 2)
trunc (n, informado o número de casas) sem nenhum
retorno: 15.97
casas) arredondamento, ou seja, truncado. Esta função
retorna o valor exato.
select trunc(15.9745) ou
select trunc(15.9765)
retorno: 15
Pós-Universo 9

Função Descrição ou Uso Exemplo


select mod(5,2)
Retorna o resto da divisão entre n2 e n1.
retorno: 1
Tal função é muito utilizada para verificar se
mod (n2, n1)
número é par ou ímpar ou divisível por 10, por
select mod(10. 2)
exemplo.
retorno: 0
select sqrt(25)
sqrt (n) Retorna a raiz quadrada de um número N.
retorno: 5
power (n2, select power(5,2)
Retorna o número n2 elevado a n1 (potência).
n1) retorno: 25
Fonte: Oracle (2005, on-line)1.

Da lista contida na documentação, apresentamos as mais relevantes para seus primeiros


estudos, mas na referência bibliográfica deste material consta a documentação e
exemplos completos destas e de outras funções numéricas como ACOS, ASIN, ATAN,
ATAN2, BITAND, COS, COSH, EXP, LN, LOG, NANVL, REMAINDER, SIGN, SIN, SINH, TAN,
TANH e WIDTH_BUCKET.

Funções para Caracteres


As funções para caracteres são utilizadas regularmente em relatórios e consultas, onde
será necessário apresentar os dados para os usuários ou como forma de tratamento,
como um filtro, antes mesmo de ser salvo no banco de dados.
Você sempre deve estar atento aos padrões que estão sendo utilizados com
os dados que estão sendo salvos no banco de dados, e com isso tomar a decisão
de corrigir a apresentação ou corrigir a origem dos dados, pois em muitos casos o
desenvolvedor da interface da aplicação não se preocupa muito com isso. Ainda
assim, dentre as funções mostradas aqui, muitas delas são auxiliares poderosas para
consultas SQL. A Tabela 2 apresenta as funções para caracteres.
10 Pós-Universo

Tabela 2 - Funções Numéricas


Função Descrição ou Uso Exemplo
chr (codigo) Retorna o caractere que possuir um valor binário select chr(67) || chr(65) || chr(67)
equivalente ao código informado. || chr(65)
retorno: CACA
concat (texto1, Retorna os valores concatenados em um resultado select concat(‘Meu nome é’, ‘ ‘,
texto2, [texto3, …]) único e funciona de maneira similar ao operador || nome) from pessoa
utilizado anteriormente no exemplo de chr(codigo).
retorna: Meu nome é: Eduardo
Bona

select concat(chr(67),
chr(65),chr(67), chr(65))
initcap (texto) Retorna o texto informado com as primeiras letras select initcap(‘eduardo bona’)
de cada palavra convertidas para maiúscula. retorna: Eduardo Bona
lower (texto) Retorna todos os caracteres convertidos em select lower (titulo) from livro
minúsculos. retorna: programação sql i
upper (texto) Retorna todos os caracteres convertidos em select upper (titulo) from livro
maiúsculos. retorna: PROGRAMAÇÃO SQL I
lpad (texto, n, Faz alinhamento à direita e preenche com caracteres select nome, lpad
texto2) à esquerda até uma determinada posição. (sobrenome,15, ‘*’) from livros
O exemplo procura os autores que contenham a where upper (nome) like
palavra “Jackson” e se encontrarem, o sobrenome ‘%jackson%’
sugerido de 15 posições é preenchido com caracteres
à esquerda. retorna
Nome Sobrenome
--------- -----------------
JACKSON ****SCHIRIGATTI
rpad (texto, n, Faz alinhamento à direita e preenche com caracteres select nome, rpad
texto2) à direita até uma determinada posição. (sobrenome,15, ‘*’) from livros
where upper (nome) like
‘%jackson%’
retorna:
Nome Sobrenome
--------- ----------------
JACKSON SCHIRIGATTI****
Pós-Universo 11

Função Descrição ou Uso Exemplo


ltrim (texto) A função retira os caracteres “espaços” contidos SELECT TRIM(‘ LIVRO ‘)
na margem esquerda da cadeia de caracteres que || titulo AS Texto FROM LIVRO
recebe como parâmetro. No exemplo ao lado, são WHERE assunto like ‘P%’.
retirados os espaços da esquerda da palavra ‘LIVRO’;
após, faz a busca dos livros com assunto que iniciam retorna:
com a letra “P”. Texto
----------------------------------
LIVRO: PROGRAMAÇÃO SQL I
rtrim (texto) A função retira os caracteres “espaços” contidos na SELECT TRIM(‘ LIVRO ‘) ||
margem direita da cadeia de caracteres que recebe titulo AS Texto FROM LIVRO
como parâmetro. No exemplo ao lado, são retirado os WHERE assunto like ‘P%’.
espaços da direita da palavra ‘LIVRO’, após, faz a busca
dos livros com assunto que iniciam com a letra “P”. retorna:
Texto
---------------------------------------
LIVRO:PROGRAMAÇÃO SQL
I
trim (texto) A função retira os caracteres “espaços” contidos SELECT TRIM(‘ LIVRO ‘)
nas margens da cadeia de caracteres que recebe || titulo AS Texto FROM LIVRO
como parâmetro. No exemplo ao lado, retira-se os WHERE assunto like ‘P%’.
espaços da esquerda e direita da palavra ‘LIVRO’;
após, faz a busca dos livros com assunto que retorna:
iniciam com a letra “P”. Texto
---------------------------------------
LIVRO:PROGRAMAÇÃO SQL I
replace Substitui todas as ocorrências de um valor da SELECT
cadeia de caracteres especificado por outro REPLACE(‘abcdefghicde’,’cde’,’xxx’);
de cadeia de caracteres. No exemplo, a função GO
replace troca a cadeia “cde” pela cadeia “xxx” na
cadeia “abcdefghicde”. retorna:
------------
abxxxfghixxx
substr Retorna parte de uma expressão de caractere, SELECT x = SUBSTRING(‘abcdef’,
binária, texto ou de imagem no SQL Server. O 2, 3);
exemplo extrai o segundo, terceiro e quarto
caractere da cadeia “abcdef”. retorna:
x
----------
bcd
Fonte: Oracle (2005, on-line)1, Costa (2006 , p. 73-74), Gonçalves (2005), Morelli (2009, p. 72),
MICROSOFT (2017, on-line)2.
12 Pós-Universo

Funções para Data


Segundo Morelli (2009, p. 73), “eventualmente o comando SELECT também pode
ser utilizado para obter um dado que não esteja armazenado em tabela alguma. Por
exemplo, às vezes resulta muito útil simplesmente checar a data corrente”. A Tabela
3 a seguir ilustra as funções para Data.

Tabela 3 – Funções para Data


Função Descrição ou Uso Exemplo
CURRENT_DATE Retorna a data corrente com o apelido SELECT current_data
“agora”, utilizando a tabela interna Agora FROM dual;
DUAL.
retorna:
Agora
---------------------
02/01/2018
CURRENT_TIMESTAMP Seleciona a hora corrente da tabela SELECT current_
dual, além do indicativo do fuso horário timestamp FROM dual;
corrente em relação ao meridiano de
Greenwich. retorna:
Current_Timestamp
----------------------------------
02/01/2018
13:10:57,765000 -03:00
DBTIMEZONE Retorna o fuso utilizado na criação do SELECT dbtimezone FROM
banco de dados, utiliza-se geralmente Dual.
GMT ou 00:00, ou seja, seleciona o
time zone da tabela Dual. O exemplo retorna:
faz com que o banco de dados retorne DBTIME
o fuso horário definido no sistema -------------
operacional. +00:00
add_months (data, n) retorna uma nova data a partir da SELECT add_months
soma em meses informados pelo valor (data_expiracao, 1)
“n”.
retorna: 2017-12-10
(supondo que a data
cadastro seja 2017-11-10)
Pós-Universo 13

Função Descrição ou Uso Exemplo


extract (opção from data) retorna o valor extraído de uma data select extract(month
ou timestamp a partir de uma das from data_cadastro) from
seguintes opções: YEAR, MONTH, pessoa
DAY, HOUR, MINUTE, SECOND,
TIMEZONE_HOUR, TIMEZONE_ retorna: 11 (supondo
MINUTE, TIMEZONE_REGION, que a data cadastro seja
TIMEZONE_ABBR. 2017-11-10)
last_day(data) retorna o último dia (em uma data) select
relativo ao mês da data informada, last_day(data_cadastro)
ou seja, o último dia daquele mês
naquele ano. retorna: 2017-30-11
(supondo que a data
cadastro seja 2017-11-10)
months_between (data1, retorna o número de meses entre select months_between(
data2) uma data e outra (em meses). O to_date (‘02/02/1995’,
retorno vem em formato decimal ‘MM/DD/YYYY’), to_data
e caso tenha interesse apenas em (‘01/01/1995’, ‘MM/DD/
um inteiro, precisará converter com YYYY’)
round ou trunc. ) as data_diff from pessoa;
Fonte: Morelli (2009, p. 72) e Price (2009, p. 176).

Com relação às funções que tratam as referências de fusos horários, segundo a


Oracle (2015, on-line)1, “devemos destacar aqui que sempre temos 3 fusos horários
a que podemos nos referir. O UTC que é o horário mundial, que antigamente era
referido ao Greenwich. O fuso horário do banco de dados que podemos acessar por
DBTIMEZONE [visto na Tabela 3] e o fuso horário da sessão do usuário que pode ser
acessado por SESSIONTIMEZONE”. Por sua vez, o LOCALTIMEZONE é uma variante
utilizada em conjunto com o TIMESTAMP, é ideal e apropriado para aplicações onde
se deseja exibir informações de data e horários usando o fuso horário do cliente. Inclui
um deslocamento de fuso horário (TIME ZONE) em seu valor. O deslocamento não
é armazenado como parte de dados da coluna, mas sim normalizado para o fuso
horário do banco de dados (DBTIMEZONE).
14 Pós-Universo

CENÁRIOS PRÁTICOS
PARA USO DE FUNÇÕES
PRÉ-DEFINIDAS
Pós-Universo 15

Segundo Price (2009, p. 126), “as funções numéricas são utilizadas para efetuar cálculos.
Essas funções aceitam um número de entrada que pode vir de uma coluna numérica,
ou qualquer expressão que seja avaliada com um número. Então o cálculo é feito e um
número é retornado”. “Já as funções de caractere aceitam entradas de caracteres, que
podem vir de uma coluna em uma tabela, ou de modo geral de qualquer expressão.
Essa entrada é processada e um resultado é retornado” (PRICE, 2009, p. 118). “Com
relação às funções de data/horário, são usadas para obter e processar data/horário”
(PRICE, 2009, p. 170). Veremos nesta parte do estudo os cenários práticos do uso das
funções pré-definidas.

Aplicação Prática com Funções


Numéricas
As aplicações com as funções numéricas são as mais variadas. Em nosso exemplo,
com (1) e (2), o uso da função ABS é aplicado com o uso de valores de preços de
produtos, como apresenta Price (2009, p. 128):

(1) SELECT abs(10), abs(-10) FROM dual;


abs (10) abs(-10)
--------------- --------------
10 10

(2) SELECT product_id, price, price - 30, abs(price - 30) FROM products
WHERE products_id < 4
product_id price price - 30 abs(price - 30)
------------- -------------- --------------- ------------------
1 19.95 -10.05 10.5
2 30 0 0
3 25.99 -4.01 4.01;
16 Pós-Universo

Perceba que o uso da função numérica ABS é selecionar os produtos da base de dados/
tabela produtos e apresentar seus preços com o “valor absoluto” (valor absoluto = sem
o sinal negativo). As aplicações deste exemplo e de várias outras funções numéricas,
como vimos na Tabela 1 (truncamento, arredondamento, operações matemáticas e
outras), são utilizadas nas áreas de venda, financeira, embarque e importações, no
uso em tabelas de preços, cálculo de impostos, conversões de moeda, descontos
em preços, peso de produtos em notas fiscais, totais de embarques e estoques, etc.

Aplicação Prática com Funções para


Caracteres
Para as aplicações com funções utilizando a manipulação de caracteres, o exemplo
3 apresenta a função “REPLACE (x, string_busca, string_substituta)” para procurar
string_busca em x e substituí-la. O exemplo a seguir recupera a coluna name da
tabela products para o produto nr.1 (onde “name” é “Modern Science”) e substitui a
string “Science” por “Physics” (PRICE, 2009, p. 124-125):

(3) SELECT replace(name, ‘Science’, ‘Physics’) FROM products


WHERE products_id = 1 ;
Replace(name, ‘Science’, ‘Physics’) ‘
-------------------------------------------------
Modern Physics

Uma nota, segundo Price (2009, p. 125), é que “REPLACE( ) não modifica a linha real do
banco de dados; somente a linha retornada pela função é modificada”. Esta e outras
funções da Tabela 2 (alinhamento à esquerda ou à direita, retirada de caracteres,
concatenação, substituição, conversão, supressão de caracteres, etc.) são utilizadas
para a área comercial, produção, logística, marketing, qualidade, tecnologia, financeira
e demais áreas, no uso de apresentações de relatórios, certificados, recibos, mala
direta, importação e exportação de dados, arquivos de dados para envio bancário, e
outros resultados onde são necessárias as manipulações de caracteres.

Aplicação Prática com Funções para


Pós-Universo 17

Datas
Para as aplicações com funções utilizando a manipulação de datas, o exemplo e
resultado (4) apresentam a função EXTRACT, visto na Tabela 3, que mostra nome, ano
e data de nascimento dos clientes de uma empresa com cargo de diretoria.

(4) SELECT name, EXTRACT (year FROM dt_nascimento) Ano


FROM Funcionario
WHERE cargo= ‘diretor’;

NOME ANO
------------------------------------------- ----------
JACKSON LUIS SCHIRIGATTI 1970
ANGELA CRISTINA RONCAGLIO SCHIRIGATTI 1972

Vejam que a função EXTRACT extrai o ano da data de nascimento do campo “dt_
nascimento” da tabela “Funcionário”. As aplicações das funções de datas como a
EXTRACT e outras como data corrente, fuso horário, última data de um determinado
mês, número de meses de um período e cálculos com datas são triviais para as mais
diversas áreas e aplicações.
18 Pós-Universo

Aplicação Prática com Outras


Funções em Destaque (Data e
Conversões)
Nesta seção, destacamos como aplicação prática a combinação de funções apresentadas
por PRICE (2009), na combinação da função TO_DATE (ou CURRENT_DATE) com TO_
CHAR. “Por exemplo, a consulta a seguir [exemplo 5] utiliza as funções TO_CHAR( ) e
TO_DATE para exibir apenas a parte referente à hora de uma data\horário”:

(5) SELECT TO_CHAR(TO_DATE(‘05-FEV-1968 19:32:36’, ‘DD-MON-YYYY


HH24:MI:SS’), ‘HH24:MI:SS’) FROM dual;

TO_CHAR(...)
-------------------
19:32:36

“A função TO_CHAR(x, [, formato]), converte x em uma string e TO_DATE(x, [, formato])


converte a string em um tipo de data” (PRICE, 2009, p. 160). Repare no resultado do
exemplo 5 que TO_DATE converte a STRING ‘05-FEV-1968 19:32:36’ no formato de
data e hora ‘DD-MON-YYYY HH24:MI:SS’ e TO_CHAR converte a data no formato
‘HH24:MI:SS’, hora, minuto e segundo. Esse tipo de aplicação de conversão de datas
em caracteres e outras combinadas é muito utilizada em relatórios, consultas e em
todos os tipos de aplicações administrativas e produtivas que acessam datas e que
devem ser manipuladas pelos aplicativos.
Pós-Universo 19

LÓGICA CONDICIONAL
20 Pós-Universo

A lógica condicional na programação SQL são estruturas condicionais utilizadas em


vários momentos da codificação em banco de dados e linguagens externas de banco
de dados, mas veremos que são aplicadas principalmente nas cláusulas SELECT,
WHERE e ORDER, onde condicionam a seleção, a filtragem e a ordenação.

Lógica Condicional em Cláusulas


SELECT
A forma mais comum de uso de uma estrutura de condicional em SQL é realizada
em cláusulas SELECT. A lógica condicional aplicada diretamente a uma consulta é
obtida por meio da expressão CASE WHEN, que é padrão na maioria dos SGBDs mais
conhecidos.
Em uma linguagem de programação, nós geralmente temos contato com dois
tipos específicos de estruturas condicionais, sendo as mais tradicionais IF/ELSE e a
SWITCH CASE. “Um uso comum da expressão CASE é substituir códigos ou abreviações
para valores mais legíveis [...] outra função é categorizar os dados” (MICROSOFT,
on-line)3.
A seguir será apresentado um exemplo de estrutura condicional IF/ELSE e SWITCH
CASE em PHP que é muito semelhante a diversas linguagens e que poderá dar uma
orientação mais assertiva para SQL, como mostra o exemplo 6:

(6)
<?php
$nota = $_GET[“nota”];
if ($nota >= 7) {
echo “Parabéns!”;
} elseif ($nota >= 6) {
echo “Atenção! Melhore sua Nota!”;
} else {
echo “Você corre o risco de reprovação”;
}
Pós-Universo 21

$opcao = $_GET[“op”];
switch($opcao) {
case 1:
echo “Opção 1”;
break;
case 2:
echo “Opção 2”;
break;
default:
echo “Nenhuma Opção”;
}
?>

Note que as duas estruturas possibilitam recursos diferentes e temos a impressão


de que o CASE WHEN em SQL seja mais parecido com o SWITCH CASE de uma
linguagem de programação, quando na verdade ele é muito parecido com o IF/ELSE,
mais tradicional mesmo. Veja o exemplo 7 a seguir:

(7)
select nome, status, case
when status = 1 then ‘Ativo’
else ‘Inativo’
end as status_descricacao
from pessoa

Neste caso será obtido como resposta a este SQL uma tabela com três colunas (nome,
status e status_descricao), sendo a última gerada por meio de uma lógica condicional
CASE WHEN. A utilização da cláusula ELSE é opcional e, deste modo, não é obrigatória;
no caso do não atendimento da expressão contida em WHEN, será retornado NULL
para a coluna em questão.
22 Pós-Universo

A inicialização do condicional é feita por meio da sintaxe CASE e em seguida de


WHEN (expressão), seguida de demais condicionais, sendo que a finalização pode
ser obtida por meio apenas de END. No entanto, sugerimos que sempre faça uso de
um apelido para este resultado, saindo já com um nome apropriado e deste modo
nossa sugestão é para que a instrução sempre seja finalizada acompanhada de END
as nome_da_coluna. Após a condicional WHEN, a instrução THEN atua como um
retorno já do resultado e aguarda impreterivelmente uma instrução resultante como
um valor fixo, uma coluna do banco ou uma subconsulta de valor único.
Analise agora o próximo exemplo (8):

(8)
select cod_pedido, valor, frete, case
when valor >= 200 then preco
when valor >= 100 then preco + (frete * 0.5)
else preco + frete
end as valor_total
from pedidos

A consulta acima já demonstra a utilização de CASE WHEN para aplicar o desconto


do frete já calculado no valor final do pedido, sendo que, se o valor for acima de
duzentos reais não será cobrado frete, enquanto compras acima de cem reais terão
50% de desconto e demais compras não terão desconto no frete. Note que foi
possível utilizar WHEN mais de uma vez em uma expressão, evitando assim a criação
de estruturas condicionais dentro de estruturas condicionais, pois, apesar de possível,
é extremamente desastroso o uso de um CASE WHEN dentro de outro CASE WHEN
em SQL.
Lembre-se que o SQL precisa sempre estar em acordo com princípios de
organização, pois se trata de uma instrução única e de manutenção mais complexa.
Outro detalhe é que a instrução ELSE não requer o uso de THEN, como pode ser
observado nos exemplos mais recentes.
Pós-Universo 23

Por fim, também é importante destacar que a expressão de uma condicional


CASE WHEN pode ser simples ou composta, tornando ainda mais interessante o uso
deste recurso e deixando assim mais próximo ainda de uma estrutura condicional
comum. Analise o código abaixo, exemplo 9:
(9)
select cod_pedido, valor, frete, case
when (valor >= 200 and cliente.vip = 1) then preco*0.8
when (valor >= 200 and cliente.vip = 0) then preco
when (valor >= 100 and cliente.vip = 1) then (preco*0.8) + (frete * 0.5)
when (valor >= 100 and cliente.vip = 0) then preco + (frete * 0.5)
when (valor < 100 and cliente.vip = 1) then (preco*0.8) + frete
else preco + frete
end as valor_total
from pedido inner join cliente
on (pedido.cod_cliente = cliente.cod_cliente)

Com base no mesmo exemplo anterior, que aplicava desconto ao frete com base
no valor da compra, este outro exemplo (9) deixa a cláusula CASE WHEN com uma
extensão maior e basicamente aplica a mesma regra ao valor do frete, no entanto,
para cada uma das validações anteriores aplica um desconto de 20% se o cliente for
VIP. Como se trata de uma regra de três, optamos por fazer a multiplicação do valor
por 0.8 e obter assim o desconto de 20% já no valor descontado, que seria 80% do
valor do pedido.
É comum ver cláusulas CASE WHEN compostas de mais de uma expressão e as
regras de filtros utilizadas em WHERE também podem ser aplicadas aqui com o uso
de AND ou OR e até mesmo com subconsultas e a maioria das expressões SQL.
24 Pós-Universo

Lógica Condicional em Cláusulas


WHERE
Todas as regras já citadas para uso de CASE WHEN em uma cláusula SELECT se aplicam
de maneira exatamente igual em WHERE. A diferença é que enquanto CASE WHEN
é utilizado em SELECT para obter respostas customizadas através de uma expressão
condicional, em uma cláusula WHERE, possibilita que a filtragem de um resultado
seja obtida também por meio de uma expressão condicional.
No caso do uso em WHERE, pode parecer um pouco estranho no começo, pois
se o WHERE já possibilita o uso de expressões, o CASE WHEN não faz muito sentido.
No entanto, nem tudo é possível obter de forma tão simples dentro de uma cláusula
WHERE, fazendo com que o CASE WHEN acabe se tornando fundamental em alguns
casos. Ainda assim, é muito mais comum ver o CASE WHEN sendo usado em cláusulas
SELECT.
Supondo o mesmo exemplo que aplica os descontos no valor do produto, vamos
supor que a empresa fizesse uma requisição para que dentro daquela consulta só
fossem exibidos os pedidos acima de R$ 80.00 e o cliente tivesse como estado o
Paraná (coluna uf valor PR). Como a mesma estrutura poderia ser aplicada dentro do
WHERE?

(10)
select cod_pedido, valor, frete, case
when (valor >= 200 and cliente.vip = 1) then preco*0.8
when (valor >= 200 and cliente.vip = 0) then preco
when (valor >= 100 and cliente.vip = 1) then (preco*0.8) + (frete * 0.5)
when (valor >= 100 and cliente.vip = 0) then preco + (frete * 0.5)
when (valor < 100 and cliente.vip = 1) then (preco*0.8) + frete
else preco + frete
end as valor_total
from pedido inner join cliente
on (pedido.cod_cliente = cliente.cod_cliente)
where (case
when (valor >= 200 and cliente.vip = 1) then preco*0.8
when (valor >= 200 and cliente.vip = 0) then preco
Pós-Universo 25

when (valor >= 100 and cliente.vip = 1) then (preco*0.8) + (frete * 0.5)
when (valor >= 100 and cliente.vip = 0) then preco + (frete * 0.5)
when (valor < 100 and cliente.vip = 1) then (preco*0.8) + frete
else preco + frete
end) >= 80 and cliente.uf = ‘PR’

Infelizmente, não é possível aproveitar a lógica desenvolvida na cláusula SELECT


apenas com o nome da coluna em WHERE, por isso, há a necessidade neste caso
de duplicar. Logicamente, se este cálculo for mesmo necessário, poderemos tornar
a consulta mais reaproveitável colocando toda a lógica condicional dentro de uma
função própria (a ser criada pelo desenvolvedor SQL) ou criando uma VIEW que
abstrai todo o cálculo dentro de seu SELECT e então tornaria o uso de WHERE como
uma comparação simples.
De todo modo, não é difícil encontrar CASE WHEN em cláusulas WHERE,
principalmente quando você está desenvolvendo em cima de um projeto com
banco de dados pronto e que não se preparou adequadamente para o uso de visões
(views) e funções (functions). Nestes casos, não crie um novo padrão no projeto e
simplesmente use as expressões que conhece de SQL da melhor forma na cláusula
WHERE.

atenção
Lembrando que a diferença do uso de CASE WHEN: quando utilizado em
SELECT, obtém respostas customizadas através de uma expressão condicional,
já em uma cláusula WHERE, filtra um resultado obtido também por meio de
uma expressão condicional.

Fonte: os autores.
26 Pós-Universo

Lógica Condicional em Cláusulas


ORDER
Uma facilidade que pode ser obtida com a lógica condicional CASE WHEN é a de
praticamente poder utilizá-la em qualquer momento da consulta SQL, inclusive na
cláusula ORDER. Você pode neste momento se perguntar qual seria a vantagem ou o
uso de CASE WHEN em uma ordenação, e talvez pudesse até afirmar que a aplicação
disso em ORDER seria uma loucura, mas acredite: em alguns momentos, é necessário
mesmo.
Vamos praticar e deixar mais visível este tipo de demanda.
Supondo um relatório de clientes onde a ordenação seja solicitada por nome
ascendente (ASC), mas que seja dada prioridade para pessoas idosas (acima ou igual
a 60 anos), sendo que no banco de dados só existe a data de nascimento. Como você
colocaria estas pessoas ordenadas alfabeticamente antes do outro relatório?
Em várias situações, muitos desenvolvedores optam por fazer dois relatórios, um
com as prioridades e outro com as demais pessoas e apresentar em tela. Mas agora
que você sabe que pode usar CASE WHEN em cláusula ORDER, poderá fazer algo
bem melhor.
Antes, é preciso apenas saber como calcular a idade de uma pessoa, e como já
vimos anteriormente em um uso parecido, sabemos que a consulta “select months_
between(current_date, data_nascimento)” retornaria a idade de uma pessoa. Agora,
resta colocar a lógica condicional no ORDER (exemplo 11):

(11)
select nome, cpf
from cliente
order by (case
when months_between(current_date, data_nascimento) >= 60*12 then 1
else 2
end) ASC, nome ASC
Pós-Universo 27

Deste modo, a condicional verifica se os meses entre a data atual e a data de nascimento
são superiores ou iguais ao resultado do número 60 (sessenta) multiplicado por 12
(doze), pois como a função months_between retorna o número de meses, é preciso
fazer a conversão em virtude de um ano possuir 18 (dezoito) meses.
É retornado para o atendimento da cláusula o valor 2, e justamente este resultado
é utilizado para a primeira expressão de ordenação, ou seja, as linhas que tiverem o
resultado 1 serão mostradas primeiramente (ordenação ASC), enquanto as demais
com resultado 2 serão exibidas posteriormente.
Como haverá uma repetição de resultados 1 e 2, definimos na consulta o
segundo critério de ordenação como nome (ordenação ASC) e deste modo serão
mostradas neste relatório todas as pessoas que tiverem 60 anos ou mais, ordenadas
alfabeticamente pelo nome, e em seguida as demais pessoas com menos de 60 anos
ordenadas alfabeticamente também.
Tudo isso sem necessidade de duas consultas, UNION ou qualquer outra solução
mais mirabolante. Você poderá também optar pelo uso do próprio CASE WHEN
desenvolvido no SELECT caso demande ordenação por ele. Seria também necessário
o uso dele, uma vez que não se ordena pelo apelido, e sim pela expressão completa.

Utilizações Mais Avançadas de


Lógica Condicional
Os exemplos mostrados até agora para a lógica condicional foram os exemplos mais
óbvios para cada cenário: select, where e order. Como dito anteriormente, ela pode
estar presente em quase todo o nosso SQL, e já foram mostrados alguns casos em
que ela até facilita nosso código, reduzindo o número de consultas.
A prática com o uso de lógicas condicionais CASE WHEN vai levar você a um
outro universo possível com a linguagem SQL, e isso sim colocará você em um outro
patamar como desenvolvedor.
28 Pós-Universo

Separamos para última análise deste assunto o seguinte cenário: uma empresa
tem em um banco de dados uma visão (view) chamada clientes_consumo com os
seguintes campos:

•• cod: inteiro

•• nome_cliente: textual

•• estado_sigla: char(2) (pr | sp | pa | am | entre outros)

•• movimento_3m: decimal (92000.24 | 520992.50 | 247393.00 | entre outros)

Este mesmo cliente pediu que você desenvolva um relatório estatístico onde seja
apresentada a quantidade de clientes por estado com os seguintes indicadores:
quantidade de clientes que compraram acima de R$ 200.000,00, quantidade de
clientes que compraram entre R$ 100.000,00 e R$ 200.000,00 e clientes que compraram
abaixo de R$ 100.000,00.
Deste modo, o resultado seria algo próximo deste layout:

Tabela 4 - resultado da visão clientes_consumo

estado_sigla ate_100 entre_100_200 acima_200


pr 850 240 110
sp 1200 430 201
rj 300 200 89
Fonte: os autores.

Cada desenvolvedor pensaria numa solução pra isso. Este questionamento já foi feito
algumas vezes para diversos alunos e desenvolvedores da equipe e várias respostas
foram obtidas, dentre elas:

•• Fazer uma consulta com subconsultas em cada coluna;

•• Fazer três consultas para cada cenário com group by e depois juntar na
aplicação;

•• Criar três views, uma para cada cenário, e depois juntar em uma consulta só;

•• Fazer uma consulta com inner join em três subsconsultas (subconsultas


como tabela) com group by.
Pós-Universo 29

Mas a mesma solução que imaginamos, depois de muita prática, e que somente
alguns bons desenvolvedores SQL concordaram que era a melhor, usaria apenas
uma consulta e lógica condicional.
Antes disso, vamos realizar a consulta com subconsultas e adotar a solução mais
escolhida pelos desenvolvedores (exemplo 12):

(12)
select
distinct consumo.estado_sigla,
(select count(*) from clientes_consumo as cliente_consumo2 where estado_
sigla = consumo.estado_sigla and movimento_3m <= 100000) as ate_100,
(select count(*) from clientes_consumo as cliente_consumo2 where estado_
sigla = consumo.estado_sigla and movimento_3m BETWEEN 100000 AND 200000)
as entre_100_200,
(select count(*) from clientes_consumo as cliente_consumo2 where estado_
sigla = consumo.estado_sigla and movimento_3m >= 200000) as acima_200
from clientes_consumo as consumo
order by estado_sigla

Nesta consulta, as subconsultas são utilizadas e fazem referência a uma cláusula


WHERE relativa ao movimento e a sigla do estado que precisa ser igual à da consulta
principal. O fato é que este tipo de consulta funciona muito bem em bancos de dados
pequenos, mas você precisa entender que, ao utilizar subconsultas para cada linha
da consulta principal, três outras consultas (exemplo acima) estão sendo utilizadas.
Por isso, subconsultas são utilizadas em casos muito específicos.
30 Pós-Universo

Agora, com CASE WHEN é possível fazer coisas mágicas. Veja a consulta com o
mesmo resultado sem subconsultas, como ficaria (exemplo 13):

(13)
select
estado_sigla,
sum(case when movimento_3m <= 100000 then 1 else 0 end) as ate_100,
sum(case when movimento_3m BETWEEN 100000 AND 200000 then 1 else 0
end) as entre_100_200,
sum(case when movimento_3m >= 200000 then 1 else 0 end) as acima_200
from clientes_consumo
group by estado_sigla
order by estado_sigla

Com o uso da condicional lógica CASE WHEN, fizemos o uso da função de agregado
SUM para retornar a soma dos resultados, que de acordo com a condicional, resultam
em 1 ou 2. Não utilizamos COUNT, pois a função COUNT faz a ocorrência de linhas
e aí não teríamos como fazer 3 validações na mesma consulta, mas com o uso de
SUM, sendo os resultados 1 ou 2, seria possível obter um resultado igual, com uma
consulta muito menor em sintaxe e em consultas internas.
Logicamente, este é um uso bem complexo, mas entre um relatório e outro,
principalmente os estatísticos, seu poder de criatividade para buscar soluções pelos
menores caminhos possíveis deverá ser posto em prática. Por isso, não se esqueça
do CASE WHEN.

saiba mais
CASE pode ser usada em qualquer instrução ou cláusula que permita uma
expressão válida. Por exemplo, você pode usar CASE em instruções, como
SELECT, UPDATE, DELETE e SET, e em cláusulas como select_list, IN, WHERE,
ORDER BY e HAVING.

Fonte: MICROSOFT (2017, on-line)4.


Pós-Universo 31

FUNÇÕES PRÓPRIAS
EM SQL
32 Pós-Universo

Funções Próprias
Para Ramalho (2005, p. 8-9),

““
uma função é uma sub-rotina parecida com uma stored procedure. O SQL
Server 2005 permite que o usuário crie suas próprias funções, além de usar
aquelas que já fazem parte da linguagem Transact-SQL. Uma função definida
pelo usuário é criada pelo comando CREATE FUNCTION.

Por sua vez, segundo Silberschatz, Korth e Surdarshan (2006, p. 95), “a partir da versão
SQL:1999, a SQL permite a definição de funções, procedimentos e métodos. Esses
podem ser definidos pelo componente procedural da SQL:1999 ou por uma linguagem
de programação externa, como Java, C ou C++”.
As funções criadas pelos usuários também são chamadas de User-Defined Functions
(UDF), ou seja, funções definidas pelo usuário. Silberschatz, Korth e Surdarshan (2006)
apresentam o exemplo 14 da criação de uma função, onde dado o nome de um
cliente, retorna a contagem do número de contas pertencentes a esse cliente em
forma de tabelas. Esse tipo de funções são chamadas “funções de tabelas”. “A função
do exemplo retorna uma tabela contendo todas as contas que uma determinada
pessoa possui. Observe que o parâmetro de função é referenciado prefixando-o com
o nome da função (conta_de.nome_cliente)” (SILBERSCHATZ; KORTH; SURDARSHAN,
2006, p. 95).

(14)
create function contas_de (nome_cliente char (20))
return table (
numero_conta char (10),
nome_agencia char (15),
saldo numeric(12,2))
return table
( select numero_conta, nome_agencia, saldo from conta
where exist (select * from depositante);
Pós-Universo 33

O exemplo 15 ilustra a chamada da função “contas_de”, que retorna todas as contas


pertencente ao cliente ‘schirigatti’.

(15)
SELECT *
FROM table (contas_de (‘schirigatti’))

Em geral, contudo, as funções com valor de tabela podem ser imaginadas como views
parametrizadas que generalizam a noção comum de views permitindo parâmetros
(SILBERSCHATZ; KORTH; SURDARSHAN, 2006, p. 95).
Um outro exemplo de função (exemplo 16), segundo PRICE (2009), ilustra no
Oracle 11g a criação de uma função chamada “average_produc_price ()”, a qual
retorna o preço médio dos produtos cujo valor de “product_type_id” é igual ao valor
do parâmetro de entrada. O parâmetro product_type_id é o código do produto da
tabela produtos. AVG(price) calcula a média dos processos dos produtos pesquisados
como resultado inseridos em v_average_product_price, que é retornado pela função
através de RETURN. Percebam que a busca (seleção), o cálculo da média dos preços e
a condição de busca na tabela produtos são realizados entre a estrutura BEGIN/END.

(16)
CREATE FUNCTION average_produc_price (p_product_type_id) (
p_product_type_id IN INTEGER) RETURN NUMBER AS
v_average_product_price NUMBER;
BEGIN
SELECT AVG(price)
INTO v_average_product_price
FROM products
WHERE product_type_id = p_product_type_id;
RETURN v_average_product_price;
END average_produc_price;
34 Pós-Universo

Para chamar a função average_produc_price(), o exemplo 17 ilustra a chamada dentro


de um SELECT, passando o valor de parâmetro 1 para a função, para obter o preço
médio dos produtos, cujo valor de product_type_id é 1:

(17)
SELECT average_produc_price(1) FROM dual;

average_produc_price(1)
--------------------------------
29.965

saiba mais
As procedures e funções têm vantagens em um ambiente de banco de
dados. As procedures são compiladas e armazenadas no dicionário de
dados de uma vez; quando mais de um usuário precisar chamá-la, ela já
estará compilada e haverá somente uma cópia da procedure armazenada
no shared pool. Uma procedure diferente da função não retorna um valor,
apenas um código de status. Entretanto, as procedures podem ter uma ou
mais variáveis que podem ser definidas e retornadas como parte de sua
lista de argumentos.

Fonte: Bryla e Loney (2009, p. 47).


atividades de estudo

1. O Oracle inclui muitas funções de SQL construídas diretamente no banco de dados,


que podem ser utilizadas em uma variedade de maneiras em SQL e PL/SQL. Essas
funções podem aceitar qualquer número de parâmetros e sempre retornam um
resultado de um tipo de dado. Marque a alternativa correta sobre as funções pré-
definidas no SQL que aprendemos em nossos estudos.

a) compreende funções numéricas, funções definidas pelo usuário e funções de


manipulação de caracteres.
b) pode compreender funções numéricas, manipulação e conversão de caracteres
e de datas.
c) funções pré-definidas funcionam de forma muito parecida aos operadores que
manipulam itens de dados e retornam um status.
d) diferentemente de uma consulta SQL, uma função poderá receber vários parâmetros
e retornará vários resultados.

2. As funções pré-definidas numéricas basicamente recebem e retornam valores


numéricos. Marque a alternativa correta que relaciona a função que retorna um
número (inteiro ou decimal, caso informado o número de casas) arredondado. É muito
usado para divisões após valores monetários ou obtenção de valores percentuais
ou medias, pois muitas vezes estas divisões resultam em mais de 5 casas decimais e
é preciso diminuir as casas com arredondamento. O arredondamento é obtido por
meio de aproximação, podendo ser para baixo (até .5) ou para cima (a partir de .5).

a) trunc (n, casas).


b) ceil (n).
c) floor (n).
d) round (n, casas).
atividades de estudo

3. Uma facilidade que pode ser obtida com a lógica condicional CASE WHEN é a de
praticamente poder utilizá-la em qualquer momento da consulta SQL, inclusive na
cláusula ORDER. Marque a alternativa correta, que justifica o uso da condicional CASE
WHEN na cláusula ORDER:

a) Evita o uso de duas consultas, UNION ou qualquer outra solução.


b) Promove uma maior velocidade no processamento das consultas.
c) Possibilita que a filtragem de um resultado seja obtida por meio também de uma
expressão condicional.
d) Evita o uso da expressão GROUP BY com a ORDER BY.

4. Segundo Morelli (2009, p. 73), “eventualmente o comando SELECT também pode


ser utilizado para obter um dado que não necessariamente esteja armazenado em
uma tabela de dados”. Por exemplo, as vezes é muito útil simplesmente realizar um
retorno do valor extraído de uma data ou timestamp a partir de uma das seguintes
opções: YEAR, MONTH, DAY, HOUR, MINUTE, SECOND, TIMEZONE_HOUR, TIMEZONE_
MINUTE, TIMEZONE_REGION, TIMEZONE_ABBR. Marque a alternativa que corresponde
à funcionalidade apresentada:

a) current_timestamp.
b) extract.
c) dbtimezone.
d) months_between.
resumo

Podemos resumir o nosso estudo nos conceitos e nas aplicações das funções pré-definidas,
aplicações das funções em cenários práticos, uso da lógica condicional CASE WHEN e na criação de
funções pré-definidas pelo usuário. Com relação às funções pré-definidas, as principais apresentadas
em nosso estudo são as funções numéricas e as de manipulação e conversão de caracteres e
datas. Vimos que o uso das funções pré-definidas funcionam de forma muito parecida a dos
operadores que manipulam itens de dados e retornam um valor. Assim como também em uma
linguagem de programação normal, funções recebem dados passados mediante parâmetros,
que podem ser caracterizados por um ou mais argumentos e resultam em um retorno único.
Também compreendemos que as funções, tanto as pré-definidas como as definidas pelos usuários,
possuem uma importância dentro da linguagem SQL quanto ao reuso dos cálculos prontos,
facilitando a programação e reutilização dos códigos. Os cenários práticos apresentados em nosso
estudo são os mais variados, onde houver uma aplicação em uma empresa ou setor comercial,
financeiro ou produtivo, ou outro qualquer que necessite de operações de cálculos, manipulação
de caracteres e datas, as funções podem ser utilizadas para facilitar o desenvolvimento do código
SQL. Quanto à aplicação da lógica condicional, como a cláusula CASE WHEN, vimos que ela traz
grandes benefícios de organização e visualização, deixando assim mais próximo o código em
uma estrutura condicional comum, sendo que praticamente é possível utilizá-la em qualquer
momento da consulta SQL. Contudo, entendemos que a CASE WHEN é mais utilizada na cláusula
SELECT para condicionar a seleção, na WHERE para condicionar os resultados da filtragem e na
cláusula ORDER para condicionar as classificações. E, por fim, compreendemos a importância
do estudo das funções definidas pelos usuários, onde é possível criar funções de um retorno
(numérico, caractere ou outro tipo de dado), bem como o retorno de tabelas de dados, através
das chamadas “funções de tabelas”.
material complementar

Na Web
Acesse o link da documentação do SQL da Microsoft (Transact-SQL) para conhecer mais
sobre as dezenas de funções de banco de dados, como agregação, analíticas, agrupamento,
configuração, conversão, matemático, lógica, data e hora, etc.:
Web: <https://docs.microsoft.com/pt-br/sql/t-sql/functions/string-functions-transact-sql>.

Na Web
Acesse o link da documentação do SQL da Microsoft (Transact-SQL) para conhecer mais sobre
as funções pré-definidas de cadeia de caracteres:
Web: <https://docs.microsoft.com/pt-br/sql/t-sql/functions/string-functions-transact-sql>.
referências

BRYLA, B.; LONEY, K. Oracle Database 11g - Manual do DBA: administre um banco de dados
corporativo Oracle escalável e seguro. Porto Alegre: Bookman, 2009.

COSTA, R. L. de C. SQL: guia prático. 2. ed. Rio de Janeiro: Brasport, 2006.

FREEMAN, R. Oracle, referência para o DBA: técnicas essenciais para o dia-a-dia do DBA. Rio de
Janeiro: Elsevier, 2005.

GONÇALVES, E. PL/SQL: domine a linguagem do banco de dados SQL. São Paulo: Casa do Código,
2015.

MORELLI, E.T. Oracle DBA essencial. v. 1. Rio de Janeiro: Brasport, 2009.

ORACLEPRESS. Timestamp e Timezone. Disponível em: <https://oraclepress.wordpress.


com/2015/02/02/timestamp-and-timezone/>. Acesso em: 02 jan. 2018.

PRICE, J. Oracle Database 11g: domine SQL e PL/SQL no banco de dados Oracle. Porto Alegre:
Bookman, 2009.

RAMALHO, J. A. A. Microsoft SQL 2005: guia prático. Rio de Janeiro: Elsevier, 2005.

SILBERSCHATZ, A.; KORTH, H. F.; SURDARSHAN, S. Sistemas de Banco de Dados. Rio de Janeiro:
Elsevier, 2006.
resolução de exercícios

1. b) pode compreender funções numéricas, manipulação e conversão de caracteres


e de datas.

2. d) round (n, casas).

3. a) Evita o uso de duas consultas, UNION ou qualquer outra solução.

4. b) extract.