O Terminal do SQLite

Na aula passada você instalou o sqlite3 e conferiu a versão. Agora é hora de entrar nele. O sqlite3 é como o balcão do estoquista: você chega, faz um pedido em SQL, ele responde, e você faz o próximo pedido, até ir embora. Nesta aula você vai abrir o banco da Loja Aurora no terminal, fazer as primeiras consultas, escrever comandos em várias linhas, descobrir o que acontece quando o ponto e vírgula fica para trás e sair do programa sem susto. Todas as sessões são reais, do computador da Ana.

Você vai aprender
  • Como abrir um banco com sqlite3 loja.db e o que diz a mensagem de boas-vindas.
  • Os dois prompts: sqlite> (pronto para um comando novo) e ...> (esperando o resto do comando).
  • Por que o ponto e vírgula é obrigatório no terminal, e como sair do "prompt de continuação".
  • Como ler as mensagens Parse error e Runtime error, com a seta que aponta o erro.
  • Como sair: .quit, .exit e Ctrl+D.
  • O banco em memória (sqlite3 sozinho) e o .open.
  • Quatro formas de mandar SQL ao sqlite3: digitando, como argumento, por um arquivo e por um "cano".
Como ler os quadros de terminal

Nos quadros pretos, $ é o prompt do terminal da Ana (ana@notebook:~$), sqlite> é o prompt do sqlite3, e ...> é o prompt de continuação. O que vem depois de um prompt foi o que a Ana digitou; as outras linhas são as respostas. Para acompanhar no seu computador, você precisa do loja.db criado em Instalar o SQLite.


A ideia: um balcão de atendimento

Até agora você usou o terminal do sistema (o do $), que entende comandos como ls, cd e sqlite3 --version. Quando você digita sqlite3 loja.db, entra num segundo balcão, dentro do primeiro: o do SQLite, que entende SQL. É como passar da recepção de uma loja para o balcão do estoque: o atendente muda, a língua muda, e o aviso em cima do balcão também (o prompt troca de $ para sqlite>).

PromptQuem está atendendoO que entendeExemplo
$O terminal do sistema (bash)Comandos do sistemals, cd Downloads, sqlite3 loja.db
sqlite>O sqlite3, prontoSQL e comandos de pontoSELECT nome FROM clientes;, .quit
...>O sqlite3, esperando o restoA continuação do comando anteriorA próxima linha do SELECT, ou só o ;

1. Entrando: sqlite3 loja.db

$ sqlite3 loja.db
SQLite version 3.50.4 2025-07-30 19:33:53
Enter ".help" for usage hints.
sqlite> 
sqlite3 loja.db
Abre o programa já com o banco loja.db da pasta em que você está. Se o arquivo não existir, o sqlite3 cria um banco novo, vazio, com esse nome (o susto do "no such table" de Instalar o SQLite).
SQLite version 3.50.4 …
A mensagem de boas-vindas, com a versão.
Enter ".help" for usage hints.
"Digite .help para ver dicas de uso." O .help lista os comandos de ponto, que são a próxima aula.
sqlite>
O prompt: o sqlite3 está esperando o seu pedido.

2. A primeira consulta no terminal

Digite a consulta e termine com ponto e vírgula. Ao apertar Enter, a resposta aparece logo embaixo, e o prompt volta, pronto para outra:

sqlite> SELECT nome, preco FROM produtos WHERE preco < 5;
Caneta Esferográfica Azul|2.79
Lápis Grafite HB|1.15
Marca-texto Amarelo|4.9
sqlite> 

É a mesma consulta e a mesma resposta da aula O que é SQL, mas com outra cara. No editor do guia o resultado vem numa tabela bonita, com o nome das colunas. No terminal, o padrão é o modo list ("lista"): uma linha por registro, valores separados por uma barra vertical |, sem cabeçalho. Dá para mudar isso, com .headers on e .mode box, por exemplo; é assunto de Comandos de Ponto.

Compare com o editor, onde a mesma consulta vira tabela:

SELECT nome, preco FROM produtos WHERE preco < 5;

3. Comandos em várias linhas e o prompt ...>

Consultas maiores ficam mais legíveis com uma parte por linha. No terminal, isso funciona assim: enquanto o sqlite3 não vê o ponto e vírgula, ele entende que o comando ainda não acabou e mostra o prompt de continuação, ...>:

sqlite> SELECT nome, cidade
   ...> FROM clientes
   ...> WHERE estado = 'CE';
