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.
Atividade Prática: Cite um comando DDL.

CREATE DATABASE e TABLE

// Criando Estruturas

CREATE DATABASE cria o contêiner lógico. CREATE TABLE define tabelas com atributos e domínios.

db_design@postgres:~#

CREATE DATABASE gestao_projetos;
CREATE TABLE projetos (
  jid SERIAL PRIMARY KEY,
  jname VARCHAR(100) NOT NULL,
  datainicio DATE,
  status VARCHAR(20) DEFAULT 'planejado'
);
          
Atividade Prática: Escreva o comando para criar a tabela colaboradores com fid (chave primária) e fname.

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)
db_design@postgres:~#

CREATE TABLE tarefas (
  tid SERIAL,
  jid INT,
  tname TEXT,
  datalimite DATE,
  PRIMARY KEY (tid, jid)
);
          
Atividade Prática: Escolha um tipo de dado para status em uma tabela de equipes.

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
db_design@postgres:~#

CREATE TABLE colaboradores (
  fid SERIAL PRIMARY KEY,
  fname VARCHAR(100) NOT NULL,
  idade INT CHECK (idade >= 18),
  salario DECIMAL(10,2) DEFAULT 3000
);
          
Atividade Prática: Adicione uma restrição CHECK para datainicio em projetos.

ALTER TABLE e DROP TABLE

// Modificando e Excluindo

ALTER TABLE modifica tabelas. DROP TABLE remove tabelas e seus dados.

db_design@postgres:~#

ALTER TABLE projetos
ADD COLUMN orcamento DECIMAL(10,2);
ALTER TABLE projetos
DROP COLUMN orcamento;
DROP TABLE tarefas;
          
Atividade Prática: Escreva um comando para adicionar email a colaboradores.

CREATE INDEX e VIEW

// Otimização e Visões

CREATE INDEX melhora consultas. CREATE VIEW cria tabelas virtuais.

db_design@postgres:~#

CREATE INDEX idx_jname ON projetos (jname);
CREATE VIEW projetos_ativos AS
SELECT jid, jname
FROM projetos
WHERE datainicio >= '2025-01-01';
          
Atividade Prática: Crie uma visão para equipes com status positivo.

Atividade: Mãos à Obra

// Implementando o Esquema

Atividade Prática:
Implemente o esquema do sistema de gestão de projetos (Aula 6) em PostgreSQL:
  1. Crie as tabelas projetos, tarefas, colaboradores, equipes, equipe_colaboradores.
  2. Defina chaves, restrições (NOT NULL, CHECK, DEFAULT) e tipos.
  3. Crie uma visão para tarefas pendentes e um índice para status.
  4. Insira 3 registros por tabela.
  5. Teste a integridade (ex.: violar FOREIGN KEY).

Visualização: Esquema Relacional

Projetos JID (PK) JNAME, STATUS Tarefas TID, JID (PK, FK) Colaboradores FID (PK) FK
db_design@postgres:~#

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
          

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?

a) CREATE TABLE
b) INSERT INTO
c) ALTER TABLE
d) DROP TABLE
Resposta Correta: a) CREATE TABLE. Define a estrutura de uma tabela.

2. Qual restrição garante que valores sejam únicos?

a) NOT NULL
b) PRIMARY KEY
c) UNIQUE
d) FOREIGN KEY
Resposta Correta: c) UNIQUE. Garante unicidade em colunas.

3. O que faz CREATE INDEX?

a) Cria uma tabela
b) Melhora consultas
c) Define visão
d) Remove dados
Resposta Correta: b) Melhora consultas. Otimiza acesso aos dados.

4. Qual comando modifica uma tabela?

a) CREATE TABLE
b) ALTER TABLE
c) DROP TABLE
d) CREATE VIEW
Resposta Correta: b) ALTER TABLE. Modifica estrutura de tabelas.

5. O que é uma visão (VIEW)?

a) Tabela física
b) Tabela virtual
c) Índice único
d) Restrição
Resposta Correta: b) Tabela virtual. Simplifica consultas e segurança.

6. Qual comando remove completamente uma tabela?

a) DELETE TABLE
b) DROP TABLE
c) REMOVE TABLE
d) CLEAR TABLE
Resposta Correta: b) DROP TABLE. Remove a tabela e seus dados.
db_quiz_results:~#

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