Você está na página 1de 8

211

Aula 2º

FUNÇÕES EM SQL

Olá, pessoal, tudo bem?


Bem-vindos(as) novamente a nossa matéria Banco de Dados I.
Nesta segunda aula, vamos estudar mais alguns conceitos da linguagem
SQL: as funções. Graças a elas, podemos fazer manipulações dos dados
diretamente em nossas consultas, sem precisar de tratamento posterior.
Nesta aula, você vai estudar as funções que manipulam strings, datas e
números, que são muito importantes, e podem fazer que você ganhe
tempo ao programar os seus sistemas.
Qualquer dúvida, entrem em contato via quadro de avisos. E
lembrem-se de fazer as atividades. A sua participação é muito importante.
Bons estudos!

Objetivos de aprendizagem

Ao término desta aula, vocês serão capazes de:

• saber como usar funções de manipulação de strings;


• saber como usar funções de manipulação de datas;
• saber como usar funções de manipulação de números;
• Entender o conceito de funções.
212 Banco de Dados II 14
números. Explicaremos, também, os tipos de junções (joins)
Seções de estudo entre tabelas, e entenderemos o que são as funções agregadas,
que são muito importantes na manipulação dos bancos de
1. O que são funções? dados.
2. Funções de String Feito as explicações iniciais, vamos agora explicar o que
3. Funções de Data fazem algumas funções do MySQL, que podem ser muito
4. Funções de Números úteis durante a sua jornada de desenvolvimento de sistemas.

1 - O que são funções? 2 - Funções de String


A linguagem SQL serve para que você crie as bases de As funções de string manipulam cadeias de caracteres
dados, suas tabelas, armazene dados e ainda permite que você obtidos em um banco de dados. Podem ser aplicados em
faça recuperação dos dados, através das consultas. Mas qualquer campo que consista em apenas uma cadeia de
existem situações em que um mero SELECT para colunas de caracteres (como o clássico VARCHAR, por exemplo).
uma tabela não faz sozinho, como: A partir de agora, vamos explicar o que fazem as
principais funções de manipulação de string, que são: substr,
• manipular qual a parte da data que queremos; length, concat, concat_ws, lcase e ucase.
• saber quantos dados estão em uma tabela;
• alterar o nome do cliente para maiúsculas; 2.1 - Funções substr e length
• entre outros. Suponha que você queira saber quais cidades começam
Para isso, os programadores de SGBDs criaram funções com a palavra São. Uma forma é usar o operador LIKE,
que ajudam o usuário em tarefas específicas, aumentando as usando o curinga. Mas existe outra forma. Podemos usar a
possibilidades de recuperação de dados em um banco. Com função substr, que gera uma substring de uma string gerada.
eles, podemos fazer essas situações que citamos acima, além Vamos a alguns exemplos. Abra o MySQL Workbench e
de muitas outras coisas, como relata Vinícius Carvalho: digite os seguintes comandos:

No MySQL, existem várias funções nativas SELECT substr(“Felipe”,1,3);


que nos possibilitam fazer diversas operações,
dentre elas: realizar cálculos, manipular strings, Esse comando vai apenas retornar os três primeiros
trabalhar com datas, realizar opções lógicas, caracteres da palavra Felipe. Ou seja, o MySQL vai devolver a
extrair informações dos nossos registros etc. Elas string Fel. Vamos para outro teste:
estão divididas nos seguintes tipos: numéricas,
lógica, manipulação de string e funções de data SELECT substr(“Felipe”,3,3);
e hora. (CARVALHO, 2017, p. 75) Aqui, diferentemente que alguns pensariam, o MySQL
O MySQL possui um vasto número de funções prontas devolverá a string “lip”. Isso porque o terceiro parâmetro não
para que nós possamos utilizar em nossos scripts SQL. A é a posição final, é a quantidade de caracteres que deve ser
documentação oficial tem uma lista (em inglês) com todas essas extraída dessa string. Assim, a string gerada vai do terceiro
funções disponíveis. Para isso, basta acessar o site: <https:// caractere até o quinto caractere.
dev.mysql.com/doc/refman/5.6/en/func-op-summary-ref. Podemos, então, fazer a nossa consulta:
html>. Para saber o que uma função em específico faz, basta SELECT NOMECID FROM CIDADE WHERE
procurar na lista a função especificada e clicar nela. substr(NOMECID,1,3) = “São”;

