MySQL: Uma explicação detalhada da sintaxe do SELECT para…

Última atualização: 2026-08-26

SELECT é a instrução mais utilizada no SQL — praticamente toda recuperação de dados começa com ela.

Esta aula apresenta uma explicação sistemática da sintaxe básica e das operações comuns da instrução SELECT.

100%
graph TB
    A[SELECT Inquiry Process] --> B[FROM<br/>Specify a data source]
    B --> C[WHERE<br/>Conditional Filtering]
    C --> D[GROUP BY<br/>Grouping]
    D --> E[HAVING<br/>Filter Groups]
    E --> F[SELECT<br/>Select a field]
    F --> G[DISTINCT<br/>Remove duplicates]
    G --> H[ORDER BY<br/>Sort]
    H --> I[LIMIT<br/>Pagination]

1. O que você vai aprender


2. A história real por trás de uma reportagem

(1) Desafio: há dados demais para analisar

Um analista de dados precisa identificar os “10 clientes com os maiores valores de pedidos no mês passado” entre 100 mil pedidos.

Navegar manualmente pelas páginas? Fazer filtragens no Excel? Nenhuma das duas opções é muito eficiente.

(2) Solução para SELECT

SQL
SELECT 
    customer_name,
    SUM(amount) AS total_spent
FROM orders
WHERE order_date >= '2026-06-01' AND order_date < '2026-07-01'
GROUP BY customer_name
ORDER BY total_spent DESC
LIMIT 10;

Vantagens: Uma única consulta SQL retorna resultados em segundos.


3. Sintaxe básica da instrução SELECT

▶ Exemplo: Consultar todos os campos

SQL
-- Query all fields(Use with caution in production environments)
SELECT * FROM employees;

-- Query a Specific Field(Recommendations)
SELECT first_name, last_name, salary FROM employees;
▶ Experimente

▶ Exemplo: Aliases de campos

SQL
-- AS Set Aliases for Keywords
SELECT 
    first_name AS first_name,
    last_name AS last_name,
    salary AS salary
FROM employees;

-- (Omit) AS (same result)
SELECT first_name first_name, last_name last_name FROM employees;

-- If an alias contains spaces, it must be enclosed in quotation marks.
SELECT first_name AS 'First Name' FROM employees;
▶ Experimente

Saída:

TEXT 📖 Somente leitura
+--------+--------+--------+
| first_name | last_name | salary |
+--------+--------+--------+
| John   | Smith  | 5000   |
| Jane   | Doe    | 6000   |
+--------+--------+--------+

▶ Exemplo: Cálculo de expressões

SQL
-- Calculate Annual Salary
SELECT 
    first_name,
    salary,
    salary * 12 AS annual_salary
FROM employees;

-- String Concatenation
SELECT 
    CONCAT(first_name, ' ', last_name) AS full_name
FROM employees;
▶ Experimente

4. Filtragem com a condição WHERE

▶ Exemplo: Condições básicas

SQL
-- Equal Value Query
SELECT * FROM employees WHERE department = 'Engineering';

-- Non-equality query
SELECT * FROM employees WHERE salary != 5000;

-- Range Query
SELECT * FROM employees WHERE salary BETWEEN 4000 AND 8000;

-- List Query
SELECT * FROM employees WHERE department IN ('Sales', 'Marketing', 'HR');

-- Fuzzy Search
SELECT * FROM employees WHERE first_name LIKE 'J%';

-- NULL Search
SELECT * FROM employees WHERE manager_id IS NULL;
▶ Experimente

▶ Exemplo: Condições combinadas

SQL
-- AND Combination
SELECT * FROM employees 
WHERE department = 'Engineering' AND salary > 6000;

-- OR Combination
SELECT * FROM employees 
WHERE department = 'Sales' OR department = 'Marketing';

-- Mixed Combinations(Use parentheses to specify precedence)
SELECT * FROM employees 
WHERE (department = 'Sales' OR department = 'Marketing')
  AND salary > 5000;

-- NOT Negate
SELECT * FROM employees WHERE NOT (department = 'HR');
▶ Experimente

5. DISTINCT com deduplicação

▶ Exemplo: Consulta para remoção de duplicatas

SQL
-- Single-Field Duplicate Removal
SELECT DISTINCT department FROM employees;

-- Multi-field combination dedup
SELECT DISTINCT department, job_title FROM employees;

-- Count the number of unique entries
SELECT COUNT(DISTINCT department) AS dept_count FROM employees;
▶ Experimente

Saída:

TEXT 📖 Somente leitura
+-------------+
| department  |
+-------------+
| Engineering |
| Sales       |
| Marketing   |
| HR          |
+-------------+

6. Ordenação com ORDER BY

▶ Exemplo: Consulta ordenada

