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.

Você vai aprender
  • 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, select e Select sã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êsEm SQLQuer 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:

  1. 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.
  2. As linhas: cada linha é uma categoria, uma "ficha" da gaveta. A primeira é a categoria 1, Papelaria.
  3. 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 id ficou 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 trazTodas as colunas, na ordem da tabelaSó as colunas da lista, na ordem que você escreveu
Bom paraDar uma olhada numa tabela que você não conheceConsultas de verdade: relatórios, telas, programas
Se a tabela ganhar uma coluna novaO resultado muda sozinho (ganha a coluna)O resultado continua igual
Quantidade de dadosTudo, mesmo o que você não vai usarSó o necessário
Boa prática

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á:

OndeUm comando sóVários comandos
Editor do guiaFunciona com ou sem ; no fimPrecisa do ; entre um e outro
Terminal do sqlite3Precisa do ;: sem ele, o programa espera você continuarPrecisa 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.

Boa prática

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 escreverExemplo
Palavras-chave do SQLMAIÚSCULASSELECT, FROM, WHERE
Nomes de tabelas e colunasminúsculas, do jeito que foram criadoscategorias, nome, itens_pedido
Cuidado: os dados não são assim

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.

Nos outros bancos

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 (CATEGORIAS vira categorias).
  • MySQL: nomes de colunas não ligam para maiúsculas, mas nomes de tabelas dependem do sistema: no Linux, Categorias e categorias sã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.

Nos outros bancos

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;
FormaQuando 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 categoriasFunciona, mas foge do costume (minúsculas e sem ;). Evite
Em várias linhasQuando 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.

O nome da tabela está errado

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).

Esqueceu o que mostrar
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;.

Uma palavra-chave com erro de digitação
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).

Dois comandos sem o ponto e vírgula no meio
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

EscritaO 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 SQLiteQuer dizer
no such table: clienteA tabela cliente não existe: confira o nome
near "FROM": syntax errorErro de gramática perto de FROM: falta algo antes dele
near "FORM": syntax errorPalavra 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:

* produtos;

2. Todas as colunas

Que símbolo, no lugar das colunas, quer dizer "todas as colunas"?

SELECT FROM clientes;

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 o SELECT nã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, o sqlite3 mostra ...> e espera.
  • Palavras-chave não ligam para maiúsculas, mas o costume é SELECT em 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.