O resultado, como você pode ver, corresponde ao


esperado:

NOMECID

SÃO PAULO

SÃO SEBASTIÃO

SÃO JOSÉ DO RIO PRETO

Figura 1 - Captura de tela do site da documentação de funções do MySQL. Fonte: Podemos também fazer uma consulta na tabela cidade
Disponível em: <https://dev.mysql.com/doc/refman/5.6/en/func-op-summary-ref.
html>. Acesso em 24 ago. 2018. para listar todas as cidades e os três primeiros caracteres do
seu respectivo nome. Para isso, podemos usar essa consulta:
Nesta aula, vamos veremos uma noção introdutória SELECT NOMECID, substr(NOMECID,1,3) FROM
sobre as funções, explicando o que fazem as funções de String, CIDADE;
funções de manipulação de datas e funções de manipulação de A seguir, reproduzimos o resultado:
15 213
2.2 - Concatenando com concat e
NOMECID substr(NOMECID,1,3) concat_ws
DOURADOS DOU Uma coisa que é muito usual quando criamos os
nossos sistemas é concatenar valores em uma única string
CAMPO GRANDE CAM apenas. Normalmente, fazemos as nossas consultas por
SÃO PAULO SÃO SQL e depois usamos a linguagem de programação para
fazer a concatenação. Mas você sabia que o SQL permite a
CUIABA CUI concatenação diretamente nas consultas?
O MySQL prevê o uso das funções concat e concat_ws.
FLORIANÓPOLIS FLO Primeiro, explicaremos o que é a função concat. Ela nada
mais é que uma função que aceita um número infinito de
SÃO SEBASTIÃO SÃO
parâmetros e devolve uma string única, com todos os valores
CAARAPÓ CAA dos parâmetros que incluímos nessa função. Vamos para um
exemplo.
BRASÍLIA BRA
SELECT concat(“Felipe”, “Pereira”, “Perez”);
TUPÃ TUP
O resultado é FelipePereiraPerez. Como nenhum espaço
SÃO JOSÉ DO RIO PRETO SÃO foi incluído, o MySQL gerou essa string direta. Para incluirmos
os espaços, poderíamos fazer de diferentes formas:
APUCARANA APU
SELECT concat(“Felipe “, “Pereira “, “Perez”);
JARDIM JAR
SELECT concat(“Felipe”, “ Pereira”, “ Perez”);
JATEI JAT SELECT concat(“Felipe”, “ “, “Pereira”, “ “,
“Perez”);
AMAMBAI AMA
Os resultados dessas três consultas são idênticas
Outra função importante de manipulação de strings é (Felipe Pereira Perez), mas existe uma forma mais elegante
a length. Seu nome é uma palavra em inglês que quer dizer de incluirmos um separador entre as palavras. Essa forma é
comprimento. Sua única função é apenas contar quantos feita por uma função chamada de concat_ws. Ela é similar
caracteres temos em uma string. Para entender melhor, vamos ao concat, mas a diferença é que o primeiro parâmetro é o
a um exemplo: caractere que deve ser colocado entre as palavras (o separador).
Vamos para um exemplo:
SELECT length(“Felipe”);
SELECT concat_ws(“ “, “Felipe”, “Pereira”,
O resultado dessa consulta é 6, pois a palavra Felipe tem “Perez”);
seis caracteres. Assim, podemos entender que essa é uma
função bastante simples. O resultado é idêntico às três consultas anteriores. Dito
Uma boa utilidade é usar essa função para verificar se isso, podemos usar essas funções para preparar um relatório
tem alguma tupla com um valor de coluna preenchida com em CSV. Nesse caso, cada linha teria os dados do cliente,
um valor incorreto. Por exemplo, um CPF tem 11 dígitos. Se separados por ponto-e-vírgula. Para obtermos isso, usamos
considerarmos os traços e pontos que utilizamos para escrever esse comando:
o nosso número, temos 14 caracteres.
Em nosso banco de dados, o DBA definiu que os SELECT concat_ws(“,”, CODCID, NOMECID,
números de CPF dos clientes seriam armazenados com os UF) FROM CIDADE;
seus pontos e traços. Assim, esperamos que os números de
Os resultados são mostrados na tabela a seguir:
CPF dos cidadãos armazenados nesse banco tenham 14
caracteres, certo? Vamos verificar rodando esse comando:
concat_ws(“,”, CODCID, NOMECID, UF)
SELECT * FROM CLIENTE WHERE length(CPF) <> 14;
1,DOURADOS,MS
E descobrimos que temos um cliente com um número
de CPF incorreto. Provavelmente, o vendedor deve ter 2,CAMPO GRANDE,MS
confundido o seu CEP com o seu número de CPF.
3,SÃO PAULO,SP

