SQL O Editor do Guia

Em toda aula deste guia aparecem caixas Experimente: você escreve um comando SQL, clica em Rodar e vê a resposta do banco de dados logo embaixo, como uma tabela. Quem responde não é uma imitação: é o SQLite de verdade, o mesmo programa que está dentro do seu celular, rodando dentro do seu navegador. Não precisa instalar nada. Nesta página você conhece cada parte do editor, descobre por que pode apagar o que quiser sem medo e aprende o que muda quando você abre o mesmo banco no terminal.

Você vai aprender
  • As partes de uma caixa Experimente: o código, o botão Rodar, o resultado, Restaurar e Ver solução.
  • Como ler a tabela de resultado, o total de linhas e o NULL em itálico.
  • Por que o banco da Loja Aurora volta limpo a cada Rodar.
  • Como rodar vários comandos de uma vez, separados por ;.
  • Como aparecem os erros, e por que eles vêm em inglês.
  • O que o editor não faz: comandos de ponto, SQL sem fim, tabelas gigantes.
  • Como funcionam as missões e como abrir o mesmo banco no terminal.

A ideia: uma cópia da loja só para você

Imagine que a Ana, dona da Loja Aurora, contrata um ajudante novo. Ela não vai deixar o ajudante treinar no caixa de verdade, com o dinheiro do dia. Ela tira uma cópia do caderno da loja e diz: "treine nesta cópia; pode rabiscar, apagar, errar à vontade". Quando a cópia fica toda rabiscada, ela tira outra, novinha.

O editor do guia faz exatamente isso. Cada vez que você clica em Rodar, ele:

  1. cria um banco de dados novo, na memória do seu navegador;
  2. enche esse banco com os dados da Loja Aurora: categorias, produtos, clientes, pedidos… (a aula O Banco da Loja Aurora apresenta cada tabela);
  3. roda o SQL que está na caixa;
  4. desenha a resposta embaixo e joga a cópia fora.

Tudo isso acontece no seu computador, em uma fração de segundo. Nada do que você digita sai do seu navegador, e nada fica gravado.


As partes da caixa

Esta é uma caixa livre, sem missão. Clique em Rodar ▶:

SELECT * FROM categorias;

Apareceu uma tabela com as 8 categorias da loja. O comando SELECT * FROM categorias quer dizer "selecione (select) todas as colunas (*) da (from) tabela categorias". Você vai aprender o SELECT com calma na aula SELECT; por enquanto, repare nas partes da caixa:

ParteO que faz
📄 consulta.sqlO nome do "arquivo" da caixa. É só um rótulo: .sql é a terminação dos arquivos com comandos SQL.
O códigoA área em que você digita, com os números das linhas do lado. Pode apagar, mudar e escrever o que quiser.
Rodar ▶Manda o SQL para o SQLite e desenha a resposta embaixo.
RestaurarVolta ao código original da caixa e apaga o resultado. Use quando se perder.
Ver soluçãoSó aparece nas missões. Pergunta antes ("Trocar o seu SQL pela solução?") e, se você confirmar, troca o seu código pela resposta e roda.
A tabelaA resposta do banco: o cabeçalho com o nome de cada coluna e uma linha da tabela para cada registro encontrado.
8 linhasEmbaixo da tabela, quantos registros vieram.

Atalhos do teclado

TeclaO que faz
Ctrl+EnterRoda o SQL, igual ao botão Rodar (no Mac, ⌘+Enter).
TabPõe dois espaços no lugar do cursor, para alinhar o SQL.
EscSai do editor (o Tab volta a andar pela página).

Experimente agora na caixa de cima: troque categorias por fornecedores e aperte Ctrl+Enter. Depois clique em Restaurar para voltar ao começo.


O quadro "Resultado" embaixo do código

Nas aulas, muitos exemplos são só para ler. Mesmo assim, o guia roda cada um de verdade, no mesmo SQLite, e desenha a resposta num quadro Resultado logo embaixo. Nenhuma tabela deste guia foi digitada à mão:

SELECT * FROM fornecedores;

Repare em duas linhas: a Lusitana Comércio (de Portugal) e a Pampa Sur (da Argentina) não têm estado, porque estado (UF) só existe no Brasil. Nesse lugar, o quadro mostra NULL, em itálico. NULL é o jeito de o banco dizer "aqui não tem valor nenhum", e ele é tão importante que tem aula própria: O Valor NULL.

Quer mexer num desses exemplos? Clique em copiar, no canto do código, e cole numa caixa Experimente.


Pode apagar: o banco volta limpo a cada Rodar

