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.
- 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:
- cria um banco de dados novo, na memória do seu navegador;
- enche esse banco com os dados da Loja Aurora: categorias, produtos, clientes, pedidos… (a aula O Banco da Loja Aurora apresenta cada tabela);
- roda o SQL que está na caixa;
- 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:
| Parte | O que faz |
|---|---|
📄 consulta.sql | O nome do "arquivo" da caixa. É só um rótulo: .sql é a terminação dos arquivos com comandos SQL. |
| O código | A á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. |
| Restaurar | Volta ao código original da caixa e apaga o resultado. Use quando se perder. |
| Ver solução | Só 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 tabela | A resposta do banco: o cabeçalho com o nome de cada coluna e uma linha da tabela para cada registro encontrado. |
| 8 linhas | Embaixo da tabela, quantos registros vieram. |
Atalhos do teclado
| Tecla | O que faz |
|---|---|
| Ctrl+Enter | Roda o SQL, igual ao botão Rodar (no Mac, ⌘+Enter). |
| Tab | Põe dois espaços no lugar do cursor, para alinhar o SQL. |
| Esc | Sai 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.
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 comando | O 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 outros | Só 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.
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;.
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.
.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).
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 editor | Por quê, e onde fazer |
|---|---|
Comandos de ponto (.tables, .schema, .mode, .import…) dão erro | São do programa sqlite3, não do SQL. Use no terminal: aula Comandos de Ponto. |
| Nada fica salvo | Cada 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 é interrompido | Para a página não travar. Nenhum exemplo do guia chega perto disso. |
| A tabela mostra no máximo 500 linhas | Para 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 linhas | O último SELECT da caixa precisa trazer exatamente esse número de linhas. |
| as colunas do último SELECT devem ser nome, cidade | As 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 rodar | O seu SQL precisa criar essa tabela. |
| a tabela "categorias" deve ficar com 9 linhas | Depois 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:
| Assunto | No editor do guia | No terminal (sqlite3 loja.db) |
|---|---|---|
| Resultado | Tabela com cabeçalho | Uma linha por registro, valores separados por |, sem cabeçalho (dá para mudar com .mode) |
NULL | NULL em itálico | Nada: Porto||Portugal |
| Mensagem de erro | Erro do SQLite: no such table: cliente | Parse error: no such table: cliente (às vezes com uma setinha ^--- error here apontando o lugar) |
| Comandos de ponto | Erro de sintaxe | Funcionam |
| O que você muda | Some no próximo Rodar | Fica 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 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.
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
SELECTque 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:ouRuntime 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.