SELECT table_name
FROM information_schema.tables
WHERE table_schema = 'public'
ORDER BY table_name;| table_name |
|---|
| aluno |
| centro |
| curso |
| disciplina |
| escola |
| matricula_disciplina |
| ministra |
| prereq |
| professor |
A DDL (Data Definition Language) permite criar e modificar a estrutura de um banco de dados. Nesta seção, veremos os tipos de dados disponíveis em SQL e os comandos CREATE TABLE, ALTER TABLE e DROP TABLE.
Cada coluna de uma tabela deve ter um tipo de dado que determina quais valores ela pode armazenar. Os principais tipos do padrão SQL são:
| Tipo | Descrição | Exemplo |
|---|---|---|
CHAR(n) |
String de comprimento fixo com exatamente n caracteres | CHAR(5) para sigla 'ESETI' |
VARCHAR(n) |
String de comprimento variável com até n caracteres | VARCHAR(50) para nomes |
INT ou INTEGER |
Número inteiro (tipicamente 4 bytes) | 42, -7 |
SMALLINT |
Número inteiro menor (tipicamente 2 bytes) | 32767 |
NUMERIC(p, d) |
Número decimal com p dígitos no total e d após a vírgula | NUMERIC(4,1) para nota 9.5 |
REAL |
Número de ponto flutuante de precisão simples | 3.14 |
FLOAT(n) |
Ponto flutuante com pelo menos n dígitos de precisão | FLOAT(10) |
DATE |
Data no formato AAAA-MM-DD |
'2026-03-10' |
TIME |
Hora no formato HH:MM:SS |
'08:30:00' |
TIMESTAMP |
Data e hora combinadas | '2026-03-10 08:30:00' |
BOOLEAN |
Valor lógico TRUE ou FALSE |
TRUE |
A escolha do tipo de dado adequado é importante por duas razões: integridade (impede que valores inválidos sejam inseridos) e eficiência (tipos menores ocupam menos espaço e são processados mais rapidamente).
O comando CREATE TABLE define uma nova tabela no banco de dados. A sintaxe geral é:
| Restrição | Descrição |
|---|---|
PRIMARY KEY |
Identifica unicamente cada linha; implica NOT NULL e UNIQUE |
NOT NULL |
Impede que a coluna receba valor nulo |
UNIQUE |
Garante que todos os valores da coluna são distintos |
REFERENCES tabela(coluna) |
Define uma chave estrangeira (integridade referencial) |
CHECK (condição) |
Valida que o valor satisfaz a condição especificada |
DEFAULT valor |
Define um valor padrão quando nenhum é informado |
As tabelas devem ser criadas na ordem correta: primeiro as que não têm dependências, depois as que referenciam outras por chave estrangeira.
Tabela centro — sem chaves estrangeiras, criada primeiro:
Tabela escola — referencia centro:
Tabela curso — referencia escola:
Tabela professor — referencia escola:
Tabela aluno — referencia curso:
Tabela disciplina — referencia curso e exige carga horária positiva:
Tabela prereq — pré-requisitos entre disciplinas; chave primária composta e duas FKs para disciplina:
Tabela ministra — chave primária composta, referencia disciplina e professor:
Tabela matricula_disciplina — chave primária composta com chave estrangeira composta:
CREATE TABLE matricula_disciplina (
id_disciplina INTEGER NOT NULL,
ano INTEGER NOT NULL,
semestre INTEGER NOT NULL,
turma INTEGER NOT NULL,
id_aluno INTEGER REFERENCES aluno(id_aluno),
nota NUMERIC(4,1),
aprovado SMALLINT,
PRIMARY KEY (id_disciplina, ano, semestre, turma, id_aluno),
FOREIGN KEY (id_disciplina, ano, semestre, turma)
REFERENCES ministra(id_disciplina, ano, semestre, turma)
);Se tentarmos criar escola antes de centro, o banco de dados retornará um erro:
ERROR: relation "centro" does not exist
Isso ocorre porque REFERENCES centro(id_centro) exige que centro já exista.
O comando ALTER TABLE modifica a estrutura de uma tabela já existente:
O comando DROP TABLE remove uma tabela e todos os seus dados permanentemente:
DROP TABLE é uma operação irreversível. Todos os dados da tabela são perdidos permanentemente. Use com cautela em ambientes de produção.
Se outras tabelas referenciam a tabela removida por chave estrangeira, o comando falhará — a menos que CASCADE seja especificado.
O SQL permite validar valores na inserção com CHECK:
Se tentarmos adicionar NOT NULL a uma coluna que já possui valores nulos, o banco retorna erro:
A solução é primeiro preencher os valores nulos antes de aplicar a restrição.
| column_name | data_type | is_nullable | column_default |
|---|---|---|---|
| id_prof | integer | NO | NA |
| nome | character varying | NO | NA |
| id_escola | integer | YES | NA |
| ch_semanal | integer | NO | NA |
| salario | numeric | NO | NA |