MySQL: Um guia completo sobre as funções integradas do…
Última atualização: 2026-08-26
As funções são o canivete suíço do SQL — elas cuidam da transformação, formatação e cálculos dos dados.
Esta aula oferece uma visão geral sistemática das funções embutidas mais utilizadas no MySQL.
graph TB
A[MySQL Built-in Functions] --> B[Mathematical Functions<br/>ROUND/CEIL/FLOOR/RAND]
A --> C[String Functions<br/>CONCAT/LENGTH/SUBSTRING]
A --> D[Date Functions<br/>NOW/DATE_FORMAT/DATEDIFF]
A --> E[Conditional Functions<br/>IF/IFNULL/CASE]
A --> F[Aggregate Functions<br/>COUNT/SUM/AVG/MAX/MIN]
A --> G[Type Conversion<br/>CAST/CONVERT]
1. O que você vai aprender
- Funções matemáticas (ROUND/CEIL/FLOOR/MOD)
- Funções de cadeia de caracteres (CONCAT/LENGTH/SUBSTRING/REPLACE)
- Funções de data (NOW/DATE_FORMAT/DATEDIFF/DATE_ADD)
- Funções de conversão de tipos (CAST/CONVERT)
- Funções condicionais (IF/IFNULL/CASE)
2. Histórias reais sobre limpeza de dados
(1) Problema: Formatos de dados inconsistentes
Dados de cadastro do usuário:
| nome | telefone | data_de_criação |
|---|---|---|
| John | 138-0000-1111 | 03/07/2026 |
| Jane | 13800002222 | 3 de julho de 2026 |
Os números de telefone estão formatados de maneira inconsistente, e as datas, de forma aleatória.
(2) Resolução de funções
-- Standardize Phone Number Formats
SELECT name, REPLACE(phone, '-', '') AS clean_phone FROM users;
-- Standardize Date Formats
SELECT name, STR_TO_DATE(created_at, '%Y/%m/%d') AS clean_date FROM users;
3. Funções matemáticas
| Função | Descrição | Exemplo |
|---|---|---|
| Arredondamento para o número de casas decimais especificado. | ||
ROUND(x, d) |
Arredondar para d casas decimais | ROUND(3.1415, 2) → 3,14 |
CEIL(x) |
Resumo | CEIL(3.1) → 4 |
FLOOR(x) |
Arredondar para baixo | FLOOR(3.9) → 3 |
ABS(x) |
Valor absoluto | ABS(-5) → 5 |
MOD(a, b) |
Módulo | MOD(10, 3) → 1 |
POWER(x, y) |
Operação de potência | POWER(2, 3) → 8 |
SQRT(x) |
raiz quadrada | SQRT(16) → 4 |
RAND() |
Número aleatório entre 0 e 1 | RAND() → 0,723... |
▶ Exemplo: Aplicações das funções matemáticas
-- Calculate the discounted price and round it off
SELECT
product_name,
price,
ROUND(price * 0.85, 2) AS sale_price
FROM products;
-- Calculate the number of pages (Round up)
SELECT CEIL(103 / 10) AS total_pages; -- 11 pages
-- Random sort
SELECT * FROM users ORDER BY RAND() LIMIT 5;
4. Funções de cadeia de caracteres
| Função | Descrição | Exemplo |
|---|---|---|
CONCAT(s1, s2, ...) |
Concatenar cadeias de caracteres | CONCAT('Hello', ' ', 'World') |
CONCAT_WS(sep, s1, ...) |
Concatenar usando um separador | CONCAT_WS('-', '2026', '07', '03') |
LENGTH(s) |
Comprimento em bytes | LENGTH('Hello') → 5 |
CHAR_LENGTH(s) |
Comprimento do caractere | CHAR_LENGTH('你好') → 2 |
UPPER(s) |
Converter para maiúsculas | UPPER('hello') → HELLO |
LOWER(s) |
Converter para letras minúsculas | LOWER('HELLO') → hello |
TRIM(s) |
Remover espaços à esquerda e à direita | TRIM(' hi ') → oi |
LTRIM(s) |
Remover espaços à esquerda | LTRIM(' hi') → oi |
RTRIM(s) |
Remover espaços à direita | RTRIM('hi ') → oi |
SUBSTRING(s, pos, len) |
Subsequência | SUBSTRING('Hello', 2, 3) → ell |
LEFT(s, n) |
n caracteres à esquerda | LEFT('Hello', 3) → Ajuda |
RIGHT(s, n) |
n caracteres à direita | RIGHT('Hello', 3) → llo |
REPLACE(s, old, new) |
Substituir | REPLACE('Hi World', 'Hi', 'Hello') |
REVERSE(s) |
Reverso | REVERSE('Hello') → olleH |
LPAD(s, len, pad) |
Preenchimento à esquerda | LPAD('5', 3, '0') → 005 |
RPAD(s, len, pad) |
Preenchimento à direita | RPAD('Hi', 5, '.') → Oi... |
▶ Exemplo: Aplicações das funções de cadeia de caracteres
-- Full name (combined)
SELECT CONCAT(first_name, ' ', last_name) AS full_name FROM employees;
-- Clean phone numbers
SELECT REPLACE(REPLACE(phone, '-', ''), ' ', '') AS clean_phone FROM users;
-- Extract the email domainSELECT
email,
SUBSTRING(email, LOCATE('@', email) + 1) AS domain
FROM users;
-- Generate order number
SELECT CONCAT('ORD', LPAD(id, 6, '0')) AS order_no FROM orders;
Saída:
+-------------+------------+
| email | domain |
+-------------+------------+
| a@gmail.com | gmail.com |
| b@163.com | 163.com |
+-------------+------------+
5. Funções de data
| Função | Descrição | Exemplo |
|---|---|---|
NOW() |
Data e hora atuais | 2026-07-03 10:30:00 |
CURDATE() |
Data atual | 2026-07-03 |
CURTIME() |
Hora atual | 10:30:00 |
DATE(dt) |
Extrair a parte da data | DATE('2026-07-03 10:30:00') |
YEAR(dt) |
Ano de extração | YEAR('2026-07-03') → 2026 |
MONTH(dt) |
Extrair mês | MONTH('2026-07-03') → 7 |
DAY(dt) |
Data de extração | DAY('2026-07-03') → 3 |
HOUR(dt) |
Extrair horas | HOUR('10:30:00') → 10 |
DATE_FORMAT(dt, fmt) |
Formato da data | DATE_FORMAT(NOW(), '%Y-%m-%d') |
STR_TO_DATE(s, fmt) |
Converter string em data | STR_TO_DATE('2026-07-03', '%Y-%m-%d') |
DATEDIFF(d1, d2) |
Diferença de datas (dias) | DATEDIFF('2026-07-10', '2026-07-03') → 7 |
DATE_ADD(dt, INTERVAL) |
Data de adição | DATE_ADD(NOW(), INTERVAL 7 DAY) |
DATE_SUB(dt, INTERVAL) |
Subtração de datas | DATE_SUB(NOW(), INTERVAL 1 MONTH) |
TIMESTAMPDIFF(unit, d1, d2) |
Diferença de horário | TIMESTAMPDIFF(YEAR, birth, CURDATE()) |
▶ Exemplo: Como usar funções de data
-- Check today's data
SELECT * FROM orders WHERE DATE(created_at) = CURDATE();
-- View recent 7 days
SELECT * FROM orders WHERE created_at >= DATE_SUB(NOW(), INTERVAL 7 DAY);
-- Monthly Statistics
SELECT
DATE_FORMAT(order_date, '%Y-%m') AS month,
COUNT(*) AS order_count,
SUM(amount) AS total_amount
FROM orders
GROUP BY month
ORDER BY month;
-- Calculate Age
SELECT
name,
birth_date,
TIMESTAMPDIFF(YEAR, birth_date, CURDATE()) AS age
FROM users;
Saída:
+---------+-------------+--------------+
| month | order_count | total_amount |
+---------+-------------+--------------+
| 2026-01 | 120 | 45000.00 |
| 2026-02 | 135 | 52000.00 |
| 2026-03 | 148 | 58000.00 |
+---------+-------------+--------------+
▶ Exemplo: Formatação de datas
-- Common Formats
SELECT DATE_FORMAT(NOW(), '%Y-%m-%d'); -- 2026-07-03
SELECT DATE_FORMAT(NOW(), '%Y/%m/%d'); -- 2026/07/03
SELECT DATE_FORMAT(NOW(), '%H:%i:%s'); -- 10:30:00
SELECT DATE_FORMAT(NOW(), '%W, %M %d, %Y'); -- Friday, July 03, 2026
6. Funções condicionais
| Função | Descrição | Exemplo |
|---|---|---|
IF(expr, t, f) |
Instruções condicionais | IF(score >= 60, 'Pass', 'Fail') |
IFNULL(expr, alt) |
Substituição por NULL | IFNULL(email, 'N/A') |
NULLIF(a, b) |
Retorna NULL | NULLIF(1, 1) → NULL |
CASE WHEN ... THEN ... END |
Avaliação de múltiplas condições | Veja o exemplo |
▶ Exemplo: Funções condicionais
-- IF Decision
SELECT
name,
score,
IF(score >= 60, 'Pass', 'Fail') AS result
FROM students;
-- IFNULL Processing NULL
SELECT
name,
IFNULL(phone, 'No phone') AS phone
FROM users;
-- CASE Multiple conditions
SELECT
name,
score,
CASE
WHEN score >= 90 THEN 'A'
WHEN score >= 80 THEN 'B'
WHEN score >= 70 THEN 'C'
WHEN score >= 60 THEN 'D'
ELSE 'F'
END AS grade
FROM students;
Saída:
+-------+-------+-------+
| name | score | grade |
+-------+-------+-------+
| Alice | 95 | A |
| Bob | 82 | B |
| Carol | 67 | D |
| Dave | 45 | F |
+-------+-------+-------+
7. Visualização da função agregada
| Função | Descrição | Exemplo |
|---|---|---|
COUNT(*) |
contagem | SELECT COUNT(*) FROM users |
SUM(col) |
Soma | SELECT SUM(amount) FROM orders |
AVG(col) |
Média | SELECT AVG(salary) FROM employees |
MAX(col) |
Valor máximo | SELECT MAX(price) FROM products |
MIN(col) |
valor mínimo | SELECT MIN(age) FROM users |
Para mais detalhes, consulte a Lição 12, “Agregação e agrupamento”.
❓ Perguntas Frequentes
P: Qual é o resultado da função CONCAT quando ela contém NULL? R: O resultado é NULL. Use
CONCAT_WSouIFNULLpara lidar com isso:CONCAT_WS(' ', 'Hello', NULL)→ 'Olá'.
P: Qual é a diferença entre NOW() e CURDATE()? R: NOW() retorna a data e a hora, enquanto CURDATE() retorna apenas a data.
P: Onde posso encontrar os especificadores de formatação de data? R: Pesquise por “especificadores DATE_FORMAT do MySQL”. Os mais comuns incluem: %Y (ano), %m (mês), %d (dia), %H (hora), %i (minuto) e %s (segundo).
P: É possível usar funções na cláusula WHERE? R: Sim, mas isso afetará a indexação.
WHERE DATE(created_at) = CURDATE()não pode usar um índice; use um intervalo em vez disso:WHERE created_at >= CURDATE() AND created_at < CURDATE() + 1.
📖 Resumo
- Funções matemáticas: ROUND/CEIL/FLOOR/MOD/RAND
- Funções de cadeia de caracteres: CONCAT/LENGTH/UPPER/LOWER/TRIM/SUBSTRING/REPLACE
- Funções de data: NOW/CURDATE/DATE_FORMAT/DATEDIFF/DATE_ADD/DATE_SUB
- Funções condicionais: IF/IFNULL/CASE WHEN
- Funções de agregação: COUNT/SUM/AVG/MAX/MIN
📝 Exercícios
-
Problema básico (Dificuldade ⭐): Use CONCAT e LPAD para gerar um número de pedido no formato 'ORD000001'.
-
Problema avançado (Dificuldade: ⭐⭐): Consulte o número de pedidos para cada dia nos últimos 30 dias, usando DATE_FORMAT para formatar as datas.
-
Questão de desafio (Dificuldade: ⭐⭐⭐): Calcule a idade de cada usuário e use uma instrução CASE WHEN para classificá-los em quatro categorias: “adolescente”, “jovem adulto”, “meia-idade” e “idoso”.