A caixa abaixo faz uma coisa que, num banco de verdade, daria um belo susto: o DELETE ("apague") apaga todos os itens de todos os pedidos da loja. Depois, o SELECT count(*) conta quantos sobraram. Rode:

DELETE FROM itens_pedido;
SELECT count(*) AS total FROM itens_pedido;

O editor mostrou duas respostas, uma para cada comando: DELETE: 220 linhas afetadas (os 220 itens foram apagados) e uma tabela com total = 0. Agora apague a primeira linha, deixe só o SELECT e rode de novo: o total volta a ser 220. O DELETE aconteceu numa cópia, e a cópia foi jogada fora. Cada Rodar começa do zero, com a loja inteira.

Por que isso é bom

Você pode testar DELETE, UPDATE e DROP TABLE sem medo de "quebrar" os exemplos das próximas aulas. E o resultado é sempre o mesmo: o que você vê aqui é o que o texto da aula descreve. A contrapartida é que nada fica guardado: se quiser ver o efeito de um comando, o comando e o SELECT que confere precisam estar na mesma caixa, rodando juntos.


Vários comandos numa caixa

Uma caixa pode ter quantos comandos você quiser. O que separa um comando do outro é o ponto e vírgula (;) no fim de cada um. O editor roda os comandos na ordem e mostra uma resposta para cada um:

INSERT INTO categorias (nome, descricao) VALUES ('Música', 'Instrumentos e partituras');
UPDATE produtos SET preco = 2.00 WHERE nome = 'Lápis Grafite HB';
SELECT id, nome FROM categorias;
Tipo de comandoO que o editor mostra
SELECT (consultar)Uma tabela com o resultado e o total de linhas.
INSERT, UPDATE, DELETE (mudar dados)Quantas linhas o comando mudou: "INSERT: 1 linha afetada".
CREATE TABLE, DROP TABLE e outrosSó um "ok": "CREATE TABLE: ok".

Não se preocupe com o INSERT e o UPDATE agora: cada um tem a sua aula (INSERT INTO e UPDATE). Por enquanto, o que importa é ver que a categoria nova, Música, aparece na tabela com o número 9: o SELECT rodou depois do INSERT, na mesma cópia do banco.


Quando dá errado

Errar faz parte, e o editor mostra o erro do jeito que ele é: num quadro vermelho, com a mensagem real do SQLite. As mensagens vêm em inglês porque o SQLite "fala" inglês; as aulas traduzem e explicam cada uma.

O nome da tabela no singular
SELECT * FROM categoria;

O que aconteceu: no such table: categoria quer dizer "não existe a tabela categoria". A tabela se chama categorias, no plural. Para o banco, uma letra a menos já é outro nome.

Como consertar: escreva o nome exato: SELECT * FROM categorias;.

Um erro no meio de vários comandos
SELECT count(*) AS produtos FROM produtos;
SELECT count(*) AS clientes FROM cliente;
SELECT count(*) AS pedidos FROM pedidos;

O que aconteceu: o primeiro comando rodou e mostrou a tabela dele. O segundo tem o mesmo erro do exemplo de cima (cliente sem o "s") e o editor parou ali: o terceiro comando nem chegou a rodar. Quando um comando dá erro, tudo o que vem depois dele espera você consertar.

Como consertar: leia a mensagem, corrija o comando que ela aponta (clientes) e rode de novo.

Um comando de ponto no editor
.tables

O que aconteceu: near ".": syntax error, "erro de sintaxe perto do .". Comandos que começam com ponto, como .tables (liste as tabelas), não são SQL: são atalhos do programa sqlite3, que você usa no terminal. O editor só entende SQL, então para ele o ponto é um erro de digitação.

Como consertar: no editor, use só SQL. Os comandos de ponto têm aula própria, Comandos de Ponto, e funcionam no terminal (veja mais abaixo).

Um SQL que não termina nunca

O comando abaixo conta 1, 2, 3… para sempre (você vai entendê-lo na aula CTE Recursiva). Clique em Rodar e espere uns segundos: enquanto o SQLite trabalha, a página fica parada.

WITH RECURSIVE n(x) AS (SELECT 1 UNION ALL SELECT x + 1 FROM n)
SELECT count(*) FROM n;

O que aconteceu: para a sua página não travar de vez, o editor dá 4 segundos a cada Rodar. Passou disso, ele interrompe o SQLite, que responde interrupted ("interrompido"), e o guia explica em português logo embaixo.

Como consertar: todo SQL que repete precisa de um fim. Aqui, um LIMIT 10 logo depois de FROM n, antes do parêntese que fecha, faz a contagem parar em 10. Experimente na caixa.