4,CUIABA,MT
CODCLI NOME (...) CEP TELEFONE CPF (...)
Nicolash
5,FLORIANÓPOLIS,SC
1 Pereira (...) 13971-150 NULL 13971-150 (...)
6,SÃO SEBASTIÃO,SC
Rodrigues
214 Banco de Dados II 16
Agora que você sabe como funcionam as funções de
7,CAARAPÓ,MS
manipulação de strings, vamos para as funções de manipulação
8,BRASÍLIA,DF de data.

10,TUPÃ,SP
3 - Funções de Data
11,SÃO JOSÉ DO RIO PRETO,SP
O MySQL oferece uma quantidade muito interessante
12,APUCARANA,PR de funções para a manipulação de datas. Vale lembrar que o
MySQL armazena as datas em colunas do tipo DATE, onde
13,JARDIM,MS armazena as datas no formato AAAA-MM-DD e em colunas
DATETIME, que abriga simultaneamente a hora,
14,JATEI,MS
armazenando no formato AAAA-MM-DD HH:MM:SS.
15,AMAMBAI,MS Para retornar a data atual, usamos a função curdate().
Vejamos como funciona:

2.3 - Usando as funções ucase e SELECT curdate();


lcase.
SELECT curdate();
Podemos também alterar o formato de exibição das
letras diretamente no script SQL. Ou seja, podemos controlar 2018-08-24
se as letras serão escritas da forma maiúscula ou da forma
Se quisermos mais informações, como, por exemplo, o
MAIÚSCULA.
horário atual junto com a data atual, usamos as funções now()
Para fazer que as letras fiquem da forma maiúscula,
ou sysdate(). Veja como funciona:
usamos a função ucase. Veja como fica:
SELECT now(), sysdate();
SELECT ucase(“Felipe Pereira”);

O resultado é a string escrita da forma maiúscula: now() sysdate()


FELIPE PEREIRA. Porém, se quisermos transformar as 2018-08-24 23:15:48 2018-08-24 23:15:48
strings em letras minúsculas, podemos fazer, usando a função
lcase. Veja o resultado quando colocamos essa função para Porém, se você deseja ver apenas a hora, use a função
mostrar os nomes das cidades. curtime(). Vamos ver como usamos:
SELECT lcase(NOMECID) FROM CIDADE; SELECT curtime();

lcase(NOMECID) SELECT curtime();

dourados 23:15:48

campo grande Legal, não? Agora, suponhamos que precisemos ver


