TIC 5 · Bases de Dados

Aprender SQL

Recursos educativos para dominar a linguagem de consulta estruturada — do básico ao avançado, com exercícios práticos.

▶ Começar aqui 🏋️ Exercícios 🌐 Sites de Treino
📖 Introdução — SQL vs MySQL
Antes de começar, é essencial perceber a diferença entre uma linguagem e um sistema de gestão.

O que é o SQL?

SQL (Structured Query Language) é uma linguagem padronizada para comunicar com bases de dados relacionais. Foi criada na década de 1970 pela IBM e tornou-se a norma ISO/ANSI para manipulação de dados tabulares.

Com SQL podes criar tabelas, inserir dados, fazer consultas, atualizar registos e definir permissões — tudo isso usando uma sintaxe declarativa e legível.

SQL não é um programa — é uma linguagem. É como dizer "português": o português é a língua, mas podes escrever em papel, computador ou quadro negro.

🗣️ SQL — A Linguagem

  • Norma internacional (ISO/ANSI)
  • Não é um software instalável
  • Funciona em múltiplos sistemas
  • Define a sintaxe das consultas
  • Dividida em DDL, DML, DCL, TCL
  • Existe desde os anos 70 (IBM)

🛢️ MySQL — Um Sistema (SGBD)

  • Software que implementa o SQL
  • Instalável em servidor ou PC
  • Open-source (Oracle/comunidade)
  • Adiciona extensões proprietárias
  • Usado em WordPress, PHP, apps web
  • Criado em 1995 por Michael Widenius

💡 Analogia fácil

Imagina que SQL é como a língua portuguesa. O MySQL, PostgreSQL e SQLite são como diferentes "editores de texto" que lêem e escrevem nessa língua — cada um com as suas particularidades, mas todos compreendem o mesmo português base.

Aprender SQL é, portanto, aprender o núcleo universal que funciona em todos os sistemas de bases de dados relacionais.


🛢️ Principais Sistemas de Bases de Dados
Todos usam SQL com ligeiras variações de sintaxe. Conhece os mais utilizados no mundo.
🐬
MySQL
O mais popular para web. Usado em WordPress, PHP, e aplicações open-source.
🐘
PostgreSQL
Poderoso e open-source. Suporta JSON, triggers avançados e é muito robusto.
🔵
SQL Server
Da Microsoft. Muito usado em empresas com ecossistema Windows e .NET.
🔶
Oracle DB
Enterprise de alto desempenho. Utilizado em bancos e grandes corporações.
📦
SQLite
Sem servidor. Ficheiro único. Ideal para apps móveis, Python e projetos locais.
☁️
MariaDB
Fork do MySQL totalmente open-source, compatível e cada vez mais adotado.

📚 Trilha de Aprendizagem
Segue esta ordem para uma progressão lógica do básico ao avançado.
🗄️

1. Conceitos de Base de Dados

O que são tabelas, linhas, colunas, chaves primárias e estrangeiras. Modelo relacional.

⬤ Iniciante
📋

2. DDL — Definir Estruturas

CREATE, ALTER e DROP para criar e modificar tabelas, bases de dados e índices.

⬤ Iniciante
✏️

3. DML — Manipular Dados

INSERT, UPDATE, DELETE para adicionar, alterar e remover registos nas tabelas.

⬤ Iniciante
🔍

4. SELECT — Consultar Dados

A instrução mais usada. Filtrar com WHERE, ordenar com ORDER BY, limitar com LIMIT.

⬤ Intermédio
🔗

5. JOINs — Ligar Tabelas

INNER, LEFT, RIGHT e FULL JOIN para cruzar informação entre múltiplas tabelas.

⬤ Intermédio
📊

6. Funções de Agregação

COUNT, SUM, AVG, MAX, MIN com GROUP BY e HAVING para resumir e analisar dados.

⬤ Intermédio
🔒

7. DCL — Permissões

GRANT e REVOKE para controlar quem acede ao quê na base de dados.

⬤ Avançado
🔄

8. Transações (TCL)

COMMIT, ROLLBACK e SAVEPOINT para garantir consistência e atomicidade dos dados.

⬤ Avançado

9. Subqueries & Views

Consultas dentro de consultas. Criar vistas reutilizáveis para simplificar queries complexas.

⬤ Avançado

💻 Referência Rápida — Sintaxe Essencial
Os comandos mais usados no dia a dia de qualquer programador SQL.

🗄️ Criar uma tabela

CREATE TABLE alunos (
  id        INT PRIMARY KEY AUTO_INCREMENT,
  nome      VARCHAR(100) NOT NULL,
  idade     INT,
  email     VARCHAR(150) UNIQUE,
  criado_em DATE DEFAULT CURRENT_DATE
);

✏️ Inserir e consultar

