SQL SELECT
Chegou a hora da primeira conversa de verdade com o banco de dados. Para ver o que está guardado numa tabela, você usa o comando SELECT (em inglês, "selecione"). É o comando mais usado do SQL: toda tela que mostra uma lista de produtos, um extrato do banco ou o histórico de pedidos de um site tem um SELECT por trás. Nesta aula a Ana, que trabalha na Loja Aurora, vai fazer as primeiras perguntas ao banco da loja, e você vai fazê-las junto com ela, no editor desta página.
- A forma mais simples de consulta:
SELECT * FROM tabela;, parte por parte. - Como ler o resultado: cabeçalho, linhas e o total de linhas.
- A diferença entre
SELECT *(todas as colunas) e escrever o nome das colunas. - Para que serve o ponto e vírgula e o que acontece quando você o esquece.
- Que
SELECT,selecteSelectsão a mesma coisa, e por que o costume é escrever em MAIÚSCULAS. - Que espaços e quebras de linha não mudam a consulta.
- As mensagens de erro reais do SQLite quando a consulta está errada.
Todos os quadros com código desta página rodam de verdade: o SQLite, um banco de dados completo, funciona dentro do seu navegador com o banco da Loja Aurora (se ainda não conhece as tabelas da loja, veja O Banco da Loja Aurora). O quadro "Resultado" embaixo de cada código é a resposta que o banco deu.
A ideia: pedir para ver as fichas
Imagine o estoque da Loja Aurora antes do computador: uma gaveta com uma ficha para cada produto. Se a Ana quisesse ver os produtos, pediria ao colega do estoque:
Me mostra todas as fichas da gaveta de produtos.
Em SQL, esse pedido tem quase as mesmas palavras, só que em inglês e numa ordem fixa: primeiro o que você quer ver, depois de onde.
| Em português | Em SQL | Quer dizer |
|---|---|---|
| Me mostra… | SELECT | "selecione": vou pedir dados |
| …todos os campos… | * | todas as colunas |
| …da gaveta de categorias. | FROM categorias | "de" categorias: a tabela de onde os dados vêm |
| (fim do pedido) | ; | o comando acabou |
Duas coisas importantes antes de começar. Primeiro: o SELECT só lê. Ele não apaga nem muda nada no banco; você pode rodar quantos quiser, sem medo. Segundo: a resposta do banco é sempre uma tabela nova, montada na hora só para você, com as linhas e colunas que você pediu.
1. A primeira consulta
A tabela mais curta da loja é a de categorias. Peça para ver tudo o que tem nela:
SELECT * FROM categorias;
- SELECT
- "Selecione". Avisa ao banco que você quer ver dados. Toda consulta começa por aqui.
- *
- O asterisco quer dizer "todas as colunas". Lê-se "selecione tudo" ou "select estrela".
- FROM
- "De". Vem antes do nome da tabela de onde os dados saem.
- categorias
- O nome da tabela, escrito exatamente como ela foi criada (aqui, no plural e sem acento).
- ;
- O ponto e vírgula fecha o comando, como o ponto final fecha uma frase. A seção 4 explica quando ele é obrigatório.
Isso é uma consulta (em inglês, query): um pedido de dados ao banco. Daqui para a frente, "consulta" e "SELECT" vão aparecer o tempo todo, e querem dizer quase a mesma coisa.
2. Lendo o resultado
Olhe de novo o quadro "Resultado" lá de cima. Ele tem três partes:
- O cabeçalho, a primeira linha: os nomes das colunas (
id,nome,descricao). Com*, elas vêm na mesma ordem em que a tabela foi criada. - As linhas: cada linha é uma categoria, uma "ficha" da gaveta. A primeira é a categoria 1, Papelaria.
- O total, embaixo: 8 linhas. A Loja Aurora tem 8 categorias.
Agora uma tabela maior. A loja tem 6 fornecedores, e cada um tem mais colunas:
SELECT * FROM fornecedores;
Repare na coluna estado dos fornecedores 4 e 5: em vez de um valor, aparece NULL, em itálico. São os fornecedores de Portugal e da Argentina, que não têm estado brasileiro. NULL quer dizer "sem valor", um campo da ficha que ficou em branco. Ele tem aula própria: O Valor NULL. Por enquanto, basta saber ler.
Experimente: rode a consulta. Depois troque categorias pelo nome de outra tabela da loja (produtos, clientes, funcionarios, pedidos, itens_pedido) e rode de novo. Olhe o cabeçalho e o total de linhas de cada uma.
SELECT * FROM categorias;
Missão: a Ana quer ver a ficha de todos os funcionários da loja. Mude a consulta para mostrar todas as colunas da tabela funcionarios.
SELECT * FROM categorias;
SELECT * FROM funcionarios;
3. SELECT * ou o nome das colunas?
O asterisco é prático, mas traz tudo. Muitas vezes você só quer uma parte. No lugar do *, escreva o nome das colunas que quer ver, separados por vírgula:
SELECT nome, descricao FROM categorias;
- SELECT
- Igual a antes: vou pedir dados.
- nome, descricao
- A lista de colunas que você quer, separadas por vírgula. O
idficou de fora, porque não foi pedido. - FROM categorias
- A mesma tabela.
- ;
- Fim do comando.
As linhas são as mesmas 8; o que mudou foi quantas colunas vieram. Escolher colunas tem uma aula inteira, a próxima: Escolhendo Colunas. Aqui, o importante é saber quando usar cada forma:
SELECT * | SELECT nome, descricao | |
|---|---|---|
| O que traz | Todas as colunas, na ordem da tabela | Só as colunas da lista, na ordem que você escreveu |
| Bom para | Dar uma olhada numa tabela que você não conhece | Consultas de verdade: relatórios, telas, programas |
| Se a tabela ganhar uma coluna nova | O resultado muda sozinho (ganha a coluna) | O resultado continua igual |
| Quantidade de dados | Tudo, mesmo o que você não vai usar | Só o necessário |
Use o * para explorar: "que colunas essa tabela tem mesmo?". Numa consulta que vai ficar guardada (num relatório, num programa), escreva o nome das colunas. Quem ler depois entende na hora o que a consulta mostra, e ela não muda de cara quando alguém acrescenta uma coluna na tabela.
4. O ponto e vírgula
O ; marca onde um comando termina. Com ele, você pode escrever vários comandos seguidos, e o banco roda um de cada vez, na ordem. No editor do guia, cada SELECT ganha a sua tabela de resultado:
SELECT * FROM categorias; SELECT * FROM fornecedores;
Vieram duas tabelas: primeiro as 8 categorias, depois os 6 fornecedores. O ponto e vírgula do meio é o que separa um comando do outro.
Precisa mesmo do ponto e vírgula?
Depende de onde você está:
| Onde | Um comando só | Vários comandos |
|---|---|---|
| Editor do guia | Funciona com ou sem ; no fim | Precisa do ; entre um e outro |
Terminal do sqlite3 | Precisa do ;: sem ele, o programa espera você continuar | Precisa do ; em cada um |
No editor, um comando sozinho sem ponto e vírgula roda normalmente:
SELECT * FROM categorias
No terminal do SQLite é diferente. Lá, a tecla Enter não basta: o programa só roda o comando quando encontra o ;. Veja a Ana esquecendo o ponto e vírgula no notebook dela:
$ sqlite3 loja.db SQLite version 3.50.4 2025-07-30 19:33:53 Enter ".help" for usage hints. sqlite> SELECT nome FROM categorias « a Ana apertou Enter sem o ; ...> ; « o sqlite3 esperou; ela digitou só o ; Papelaria Eletrônicos Casa e Cozinha Livros Brinquedos Esporte e Lazer Alimentos Jardim sqlite> .quit
O ...> é o prompt de continuação: o sqlite3 está dizendo "o comando ainda não acabou, pode continuar". Não é erro. Basta digitar o ; e apertar Enter. Isso é útil: você pode escrever uma consulta comprida em várias linhas, e ela só roda no fim.
Termine sempre o comando com ;, mesmo no editor, onde ele é opcional para um comando só. Assim a consulta funciona igual em qualquer lugar: no editor, no terminal e nos outros bancos.
Missão: numa caixa só, mostre duas tabelas: primeiro todas as categorias, depois todos os clientes. Use o ponto e vírgula para separar os dois comandos.
SELECT * FROM categorias
SELECT * FROM categorias; SELECT * FROM clientes;
5. Maiúsculas e minúsculas
As palavras do SQL (SELECT, FROM…) são chamadas palavras-chave. Para o banco, tanto faz escrevê-las em maiúsculas ou minúsculas. Estas três consultas são a mesma:
select nome from categorias;
SeLeCt nome FrOm categorias;
SELECT nome FROM categorias;
No SQLite, os nomes de tabelas e colunas também não ligam para maiúsculas: SELECT NOME FROM CATEGORIAS funciona e dá o mesmo resultado (o cabeçalho continua nome, do jeito que a coluna foi criada).
SELECT NOME, Descricao FROM CATEGORIAS;
Se tanto faz, por que o guia escreve sempre SELECT nome FROM categorias? É um costume seguido no mundo inteiro, e tem um bom motivo: com as palavras-chave em MAIÚSCULAS e os nomes em minúsculas, você bate o olho e separa o que é "SQL" do que é "a sua tabela".
| O quê | Como escrever | Exemplo |
|---|---|---|
| Palavras-chave do SQL | MAIÚSCULAS | SELECT, FROM, WHERE |
| Nomes de tabelas e colunas | minúsculas, do jeito que foram criados | categorias, nome, itens_pedido |
Maiúsculas não importam nas palavras do SQL, mas importam (e muito) dentro dos dados. Para o SQLite, o texto 'Teresina' e o texto 'teresina' são diferentes. Você vai ver isso na aula WHERE, quando começar a procurar valores.
As palavras-chave não ligam para maiúsculas em nenhum banco. Os nomes variam:
- PostgreSQL: nomes sem aspas não ligam para maiúsculas, porque ele os converte para minúsculas (
CATEGORIASviracategorias). - MySQL: nomes de colunas não ligam para maiúsculas, mas nomes de tabelas dependem do sistema: no Linux,
Categoriasecategoriassão tabelas diferentes; no Windows, não.
Mais um motivo para seguir o costume: nomes sempre em minúsculas, escritos do mesmo jeito em todo lugar.
6. Espaços e quebras de linha
O SQL não liga para espaços a mais nem para quebras de linha. Você pode escrever a consulta numa linha só ou em várias:
SELECT nome,
descricao
FROM categorias;
O resultado é igual ao da consulta numa linha só. Para consultas curtas, uma linha basta. Quando elas crescerem (e vão crescer, já na aula WHERE), o costume é pôr cada parte numa linha, para ler de cima para baixo:
SELECT nome, cidade ← o que mostrar FROM clientes ← de onde WHERE estado = 'PI'; ← quais linhas (aula WHERE)
O que não pode é separar uma palavra no meio nem grudar duas palavras. SEL ECT * FROM categorias; dá near "SEL": syntax error, e SELECT*FROMcategorias; dá near "FROMcategorias": syntax error: para o banco, FROMcategorias é uma palavra só, que ele não conhece. (Já SELECT*FROM categorias; funciona: o * é um símbolo e separa as palavras sozinho. Mas fica difícil de ler; use os espaços.)
7. Um SELECT sem tabela
O FROM diz de qual tabela vêm os dados. Se você não precisa de tabela nenhuma, pode deixá-lo de fora, e o SELECT vira uma calculadora:
SELECT 2 + 2;
SELECT 'Olá, Ana';
O resultado é uma tabela de uma linha, e o cabeçalho é o próprio texto que você escreveu. Repare que o texto 'Olá, Ana' está entre aspas simples: é assim que o SQL sabe que aquilo é um texto, e não o nome de uma coluna (a aula WHERE explica com calma). Esse truque vai ser útil para testar coisas pequenas, como as comparações da aula Comparações.
O PostgreSQL também aceita SELECT 2+2; sem FROM, e a documentação dele avisa que alguns outros bancos não aceitam: neles é preciso usar uma tabela "de mentira", de uma linha só.
Formas diferentes de fazer a mesma coisa
Todas estas consultas mostram a tabela de categorias inteira, com as mesmas 8 linhas e as mesmas 3 colunas:
SELECT * FROM categorias;
SELECT id, nome, descricao FROM categorias;
select * from categorias
SELECT * FROM categorias;
| Forma | Quando usar |
|---|---|
SELECT * FROM categorias; | Para explorar uma tabela rapidamente |
SELECT id, nome, descricao FROM categorias; | Em consultas que vão ficar guardadas: deixa claro o que vem, na ordem que você quer |
select * from categorias | Funciona, mas foge do costume (minúsculas e sem ;). Evite |
| Em várias linhas | Quando a consulta fica comprida: uma parte por linha |
Quando dá errado
Quando a consulta tem um erro, o banco não mostra resultado nenhum: no lugar da tabela, aparece uma mensagem em vermelho. As mensagens do SQLite são em inglês; abaixo estão as reais, com a tradução.
A Ana escreveu cliente, no singular, mas a tabela se chama clientes:
SELECT * FROM cliente;
no such table: cliente quer dizer "não existe a tabela cliente". O banco não adivinha: ou o nome está exatamente certo, ou ele não acha. No terminal, a mesma mensagem vem com um prefixo:
$ sqlite3 loja.db SQLite version 3.50.4 2025-07-30 19:33:53 Enter ".help" for usage hints. sqlite> SELECT * FROM cliente; Parse error: no such table: cliente sqlite> .quit
Parse error é "erro de análise": o sqlite3 leu o comando e achou o problema antes de rodar. Como consertar: confira o nome da tabela. Na aula O Banco da Loja Aurora está a lista de todas; no terminal, o comando .tables mostra os nomes (veja Comandos de Ponto).
SELECT FROM produtos;
near "FROM": syntax error quer dizer "erro de sintaxe perto de FROM". Sintaxe é a gramática do SQL, a ordem certa das palavras. Logo depois do SELECT o banco esperava a lista de colunas (ou o *), e encontrou o FROM. Repare no padrão: o erro de sintaxe aponta a palavra onde o banco se perdeu, e o problema costuma estar nela ou logo antes dela.
Como consertar: diga o que quer ver: SELECT * FROM produtos;.
SELECT * FORM produtos;
near "FORM": syntax error. O FROM virou FORM, uma troca de letras muito comum. O banco não conhece a palavra FORM e se perdeu bem ali. Como consertar: FROM, com o R antes do O ("de", em inglês).
SELECT * FROM categorias SELECT * FROM fornecedores;
near "SELECT": syntax error. Sem o ;, o banco leu tudo como um comando só. Quando chegou ao segundo SELECT, achou que ele não fazia sentido ali. E repare: nenhuma das duas tabelas apareceu, nem a primeira, que estava certa. Um erro de sintaxe impede o comando inteiro de rodar.
Como consertar: ponha o ; no fim de cada comando.
Missão: esta consulta deveria mostrar todos os produtos da loja, mas tem um erro. Rode, leia a mensagem e conserte.
SELECT * FORM produtos;
SELECT * FROM produtos;
Referência rápida
| Escrita | O que faz |
|---|---|
SELECT * FROM tabela; | Mostra todas as colunas e todas as linhas da tabela |
SELECT coluna1, coluna2 FROM tabela; | Mostra só as colunas da lista, nessa ordem |
; | Fecha o comando; separa um comando do outro |
...> (no terminal) | O comando ainda não acabou: falta o ; |
SELECT 2 + 2; | Um SELECT sem tabela: calcula e mostra uma linha |
| Mensagem do SQLite | Quer dizer |
|---|---|
no such table: cliente | A tabela cliente não existe: confira o nome |
near "FROM": syntax error | Erro de gramática perto de FROM: falta algo antes dele |
near "FORM": syntax error | Palavra desconhecida ou fora do lugar: aqui, FROM digitado errado |
Parse error: … (no terminal) | O mesmo erro, com o prefixo do programa sqlite3 |
Exercícios
1. A primeira consulta
Complete para mostrar todas as colunas da tabela produtos:
2. Todas as colunas
Que símbolo, no lugar das colunas, quer dizer "todas as colunas"?
3. No terminal, a Ana digitou SELECT * FROM categorias e apertou Enter. Apareceu ...>. O que aconteceu?
4. O que a consulta select nome from categorias; faz?
5. A Ana rodou SELECT * FROM produto; e recebeu no such table: produto. Qual é o problema?
6. Rodar um SELECT pode estragar os dados da tabela?
Missão final: o caderno de pedidos
Missão: cada produto vendido num pedido fica numa linha da tabela itens_pedido (com sublinhado no meio). Mostre essa tabela inteira, com todas as colunas. Quantas linhas ela tem?
SELECT * FROM pedidos;
SELECT * FROM itens_pedido;
São 220 itens, e o quadro mostra todos. Ninguém lê 220 linhas inteiras: nas próximas aulas você vai aprender a pedir só as colunas que interessam (Escolhendo Colunas) e só as linhas que interessam (WHERE).
Resumo
SELECT("selecione") pede dados ao banco;FROM("de") diz de qual tabela. A resposta é sempre uma tabela nova, e oSELECTnão muda nada no banco.SELECT * FROM tabela;mostra todas as colunas. Para explorar, ótimo; nas consultas que ficam guardadas, prefira escrever o nome das colunas.- O
;fecha o comando e separa um comando do outro. No terminal ele é obrigatório: sem ele, osqlite3mostra...>e espera. - Palavras-chave não ligam para maiúsculas, mas o costume é
SELECTem maiúsculas e nomes de tabelas e colunas em minúsculas. Nos dados, maiúsculas importam. - Espaços e quebras de linha não mudam a consulta.
- Um erro não mostra resultado nenhum:
no such tableé nome de tabela errado;near "…": syntax erroré a gramática errada perto daquela palavra.