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.
- Como abrir um banco com
sqlite3 loja.dbe 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 erroreRuntime error, com a seta que aponta o erro. - Como sair:
.quit,.exite Ctrl+D. - O banco em memória (
sqlite3sozinho) e o.open. - Quatro formas de mandar SQL ao
sqlite3: digitando, como argumento, por um arquivo e por um "cano".
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>).
| Prompt | Quem está atendendo | O que entende | Exemplo |
|---|---|---|---|
$ | O terminal do sistema (bash) | Comandos do sistema | ls, cd Downloads, sqlite3 loja.db |
sqlite> | O sqlite3, pronto | SQL e comandos de ponto | SELECT nome FROM clientes;, .quit |
...> | O sqlite3, esperando o resto | A continuação do comando anterior | A 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.dbda pasta em que você está. Se o arquivo não existir, osqlite3cria 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
.helppara ver dicas de uso." O.helplista os comandos de ponto, que são a próxima aula. - sqlite>
- O prompt: o
sqlite3está 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
sqlite3junta 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 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 parapreç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.
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.
| Onde | Como a mensagem aparece |
|---|---|
| Editor do guia | near "SELEC": syntax error (só a mensagem, em vermelho) |
| Terminal, digitando | Parse error: near "SELEC": syntax error, com a seta |
| Terminal, SQL como argumento | Error: 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 NOMEDOARQUIVOpara 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.dbno 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
| Forma | Comando | Quando usar |
|---|---|---|
| 1. Interativa | sqlite3 loja.db e digitar | Explorar o banco, aprender, testar várias coisas seguidas |
| 2. Argumento | sqlite3 loja.db "SQL;" | Uma pergunta rápida, sem entrar no programa |
| 3. Arquivo | sqlite3 loja.db < arquivo.sql | Uma lista de comandos que se repete: criar o banco, um relatório |
| 4. Cano | echo "SQL;" | sqlite3 loja.db | Scripts, ligar o sqlite3 a outros programas |
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
...> 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.
; 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.
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 tecla | O que faz |
|---|---|
sqlite3 loja.db | Abre o banco (cria um vazio, se não existir) |
sqlite3 | Abre 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.db | Troca para outro banco sem sair |
.help | Lista os comandos de ponto |
.quit ou .exit | Sai do sqlite3 |
| Ctrl+D | Sai (fim de arquivo), no Linux e no macOS |
| Ctrl+C | Interrompe uma consulta demorada (não sai) |
sqlite3 loja.db "SQL;" | Roda um comando e termina |
sqlite3 loja.db < arquivo.sql | Roda 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:
2. Abrir outro banco
Você abriu o sqlite3 sem arquivo. Complete o comando que abre o banco da loja sem sair do programa:
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.dbabre o banco e mostra o promptsqlite>;sqlite3sozinho abre um banco temporário em memória, e.opentroca 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) ouRuntime error(deu problema ao executar). Como argumento, a embalagem éError: in prepare, …. - Sai-se com
.quit,.exitou 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.