Consultas Básicas
Consultas Básicas
Imagine entrar em uma biblioteca e querer encontrar um livro. Você não levaria todos os livros para casa — em vez disso, diria à bibliotecária: "Gostaria de encontrar romances de ficção científica publicados após 2020, ordenados por data de publicação do mais novo ao mais antigo, e me mostre os 5 primeiros." Este processo corresponde aos passos centrais de uma consulta SQL: selecionar dados, filtrar condições, ordenar e limitar quantidade.
Na lição anterior, aprendemos a criar bancos de dados e tabelas, e inserir dados. Esta lição aprenderá como consultar com precisão os dados que precisamos de um banco de dados.
Conceitos Fundamentais
1. Instrução SELECT
SELECT é a instrução mais comumente usada em SQL, utilizada para recuperar dados de tabelas do banco de dados. Sua estrutura básica é:
SELECT coluna1, coluna2, ...
FROM nome_da_tabela;
- Após
SELECT, especifique as colunas a consultar - Após
FROM, especifique de qual tabela consultar - Cada instrução SQL termina com ponto e vírgula
;
2. Consultar Colunas Específicas vs. Todas as Colunas
Consultar colunas específicas (recomendado):
SELECT name, salary FROM employees;
Consultar todas as colunas:
SELECT * FROM employees;
*. Isso melhora a eficiência da consulta e torna o código mais claro.
3. Filtragem com Condição WHERE
A cláusula WHERE é usada para filtrar registros, retornando apenas linhas que atendem às condições:
SELECT coluna1, coluna2
FROM nome_da_tabela
WHERE condição;
4. Operadores de Comparação
| Operador | Descrição | Exemplo |
|---|---|---|
= |
Igual a | salary = 50000 |
<> ou != |
Diferente de | status <> 'Inactive' |
> |
Maior que | salary > 50000 |
< |
Menor que | age < 30 |
>= |
Maior ou igual a | salary >= 50000 |
<= |
Menor ou igual a | age <= 30 |
5. Operadores Lógicos: AND / OR
AND: Todas as condições devem ser verdadeirasOR: Pelo menos uma condição deve ser verdadeira
SELECT name, salary, department_id
FROM employees
WHERE salary > 50000 AND department_id = 1;
SELECT name, salary, department_id
FROM employees
WHERE department_id = 1 OR department_id = 2;
AND e OR são misturados, AND tem prioridade maior. Use parênteses () para esclarecer a prioridade e evitar ambiguidade.
6. IN / BETWEEN / LIKE
IN — Corresponder a qualquer valor em um conjunto:
SELECT name, department_id
FROM employees
WHERE department_id IN (1, 2, 3);
BETWEEN — Corresponder a valores dentro de um intervalo (incluindo limites):
SELECT name, salary
FROM employees
WHERE salary BETWEEN 40000 AND 80000;
LIKE — Correspondência fuzzy de strings:
%corresponde a qualquer número de caracteres (incluindo zero)_corresponde a exatamente um caractere
-- Funcionários cujos nomes começam com "J"
SELECT name FROM employees WHERE name LIKE 'J%';
-- Funcionários cujos nomes têm 4 caracteres e começam com "John"
SELECT name FROM employees WHERE name LIKE 'John_';
7. Ordenação com ORDER BY
ORDER BY é usado para ordenar o conjunto de resultados:
ASC: Ascendente (padrão, pode ser omitido)DESC: Descendente
-- Ordenar por salário do maior para o menor
SELECT name, salary
FROM employees
ORDER BY salary DESC;
-- Ordenar por departamento ascendente, depois por salário descendente
SELECT name, department_id, salary
FROM employees
ORDER BY department_id ASC, salary DESC;
8. LIMIT para Limitar Linhas
LIMIT é usado para restringir o número de registros retornados:
-- Retornar apenas os primeiros 5 registros
SELECT name, salary
FROM employees
ORDER BY salary DESC
LIMIT 5;
-- Pular os primeiros 5, retornar os próximos 5 (paginação)
SELECT name, salary
FROM employees
ORDER BY salary DESC
LIMIT 5 OFFSET 5;
LIMIT é tipicamente usado com ORDER BY; caso contrário, a ordem dos registros retornados é indefinida.
Sintaxe/Uso Básico
Estrutura Completa de uma Instrução de Consulta
SELECT coluna1, coluna2, ...
FROM nome_da_tabela
WHERE condição
ORDER BY coluna [ASC|DESC]
LIMIT quantidade [OFFSET deslocamento];
A ordem de escrita das cláusulas deve ser seguida rigorosamente:
| Ordem | Cláusula | Finalidade |
|---|---|---|
| 1 | SELECT |
Especificar colunas a consultar |
| 2 | FROM |
Especificar a tabela de origem |
| 3 | WHERE |
Filtrar linhas |
| 4 | ORDER BY |
Ordenar resultados |
| 5 | LIMIT |
Limitar número de linhas retornadas |
Técnicas Comuns
-- Usar aliases para tornar nomes de colunas mais legíveis
SELECT name AS employee_name, salary AS employee_salary
FROM employees;
-- Remover valores duplicados
SELECT DISTINCT department_id
FROM employees;
-- Usar expressões em SELECT
SELECT name, salary, salary * 12 AS annual_salary
FROM employees;
- Aliases podem usar caracteres em português, mas inglês é recomendado para colaboração em equipe
DISTINCTremove duplicatas baseado na combinação de todas as colunas selecionadas- Expressões não modificam os dados originais; afetam apenas a exibição dos resultados da consulta
Exemplos
Exemplo: Consultar Funcionários de um Departamento Específico
Requisito: Consultar todos os nomes e salários dos funcionários do departamento ID 1, ordenados por salário do maior para o menor.
SELECT name, salary
FROM employees
WHERE department_id = 1
ORDER BY salary DESC;
Saída Esperada:
+----------+--------+
| name | salary |
+----------+--------+
| John | 85000 |
| Bob | 62000 |
| Alice | 55000 |
+----------+--------+
Explicação:
WHERE department_id = 1mantém apenas linhas onde o ID do departamento é 1ORDER BY salary DESCordena por salário em ordem decrescente- Os resultados contêm apenas as colunas
nameesalary
Exemplo: Consulta Multi-condição
Requisito: Consultar funcionários com salário entre 60000 e 90000, e ID do departamento 1 ou 2. Mostrar nome, ID do departamento e salário. Ordenar por ID do departamento ascendente, depois salário descendente.
SELECT name, department_id, salary
FROM employees
WHERE salary BETWEEN 60000 AND 90000
AND department_id IN (1, 2)
ORDER BY department_id ASC, salary DESC;
Saída Esperada:
+----------+---------------+--------+
| name | department_id | salary |
+----------+---------------+--------+
| John | 1 | 85000 |
| Bob | 1 | 62000 |
| Jane | 2 | 75000 |
+----------+---------------+--------+
Explicação:
BETWEEN 60000 AND 90000filtra o intervalo de salárioIN (1, 2)filtra departamentosANDcombina as duas condições- Ordenar por departamento ascendente primeiro, depois por salário descendente dentro do mesmo departamento
Exemplo: Consulta Fuzzy e Paginação
Requisito: Encontrar funcionários cujos nomes contêm "J", ordenados por data de contratação descendente, mostrando apenas os registros 2 a 3.
SELECT name, hire_date, salary
FROM employees
WHERE name LIKE '%J%'
ORDER BY hire_date DESC
LIMIT 2 OFFSET 1;
Saída Esperada:
+--------+------------+--------+
| name | hire_date | salary |
+--------+------------+--------+
| Jane | 2022-03-15 | 68000 |
| Julia | 2021-08-20 | 52000 |
+--------+------------+--------+
Explicação:
LIKE '%J%'corresponde a registros onde o nome contém "J" em qualquer posiçãoORDER BY hire_date DESCordena por data de contratação do mais novo ao mais antigoLIMIT 2 OFFSET 1pula o primeiro registro, retorna o 2º e 3º (ou seja, página 2 com 2 registros por página)
Cenários
Cenário 1: Filtrar Funcionários de Alto Salário por Faixa Salarial
RH precisa exportar uma lista de funcionários que ganham mais de 70000, incluindo nome, departamento e salário, ordenados por salário do maior para o menor.
SELECT e.name AS employee_name,
d.name AS department_name,
e.salary AS salary
FROM employees e
JOIN departments d ON e.department_id = d.id
WHERE e.salary > 70000
ORDER BY e.salary DESC;
Observações:
- Usa
JOINpara associar a tabela de departamentos para obter nomes dos departamentos (coberto em detalhes nas lições posteriores) eedsão aliases de tabela que simplificam a escrita- Aliases usam nomes descritivos para uma saída mais clara
Cenário 2: Lista de Funcionários Paginada
A página de lista de funcionários de uma aplicação web mostra 10 registros por página. Quando o usuário clica na página 3, precisa pular os primeiros 20 registros e exibir os registros 21-30.
-- Página 3, 10 registros por página
SELECT id, name, department_id, salary
FROM employees
ORDER BY id ASC
LIMIT 10 OFFSET 20;
Fórmula de Paginação: OFFSET = (número_da_página - 1) × registros_por_página
| Página | LIMIT | OFFSET |
|---|---|---|
| Página 1 | 10 | 0 |
| Página 2 | 10 | 10 |
| Página 3 | 10 | 20 |
❓ Perguntas Frequentes
P: Qual a diferença entre
SELECT *e especificar nomes de colunas? R:SELECT *retorna todas as colunas da tabela, enquanto especificar nomes de colunas retorna apenas as colunas que você precisa. Em ambientes de produção, é recomendado especificar explicitamente os nomes das colunas — as consultas são mais rápidas, mais legíveis e menos propensas a erros quando as estruturas das tabelas mudam.
P: Posso usar aliases em
WHERE? R: Não. A ordem de execução do SQL éFROM→WHERE→SELECT→ORDER BY. QuandoWHEREexecuta, os aliases ainda não foram gerados. Se precisar filtrar por um alias, use uma subconsulta ouHAVING(coberto nas lições posteriores).
P:
BETWEENinclui valores limites? R: Sim.BETWEEN 10 AND 20é equivalente a>= 10 AND <= 20. Ambos os valores dos extremos estão incluídos nos resultados.
P:
LIKEé case-sensitive? R: Depende da collation do banco de dados. MySQL é case-insensitive por padrão, enquanto PostgreSQL é case-sensitive por padrão. Para forçar sensibilidade a maiúsculas/minúsculas, PostgreSQL pode usarLIKEe MySQL pode usar a palavra-chaveBINARY.
📖 Resumo
Esta lição cobriu as habilidades centrais de consulta SQL:
- SELECT — Especificar colunas a consultar; use
*para consultar todas as colunas - WHERE — Filtrar linhas com condições, suportando operadores de comparação (
=,>,<,<>,>=,<=) - Operadores Lógicos —
AND(ambos),OR(qualquer um); use parênteses para controlar prioridade - IN — Corresponder a qualquer valor em um conjunto
- BETWEEN — Corresponder a valores dentro de um intervalo (incluindo limites)
- LIKE — Correspondência fuzzy;
%corresponde a múltiplos caracteres,_corresponde a um único caractere - ORDER BY — Ordenar;
ASCascendente (padrão),DESCdescendente - LIMIT / OFFSET — Limitar linhas retornadas, habilitando paginação
Ordem de escrita da instrução de consulta: SELECT → FROM → WHERE → ORDER BY → LIMIT
📝 Exercícios
Exercício 1: Consulta Básica
Consulte todos os registros na tabela departments, mostrando apenas as colunas name e location.
Exercício 2: Filtragem por Condição e Ordenação
Consulte funcionários na tabela employees com salário maior ou igual a 60000 e data de contratação posterior a 1º de janeiro de 2022. Mostrar nome, salário e data de contratação, ordenados por salário descendente.
Exercício 3: Consulta Abrangente
Consulte funcionários na tabela employees com ID do departamento 1 ou 3, e nomes que não começam com "J". Mostrar nome, ID do departamento e salário. Ordenar por ID do departamento ascendente, salário descendente. Retornar apenas os primeiros 3 registros.
Próxima Lição: Operações de Dados: INSERT, UPDATE, DELETE



