UC02830 · Programar com SQL
Aulify · Componente Tecnológica

Programar com SQL

DDL, DML, queries, joins, transações
UC02830 · 50 horas · 4,5 pontos Nível 4 · TDS · Ano 2
Aulify · Componente Tecnológica · Cursos Profissionais
UC02830 · Programar com SQL

Resultados de aprendizagem

  1. Criar e alterar esquemas com DDL.
  2. Consultar dados com SELECT (JOIN, GROUP BY, subqueries).
  3. Modificar dados com INSERT/UPDATE/DELETE.
  4. Garantir integridade com transações.
SQL é a linguagem mais antiga ainda em uso massivo. Aprende uma vez, vale para a vida.
Aulify · Componente Tecnológica · Cursos Profissionais
UC02830 · Programar com SQL
Bloco 1 · DDL

Criar estruturas

Aulify · Componente Tecnológica · Cursos Profissionais
UC02830 · Programar com SQL

CREATE TABLE

CREATE TABLE Cliente (
  id INT PRIMARY KEY AUTO_INCREMENT,
  nome VARCHAR(150) NOT NULL,
  email VARCHAR(150) UNIQUE NOT NULL,
  data_registo DATETIME DEFAULT CURRENT_TIMESTAMP
);

CREATE TABLE Encomenda (
  id INT PRIMARY KEY AUTO_INCREMENT,
  cliente_id INT NOT NULL,
  total DECIMAL(10,2) CHECK (total >= 0),
  estado VARCHAR(20) DEFAULT 'pendente',
  FOREIGN KEY (cliente_id) REFERENCES Cliente(id)
);
Aulify · Componente Tecnológica · Cursos Profissionais
UC02830 · Programar com SQL

ALTER e DROP

-- Adicionar coluna
ALTER TABLE Cliente ADD telefone VARCHAR(20);

-- Modificar coluna
ALTER TABLE Cliente MODIFY nome VARCHAR(200) NOT NULL;

-- Renomear coluna
ALTER TABLE Cliente RENAME COLUMN telefone TO tel;

-- Apagar coluna
ALTER TABLE Cliente DROP COLUMN tel;

-- Apagar tabela inteira
DROP TABLE Cliente;
DROP é destrutivo e irreversível. Sempre fazer backup antes em produção.
Aulify · Componente Tecnológica · Cursos Profissionais
UC02830 · Programar com SQL
Bloco 2 · DML

Inserir, actualizar, apagar

Aulify · Componente Tecnológica · Cursos Profissionais
UC02830 · Programar com SQL

INSERT

-- Inserir uma linha
INSERT INTO Cliente (nome, email) VALUES ('Ana Silva', 'ana@ex.pt');

-- Inserir várias
INSERT INTO Cliente (nome, email) VALUES
  ('João Costa', 'joao@ex.pt'),
  ('Maria Lopes', 'maria@ex.pt');

-- Inserir todos os campos (na ordem)
INSERT INTO Cliente VALUES (NULL, 'Pedro', 'pedro@ex.pt', NOW());
Aulify · Componente Tecnológica · Cursos Profissionais
UC02830 · Programar com SQL

UPDATE

-- Actualizar com WHERE — IMPORTANTE
UPDATE Cliente SET email = 'novo@ex.pt' WHERE id = 1;

-- Pode actualizar várias colunas
UPDATE Cliente
SET nome = 'Ana Maria Silva', email = 'amsilva@ex.pt'
WHERE id = 1;
UPDATE sem WHERE altera todas as linhas. Em produção, testar sempre primeiro com SELECT.
Aulify · Componente Tecnológica · Cursos Profissionais
UC02830 · Programar com SQL

DELETE

-- Apagar uma linha
DELETE FROM Cliente WHERE id = 5;

-- Apagar várias
DELETE FROM Cliente WHERE data_registo < '2020-01-01';

-- ATENÇÃO: apaga TUDO se sem WHERE
DELETE FROM Cliente;

Alternativa moderna: soft delete com campo apagado_em DATETIME.

Aulify · Componente Tecnológica · Cursos Profissionais
UC02830 · Programar com SQL
Bloco 3 · SELECT

Consultar dados

Aulify · Componente Tecnológica · Cursos Profissionais
UC02830 · Programar com SQL

SELECT básico

-- Tudo
SELECT * FROM Cliente;

-- Colunas específicas
SELECT nome, email FROM Cliente;

-- Filtrar com WHERE
SELECT * FROM Cliente WHERE id = 1;
SELECT * FROM Cliente WHERE nome LIKE 'A%';
SELECT * FROM Cliente WHERE data_registo > '2026-01-01';

-- Ordenar
SELECT * FROM Cliente ORDER BY nome ASC;
SELECT * FROM Cliente ORDER BY data_registo DESC LIMIT 10;
Aulify · Componente Tecnológica · Cursos Profissionais
UC02830 · Programar com SQL

