SQL DDL: Definição de Dados
// Estruturando Bancos Relacionais
SQL DDL (Data Definition Language) define a estrutura de bancos relacionais, garantindo integridade, compartilhamento, concorrência e o correto funcionamento do SGBD (C.J. Date).
Comando | Função |
---|---|
CREATE | Cria bancos, tabelas, índices, visões, relacionamentos. |
ALTER | Modifica estruturas existentes. |
DROP | Remove estruturas do banco. |
CREATE TABLE
CREATE DATABASE e TABLE
// Criando Estruturas
CREATE DATABASE
cria o contêiner lógico. CREATE TABLE
define tabelas com atributos e domínios.
CREATE DATABASE gestao_projetos;
CREATE TABLE projetos (
jid SERIAL PRIMARY KEY,
jname VARCHAR(100) NOT NULL,
datainicio DATE,
status VARCHAR(20) DEFAULT 'planejado'
);
colaboradores
com fid
(chave primária) e fname
.
CREATE TABLE colaboradores ( fid SERIAL PRIMARY KEY, fname VARCHAR(100) NOT NULL );
Tipos de Dados em SQL
// Definindo Domínios
Tipos de dados definem o domínio de cada atributo, garantindo consistência.
Tipo | Descrição |
---|---|
INT/SERIAL | Inteiro (ex.: fid , jid ) |
VARCHAR(n) | Texto variável (ex.: jname ) |
TEXT | Texto longo (ex.: descrição) |
DATE | Data (ex.: datainicio ) |
CREATE TABLE tarefas (
tid SERIAL,
jid INT,
tname TEXT,
datalimite DATE,
PRIMARY KEY (tid, jid)
);
status
em uma tabela de equipes.
SMALLINT
Restrições (Constraints)
// Garantindo Integridade
Restrições asseguram integridade da entidade e referencial.
Restrição | Função |
---|---|
PRIMARY KEY | Unicidade e não-nulidade |
FOREIGN KEY | Integridade referencial |
UNIQUE | Unicidade em colunas |
NOT NULL | Impede valores nulos |
CHECK | Valida dados (ex.: idade >= 18) |
DEFAULT | Valor padrão para colunas |
CREATE TABLE colaboradores (
fid SERIAL PRIMARY KEY,
fname VARCHAR(100) NOT NULL,
idade INT CHECK (idade >= 18),
salario DECIMAL(10,2) DEFAULT 3000
);
CHECK
para datainicio
em projetos
.
CHECK (datainicio >= '2020-01-01')
ALTER TABLE e DROP TABLE
// Modificando e Excluindo
ALTER TABLE
modifica tabelas. DROP TABLE
remove tabelas e seus dados.
ALTER TABLE projetos
ADD COLUMN orcamento DECIMAL(10,2);
ALTER TABLE projetos
DROP COLUMN orcamento;
DROP TABLE tarefas;
email
a colaboradores
.
ALTER TABLE colaboradores ADD COLUMN email VARCHAR(100);
CREATE INDEX e VIEW
// Otimização e Visões
CREATE INDEX
melhora consultas. CREATE VIEW
cria tabelas virtuais.
CREATE INDEX idx_jname ON projetos (jname);
CREATE VIEW projetos_ativos AS
SELECT jid, jname
FROM projetos
WHERE datainicio >= '2025-01-01';
status
positivo.
CREATE VIEW equipes_ativas AS SELECT eid, ename FROM equipes WHERE status > 0;
Atividade: Mãos à Obra
// Implementando o Esquema
Implemente o esquema do sistema de gestão de projetos (Aula 6) em PostgreSQL:
- Crie as tabelas
projetos
,tarefas
,colaboradores
,equipes
,equipe_colaboradores
. - Defina chaves, restrições (
NOT NULL
,CHECK
,DEFAULT
) e tipos. - Crie uma visão para tarefas pendentes e um índice para
status
. - Insira 3 registros por tabela.
- Teste a integridade (ex.: violar
FOREIGN KEY
).
Visualização: Esquema Relacional
CREATE TABLE projetos (
jid SERIAL PRIMARY KEY,
jname VARCHAR(100) NOT NULL,
status VARCHAR(20) DEFAULT 'planejado',
datainicio DATE
);
CREATE TABLE tarefas (
tid SERIAL,
jid INT,
tname TEXT,
status VARCHAR(20) DEFAULT 'pendente',
PRIMARY KEY (tid, jid),
FOREIGN KEY (jid) REFERENCES projetos(jid)
);
CREATE INDEX idx_status ON projetos(status);
CREATE VIEW tarefas_pendentes AS
SELECT tid, tname
FROM tarefas
WHERE status = 'pendente';
INSERT INTO projetos (jname, datainicio)
VALUES ('Projeto A', '2025-01-01'),
('Projeto B', '2025-02-01'),
('Projeto C', '2025-03-01');
INSERT INTO tarefas (tid, jid, tname)
VALUES (1, 1, 'Tarefa 1'),
(2, 1, 'Tarefa 2'),
(3, 2, 'Tarefa 3');
-- Teste de integridade
INSERT INTO tarefas (tid, jid, tname)
VALUES (4, 999, 'Tarefa Invalida');
-- Erro: JID 999 não existe
CREATE TABLE colaboradores ( fid SERIAL PRIMARY KEY, fname VARCHAR(100) NOT NULL, idade INT CHECK (idade >= 18), salario DECIMAL(10,2) DEFAULT 3000 ); CREATE TABLE equipes ( eid SERIAL PRIMARY KEY, ename VARCHAR(100) NOT NULL, lider_id INT UNIQUE, FOREIGN KEY (lider_id) REFERENCES colaboradores(fid) ); CREATE TABLE equipe_colaboradores ( eid INT, fid INT, PRIMARY KEY (eid, fid), FOREIGN KEY (eid) REFERENCES equipes(eid), FOREIGN KEY (fid) REFERENCES colaboradores(fid) ); INSERT INTO colaboradores (fname, idade, salario) VALUES ('Ana', 30, 4000), ('Bruno', 25, 3500), ('Clara', 28, 3000); INSERT INTO equipes (ename, lider_id) VALUES ('Equipe X', 1), ('Equipe Y', 2), ('Equipe Z', 3); INSERT INTO equipe_colaboradores (eid, fid) VALUES (1, 1), (1, 2), (2, 3);
Aula 8 – Prática com SQL DDL + DML
Objetivo: Criar e manipular bancos relacionais com SQL em um SGBD real (PostgreSQL ou MySQL).
1. Criar o Banco de Dados
-- PostgreSQL
CREATE DATABASE gestao_projetos;
\c gestao_projetos;
-- MySQL
CREATE DATABASE gestao_projetos;
USE gestao_projetos;
2. Criar Tabelas
CREATE TABLE FUNCIONARIO (
matricula CHAR(6) PRIMARY KEY,
nome VARCHAR(100) NOT NULL,
cargo VARCHAR(50),
salario DECIMAL(10,2) CHECK (salario > 0)
);
CREATE TABLE PROJETO (
codigo INT AUTO_INCREMENT PRIMARY KEY,
nome VARCHAR(100) NOT NULL,
data_inicio DATE NOT NULL,
data_fim DATE,
orcamento DECIMAL(12,2) DEFAULT 0
);
CREATE TABLE ALOCACAO (
matricula CHAR(6),
codigo INT,
data_alocacao DATE NOT NULL DEFAULT CURRENT_DATE,
horas DECIMAL(5,2) CHECK (horas >= 0),
PRIMARY KEY (matricula, codigo),
FOREIGN KEY (matricula) REFERENCES FUNCIONARIO(matricula),
FOREIGN KEY (codigo) REFERENCES PROJETO(codigo)
);
3. Inserir Dados
INSERT INTO FUNCIONARIO VALUES
('F0001', 'Ana Lima', 'Analista', 5200.00),
('F0002', 'Carlos Souza', 'Gerente', 8500.00);
INSERT INTO PROJETO (nome, data_inicio, data_fim, orcamento) VALUES
('Sistema Web', '2025-03-01', '2025-06-30', 100000),
('App Móvel', '2025-04-10', NULL, 50000);
INSERT INTO ALOCACAO VALUES
('F0001', 1, DEFAULT, 120),
('F0002', 1, DEFAULT, 90),
('F0002', 2, DEFAULT, 60);
4. Consultar Dados
SELECT * FROM FUNCIONARIO;
SELECT nome, orcamento FROM PROJETO
WHERE orcamento > 60000;
SELECT F.nome, P.nome AS projeto, A.horas
FROM ALOCACAO A
JOIN FUNCIONARIO F ON A.matricula = F.matricula
JOIN PROJETO P ON A.codigo = P.codigo;
5. Atualizar Dados
UPDATE FUNCIONARIO
SET salario = 9000
WHERE nome = 'Carlos Souza';
UPDATE PROJETO
SET data_fim = '2025-08-15'
WHERE nome = 'App Móvel';
6. Remover Dados
DELETE FROM ALOCACAO WHERE matricula = 'F0002' AND codigo = 2;
DELETE FROM ALOCACAO WHERE matricula = 'F0001';
DELETE FROM FUNCIONARIO WHERE matricula = 'F0001';
📝 Tarefa
Execute todos os comandos em seu SGBD, observando os efeitos. Após cada etapa, utilize SELECT
para conferir os resultados.
Quiz Interativo
// Teste seus Conhecimentos em DDL
Teste de Conhecimento
Responda às perguntas para consolidar o aprendizado sobre SQL DDL.
1. Qual comando cria uma tabela?
2. Qual restrição garante que valores sejam únicos?
3. O que faz CREATE INDEX?
4. Qual comando modifica uma tabela?
5. O que é uma visão (VIEW)?
6. Qual comando remove completamente uma tabela?
RUN ddl_quiz_check;
-- Quiz finalizado. Parabéns!
Referências
// Fontes Utilizadas
- Date, C. J. Introdução a Sistemas de Banco de Dados
- Documentação oficial do PostgreSQL e MySQL
- Exemplos adaptados do modelo relacional S-P-SP