quantos dias tem entre o dia 25 de Março até o dia 30 de
são paulo Dezembro de 2019. Para isso, usamos a função datediff,
declarando nos seus argumentos o dia final e o dia inicial.
cuiaba
SELECT datediff(‘2019-12-30’, ‘2019-03-25’);
ÀRULDQySROLV
SELECT datedi΍(Ȇ2019-12-30ȇ, Ȇ2019-03-25ȇ);
são sebastião
280
FDDUDSy
brasília Se quisermos ver qual será o dia depois de um número
X de dias, usamos a função date_add, colocando a data inicial,
tupã e o intervalo a ser adicionado. Se quisermos salvar o dia de
vencimento de um protocolo criado no dia 20 de Fevereiro de
são josé do rio preto 2019, e esse vencimento é daqui a 45 dias, usamos esse código
para descobrir qual será a data:
apucarana
SELECT date_add(‘2019-02-20’, interval 45
jardim
day);
jatei
SELECT date_add(Ȇ2019-02-20ȇ, interval 45 day);
amambai
2019-04-06
17 215
Outra função muito útil é o date_format, que permite DD/MM/AAAA. Para isso, devemos passar como parâmetro
que escolhamos um formato para apresentação da data que uma string do tipo “%d/%m/%Y”. Vamos testar?
queremos recuperar do banco. Há duas formas de usar. A
primeira é indicar o local a qual a data será formatada. O SELECT date_format(‘2019-02-10’,’%d/%m/%Y’);
MySQL possui vários locais pré-definidos para que possamos
Como podemos ver, deu certo:
formatar as nossas datas. Uma delas que é bem parecida com
o formato brasileiro é o formato europeu. Assim, vamos
SELECT date_format(‘2019-02-
formatar a data segundo o padrão europeu.
10’,’%d/%m/%Y’);
SELECT date_format(‘2019-02-10’,get_ 10/02/2019
format(date,’EUR’));
Mas, e se quisermos armazenar uma data no padrão
SELECT date_format(Ȇ2019-02-10ȇ,get_format(date,ȇEURȇ)); brasileiro no MySQL, que só aceita o padrão americano?
10.02.2019 Podemos usar a função str_to_date, que converte uma string
no formato de data correto do MySQL. Para que o MySQL
Outra forma é colocar no segundo parâmetro uma string entenda qual número é o dia, qual número é o mês e qual
com vários parâmetros. Nesse caso, temos uma flexibilidade número é o ano, devemos passar uma string com parâmetros
maior para formatar a nossa data. A seguir, mostramos uma (da mesma forma que em date_format), indicando como a
tabela com os parâmetros possíveis de serem colocados nessa data foi escrita.
string: Vamos testar essa função, passando uma data escrita no
padrão brasileiro e a string de mapeamento (que é a mesma
Tabela 1 – Alguns parâmetros possíveis de serem string que usamos para fazer a conversão de data):
colocados na função date_format
%a Dia da semana abreviado, em inglês (Sun a Sat) SELECT str_to_date(‘02/03/2019’,’%d/%m/%Y’);

%b Nome do mês abreviado, em inglês (Jan a Dec)


SELECT str_to_date(Ȇ02032019ȇ,ȇ%d%m%Yȇ);
%c Número do mês (01 a 12)
2019-03-02
%D Dia do mês escrito em ordinais, em inglês (1st, 2nd, 3rd, Ȑ)
%d Dia do mês, em numérico (01 a 31) E, com isso, encerramos as nossas funções de datas.
%e Dia do mês, em numérico (0 a 31)
Agora vamos ver como funcionam as funções que manipulam
números.
%f Microssegundos
%H Hora (00 a 23) 4 - Funções de Números
%h Hora (00 a 12)
O MySQL dá ao programador diversas funções de
%I Hora (00 a 12)
manipulação de números. Com eles, podemos fazer diversos
%i Minutos (00 a 59) cálculos e operações sobre os dados numéricos do banco.
%j Dia do ano (001..366) O primeiro deles é a função round, que arredonda um
número de ponto flutuante, gerando um número de n casas
%k Hora (0 a 23)
decimais, definido na função. Assim, temos dois argumentos:
%l Hora (1 a 12) o primeiro é o número racional ou uma coluna que tenha um
%M Mês, por extenso, escrito em Inglês (JanuaryȐ) número racional. O segundo argumento é o número de casas
decimais que deve ter o número que será retornado.
%m Mês, numérico (00 a 12)
Para esclarecer isso, vamos fazer um teste, criando uma
%p AM ou PM consulta que arredonda números:
%r Hora, no formato 12 horas (hh:mm:ss (AM ou PM))
SELECT round(1234.6789,2), round(1234.6789,3);
%S Segundos (00 a 59)
%s Segundos (00 a 59) round(1234.6789,2) round(1234.6789,3)

%T Hora, no formato 24 horas (hh:mm:ss) 1234.68 1234.679


%Y Ano em quatro dígitos
Podemos usar essa função para arredondar os números
%y Ano em dois dígitos
presentes em uma tabela. Vamos fazer isso com os valores
%% O caractere % unitários da tabela PRODUTO:
Fonte: Disponível em: <https://dev.mysql.com/doc/refman/5.5/en/date-and-time-
functions.html#function_date-format>. Acesso em 24 ago. 2018. Adaptado.
SELECT DESCRICAO, round(VALOR_UN, 1) FROM
Suponhamos que queiramos colocar o dia no formato PRODUTO;
216 Banco de Dados II 18
DESCRICAO round(VALOR_UN, 1) DESCRICAO (VALOR_UN - 1.5)