Funções de agregação

-- Contar
SELECT COUNT(*) FROM Cliente;
SELECT COUNT(DISTINCT email) FROM Cliente;

-- Outras
SELECT SUM(total), AVG(total), MAX(total), MIN(total) FROM Encomenda;

-- Agrupar
SELECT cliente_id, COUNT(*) AS n_encomendas, SUM(total) AS gasto
FROM Encomenda
GROUP BY cliente_id
HAVING SUM(total) > 100;

HAVING filtra depois de agregar; WHERE filtra antes.

Aulify · Componente Tecnológica · Cursos Profissionais
UC02830 · Programar com SQL
Bloco 4 · JOINS

Combinar tabelas

Aulify · Componente Tecnológica · Cursos Profissionais
UC02830 · Programar com SQL

INNER JOIN

SELECT c.nome, e.total, e.estado
FROM Cliente c
INNER JOIN Encomenda e ON c.id = e.cliente_id
WHERE e.estado = 'pago';

Devolve só clientes com encomendas pagas. Sem encomendas → não aparecem.

Aulify · Componente Tecnológica · Cursos Profissionais
UC02830 · Programar com SQL

LEFT / RIGHT JOIN

-- Todos os clientes, mesmo sem encomendas
SELECT c.nome, COUNT(e.id) AS n_enc
FROM Cliente c
LEFT JOIN Encomenda e ON c.id = e.cliente_id
GROUP BY c.id, c.nome;

-- Clientes sem encomendas
SELECT c.nome
FROM Cliente c
LEFT JOIN Encomenda e ON c.id = e.cliente_id
WHERE e.id IS NULL;
Aulify · Componente Tecnológica · Cursos Profissionais
UC02830 · Programar com SQL

JOIN com 3+ tabelas

SELECT c.nome, p.nome AS produto, ei.qty, ei.preco_unit
FROM Cliente c
INNER JOIN Encomenda e ON c.id = e.cliente_id
INNER JOIN EncomendaItem ei ON e.id = ei.encomenda_id
INNER JOIN Produto p ON ei.produto_id = p.id
WHERE e.id = 42;
Aulify · Componente Tecnológica · Cursos Profissionais
UC02830 · Programar com SQL
Bloco 5 · Avançado

Subqueries e transações

Aulify · Componente Tecnológica · Cursos Profissionais
UC02830 · Programar com SQL

Subqueries

-- Clientes que gastaram mais que a média
SELECT nome FROM Cliente WHERE id IN (
  SELECT cliente_id
  FROM Encomenda
  GROUP BY cliente_id
  HAVING SUM(total) > (SELECT AVG(total) FROM Encomenda)
);

-- Subquery escalar
SELECT nome,
  (SELECT COUNT(*) FROM Encomenda WHERE cliente_id = Cliente.id) AS n_enc
FROM Cliente;
Aulify · Componente Tecnológica · Cursos Profissionais
UC02830 · Programar com SQL

CTE (Common Table Expression)

Alternativa moderna a subqueries — mais legível:

WITH gastos AS (
  SELECT cliente_id, SUM(total) AS total
  FROM Encomenda
  GROUP BY cliente_id
)
SELECT c.nome, g.total
FROM Cliente c
JOIN gastos g ON c.id = g.cliente_id
WHERE g.total > 1000
ORDER BY g.total DESC;
Aulify · Componente Tecnológica · Cursos Profissionais
UC02830 · Programar com SQL

Transações

BEGIN;     -- ou START TRANSACTION;

UPDATE Conta SET saldo = saldo - 100 WHERE id = 1;
UPDATE Conta SET saldo = saldo + 100 WHERE id = 2;

-- Verificar se tudo OK; se sim:
COMMIT;

-- Se algo correu mal:
ROLLBACK;

ACID:

  • Atomicidade — tudo ou nada.
  • Consistência — restrições mantidas.
  • Isolamento — transações paralelas não interferem.
  • Durabilidade — persistente após commit.
Aulify · Componente Tecnológica · Cursos Profissionais
UC02830 · Programar com SQL

Índices

-- Acelera SELECT em colunas filtradas/ordenadas
CREATE INDEX idx_cliente_email ON Cliente(email);

-- Composto (várias colunas)
CREATE INDEX idx_enc_cli_data ON Encomenda(cliente_id, data);

-- Único (combina índice + UNIQUE)
CREATE UNIQUE INDEX idx_email_unique ON Cliente(email);

Trade-off: índices aceleram leitura mas abrandam escrita e ocupam disco.

Aulify · Componente Tecnológica · Cursos Profissionais
UC02830 · Programar com SQL
Aulify · UC02830 · Fim

SQL é a língua universal dos dados.

📧 geral@aulify.pt
Aulify · Componente Tecnológica · Cursos Profissionais