Fundamentos do ORDER BY: Como ordenar dados livremente com SQL
Listas de produtos em sites, índices de artigos em blogs, rankings de usuários… Grande parte do conteúdo na web que vemos todos os dias está organizada de acordo com alguma regra. Essa ordenação dos dados é feita com a cláusula ORDER BY do SQL.
Este artigo é voltado para criadores web que estão começando a aprender SQL ou que desejam revisar os fundamentos. Vamos explicar detalhadamente como usar o ORDER BY. Com o tema “É só copiar e funciona!”, preparamos diversos exemplos de código. Experimente por conta própria e aproveite a diversão de manipular dados livremente!
Vamos começar! Prepare os dados de exemplo
Aprender praticando! Vamos direto ao ponto escrevendo SQL. Neste artigo, usaremos como exemplo uma loja virtual fictícia chamada “Web Creator's Mart” e sua tabela de produtos (products).
As instruções SQL abaixo criam essa tabela e inserem os dados de exemplo. O restante do código assume que essa tabela já existe, então se você quiser testar em seu próprio ambiente, execute primeiro este SQL.
-- Criar a tabela de produtos
CREATE TABLE products (
id INT,
name VARCHAR(255),
category VARCHAR(255),
price INT,
release_date DATE
);
-- Inserir dados de exemplo
INSERT INTO products (id, name, category, price, release_date) VALUES
(1, 'Almofada Fofa', 'Decoração', 3200, '2023-04-15'),
(2, 'Protetor Auricular de Foco', 'Gadget', 7800, '2023-11-01'),
(3, 'Caderno de Ideias', 'Papelaria', 1200, '2022-08-20'),
(4, 'Teclado Iluminado', 'Gadget', 15000, '2023-06-30'),
(5, 'Cadeira Super Confortável', 'Decoração', 32000, '2022-11-10'),
(6, 'Caneta Esferográfica Suave', 'Papelaria', 1200, '2023-09-01'),
(7, 'Caneca do Criador', 'Utensílios', 2500, '2023-04-15');
Essa tabela contém as colunas ID do produto (id), nome do produto (name), categoria (category), preço (price) e data de lançamento (release_date). Preparado? Vamos começar a usar o ORDER BY!
Fundamentos do ORDER BY: Vamos começar com ordem crescente
O uso mais básico do ORDER BY é ordenar os dados com base em uma coluna específica em ordem crescente (do menor para o maior, do mais antigo para o mais recente). Por exemplo, para exibir uma lista de produtos do mais barato para o mais caro.
A sintaxe é muito simples: basta adicionar ORDER BY nome_coluna ao final do comando SELECT.
SELECT * FROM products ORDER BY price;
Ao executar este SQL, os dados serão ordenados pela coluna price em ordem crescente (do menor para o maior valor). Aliás, é possível especificar explicitamente a ordem crescente com a palavra-chave ASC (de Ascending), mas como ORDER BY já usa essa ordem por padrão, o uso de ASC geralmente é omitido.
-- Mesmo resultado do código acima
SELECT * FROM products ORDER BY price ASC;
Ordem inversa é fácil! Usando DESC para ordenar em ordem decrescente
Às vezes você vai querer ordenar os dados em ordem decrescente (do maior para o menor, ou do mais recente para o mais antigo), como por exemplo, listar os preços do maior para o menor ou os produtos mais novos primeiro. Para isso, usamos a palavra-chave DESC (de Descending).
Basta adicionar DESC após o nome da coluna. Simples assim!
-- Ordenar por preço do maior para o menor
SELECT * FROM products ORDER BY price DESC;
Assim, o produto mais caro, “Cadeira Super Confortável”, aparecerá primeiro. O mesmo vale para ordenar pela data de lançamento (release_date) do mais novo para o mais antigo.
-- Ordenar pela data de lançamento do mais novo para o mais antigo
SELECT * FROM products ORDER BY release_date DESC;
ASC é opcional, mas para ordenar em ordem decrescente, DESC é obrigatório. Não se esqueça disso!
Exemplo avançado ①: Ordenando por múltiplos critérios
Uma das vantagens do ORDER BY é poder ordenar por múltiplos critérios. Por exemplo: ordenar primeiro por categoria e, dentro de cada categoria, por preço crescente.
Para isso, basta listar os nomes das colunas separados por vírgulas (,) na cláusula ORDER BY. A primeira coluna listada será usada como chave de ordenação principal.
-- Ordenar por categoria (crescente) e depois por preço (crescente)
SELECT * FROM products ORDER BY category, price;
Esse comando SQL vai ordenar os dados pela category em ordem alfabética (por exemplo: Gadget → Interior → Papelaria...), e dentro da categoria “Papelaria”, por price do menor para o maior.
É claro que você também pode definir a ordem de cada coluna individualmente, seja crescente ou decrescente. Um caso comum em lojas online é ordenar pela data de lançamento mais recente, e dentro de uma mesma data, mostrar primeiro os produtos mais caros.
-- Ordenar por data de lançamento (descrescente), depois por preço (descrescente)
SELECT * FROM products ORDER BY release_date DESC, price DESC;
No exemplo de dados, “Almofada Fofa” e “Caneca do Criador” têm a mesma data de lançamento (2023-04-15). Esse SQL exibirá primeiro a “Almofada Fofa” por ser mais cara. Dominar ordenações múltiplas amplia muito suas possibilidades de exibição!
💻 Experimente agora! Execute SQL no seu navegador
Vimos muitos exemplos de SQL até agora, mas a melhor forma de aprender é praticando.
Por isso, preparamos um arquivo HTML especial que permite executar SQL diretamente no seu navegador, sem necessidade de instalar nada.
Copie o código abaixo para um arquivo chamado, por exemplo, index.html e abra no navegador. Você terá um ambiente de prática SQL totalmente funcional. Experimente os diferentes padrões de ORDER BY que aprendeu neste artigo!
<!DOCTYPE html>
<html lang="pt">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Prática de SQL com ORDER BY</title>
<style>
body { font-family: sans-serif; line-height: 1.6; color: #333; max-width: 800px; margin: 2rem auto; padding: 0 1rem; }
h1, h2 { color: #444; }
textarea { width: 100%; height: 150px; font-family: monospace; font-size: 16px; padding: 10px; border: 1px solid #ccc; border-radius: 4px; box-sizing: border-box; }
button { background-color: #007bff; color: white; padding: 10px 20px; border: none; border-radius: 4px; cursor: pointer; font-size: 16px; }
button:hover { background-color: #0056b3; }
#result-container { margin-top: 1.5rem; }
table { width: 100%; border-collapse: collapse; margin-top: 1rem; }
th, td { border: 1px solid #ddd; padding: 8px; text-align: left; }
th { background-color: #f2f2f2; }
#error-message { color: red; font-weight: bold; }
</style>
</head>
<body>
<h1>Aprenda SQL praticando! Ambiente de teste ORDER BY</h1>
<p>Digite seu código SQL abaixo e clique em “Executar SQL”. A consulta será executada na tabela <code>products</code>.</p>
<textarea id="sql-input">-- Digite seu SQL aqui! Teste os exemplos!
SELECT * FROM products ORDER BY price DESC;</textarea>
<button onclick="executeQuery()">Executar SQL</button>
<h2>Resultados</h2>
<div id="result-container"></div>
<div id="error-message"></div>
<script src="https://cdnjs.cloudflare.com/ajax/libs/sql.js/1.10.3/sql-wasm.js"></script>
<script>
let db;
async function initDb() {
const SQL = await initSqlJs({
locateFile: file => `https://cdnjs.cloudflare.com/ajax/libs/sql.js/1.10.3/${file}`
});
db = new SQL.Database();
// Criar tabela e inserir dados
const createTableSQL = `
CREATE TABLE products (
id INT,
name VARCHAR(255),
category VARCHAR(255),
price INT,
release_date DATE
);
INSERT INTO products (id, name, category, price, release_date) VALUES
(1, 'Almofada Fofa', 'Decoração', 3200, '2023-04-15'),
(2, 'Protetor Auricular de Foco', 'Gadget', 7800, '2023-11-01'),
(3, 'Caderno de Ideias', 'Papelaria', 1200, '2022-08-20'),
(4, 'Teclado Iluminado', 'Gadget', 15000, '2023-06-30'),
(5, 'Cadeira Super Confortável', 'Decoração', 32000, '2022-11-10'),
(6, 'Caneta Esferográfica Suave', 'Papelaria', 1200, '2023-09-01'),
(7, 'Caneca do Criador', 'Utensílios', 2500, '2023-04-15');
`;
db.run(createTableSQL);
// Executar consulta inicial
executeQuery();
}
function executeQuery() {
const sqlInput = document.getElementById('sql-input').value;
const resultContainer = document.getElementById('result-container');
const errorMessage = document.getElementById('error-message');
resultContainer.innerHTML = '';
errorMessage.innerHTML = '';
try {
const results = db.exec(sqlInput);
if (results.length > 0) {
resultContainer.appendChild(createTable(results[0]));
} else {
resultContainer.innerHTML = '<p>Consulta executada com sucesso, mas nenhum resultado foi retornado (ex: CREATE TABLE, INSERT).</p>';
}
} catch (e) {
errorMessage.textContent = 'Erro: ' + e.message;
}
}
function createTable(result) {
const table = document.createElement('table');
const thead = document.createElement('thead');
const tbody = document.createElement('tbody');
const headerRow = document.createElement('tr');
result.columns.forEach(colName => {
const th = document.createElement('th');
th.textContent = colName;
headerRow.appendChild(th);
});
thead.appendChild(headerRow);
result.values.forEach(rowData => {
const tr = document.createElement('tr');
rowData.forEach(cellData => {
const td = document.createElement('td');
td.textContent = cellData;
tr.appendChild(td);
});
tbody.appendChild(tr);
});
table.appendChild(thead);
table.appendChild(tbody);
return table;
}
initDb();
</script>
</body>
</html>
Dicas úteis! Pontos importantes ao usar ORDER BY
Por fim, aqui estão alguns pontos a considerar ao utilizar ORDER BY, além de algumas técnicas práticas que podem ajudar.
Tratamento de valores NULL
Quando os dados contêm valores NULL (ou seja, valores ausentes), como o ORDER BY os trata? Isso pode variar um pouco dependendo do tipo de banco de dados, mas normalmente os valores NULL aparecem no início (NULLS FIRST) ou no final (NULLS LAST) do resultado. Como isso pode afetar a ordem de maneira inesperada, é recomendável testar quando estiver ordenando colunas que possam conter NULL.
Sobre desempenho
Se você estiver ordenando milhões de registros com ORDER BY, isso pode aumentar significativamente a carga no banco de dados e fazer com que a consulta leve mais tempo para ser executada. Isso ocorre especialmente quando a ordenação é feita em colunas que não possuem índices. Se você costuma ordenar por certas colunas com frequência, considere criar índices no banco de dados. Esta é uma técnica um pouco mais avançada, mas pode melhorar drasticamente a velocidade de exibição.
É possível ordenar por colunas que não estão no SELECT
Pode parecer curioso, mas a cláusula ORDER BY permite ordenar com base em colunas que não estão incluídas no SELECT. Por exemplo, você pode querer mostrar apenas o nome e o preço do produto, mas ordenar os resultados pela data de lançamento mais recente.
-- Exibe apenas name e price, mas ordena por release_date
SELECT name, price FROM products ORDER BY release_date DESC;
Essa flexibilidade de separar os dados exibidos do critério de ordenação é uma das grandes vantagens do SQL.
Resumo: Domine o ORDER BY e dê o próximo passo na manipulação de dados!
Neste artigo, exploramos a cláusula ORDER BY no SQL — desde os conceitos básicos até a ordenação por múltiplas condições e observações mais avançadas. Vamos revisar os pontos principais:
- Use a cláusula
ORDER BYpara ordenar os dados retornados. - A ordem crescente (do menor para o maior) é o padrão, então
ASCpode ser omitido. - Para ordenar de forma decrescente, você deve usar
DESCapós o nome da coluna. - Você pode ordenar por várias colunas separando-as com vírgulas; as primeiras têm prioridade.
ORDER BY é uma habilidade essencial para exibir dados de forma clara e compreensível. Aproveite os exemplos de código e o ambiente interativo fornecidos neste artigo para testar várias formas de ordenação. Ao dominar isso, tanto o desenvolvimento web quanto a análise de dados ficarão ainda mais interessantes!