Carlos Eduardo Lima|Fortaleza
Fernanda Carvalho|Fortaleza
Patrícia Gusmão|Fortaleza
Gustavo Henrique Prado|Fortaleza
Débora Cristina Alves|Fortaleza
Mirela Pontes|Fortaleza
Rosângela Dias|Fortaleza
sqlite> 
sqlite> SELECT nome, cidade
A primeira linha, sem ponto e vírgula. Ao apertar Enter, nada roda ainda.
...> FROM clientes
O prompt mudou para ...>: "continue, estou ouvindo". Esta linha é juntada à anterior.
...> WHERE estado = 'CE';
O ponto e vírgula fecha o comando. Só agora o sqlite3 junta as três linhas e roda tudo como uma consulta só.

Repare que os pontinhos ficam alinhados embaixo do sqlite>, para as linhas do comando ficarem uma embaixo da outra. Você não digita os ...>; quem os escreve é o programa.

O ponto e vírgula esquecido

O tropeço número 1 de quem começa no terminal: digitar a consulta, apertar Enter e… nada. Só aparece o ...>:

sqlite> SELECT COUNT(*) FROM clientes
   ...> ;
30
sqlite> 

A Ana esqueceu o ;, e o sqlite3 ficou esperando o resto. Não travou, não deu erro: ele só acha que você ainda vai escrever mais. A saída é simples: digite o ; que faltou, sozinho na linha, e aperte Enter. A consulta roda inteira.

No editor do guia é diferente

No editor das aulas, o último comando da caixa pode ficar sem ponto e vírgula, porque o botão Rodar já diz "acabou". No terminal, não: lá, o ; é o seu "pode rodar". Por isso, o costume que este guia segue é sempre terminar com ;, em qualquer lugar.

Vários comandos numa linha só

O inverso também vale: se o ; separa os comandos, dá para escrever dois na mesma linha. Os dois rodam, um depois do outro:

sqlite> SELECT nome FROM categorias WHERE id = 1; SELECT nome FROM categorias WHERE id = 2;
Papelaria
Eletrônicos
sqlite> 

No editor do guia acontece o mesmo, e lá cada comando ganha a sua tabela:

SELECT nome FROM categorias WHERE id = 1; SELECT nome FROM categorias WHERE id = 2;

Experimente: a Ana quer contar os clientes e os pedidos de uma vez só, mas a caixa dá erro. Rode, leia a mensagem e conserte com o que faltou entre os dois comandos. Devem aparecer dois resultados: 30 e 90.

SELECT COUNT(*) FROM clientes
SELECT COUNT(*) FROM pedidos;
SELECT COUNT(*) FROM clientes;
SELECT COUNT(*) FROM pedidos;

Sem o ; no fim da primeira linha, o SQLite lê as duas como um comando só, e se perde ao encontrar o segundo SELECT no meio: near "SELECT": syntax error.


4. Os erros no terminal: Parse error e a seta

No terminal, as mensagens de erro são as mesmas do editor, com dois acréscimos: um prefixo que diz o tipo do erro e, muitas vezes, a linha do comando repetida com uma seta embaixo do ponto onde o SQLite se perdeu.

sqlite> SELEC nome FROM produtos;
Parse error: near "SELEC": syntax error
  SELEC nome FROM produtos;
  ^--- error here
sqlite> SELECT nome, preço FROM produtos;
Parse error: no such column: preço
  SELECT nome, preço FROM produtos;
               ^--- error here
sqlite> 
Parse error:
"Erro de análise": o SQLite nem chegou a rodar o comando, porque não conseguiu entendê-lo. Palavra errada, tabela ou coluna que não existe, aspas trocadas… tudo isso é descoberto na leitura.
near "SELEC": syntax error
A mesma mensagem que o editor mostra: "erro de sintaxe perto de SELEC".
SELEC nome FROM produtos;
O seu comando, repetido.
^--- error here
"O erro está aqui": o ^ fica embaixo da palavra culpada. No segundo exemplo, ele aponta exatamente para preço, a coluna que não existe (a certa é preco).

Às vezes a seta vem do outro lado, com o texto antes dela, e às vezes nem aparece. Veja os dois casos:

sqlite> SELECT nome FROM produtos WHERE nome = Lapis;
Parse error: no such column: Lapis
  SELECT nome FROM produtos WHERE nome = Lapis;
                           error here ---^