-- Inserir um registo
INSERT INTO alunos (nome, idade, email)
VALUES ('Ana Silva', 17, 'ana@escola.pt');

-- Consultar todos
SELECT * FROM alunos;

-- Filtrar e ordenar
SELECT nome, idade FROM alunos
WHERE idade >= 16
ORDER BY nome ASC;

🔗 JOIN entre tabelas

-- Tabela turmas com chave estrangeira
SELECT a.nome, t.designacao
FROM alunos a
INNER JOIN turmas t
  ON a.turma_id = t.id
WHERE t.designacao = '10ºA';

📊 Agregação de dados

-- Contar alunos por turma
SELECT turma_id,
       COUNT(*) AS total,
       AVG(idade) AS media_idade
FROM alunos
GROUP BY turma_id
HAVING COUNT(*) > 20;

🏋️ Exercícios de Treino
Pratica com estes desafios progressivos. Usa um dos sites de treino indicados abaixo.

⬤ Iniciante

Ex. 1 — Criar a base de dados de uma escola

Cria uma BD chamada escola. Dentro dela, cria as tabelas alunos (id, nome, data_nascimento, email) e turmas (id, designação, ano). Define as chaves primárias em ambas.

DDL · CREATE

Ex. 2 — Popular as tabelas com dados reais

Insere pelo menos 3 turmas e 10 alunos na base de dados criada no exercício anterior. Usa nomes e emails realistas. Certifica-te que cada aluno tem uma turma atribuída (chave estrangeira).

DML · INSERT

Ex. 3 — Consultas simples com WHERE

Escreve queries para: (a) listar todos os alunos por ordem alfabética; (b) mostrar apenas alunos com email do domínio @gmail.com; (c) contar quantos alunos existem na base de dados.

DQL · SELECT · WHERE · COUNT

⬤ Intermédio

Ex. 4 — Listar alunos com o nome da sua turma

Usa um INNER JOIN para criar uma consulta que mostre o nome do aluno e a designação da sua turma. Ordena pelo nome da turma e depois pelo nome do aluno.

JOIN · INNER JOIN · ORDER BY

Ex. 5 — Estatísticas por turma

Para cada turma, mostra a designação, o número de alunos e a média de idades. Apresenta apenas as turmas com mais de 5 alunos. Ordena do maior para o menor número de alunos.

GROUP BY · COUNT · AVG · HAVING

Ex. 6 — Atualizar e eliminar registos

Atualiza o email de um aluno específico. De seguida, remove todos os alunos cuja data de nascimento é anterior a 2005. Usa transações (BEGIN/COMMIT) para garantir segurança.

UPDATE · DELETE · Transações

⬤ Avançado

Ex. 7 — Subquery: alunos acima da média de idades

Escreve uma query que liste todos os alunos cuja idade é superior à média de idades de todos os alunos. Usa uma subquery no WHERE em vez de calcular a média manualmente.

Subquery · AVG · WHERE

Ex. 8 — Criar uma VIEW reutilizável

Cria uma VIEW chamada v_alunos_turma que combine dados de alunos e turmas. Usa essa view para responder a 3 perguntas diferentes sem reescrever o JOIN.

CREATE VIEW · Reutilização

Ex. 9 — Desafio final: sistema de notas

Adiciona uma tabela notas com (id, aluno_id, disciplina, nota). Cria queries para: (a) média por aluno; (b) ranking dos 3 melhores alunos; (c) alunos com nota negativa em alguma disciplina; (d) disciplina com maior taxa de negativas.

Multi-tabela · Ranking · LEFT JOIN

🌐 Sites de Treino Online
Pratica SQL diretamente no browser, sem instalar nada. Todos são gratuitos.
🏆

SQLZoo

Tutoriais interativos progressivos com exercícios de nível crescente. Interface simples e feedback imediato. Ideal para iniciantes.

→ sqlzoo.net
🎯

SQLBolt

18 lições interativas que cobrem SELECT, JOINs, subqueries e mais. Explicações claras e exercícios práticos em cada lição.

→ sqlbolt.com
💻

W3Schools SQL

Referência completa com editor "Try it Yourself". Cobre toda a sintaxe SQL com exemplos editáveis em tempo real.

→ w3schools.com/sql
🏅

HackerRank — SQL

Desafios de SQL com sistema de pontuação e certificados. Ótimo para preparar entrevistas e medir o teu progresso real.

→ hackerrank.com/sql
🧩

LeetCode — Database

Problemas reais de SQL usados em entrevistas de empresas como Google e Amazon. Recomendado para nível avançado.

→ leetcode.com/database
🐘

DB Fiddle

Editor online que suporta MySQL, PostgreSQL e SQLite. Podes criar tabelas, inserir dados e testar queries sem instalar nada.

→ db-fiddle.com