MATA CUPIM 25.0 MATA CUPIM 23.5

GLIFOSSATO 12.0 GLIFOSSATO 10.5

RANDAP 33.0 RANDAP 31.5

SERRA CIRCULAR 200.0 SERRA CIRCULAR 198.5

ROÇADEIRA 378.0 ROÇADEIRA 376.5

MOTO SERRA 400.0 MOTO SERRA 398.5

CORTADOR DE GRAMA 798.5


CORTADOR DE GRAMA 800.0
PÁ DE PONTA 68.5
PÁ DE PONTA 70.0
VACINA BDD 297.5
VACINA BDD 299.0
VACINA DDD 198.5
VACINA DDD 200.0
MASCARA 3.5
MASCARA 5.0
MASCARA SILICONE 8.5
MASCARA SILICONE 10.0
PINO CORTADOR 3.5
PINO CORTADOR 5.0
ROSCA SERRA 22 10.5
ROSCA SERRA 22 12.0
MANGUEIRA 04 23.5
MANGUEIRA 04 25.0
BICO MANGUEIRA 1.5
BICO MANGUEIRA 3.0 ROUPA PROTECAO 51.5
ROUPA PROTECAO 53.0 PULVERIZADOR 74.5
PULVERIZADOR 76.0 CHAPEU DE PALHA 32.5
CHAPEU DE PALHA 34.0 LUVA DE BORRACHA 0.5

LUVA DE BORRACHA 2.0


Agora, suponhamos que o gerente queira aumentar
temporariamente os preços em R$ 0,75. Para isso, vamos
Outra forma de manipular números racionais é através fazer essa consulta:
da função truncate, que elimina todas as casas decimais de um
número racional, ou elimina algumas casas decimais, definido SELECT DESCRICAO, (VALOR_UN + 0.75) FROM
no segundo parâmetro quantas casas decimais queremos PRODUTO;
manter. Vamos para um teste:
SELECT truncate(1234.6789, 0), DESCRICAO (VALOR_UN + 0.75)
truncate(1234.6789, 2);
MATA CUPIM 25.75

truncate(1234.6789, 0) truncate(1234.6789, 2) GLIFOSSATO 12.75

1234 1234.67 RANDAP 33.75

SERRA CIRCULAR 200.75


Além disso, podemos, nas nossas consultas, usar as
operações aritméticas elementares. Assim, podemos alterar os ROÇADEIRA 378.75
valores dos números diretamente em nossas consultas SQL.
MOTO SERRA 400.75
Vamos para um exemplo. Suponhamos que o gerente
queira reduzir temporariamente todos os preços da loja em CORTADOR DE GRAMA 800.75
R$ 1,50. Podemos escrever essa consulta para obter os valores
atualizados: PÁ DE PONTA 70.75

SELECT DESCRICAO, (VALOR_UN - 1.5) FROM PRODUTO; VACINA BDD 299.75


19 217
escrevendo a seguinte consulta:
VACINA DDD 200.75

MASCARA 5.75 SELECT DESCRICAO, truncate( (VALOR_UN *


1.1), 2) FROM PRODUTO;
MASCARA SILICONE 10.75

PINO CORTADOR 5.75 DESCRICAO truncate( (VALOR_UN * 1.1), 2)

ROSCA SERRA 22 12.75 MATA CUPIM 27.50

MANGUEIRA 04 25.75 GLIFOSSATO 13.20

BICO MANGUEIRA 3.75 RANDAP 36.30

ROUPA PROTECAO 53.75 SERRA CIRCULAR 220.00

PULVERIZADOR 76.75 ROÇADEIRA 415.80

CHAPEU DE PALHA 34.75 MOTO SERRA 440.00

LUVA DE BORRACHA 2.75 CORTADOR DE GRAMA 880.00

PÁ DE PONTA 77.00
Agora, vamos pensar que o gerente queira aumentar os
produtos 10%. Para isso, podemos multiplicar os valores por VACINA BDD 328.90
1,10. Assim, escrevemos essa consulta:
VACINA DDD 220.00
SELECT DESCRICAO, (VALOR_UN * 1.1) FROM PRODUTO;
MASCARA 5.50
DESCRICAO (VALOR_UN * 1.1)
MASCARA SILICONE 11.00
MATA CUPIM 27.500000000000004
PINO CORTADOR 5.50
GLIFOSSATO 13.200000000000001
RANDAP 36.300000000000004 ROSCA SERRA 22 13.20

