Laboratório SQL: as mesmas consultas, em SQL
Hoje não mexes no código do CRM. Vais usar uma base de dados a sério (SQLite), a correr dentro do browser, e fazer em SQL as mesmas perguntas que o teu CRM já sabe fazer.
🎯 No fim desta aula vais conseguir
- Explicar o que é uma base de dados relacional, um SGBD e a linguagem SQL.
- Consultar dados com
SELECT, escolher colunas, filtrar comWHEREeLIKEe ordenar comORDER BY. - Contar e somar com
COUNT,SUMeGROUP BY. - Juntar duas tabelas com
JOIN, usando uma chave estrangeira. - Criar uma tabela e inserir, alterar e apagar registos (
CREATE TABLE,INSERT,UPDATE,DELETE).
🧰 Antes de começar
- Abre a pasta
meu-crmno VS Code. Repara no ficheirosql-lab.html: está lá desde a aula 1, já vem pronto e não precisas de lhe mexer. - Abre o
index.htmlcom o Live Server e confirma que o teu CRM tem pelo menos 6 clientes, com estados diferentes e alguns emails terminados em.pt. Se não tiver, cria-os agora (2 minutos). - Precisas de Internet: o motor da base de dados é descarregado quando abres o laboratório.
😕 Faltaste à aula 10? Hoje o código do CRM não muda, mas se o teu projeto não funcionar descarrega o ponto de controlo da aula 10. Lembra-te de que os pontos de controlo não trazem clientes (esses ficam no teu browser): cria alguns antes de começar.
Parte A — O que é uma base de dados e o SQL (≈ 15 min)
📚 Bases de dados a sério
Até agora, o teu CRM guarda os dados na «gaveta» do browser (localStorage), em texto JSON. Serve para aprender, mas as empresas usam bases de dados.
- Uma base de dados relacional guarda os dados em tabelas (como as folhas de um Excel) que se relacionam entre si. Por exemplo, cada oportunidade de negócio diz qual é o
iddo seu cliente. - O programa que guarda as tabelas e responde às perguntas chama-se SGBD (Sistema de Gestão de Bases de Dados). É como um arquivista profissional.
- Para falar com o SGBD usa-se o SQL (Structured Query Language): uma linguagem padrão, quase igual em todos os SGBD.
| SGBD | Onde se encontra |
|---|---|
| MySQL / MariaDB | Sites e lojas online, aplicações web. |
| SQL Server (Microsoft) | Empresas: faturação, ERP (PHC, Primavera…), relatórios. |
| PostgreSQL, Oracle | Bancos, seguradoras, grandes empresas, Administração Pública. |
| SQLite | Telemóveis, browsers, aplicações pequenas. É o que vais usar hoje! |
💼 Porque é que isto te interessa? Quase todos os programas de gestão usam SQL por trás: faturação, stocks, salários, relatórios. Nos anúncios de emprego para informática de gestão aparece muitas vezes «conhecimentos de SQL». Saber SQL vale muito no teu CV.
💡 O laboratório faz uma cópia dos dados do teu CRM para uma base de dados SQLite dentro do browser. Tudo o que fizeres lá (inserir, alterar, apagar) não estraga o teu CRM.
Parte B — No laboratório (≈ 50 min)
1 Abrir o laboratório
Com o CRM aberto no Live Server, abre o laboratório de uma destas formas:
- no VS Code, botão direito em
sql-lab.html→ Open with Live Server; ou - na barra de endereço do browser, troca
index.htmlporsql-lab.html(fica algo comohttp://127.0.0.1:5500/sql-lab.html).
O ecrã do laboratório tem três zonas:
- Em cima: uma mensagem de estado e três botões — 📥 Usar os meus dados do CRM, 🧩 Usar dados de exemplo e 📋 Colar uma cópia (.json).
- À esquerda: Tabelas — a lista das tabelas (
clientes,interacoes,oportunidades), com o número de registos entre parênteses e as colunas de cada uma (e o seu tipo:integer,text,real). Por baixo, Exemplos: botões que escrevem e executam consultas prontas. - À direita: Escreve o teu SQL — a caixa onde escreves, o botão ▶ Executar (Ctrl+Enter) e o botão Limpar. O resultado aparece por baixo, numa tabela, com o número de linhas.
Clica em 📥 Usar os meus dados do CRM.
✅ Deves ver: a mensagem «✅ Base de dados pronta — dados do teu CRM: 6 clientes, 0 interações, 0 oportunidades.» (com o teu número de clientes) e, à esquerda, a tabela clientes com as colunas id, nome, empresa, email, telefone, nif, estado, notas e criadoEm. As tabelas interacoes e oportunidades estão vazias: vais enchê-las nas aulas 13 e 14.
😕 Não funciona?
- «❌ Não foi possível carregar o motor SQL» → não tens Internet (ou a rede bloqueia o site). Avisa o professor.
- «⚠️ Não encontrei clientes no teu CRM» → abriste o laboratório com duplo clique ou noutro endereço. Tem de ser no mesmo endereço do CRM (por exemplo, os dois em
http://127.0.0.1:5500). - Continua sem dar? Plano B: no CRM, abre a Consola (F12) e escreve
copy(JSON.stringify({ clientes: carregar('clientes') }))(copia os teus clientes). No laboratório, clica em 📋 Colar uma cópia (.json), cola com Ctrl+V e clica em Carregar.
2 A primeira consulta: SELECT
Uma consulta SQL lê-se quase como português. SELECT * FROM clientes; quer dizer: «seleciona todas as colunas (*) da tabela clientes».
Copia a consulta, cola-a na caixa «Escreve o teu SQL» (apaga o que lá estiver) e carrega em Ctrl+Enter (ou no botão ▶ Executar).
🤔 Prevê: quantas linhas vai ter o resultado?
Normalmente não queremos todas as colunas. Em vez do *, escreve os nomes das colunas que queres, separados por vírgulas:
✅ Deves ver: primeiro, uma tabela com todos os teus clientes e todas as colunas; depois, só as colunas nome, empresa e estado. Por baixo aparece, por exemplo, «6 linha(s)».
📏 Regras do SQL: as palavras do SQL (SELECT, FROM…) escrevem-se, por hábito, em MAIÚSCULAS (em minúsculas também funciona); cada consulta acaba com ;; há vírgulas entre as colunas, mas não depois da última; os textos escrevem-se entre plicas: 'Lead'.
3 Filtrar e ordenar: WHERE, ORDER BY e LIKE
WHERE é o filtro: só aparecem as linhas que cumprem a condição. É o mesmo que o filtro de estado do teu CRM.
ORDER BY ordena o resultado. Por omissão é do mais pequeno para o maior (A → Z); acrescenta DESC para a ordem inversa (Z → A).
LIKE serve para pesquisar partes de um texto, como a barra de pesquisa do CRM. O % quer dizer «qualquer coisa (ou nada)»: '%silva%' = contém «silva»; 'a%' = começa por «a»; '%.pt' = acaba em «.pt».
Podes juntar tudo, e combinar condições com AND («e») e OR («ou»):
✅ Deves ver: só os Leads; depois todos por ordem alfabética; depois só os clientes com «silva» no nome; por fim, os Clientes e os Leads de Z para A.
⚠️ Cuidado com as maiúsculas: o = compara o texto exatamente, por isso WHERE estado = 'lead' dá 0 linhas (no CRM está escrito Lead). Já o LIKE não liga a maiúsculas e minúsculas (nas letras sem acento).
4 Contar e somar: COUNT, GROUP BY e SUM
COUNT(*) conta linhas. O AS total dá um nome à coluna do resultado.
GROUP BY faz montinhos: junta as linhas com o mesmo valor (por exemplo, o mesmo estado) e calcula o COUNT de cada montinho. É como uma Tabela Dinâmica do Excel — e é o mesmo que fizeste no E2 da aula 10 com um ciclo e três contadores, mas numa só consulta!
SUM(coluna) soma os valores de uma coluna com números. Os teus clientes não têm valores em euros, por isso clica agora em 🧩 Usar dados de exemplo: é uma empresa inventada com 8 clientes, 7 interações e 6 oportunidades de negócio (cada uma com um valor e uma fase).
✅ Deves ver: o número total dos teus clientes; uma linha por estado com quantos clientes tem; e, com os dados de exemplo, o total 14000 e uma linha por fase (por exemplo, Ganho — 6200).
5 Juntar tabelas: JOIN e a chave estrangeira
Continua com os dados de exemplo. Executa SELECT * FROM oportunidades; e olha para a coluna clienteId: em vez do nome do cliente, cada oportunidade guarda só o número (id) do cliente a que pertence.
A isso chama-se chave estrangeira: um campo de uma tabela que aponta para a chave primária de outra tabela. É como num livro de encomendas onde se escreve «cliente nº 4»: para saber o nome, vais ao arquivador de clientes buscar a ficha nº 4. O JOIN faz isso automaticamente:
JOIN clientes— junta a tabelaclientesàs oportunidades;ON clientes.id = oportunidades.clienteId— a regra para emparelhar as linhas: oiddo cliente tem de ser igual aoclienteIdda oportunidade;tabela.coluna— como as duas tabelas têm uma colunaid, escrevemos o nome da tabela antes, para não haver confusão.
✅ Deves ver: 6 linhas, cada uma com o nome do cliente ao lado do título da oportunidade, por exemplo Ana Silva — Contrato anual — 1200.
6 Criar uma tabela e mexer nos registos
O SQL também serve para criar tabelas e para inserir, alterar e apagar registos. Cria uma tabela de produtos:
Cada coluna tem um tipo: INTEGER (número inteiro), TEXT (texto), REAL (número com casas decimais). PRIMARY KEY marca a chave primária: se não lhe deres valor, o SQLite numera os registos sozinho (1, 2, 3…). Repara que a tabela aparece logo à esquerda.
INSERT acrescenta registos (é o push do JavaScript). Nos números decimais usa-se ponto, não vírgula:
UPDATE altera registos e DELETE apaga registos. O WHERE diz quais:
✅ Deves ver: depois do CREATE TABLE, a mensagem verde «✅ Comando executado» e a tabela produtos à esquerda; depois dos INSERT, os 2 produtos com id 1 e 2; no fim, só o Caderno, agora a 4.5.
⚠️ Muito importante: um UPDATE ou um DELETE sem WHERE altera ou apaga todas as linhas da tabela! Numa empresa, isso pode apagar todos os clientes num segundo. Escreve sempre o WHERE primeiro.
💡 A tabela produtos só existe enquanto não recarregares a página nem clicares num dos botões «Usar…»: o laboratório é uma base de dados de treino, em memória. E lembra-te: é uma cópia, o teu CRM não muda.
😕 Aparece uma mensagem vermelha?
- «A coluna «Lead» não existe» → esqueceste as plicas: escreve
'Lead'. - «A tabela «cliente» não existe» → o nome é
clientes(no plural). Confirma os nomes na lista da esquerda. - «Erro de escrita (sintaxe) perto de «FROM»» → normalmente é uma vírgula a mais antes do
FROM(SELECT nome, FROM). table produtos already exists→ executaste oCREATE TABLEduas vezes. Não faz mal: a tabela já existe, continua.3 values for 2 columns→ escreveste o preço com vírgula (1,50). Usa ponto:1.50.ambiguous column name: id→ noJOIN, escreveclientes.idem vez de sóid.- Erro perto de uma plica estranha (
‘ou’) → copiaste de um documento de texto. Apaga as plicas e escreve-as no teclado (').
🔁 O que já fazias em JavaScript, agora em SQL
| No teu CRM (JavaScript) | Em SQL |
|---|---|
carregar('clientes') | SELECT * FROM clientes |
filtrar com if (filtro de estado, pesquisa) | WHERE (e LIKE) |
sort | ORDER BY |
push (criar cliente) | INSERT |
editar (trocar o registo no guardarCliente) | UPDATE |
splice (apagar cliente) | DELETE |
| contar com um ciclo e contadores | COUNT(*) (com GROUP BY) |
🔎 Investiga
- Com os dados de exemplo, executa
SELECT nome FROM clientes WHERE nome LIKE '%SILVA%';e depoisSELECT nome FROM clientes WHERE nome = 'ana silva';. Porque é que uma encontra resultados e a outra não? - Experimenta três botões da zona Exemplos. Para cada um, explica no caderno o que a consulta faz.
- Executa um
INSERTna tabelaclientesdo laboratório e depois volta ao teu CRM e carrega em F5. O cliente novo aparece no CRM? Porquê?
✍️ Exercícios (fazem parte do teu projeto)
Escreve as consultas sozinho e testa-as no laboratório. Quando uma funcionar, copia-a para o ficheiro consultas.sql (ver «O que mostrar ao professor»).
Consultas 1 a 5 — com os teus dados do CRM (📥)
- O nome e o telefone de todos os clientes, por ordem alfabética do nome.
- Todas as colunas, só dos clientes com estado
'Cliente'. - O nome e o email dos clientes cujo email termina em
.pt. - O número total de clientes.
- O número de clientes por estado.
💡 Dica: revê os passos 2 a 4. Para «termina em», pensa onde tem de ficar o %. Se tiveres poucos clientes, também podes usar os dados de exemplo.
Consultas 6 a 8 — com os dados de exemplo (🧩)
- O título e o valor das oportunidades com valor superior a 1000 €, da maior para a menor.
- O valor total ganho: a soma do valor das oportunidades na fase
'Ganho'. - O nome do cliente e o título de cada oportunidade.
💡 Dica: o teu CRM ainda não tem oportunidades, por isso clica em 🧩 Usar dados de exemplo. «Da maior para a menor» é DESC. Na 7, junta SUM com WHERE. A 8 precisa de JOIN (passo 5).
⭐ Desafio · A tua tabela e um cliente de teste
- Cria a tabela
produtoscom 3 produtos ou serviços da tua empresa (com preços inventados) e escreve a consulta que lista só os que custam mais de 5 €. - Na tabela
clientesdo laboratório, faz umINSERTde um cliente de teste, depois umUPDATEque lhe muda o estado e por fim umDELETEque o apaga. Depois de cada comando, confirma com umSELECT.
💡 Dica: há botões de exemplo para inserir, alterar e apagar, mas escreve os teus comandos (com outro nome de cliente). Não te esqueças do WHERE no UPDATE e no DELETE!
📦 O que mostrar ao professor
No VS Code, dentro da pasta meu-crm, cria um ficheiro novo chamado consultas.sql. Escreve cada consulta por baixo do seu comentário (em SQL, uma linha que começa por -- é um comentário). Começa por copiar este modelo:
⏱️ Se sobrar tempo
- Faz o desafio ⭐.
- Com os dados de exemplo, descobre o valor médio das oportunidades (
AVG) e a maior (MAX). - Com os dados de exemplo, mostra o nome de cada cliente e quantas interações teve (vais precisar de
JOIN,COUNTeGROUP BYjuntos).
🤖 Pedir ajuda à IA (opcional)
Uma IA gratuita é ótima para te explicar um erro de SQL ou para te dar mais exercícios para treinar. Não lhe peças as respostas dos exercícios!
📖 Palavras novas
- Base de dados relacional
- Dados guardados em tabelas que se relacionam entre si através de chaves.
- SGBD
- Sistema de Gestão de Bases de Dados: o programa que guarda as tabelas e responde às consultas (MySQL, SQL Server, SQLite…).
- SQL
- Linguagem padrão para consultar e alterar bases de dados.
SELECT … FROM …- Escolhe colunas de uma tabela.
WHERE/LIKE- Filtra as linhas / pesquisa partes de um texto (
%= qualquer coisa). ORDER BY(DESC)- Ordena o resultado (de forma decrescente).
COUNT,SUM,GROUP BY- Contar, somar, e fazer «montinhos» por um valor para contar ou somar cada um.
- Chave estrangeira
- Campo que aponta para a chave primária de outra tabela (ex.:
clienteId). JOIN … ON …- Junta duas tabelas, emparelhando as linhas segundo uma regra.
CREATE TABLE,INSERT,UPDATE,DELETE- Criar uma tabela, inserir, alterar e apagar registos.