Ordenando, Limitando e Renomeando Resultados
Domine ORDER BY, LIMIT, OFFSET, DISTINCT e aliases AS para controlar a apresentação dos resultados
Ordenando, Limitando e Renomeando Resultados
Resultados brutos de consultas raramente estão na ordem que você precisa. Esta lição ensina como ordenar, paginar, deduplicar e renomear colunas para uma saída limpa.
ORDER BY — Ordenando Resultados
ORDER BY ordena o conjunto de resultados por uma ou mais colunas.
SELECT name, salary FROM employees
ORDER BY salary ASC; -- ascendente (padrão)SELECT name, salary FROM employees
ORDER BY salary DESC; -- descendente| name | salary |
|---|---|
| Bob Smith | 72000 |
| Eve Martinez | 78000 |
| Carol Chen | 88000 |
| Alice Johnson | 95000 |
Ordenando por Múltiplas Colunas
SELECT department, name, salary
FROM employees
ORDER BY department ASC, salary DESC;Isso ordena alfabeticamente por departamento, depois pelo maior salário dentro de cada departamento.
ASC é o padrão. Você só precisa escrever DESC para ordem descendente.
Ordenando por Posição da Coluna
Você pode referenciar colunas pela sua posição na lista SELECT (não recomendado para produção):
SELECT name, salary FROM employees ORDER BY 2 DESC;
-- Ordena pela 2ª coluna (salary)Ordenar por posição ordinal (2, 3, etc.) é frágil. Se a lista SELECT mudar, a ordem de classificação muda silenciosamente. Sempre use nomes de colunas.
Ordenando com Expressões
SELECT name, salary, salary * 1.1 AS projected_raise
FROM employees
ORDER BY projected_raise DESC;LIMIT e OFFSET — Paginação
LIMIT restringe quantas linhas são retornadas. OFFSET pula um número de linhas antes de retornar os resultados.
-- Top 5 funcionários com maiores salários
SELECT name, salary FROM employees
ORDER BY salary DESC
LIMIT 5;-- 5 funcionários após pular os primeiros 5 (página 2)
SELECT name, salary FROM employees
ORDER BY salary DESC
LIMIT 5 OFFSET 5;Juntos, LIMIT e OFFSET implementam paginação. Página 1 é LIMIT 10 OFFSET 0, página 2 é LIMIT 10 OFFSET 10, etc.
Variações de Sintaxe LIMIT
Diferentes bancos de dados têm sintaxes ligeiramente diferentes:
| RDBMS | Sintaxe |
|---|---|
| PostgreSQL, SQLite | LIMIT 10 OFFSET 5 |
| MySQL | LIMIT 5, 10 (offset, count) |
| SQL Server | OFFSET 5 ROWS FETCH NEXT 10 ROWS ONLY |
| Oracle | OFFSET 5 ROWS FETCH NEXT 10 ROWS ONLY |
-- Estilo MySQL (offset, count)
SELECT name, salary FROM employees
ORDER BY salary DESC
LIMIT 5, 10; -- Pula 5, retorna 10DISTINCT — Remover Duplicatas
DISTINCT retorna apenas valores únicos para as colunas selecionadas.
-- Liste todos os departamentos únicos
SELECT DISTINCT department FROM employees;| department |
|---|
| Engineering |
| Marketing |
| Sales |
-- Combinações únicas de departamento e status
SELECT DISTINCT department, status FROM employees;DISTINCT se aplica a todas as colunas selecionadas, não apenas à primeira. SELECT DISTINCT a, b retorna pares únicos, não valores únicos de a.
COUNT(DISTINCT ...)
SELECT COUNT(DISTINCT department) AS unique_departments
FROM employees;Aliases AS
Aliases renomeiam colunas ou tabelas no conjunto de resultados. Eles não alteram o esquema subjacente.
Aliases de Coluna
SELECT name AS employee_name,
salary * 12 AS annual_salary
FROM employees;| employee_name | annual_salary |
|---|---|
| Alice Johnson | 1140000 |
| Bob Smith | 864000 |
Aliases de Tabela
Aliases de tabela tornam as consultas mais curtas e legíveis, especialmente com junções:
SELECT e.name, d.name AS department_name
FROM employees AS e
JOIN departments AS d ON e.department_id = d.id;A palavra-chave AS é opcional. SELECT name employee_name funciona, mas AS torna a intenção explícita. Use-a.
Aliases com Espaços
Se um alias contém espaços, coloque-o entre aspas duplas (ou crases no MySQL):
SELECT name AS "Employee Name", salary AS "Annual Salary"
FROM employees;Juntando Tudo
-- Página 3 de departamentos únicos, ordenados alfabeticamente
SELECT DISTINCT department AS dept
FROM employees
ORDER BY dept
LIMIT 5 OFFSET 10;Caso de Uso Real: Ranking
-- Top 10 jogadores com as maiores pontuações, paginado
SELECT
username AS player,
score,
RANK() OVER (ORDER BY score DESC) AS rank
FROM leaderboard
ORDER BY score DESC
LIMIT 10 OFFSET 0;Caso de Uso Real: Pedidos Recentes com Paginação
-- Mostre a página 2 dos pedidos mais recentes (5 por página)
SELECT
id AS order_id,
customer_name,
total AS order_total,
order_date
FROM orders
ORDER BY order_date DESC, id DESC
LIMIT 5 OFFSET 5;OFFSET fica lento em grandes conjuntos de dados porque o banco de dados ainda precisa escanear e descartar linhas puladas. Para paginação profunda (página 1000+), use paginação por chave (WHERE id > ultimo_id_visto LIMIT 10).
DISTINCT vs GROUP BY
DISTINCT e GROUP BY podem ambos deduplicar, mas servem a propósitos diferentes:
| Característica | DISTINCT | GROUP BY |
|---|---|---|
| Propósito | Remover duplicatas | Agrupar linhas para agregação |
| Pode usar agregados | Não | Sim |
| Performance | Similar (mesmo plano de execução frequentemente) | Similar |
| Legibilidade | Mais limpo para dedup simples | Necessário para agregados |
-- Mesmo resultado, intenção diferente
SELECT DISTINCT department FROM employees;
SELECT department FROM employees GROUP BY department;Perguntas de Prática
Dada employees(id, name, department, salary, hire_date):
- Escreva uma consulta para listar todos os funcionários ordenados por data de contratação, do mais recente primeiro.
- Retorne os 3 funcionários contratados mais recentemente.
- Liste todos os departamentos únicos em ordem alfabética.
- Qual é a diferença entre
LIMIT 5 OFFSET 5eLIMIT 5, 5? - Escreva uma consulta que retorne nomes de funcionários com alias "full_name" e seus salários com alias "monthly_pay".
- Mostre funcionários ordenados por departamento (A-Z), depois por salário (maior primeiro dentro de cada departamento).
- Retorne a 4ª página de funcionários (10 por página).
- Como você contaria quantos departamentos distintos existem na tabela employees?
- Por que ordenar por posição da coluna (
ORDER BY 2) é desencorajado? - Escreva uma consulta que retorne os 5 funcionários com menores salários.