SQL
-- Single-field ascending order (Default)
SELECT * FROM employees ORDER BY salary ASC;

-- Single-field descending order
SELECT * FROM employees ORDER BY salary DESC;

-- Sorting by Multiple Fields
SELECT * FROM employees 
ORDER BY department ASC, salary DESC;

-- Sort by expression
SELECT 
    first_name,
    salary,
    salary * 12 AS annual
FROM employees
ORDER BY annual DESC;

-- Sort by field position (2nd column)
SELECT first_name, salary FROM employees ORDER BY 2 DESC;
▶ Experimente

Saída:

TEXT 📖 Somente leitura
+------------+--------+
| first_name | salary |
+------------+--------+
| Charlie    |   8000 |
| Jane       |   6000 |
| John       |   5000 |
+------------+--------+

7. Paginação LIMIT

▶ Exemplo: Consultas paginadas

SQL
-- Query the first 10 rows
SELECT * FROM employees LIMIT 10;

-- Skip the first 10 rows, take 10 rows (Page 2)
SELECT * FROM employees LIMIT 10 OFFSET 10;

-- Shorthand: LIMIT offset, count
SELECT * FROM employees LIMIT 10, 10;  -- Page 2

-- Page numbering formula: LIMIT (page-1) * pageSize, pageSize
-- Page 3, 20 rows per page
SELECT * FROM employees LIMIT 40, 20;
▶ Experimente

▶ Exemplo: Paginação na prática

SQL
-- Page 1
SELECT * FROM products ORDER BY id LIMIT 0, 10;

-- Page 2
SELECT * FROM products ORDER BY id LIMIT 10, 10;

-- Page 3
SELECT * FROM products ORDER BY id LIMIT 20, 10;
▶ Experimente

8. Exemplos de consultas completas

▶ Exemplo: Consulta abrangente

SQL
-- Query the top 5 highest-paid employees in Engineering
SELECT 
    CONCAT(first_name, ' ', last_name) AS employee_name,
    department,
    salary,
    hire_date
FROM employees
WHERE department = 'Engineering'
  AND salary IS NOT NULL
ORDER BY salary DESC
LIMIT 5;

-- Query employees hired in 2025, statistics by department
SELECT 
    department,
    COUNT(*) AS employee_count,
    AVG(salary) AS avg_salary
FROM employees
WHERE hire_date BETWEEN '2025-01-01' AND '2025-12-31'
GROUP BY department
ORDER BY avg_salary DESC;
▶ Experimente

❓ Perguntas Frequentes

*P: Qual é o problema com SELECT ? R: Evite usar * em ambientes de produção — retornar todos os campos desperdiça largura de banda da rede e memória, e alterações na estrutura da tabela podem causar falhas no seu código. Liste explicitamente os campos de que você precisa.

P: Qual é a diferença entre WHERE e HAVING? R: O WHERE filtra as linhas antes do agrupamento, enquanto o HAVING filtra os grupos após o agrupamento. O WHERE não pode ser usado com funções agregadas, mas o HAVING pode.

P: Qual é a prioridade de classificação ao usar ORDER BY com vários campos? R: Os resultados são classificados primeiro pelo primeiro campo; se houver empate no primeiro campo, eles são então classificados pelo segundo campo.

P: O que devo fazer se o desempenho for ruim quando o deslocamento do LIMIT for grande? R: Deslocamentos grandes (LIMIT 100000, 10) resultam em desempenho muito ruim. Mude para a paginação por cursor: WHERE id > last_id LIMIT 10.

P: O DISTINCT afeta o desempenho? R: O DISTINCT exige uma ordenação para remover duplicatas, por isso pode ser lento ao lidar com grandes conjuntos de dados. Se você não precisar remover duplicatas, não use o DISTINCT.


📖 Resumo


📝 Exercícios

  1. Questão básica (Dificuldade ⭐): Consulte a tabela employees para identificar os funcionários cujo salário seja superior a 5.000, ordene os resultados em ordem decrescente por salário e exiba apenas as primeiras 5 linhas.

  2. Problema avançado (Dificuldade ⭐⭐): Consulte a tabela orders para obter os pedidos de 2026, calcule o número de pedidos e o valor total por mês e classifique os resultados por mês.

  3. Desafio (Dificuldade: ⭐⭐⭐): Implemente uma consulta paginada que retorne 20 registros por página. Consulte os dados da página 5 e compare as diferenças de desempenho entre o uso de um grande deslocamento LIMIT e a paginação baseada em cursor.

Web-Tutorial.com

Equipe Técnica Web-Tutorial

Uma plataforma de tutoriais mantida por diversos desenvolvedores. Cada tutorial é escrito e revisado por profissionais da área correspondente. Trabalhamos para manter nosso conteúdo preciso e confiável — se encontrar algum problema, avise-nos.

100%