Douglas Legramante

Douglas Legramante

Informática

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;
ParteSignifica
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_categorianome
1Camisetas
2Calcas
3Acessorios
4Agasalhos

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

TipoComo escreverExemplo
Textoentre aspas simplescidade = 'Vilhena'
Númerosem aspas, decimal com pontocategoria_id = 2, preco < 29.90
Dataentre aspas, AAAA-MM-DDdata_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

OperadorSignificaExemplo
=igual acidade = 'Vilhena'
<>diferente deforma_pagamento <> 'Pix'
>maior quepreco > 100
<menor queestoque < 10
>=maior ou igualdata_pedido >= '2026-10-01'
<=menor ou igualpreco <= 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

  • SELECT só 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ção filtra 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) e OR (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

Para se aprofundar