SERRA CIRCULAR 220.00000000000003 MANGUEIRA 04 27.50


ROÇADEIRA 415.8 BICO MANGUEIRA 3.30
MOTO SERRA 440.00000000000006
ROUPA PROTECAO 58.30
CORTADOR DE GRAMA 880.0000000000001
PULVERIZADOR 83.60
PÁ DE PONTA 77
CHAPEU DE PALHA 37.40
VACINA BDD 328.90000000000003
VACINA DDD 220.00000000000003 LUVA DE BORRACHA 2.20

MASCARA 5.5
MASCARA SILICONE 11
Por fim, podemos usar a operação da divisão em nossas
consultas SQL. Suponhamos que queremos consultar o valor
PINO CORTADOR 5.5
de um meio produto, caso o produto seja vendido em caixa.
ROSCA SERRA 22 13.200000000000001 Para descobrir isso, escrevemos a seguinte consulta:
MANGUEIRA 04 27.500000000000004
SELECT DESCRICAO, truncate( (VALOR_UN /
BICO MANGUEIRA 3.3000000000000003
1.1), 2) FROM PRODUTO WHERE UNIDADE = ‘CX’;
ROUPA PROTECAO 58.300000000000004
PULVERIZADOR 83.60000000000001 DESCRICAO truncate( (VALOR_UN  1.1), 2)
CHAPEU DE PALHA 37.400000000000006 VACINA BDD 271.81
LUVA DE BORRACHA 2.2
VACINA DDD 181.81

Alguns valores ficaram com muitas casas decimais. Isso é


normal, devido ao formato de armazenamento dos dados de E, com isso, finalizamos a nossa aula de funções SQL.
ponto flutuante. Podemos eliminar as casas decimais extras, Na próxima aula, veremos o que é a Álgebra Relacional, até lá!
218 Banco de Dados II 20

Retomando a aula
Vale a pena acessar

MySQL. 12.7 Date and Time Functions. Disponível


em: <https://dev.mysql.com/doc/refman/5.5/en/date-
Chegamos ao ȴnal da nossa segunda aula. Vamos and-time-functions.html#function_date-format>. Acesso
relembrar o que vimos? em: 24 ago. 2018.
W3 Schools. MySQL DATE_ADD() Function.
Disponível em: <https://www.w3schools.com/sql/func_
1 - O que são funções? mysql_date_add.asp>. Acesso em: 24 ago. 2018.
W3 Schools. MySQL DATE_ADD() Function.
O MySQL possui um vasto número de funções prontas, Disponível em: <https://www.w3schools.com/sql/func_
para que nós vamos utilizar em nossos scripts SQL. Por mysql_str_to_date.asp>. Acesso em: 24 ago. 2018.
meio deles, temos um maior poder de manipulação de dados,
podendo manipular números, datas, strings etc.

2 - Funções de String
Nessa seção, vimos as principais funções de manipulação Minhas anotações
de string presente no MySQL. Você viu funções como concat
e concat_ws, que realizam a concatenação de strings, lcase e
ucase, que transformam as strings em letras minúsculas ou
letras maiúsculas.
3 - Funções de Data
Vimos, nessa seção, como manipular datas usando o
MySQL, como o curdate(), que retorna o dia atual do sistema,
curtime(), que retorna o horário atual, datediff, que retorna o
intervalo entre duas datas, date_add, que faz uma operação de
adição entre datas, date_format, que formata uma data salva
no banco de dados e str_to_date que converte uma string de
data para um padrão aceito pelo MySQL.
4 - Funções de Números
Finalmente, entendemos como manipular números
usando o MySQL. Estudamos, também, funções como round
e truncate, que tira casas decimais de um número de ponto
flutuante. Além disso, vimos que você pode fazer operações
aritméticas diretamente nas consultas SQL.

Vale a pena

Vale a pena ler


CARVALHO, Vinícius; MYSQL: comece com o
principal banco de dados open source do mercado. São
Paulo: Casa do Código, 2017.

Você também pode gostar