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

🧰 Antes de começar

  1. Abre a pasta meu-crm no VS Code. Repara no ficheiro sql-lab.html: está lá desde a aula 1, já vem pronto e não precisas de lhe mexer.
  2. Abre o index.html com 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).
  3. 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.

SGBDOnde se encontra
MySQL / MariaDBSites e lojas online, aplicações web.
SQL Server (Microsoft)Empresas: faturação, ERP (PHC, Primavera…), relatórios.
PostgreSQL, OracleBancos, seguradoras, grandes empresas, Administração Pública.
SQLiteTelemó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:

O ecrã do laboratório tem três zonas:

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:

✅ 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 o CREATE TABLE duas 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 → no JOIN, escreve clientes.id em 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)
sortORDER BY
push (criar cliente)INSERT
editar (trocar o registo no guardarCliente)UPDATE
splice (apagar cliente)DELETE
contar com um ciclo e contadoresCOUNT(*) (com GROUP BY)

🔎 Investiga

  1. Com os dados de exemplo, executa SELECT nome FROM clientes WHERE nome LIKE '%SILVA%'; e depois SELECT nome FROM clientes WHERE nome = 'ana silva';. Porque é que uma encontra resultados e a outra não?
  2. Experimenta três botões da zona Exemplos. Para cada um, explica no caderno o que a consulta faz.
  3. Executa um INSERT na tabela clientes do 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 (📥)

  1. O nome e o telefone de todos os clientes, por ordem alfabética do nome.
  2. Todas as colunas, só dos clientes com estado 'Cliente'.
  3. O nome e o email dos clientes cujo email termina em .pt.
  4. O número total de clientes.
  5. 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 (🧩)

  1. O título e o valor das oportunidades com valor superior a 1000 €, da maior para a menor.
  2. O valor total ganho: a soma do valor das oportunidades na fase 'Ganho'.
  3. 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

  1. Cria a tabela produtos com 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 €.
  2. Na tabela clientes do laboratório, faz um INSERT de um cliente de teste, depois um UPDATE que lhe muda o estado e por fim um DELETE que o apaga. Depois de cada comando, confirma com um SELECT.

💡 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

🤖 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.