O que o editor não faz

O editor roda o SQLite de verdade, mas ele é uma caixa de treino dentro de uma página. Algumas coisas ficam de fora:

No editorPor quê, e onde fazer
Comandos de ponto (.tables, .schema, .mode, .import…) dão erroSão do programa sqlite3, não do SQL. Use no terminal: aula Comandos de Ponto.
Nada fica salvoCada Rodar parte do banco limpo. Para guardar dados de verdade, crie o seu próprio arquivo de banco no terminal.
SQL que passa de 4 segundos é interrompidoPara a página não travar. Nenhum exemplo do guia chega perto disso.
A tabela mostra no máximo 500 linhasPara a página não ficar enorme. O total embaixo continua certo: "600 linhas (mostrando as 500 primeiras)". Nenhuma tabela da Loja Aurora passa de 220 linhas.
random() e a data de hoje (date('now')) mudam a cada RodarÉ o que eles fazem também num banco de verdade: sorteiam um número novo ou leem o relógio do seu computador.

As missões

Muitas caixas têm uma Missão: uma tarefa escrita em cima do código, como "mostre só os fornecedores do Brasil". Embaixo da caixa fica uma linha de status, que confere sozinha a sua resposta a cada Rodar:

  • Missão em andamento… enquanto a resposta ainda não está certa, seguida de Ainda falta: e do que o guia está esperando, com uma pista entre parênteses;
  • ✔ Missão cumprida!, em verde, quando você acerta. Depois de cumprida, ela fica cumprida, mesmo que você continue mexendo no código.

O guia não compara o seu código letra por letra com a resposta: ele roda o seu SQL e confere o resultado. Por isso, quase sempre existe mais de um jeito certo. Estas são as conferências que as missões usam:

O "Ainda falta" diz…O que você precisa fazer
o último SELECT deve devolver 6 linhasO último SELECT da caixa precisa trazer exatamente esse número de linhas.
as colunas do último SELECT devem ser nome, cidadeAs colunas precisam ter esses nomes, nessa ordem.
a saída deve conter "Teresina"Esse texto precisa aparecer em algum lugar da resposta.
a saída precisa casar com /…/A resposta precisa ter um formato exato (o que vem entre as barras é uma "expressão regular", um molde de texto).
a tabela "notas" deve existir depois de rodarO seu SQL precisa criar essa tabela.
a tabela "categorias" deve ficar com 9 linhasDepois de rodar, a tabela precisa ter esse número de linhas (você inseriu ou apagou o que devia?).
o comando deve dar um erroÀs vezes a missão é provocar um erro, para você aprender a reconhecê-lo.

Quando o seu SQL dá erro, a pista mostra a mensagem do SQLite, porque nenhuma outra conferência passa enquanto houver erro. Faça a primeira missão:

Missão: o código tenta mostrar o nome e a cidade das categorias, mas categoria não tem cidade! Troque a tabela categorias por fornecedores e rode para ver o nome e a cidade dos 6 fornecedores da loja.

SELECT nome, cidade FROM categorias;
SELECT nome, cidade FROM fornecedores;

Rodou antes de trocar? Então viu o erro no such column: cidade ("não existe a coluna cidade"), na tabela e na pista. Isso é normal: as missões são feitas para você errar, ler a mensagem e consertar. Se travar de vez, use Ver solução; mas tente antes, e depois de ver a solução, digite-a você mesmo.


O mesmo banco no terminal

O editor é ótimo para aprender, mas no trabalho de verdade o SQLite roda como um programa no computador: o sqlite3, que você usa no terminal (a janela de texto onde se digitam comandos). Nas aulas, o terminal aparece assim, com a usuária ana no computador notebook. A aula Instalar o SQLite mostra como colocar o sqlite3 no seu computador, e O Terminal do SQLite ensina a usá-lo.

O banco do editor é montado a partir de um arquivo de texto com os comandos SQL da loja: o aurora.sql (clique para baixar). Com ele salvo na sua pasta pessoal, um comando cria o mesmo banco num arquivo de verdade, e outro confere que os 45 produtos estão lá:

$ sqlite3 minha-loja.db < aurora.sql     « cria o arquivo minha-loja.db e roda os comandos do aurora.sql nele
$ sqlite3 minha-loja.db "SELECT count(*) FROM produtos;"
45

Nas aulas, a Ana já tem esse banco pronto, num arquivo chamado loja.db. Veja a mesma consulta do editor, um erro e um comando de ponto, agora no terminal:

$ sqlite3 loja.db
SQLite version 3.50.4 2025-07-30 19:33:53
Enter ".help" for usage hints.
sqlite> SELECT * FROM fornecedores;
1|Distribuidora Piauí Center|Teresina|PI|Brasil|(86) 99821-4455
2|Loja D'Água|Fortaleza|CE|Brasil|(85) 98712-3344
3|Atlântico Importados|São Paulo|SP|Brasil|(11) 97654-8899
4|Lusitana Comércio|Porto||Portugal|+351 22 123 4567
5|Pampa Sur|Buenos Aires||Argentina|+54 11 4321 8765
6|Norte Suprimentos|Teresina|PI|Brasil|(86) 99344-2211
sqlite> SELECT nome FROM cliente;
Parse error: no such table: cliente
sqlite> .tables
categorias    fornecedores  itens_pedido  produtos
clientes      funcionarios  pedidos
sqlite> .quit

Os dados são os mesmos, mas o jeito de mostrar muda. Compare:

AssuntoNo editor do guiaNo terminal (sqlite3 loja.db)
ResultadoTabela com cabeçalhoUma linha por registro, valores separados por |, sem cabeçalho (dá para mudar com .mode)
NULLNULL em itálicoNada: Porto||Portugal
Mensagem de erroErro do SQLite: no such table: clienteParse error: no such table: cliente (às vezes com uma setinha ^--- error here apontando o lugar)
Comandos de pontoErro de sintaxeFuncionam
O que você mudaSome no próximo RodarFica gravado no arquivo loja.db

Repare na mensagem de erro: o miolo, no such table: cliente, é idêntico nos dois, porque o motor é o mesmo SQLite 3.50.4. O terminal só acrescenta uma etiqueta na frente: Parse error ("erro de análise") quando o SQLite nem entendeu o comando, Runtime error ("erro na execução") quando entendeu mas deu errado ao executar.

No terminal, apagar é para valer

No editor, um DELETE some no próximo Rodar. No terminal, ele é gravado no arquivo na hora, e não tem botão Restaurar. Antes de testar comandos que mudam dados, faça uma cópia do arquivo (aula Backup) ou treine numa cópia, como o minha-loja.db de cima.

Uma diferença escondida: as chaves estrangeiras

O banco do editor liga a conferência de chaves estrangeiras (as ligações entre tabelas, como "todo item de pedido aponta para um produto que existe"). Por isso, no editor, DELETE FROM produtos; dá o erro FOREIGN KEY constraint failed: o banco não deixa apagar produtos que estão em pedidos. No terminal, o sqlite3 começa com essa conferência desligada, e o mesmo comando apaga os 45 produtos sem reclamar. Na aula FOREIGN KEY você aprende a ligá-la com PRAGMA foreign_keys = ON;.


Exercícios

1. A tecla

Além do botão Rodar, qual combinação de teclas roda o SQL da caixa? Escreva no formato Tecla+Tecla.

2. O separador

Qual sinal separa um comando SQL do outro, quando a caixa tem vários?

3. Você rodou DELETE FROM clientes; numa caixa e, na caixa seguinte, rodou SELECT count(*) FROM clientes;. Quantos clientes aparecem?

4. Você digitou .tables numa caixa Experimente e recebeu near ".": syntax error. Por quê?

5. No editor, uma tabela aparece com NULL em itálico numa célula. O que isso quer dizer?

Missão final: desta vez, a missão é errar de propósito. Faça o SQLite responder no such table ("não existe a tabela"): mude o nome da tabela para um que não existe na loja e rode.

SELECT * FROM produtos;
SELECT * FROM produto;

Resumo

  • As caixas Experimente rodam o SQLite de verdade no seu navegador. Escreva o SQL e clique em Rodar ▶ (ou Ctrl+Enter).
  • Cada Rodar cria uma cópia nova da Loja Aurora: pode apagar e mudar à vontade, nada fica gravado. Para ver o efeito de um comando, ponha o SELECT que confere na mesma caixa.
  • Vários comandos numa caixa: separe com ;. O editor mostra uma resposta para cada um, na ordem, e para no primeiro erro.
  • Restaurar volta ao código original; Ver solução, nas missões, pede confirmação e mostra a resposta.
  • Os erros aparecem em vermelho, com a mensagem real do SQLite, em inglês. No terminal, a mesma mensagem ganha uma etiqueta: Parse error: ou Runtime error:.
  • O editor só entende SQL: comandos de ponto (.tables) são do terminal. SQL que passa de 4 segundos é interrompido, e a tabela mostra até 500 linhas.
  • As missões rodam o seu SQL e conferem o resultado; quase sempre há mais de um jeito certo.