sqlite> SELECT nome FROM produto;
Parse error: no such table: produto
sqlite> 

A primeira é a do texto sem aspas (texto vai entre aspas simples: 'Lápis Grafite HB'), com a seta apontando para o começo do Lapis. A segunda, a da tabela com nome errado, vem sem seta: o nome produto já diz tudo.

E as aspas duplas?

No editor do guia, WHERE nome = "Lápis Grafite HB" dá erro (no such column). Já o sqlite3 do Debian, no terminal, roda calado: quando não acha uma coluna com aquele nome, ele trata as aspas duplas como texto.

sqlite> SELECT nome FROM produtos WHERE nome = "Lápis Grafite HB";
Lápis Grafite HB
sqlite> 

Não se acostume: no dia em que existir uma coluna com aquele nome, a consulta muda de sentido sem avisar. A aula WHERE mostra isso acontecendo. Use sempre aspas simples para texto.

Erro durante a execução: Runtime error

Alguns comandos são entendidos, começam a rodar e só então dão problema. Aí o prefixo é outro. A Ana tentou cadastrar uma categoria com o id 1, que já é da Papelaria:

sqlite> INSERT INTO categorias (id, nome) VALUES (1, 'Papelaria');
Runtime error: UNIQUE constraint failed: categorias.id (19)
sqlite> 

Runtime error é "erro durante a execução". A mensagem diz que a regra de valor único (UNIQUE constraint) da coluna categorias.id falhou: o id é o número da ficha e não pode se repetir. O (19) é o código numérico desse tipo de erro no SQLite, útil para programadores. Nada foi gravado. Regras como essa têm aulas próprias, como PRIMARY KEY e UNIQUE.

OndeComo a mensagem aparece
Editor do guianear "SELEC": syntax error (só a mensagem, em vermelho)
Terminal, digitandoParse error: near "SELEC": syntax error, com a seta
Terminal, SQL como argumentoError: in prepare, no such table: produto (veja a seção 7)

5. Saindo: .quit

Para ir embora do balcão, use o comando .quit ("sair"), com o ponto na frente e sem ponto e vírgula. O prompt volta a ser o do terminal:

sqlite> .quit
$ 

O .exit faz a mesma coisa. Outro jeito, no Linux e no macOS, é apertar Ctrl+D no prompt vazio: a documentação do SQLite diz para terminar o programa com o caractere de "fim de arquivo" do sistema, "normalmente Control-D". Cuidado com o Ctrl+C: ele não sai; serve para interromper uma consulta que está demorando demais.

Precisa salvar antes de sair? Não. No SQLite, cada comando que muda dados é gravado no arquivo assim que termina. Não existe "Salvar como". Isso é ótimo e perigoso ao mesmo tempo, como mostra a seção 7.


6. Sem arquivo: o banco em memória e o .open

E se você digitar só sqlite3, sem nome de banco? (No Windows, é o que acontece ao dar dois cliques no sqlite3.exe.)

$ sqlite3
SQLite version 3.50.4 2025-07-30 19:33:53
Enter ".help" for usage hints.
Connected to a transient in-memory database.
Use ".open FILENAME" to reopen on a persistent database.
sqlite> SELECT 2 + 3;
5
sqlite> SELECT COUNT(*) FROM produtos;
Parse error: no such table: produtos
sqlite> .open loja.db
sqlite> SELECT COUNT(*) FROM produtos;
45
sqlite> .exit
Connected to a transient in-memory database.
"Conectado a um banco temporário em memória." Um banco vazio, que existe só enquanto o programa está aberto. Ao sair, ele some.
Use ".open FILENAME" …
"Use .open NOMEDOARQUIVO para reabrir num banco permanente."
SELECT 2 + 3;
Mesmo sem tabelas, o SQLite faz contas. Às vezes ele é usado só como calculadora.
no such table: produtos
O banco em memória está vazio: a tabela de produtos está no loja.db, não aqui.
.open loja.db
Abre o loja.db no lugar do banco em memória, sem sair do programa. Agora os 45 produtos aparecem.

O banco em memória é ótimo para testes rápidos: dá para criar tabelas, brincar e sair sem deixar rastro. O editor deste guia funciona exatamente assim: cada Rodar cria um banco em memória novo e carrega a Loja Aurora nele.


7. Quatro formas de mandar SQL ao sqlite3

Entrar e digitar é só uma das maneiras. Para um comando rápido, ou para repetir sempre a mesma lista de comandos, há outras três. Todas reais, no computador da Ana:

Forma 2: o SQL como argumento

$ sqlite3 loja.db "SELECT nome, cargo FROM funcionarios WHERE id = 1;"
Marta Lustosa|Gerente

O SQL vai entre aspas duplas, depois do nome do banco (por isso, dentro dele, o texto usa aspas simples). O sqlite3 roda aquele comando, mostra a resposta e volta para o $. Ótimo para uma pergunta só.

Forma 3: um arquivo de comandos

$ cat contagem.sql
SELECT COUNT(*) FROM clientes;
SELECT COUNT(*) FROM pedidos;
$ sqlite3 loja.db < contagem.sql
30
90

O arquivo contagem.sql tem dois comandos (o cat mostra o que há dentro). O < faz o sqlite3 ler os comandos do arquivo em vez do teclado. Foi assim que você criou o loja.db a partir do aurora.sql. Bom para relatórios que você roda toda semana: escreve uma vez, roda sempre.

Forma 4: pelo "cano" (|)

$ echo "SELECT nome FROM categorias WHERE id = 8;" | sqlite3 loja.db
Jardim

O | do terminal (o pipe, "cano") liga a saída de um programa à entrada de outro: o echo "fala" o SQL, e o sqlite3 "ouve". Programadores usam muito isso em scripts.

Qual usar

FormaComandoQuando usar
1. Interativasqlite3 loja.db e digitarExplorar o banco, aprender, testar várias coisas seguidas
2. Argumentosqlite3 loja.db "SQL;"Uma pergunta rápida, sem entrar no programa
3. Arquivosqlite3 loja.db < arquivo.sqlUma lista de comandos que se repete: criar o banco, um relatório
4. Canoecho "SQL;" | sqlite3 loja.dbScripts, ligar o sqlite3 a outros programas
No terminal, mudar é para valer

Ao contrário do editor do guia, no seu loja.db uma mudança fica gravada, e nenhum comando pergunta "tem certeza?":

$ sqlite3 loja.db "SELECT estoque FROM produtos WHERE id = 2;"
500
$ sqlite3 loja.db "UPDATE produtos SET estoque = 499 WHERE id = 2;"
$ sqlite3 loja.db "SELECT estoque FROM produtos WHERE id = 2;"
499

A Ana vendeu uma caneta azul, e o estoque baixou de 500 para 499 de verdade: o UPDATE não mostrou nada, mas gravou. Para treinar sem medo, faça uma cópia antes (cp loja.db loja-copia.db) ou recrie o banco do zero com sqlite3 loja.db < aurora.sql, como em Instalar o SQLite.


Quando dá errado

"Travou": o prompt ...> não sai
sqlite> SELECT COUNT(*) FROM clientes
   ...> ;
30
sqlite> 

O que aconteceu: faltou o ponto e vírgula, e o sqlite3 está esperando o fim do comando. Ele não travou.

Como consertar: digite ; e Enter.

O ; não resolve: a aspa aberta

A Ana esqueceu de fechar a aspa do nome. Repare no prompt de continuação: em vez de ...>, ele começa com uma aspa, ' ...>. É o sqlite3 avisando "tem uma aspa simples aberta":

sqlite> SELECT nome FROM clientes WHERE nome = 'Ana Beatriz Sousa;
'  ...> SELECT 1;
'  ...> ';
sqlite> 

O que aconteceu: com a aspa aberta, tudo o que vem depois vira parte do texto, até o ponto e vírgula e o SELECT 1; da linha seguinte. Por isso o ; não funcionou. Só quando a Ana digitou ' (fechando o texto) e ; o comando terminou. Ele rodou, mas procurou uma cliente com o nome "Ana Beatriz Sousa;" seguido de uma quebra de linha e "SELECT 1;", que não existe. Por isso não apareceu nada.

Como consertar: quando o prompt de continuação começar com uma aspa, feche a aspa e ponha o ;: ';. Depois, digite o comando de novo, certo: WHERE nome = 'Ana Beatriz Sousa';. No editor do guia, o mesmo erro aparece assim:

SELECT nome FROM clientes WHERE nome = 'Ana Beatriz Sousa;

unrecognized token é "símbolo não reconhecido": um texto que começa com ' e nunca termina.

SQL no lugar errado

Já viu em Instalar o SQLite: SQL digitado no $ dá erro do bash, não do SQLite. O contrário também acontece. A Ana quis ver os arquivos da pasta e digitou ls dentro do sqlite3:

