21-SELECT básico e WHERE
Materiais desta aula
21 — SELECT básico e WHERE
1. Do DML ao DQL: de mudar para olhar
Até agora você usou comandos que mudam o banco: INSERT coloca dados, UPDATE altera, DELETE apaga. A partir de hoje começa um bloco novo, o DQL (Data Query Language, "linguagem de consulta de dados"). Consultar é fazer uma pergunta ao banco e receber uma resposta.
O comando das consultas é o SELECT. Pense numa vitrine de loja: você olha os produtos pelo vidro, mas não mexe em nada. Rodar um SELECT uma vez ou cem vezes não muda nenhum dado do banco. Por isso é o comando mais seguro de todos para aprender e para testar.
Pergunta para pensar: se eu rodar o mesmo SELECT 100 vezes, o banco muda? E se eu rodar o mesmo INSERT 100 vezes?
2. Antes de começar: o banco loja
Nos próximos encontros vamos usar o mesmo banco loja do Encontro 20 (categoria 4 linhas · produto 12 · cliente 10 · pedido 20 · item_pedido 38). Se o seu banco não está igual, rode o script encontro_20_loja_completo.sql (Ctrl + Shift + Enter) e confira as contagens.
Para o Workbench saber qual banco usar, dê duplo clique em loja no Navigator (o nome fica em negrito) ou rode USE loja;.
3. Anatomia do SELECT
SELECT * FROM categoria;
| Parte | Significa |
|---|---|
SELECT | "mostre" — o que você quer ver |
* | "todas as colunas" |
FROM categoria | "da tabela categoria" — de onde vêm os dados |
; | fim do comando |
Lendo em português: mostre todas as colunas da tabela categoria.
O resultado aparece numa grade (result grid): cada coluna é um campo e cada linha é um registro. Embaixo, o Workbench informa quantas linhas vieram (4 row(s) returned).
| id_categoria | nome |
|---|---|
| 1 | Camisetas |
| 2 | Calcas |
| 3 | Acessorios |
| 4 | Agasalhos |
Os comandos do SQL podem ser escritos em maiúsculas ou minúsculas; escrevemos as palavras-chave em MAIÚSCULAS só para facilitar a leitura.
4. Escolhendo as colunas
O * é prático, mas muitas vezes você só quer algumas colunas. Liste os nomes separados por vírgula:
SELECT nome, cidade FROM cliente;
Só as colunas nome e cidade aparecem (10 linhas, uma por cliente). Você manda na ordem: se escrever SELECT cidade, nome FROM cliente;, a coluna cidade vem primeiro.
Atenção: a vírgula vai entre as colunas, nunca depois da última (veja o erro 1064 na seção 9).
Observação sobre a ordem das linhas: sem pedir nada, o MySQL costuma devolver as linhas na ordem em que foram guardadas, mas isso não é garantido. Garantir uma ordem é assunto do Encontro 22 (ORDER BY).
5. WHERE: filtrando as linhas
Pense nos filtros de um site de compras: "preço até R$ 100", "só da cidade X". O WHERE faz isso: só as linhas que atendem a uma condição entram no resultado.
SELECT nome, cidade FROM cliente WHERE cidade = 'Vilhena';
Lendo em português: mostre nome e cidade dos clientes cuja cidade é Vilhena. O banco testa a condição em cada linha da tabela; as que dão verdadeiro aparecem (4 clientes: Marina Alves, Paulo Nunes, Beatriz Souza e Gabriel Martins).
A ordem das palavras é fixa: SELECT → FROM → WHERE.
Texto, número e data
| Tipo | Como escrever | Exemplo |
|---|---|---|
| Texto | entre aspas simples | cidade = 'Vilhena' |
| Número | sem aspas, decimal com ponto | categoria_id = 2, preco < 29.90 |
| Data | entre aspas, AAAA-MM-DD | data_pedido >= '2026-10-08' |
Observação: o MySQL, por padrão, não diferencia maiúsculas de minúsculas em texto ('vilhena' encontra Vilhena). Já uma letra a mais ou a menos ('Vilhna') não encontra nada.
6. Operadores de comparação
| Operador | Significa | Exemplo |
|---|---|---|
= | igual a | cidade = 'Vilhena' |
<> | diferente de | forma_pagamento <> 'Pix' |
> | maior que | preco > 100 |
< | menor que | estoque < 10 |
>= | maior ou igual | data_pedido >= '2026-10-01' |
<= | menor ou igual | preco <= 29.90 |
Atenção: no SET do UPDATE o = atribui um valor novo; no WHERE ele compara.
Exemplos passo a passo
Número, igualdade — produtos da categoria 2 (calças):
SELECT nome, preco FROM produto WHERE categoria_id = 2;
Resultado: Calca Jeans (119.90), Calca Moletom (89.90), Calca Social (139.90) — 3 linhas.
A fronteira: < x <= — o produto de R$ 29,90 entra ou não?
SELECT nome, preco FROM produto WHERE preco < 29.90;
-- 1 linha: Meia Esportiva (14.90)
SELECT nome, preco FROM produto WHERE preco <= 29.90;
-- 3 linhas: Camiseta Regata (29.90), Bone (29.90), Meia Esportiva (14.90)
< deixa o 29,90 de fora; <= inclui. Sempre pergunte: "o valor-limite entra ou não?"
Diferente: pedidos que não foram pagos com Pix:
SELECT id_pedido, forma_pagamento FROM pedido WHERE forma_pagamento <> 'Pix';
Resultado: 10 linhas (pedidos 2, 3, 4, 7, 8, 11, 13, 14, 16 e 18).
Datas:
SELECT id_pedido, data_pedido FROM pedido WHERE data_pedido = '2026-10-05';
-- 1 linha: pedido 15
SELECT id_pedido, data_pedido FROM pedido WHERE data_pedido >= '2026-10-08';
-- 3 linhas: pedidos 18 (08/10), 19 (09/10) e 20 (12/10)
Lembre do Encontro 20: a data é escrita como 'AAAA-MM-DD', não como 14/03/1998.
7. O hábito de segurança: SELECT antes do UPDATE e do DELETE
No Encontro 18 você aprendeu a rodar um SELECT com o mesmo WHERE antes do UPDATE ou DELETE. Agora você sabe por quê: o SELECT mostra quais linhas seriam atingidas, sem mudar nada.
SELECT id_produto, nome, estoque FROM produto WHERE id_produto = 9;
-- 1 linha: Meia Esportiva, estoque 100 → é essa a linha que o UPDATE vai alterar
UPDATE produto SET estoque = 90 WHERE id_produto = 9;
Se o SELECT trouxesse linhas demais ou nenhuma, você corrige o WHERE antes de arriscar.
8. AND e OR no SELECT
Você já conhece AND e OR do Encontro 18; no SELECT funcionam igual.
- AND — as duas condições precisam ser verdadeiras: "camisetas e abaixo de R$ 40".
SELECT nome, preco FROM produto WHERE categoria_id = 1 AND preco < 40;
-- 2 linhas: Camiseta Basica (39.90) e Camiseta Regata (29.90); a Estampada (59.90) fica de fora
- OR — basta uma das condições: "Cacoal ou Cerejeiras".
SELECT nome, cidade FROM cliente WHERE cidade = 'Cacoal' OR cidade = 'Cerejeiras';
-- 4 linhas: Julia Ramos, Camila Rocha, Larissa Costa e Pedro Henrique
Cada lado do AND/OR é uma condição completa (cidade = 'Cacoal' OR cidade = 'Cerejeiras', e não cidade = 'Cacoal' OR 'Cerejeiras'). Quando misturar os dois, use parênteses (Encontro 18).
9. Erros comuns do SELECT
9.1 Erro 1054 — faltaram as aspas no texto
SELECT nome, cidade FROM cliente WHERE cidade = Vilhena;
-- Error Code: 1054. Unknown column 'Vilhena' in 'where clause'
Sem aspas, o MySQL entende Vilhena como o nome de uma coluna, que não existe. Correção: 'Vilhena'. (O mesmo erro 1054 aparece quando você erra o nome de uma coluna, como nomee.)
9.2 Erro 1146 — tabela que não existe
SELECT * FROM clientes;
-- Error Code: 1146. Table 'loja.clientes' doesn't exist
O nome certo é cliente (singular). Dica: confira os nomes das tabelas no Navigator. Se a mensagem for No database selected (erro 1046), faltou escolher o banco: duplo clique em loja ou USE loja;.
9.3 Erro 1064 — vírgula sobrando (erro de sintaxe)
SELECT nome, FROM cliente;
-- Error Code: 1064. You have an error in your SQL syntax; ... near 'FROM cliente' at line 1
Depois da vírgula o MySQL esperava outra coluna e encontrou o FROM. Correção: tire a última vírgula. A parte near '...' mostra onde o MySQL se perdeu: olhe logo antes dela.
9.4 Zero linhas não é erro
SELECT nome, cidade FROM cliente WHERE cidade = 'Porto Velho';
-- 0 row(s) returned
O comando está certo, mas nenhuma linha atende à condição (nesse banco não há cliente de Porto Velho). Antes de achar que o comando está errado, confira se o valor existe e foi escrito igual (SELECT * FROM cliente;).
10. Um aviso: o que o >= e o < não enxergam (NULL)
Dois clientes (Camila Rocha e Pedro Henrique) não têm data de nascimento (NULL). Veja:
SELECT nome, data_nascimento FROM cliente WHERE data_nascimento >= '2000-01-01';
-- 3 linhas
SELECT nome, data_nascimento FROM cliente WHERE data_nascimento < '2000-01-01';
-- 5 linhas
3 + 5 = 8, mas a tabela tem 10 clientes. Os dois que "sumiram" são os de data NULL: uma comparação com NULL nunca dá verdadeiro, nem para >= nem para <. Como perguntar "quem não tem data?" fica para o próximo encontro.
11. Resumo
SELECTsó lê: não altera nenhum dado.SELECT * FROM tabela;mostra todas as colunas;SELECT col1, col2 FROM tabela;mostra só as escolhidas, na ordem pedida.WHERE condiçãofiltra as linhas. Ordem:SELECT→FROM→WHERE.- Texto e data entre aspas; número sem aspas; decimal com ponto.
- Operadores:
=,<>,>,<,>=,<=. Atenção ao valor-limite (<x<=). AND(as duas) eOR(uma delas) combinam condições.- Erros: 1054 (aspas/nome de coluna), 1146 (tabela), 1064 (sintaxe). Zero linhas não é erro.
12. Prévia do próximo encontro
No próximo encontro vamos ordenar o resultado (ORDER BY) e conhecer mais operadores do WHERE: IN, BETWEEN, LIKE e IS NULL (que resolve o mistério dos clientes sem data de nascimento).
Vídeos sobre o assunto
- Curso MySQL #12 — SELECT (Parte 2) — vídeo no YouTube sobre o comando SELECT. (Conferir o conteúdo antes de indicar à turma.)
Para se aprofundar
- How to Fix MySQL Error 1054: Unknown Column — Bytebase — explica o erro de coluna desconhecida (em inglês).
- MySQL 8.0 Reference Manual — SELECT Statement — documentação oficial (em inglês; consulta para quem quiser ir além).