sqlite> ls
   ...> ;
Parse error: near "ls": syntax error
  ls ;
  ^--- error here
sqlite> 

O que aconteceu: o sqlite3 achou que ls fosse o começo de um comando SQL e esperou o ;. Quando ele veio, juntou as duas linhas (ls ;) e não reconheceu a palavra.

Como consertar: antes de digitar, olhe o prompt: $ é o sistema, sqlite> é o SQLite. Para voltar ao sistema, .quit.

Error: in prepare: o erro fora do modo interativo
$ sqlite3 loja.db "SELECT nome FROM produto;"
Error: in prepare, no such table: produto
$ echo $?
1

O que aconteceu: é o mesmo erro da tabela com nome errado, só que com outra embalagem, porque o SQL veio como argumento. "In prepare" quer dizer "ao preparar o comando", antes de rodar. O echo $? mostra o código de saída do último programa: 1 quer dizer "terminou com erro" (0 seria "deu certo"). Scripts usam esse número para saber se o sqlite3 deu certo.

Como consertar: o nome da tabela: produtos.


Referência rápida

Comando ou teclaO que faz
sqlite3 loja.dbAbre o banco (cria um vazio, se não existir)
sqlite3Abre um banco temporário em memória
;Termina um comando SQL: "pode rodar"
...>Prompt de continuação: o comando ainda não terminou
' ...>Continuação com uma aspa simples aberta: feche com ';
.open arquivo.dbTroca para outro banco sem sair
.helpLista os comandos de ponto
.quit ou .exitSai do sqlite3
Ctrl+DSai (fim de arquivo), no Linux e no macOS
Ctrl+CInterrompe uma consulta demorada (não sai)
sqlite3 loja.db "SQL;"Roda um comando e termina
sqlite3 loja.db < arquivo.sqlRoda os comandos de um arquivo
Parse error: / Runtime error:Erro ao entender o comando / erro ao executá-lo

Exercícios

1. Sair do programa

Complete o comando que sai do sqlite3:

sqlite> .

2. Abrir outro banco

Você abriu o sqlite3 sem arquivo. Complete o comando que abre o banco da loja sem sair do programa:

sqlite> . loja.db

3. A Ana digitou SELECT nome FROM clientes, apertou Enter e apareceu ...>. O que aconteceu?

4. O prompt de continuação apareceu como ' ...>, e digitar ; não adiantou. O que fazer?

5. Qual a diferença entre Parse error e Runtime error?

6. A Ana quer rodar toda segunda-feira os mesmos cinco comandos de relatório. Qual forma combina mais?

Missão final: o pedido em várias linhas

Missão: a Ana escreveu, em três linhas, uma consulta para ver o nome e o email dos clientes da cidade de São Paulo, mas ela não funciona. Há dois problemas: uma vírgula que falta e um ponto e vírgula no lugar errado, no meio do comando. Conserte e rode. Depois, se tiver o loja.db, digite a mesma consulta no terminal, linha por linha, e veja o prompt ...> aparecer.

SELECT nome email
FROM clientes;
WHERE cidade = 'São Paulo'
SELECT nome, email
FROM clientes
WHERE cidade = 'São Paulo';

Um dos sete clientes paulistanos aparece com NULL no email: ele não informou o endereço. Esse e outros "buracos" de propósito no banco da loja estão em O Banco da Loja Aurora.


Resumo

  • sqlite3 loja.db abre o banco e mostra o prompt sqlite>; sqlite3 sozinho abre um banco temporário em memória, e .open troca de banco.
  • No terminal, o comando só roda depois do ponto e vírgula. Sem ele, aparece o prompt de continuação ...>: digite o ; que faltou. Com uma aspa aberta, o prompt vira ' ...>: feche com ';.
  • O resultado sai no modo list: valores separados por |, sem cabeçalho.
  • Os erros vêm com prefixo: Parse error (não entendeu, muitas vezes com a seta ^--- error here) ou Runtime error (deu problema ao executar). Como argumento, a embalagem é Error: in prepare, ….
  • Sai-se com .quit, .exit ou Ctrl+D; Ctrl+C só interrompe uma consulta.
  • Quatro formas de mandar SQL: digitando, como argumento ("SQL;"), por arquivo (< arquivo.sql) e pelo cano (|).
  • No seu loja.db, toda mudança é gravada na hora, sem "salvar" e sem "desfazer". Treine numa cópia.