SQL, DDL, DML, DCL e controle de transações

SQL é uma linguagem para definir, consultar e controlar dados
Até aqui, construímos um esquema com relações, chaves, restrições e normalização. SQL é a linguagem usada para expressar essas estruturas e operar os dados mantidos por um sistema relacional.
Seu alcance é maior do que “fazer consultas”. Com SQL podemos:
- definir tabelas, domínios e restrições;
- consultar e transformar conjuntos de linhas;
- inserir, atualizar e excluir dados;
- conceder e retirar privilégios;
- delimitar unidades de trabalho que serão confirmadas ou desfeitas.
SQL é predominantemente declarativa: normalmente descrevemos o resultado desejado, e o SGBD escolhe um plano para obtê-lo. Em vez de programar um laço que percorra cada matrícula, declaramos qual conjunto deve ser lido ou alterado.
DDL, DML, DCL e TCL formam um mapa didático
As siglas ajudam a organizar intenções, mas não constituem compartimentos universais. Documentações e cursos podem classificar o mesmo comando de maneira diferente. SELECT, por exemplo, aparece como DQL — Data Query Language — em algumas classificações e como parte de DML em outras.
| Família didática | Pergunta principal | Exemplos frequentes |
|---|---|---|
| DDL | Qual estrutura e quais regras existirão? | CREATE, ALTER, DROP, TRUNCATE |
| DML | Quais dados serão lidos ou modificados? | SELECT, INSERT, UPDATE, DELETE, MERGE |
| DCL | Quem pode realizar determinada ação? | GRANT, REVOKE |
| TCL | Quais operações formam uma unidade confirmada ou desfeita? | START TRANSACTION, COMMIT, ROLLBACK, SAVEPOINT |
Use a tabela como orientação de estudo. Para comportamento real, consulte a referência do comando no SGBD utilizado.
DDL define a estrutura e as regras
Data Definition Language reúne comandos que criam, modificam ou removem objetos do esquema. Tabelas são apenas um exemplo: o SGBD pode oferecer visões, sequências, índices, tipos, funções, esquemas e outros objetos.
CREATE inicia um objeto
O esquema normalizado da aula anterior pode começar assim:
CREATE TABLE trilha (
trilha_id bigint GENERATED ALWAYS AS IDENTITY,
titulo text NOT NULL,
situacao text NOT NULL,
publicada_em date,
CONSTRAINT trilha_pk PRIMARY KEY (trilha_id),
CONSTRAINT trilha_situacao_ck
CHECK (situacao IN ('rascunho', 'publicada', 'arquivada'))
);
Essa instrução não insere uma trilha. Ela define o formato das linhas e as condições que qualquer linha futura deverá respeitar. Os nomes explícitos das constraints facilitam migrações e diagnóstico de erros.
ALTER evolui um objeto existente
ALTER TABLE trilha
ADD COLUMN slug text;
ALTER TABLE trilha
ADD CONSTRAINT trilha_slug_uq UNIQUE (slug);
Alterar uma tabela já preenchida exige planejamento. Adicionar NOT NULL sem preparar linhas antigas, mudar um tipo incompatível ou criar unicidade sobre duplicações existentes pode falhar. Em produção, avalie volume, bloqueios, compatibilidade da aplicação e estratégia de reversão.
DROP remove a definição
DROP TABLE trilha;
TRUNCATE costuma ser apresentado junto de DDL porque esvazia a tabela como operação estrutural em vários materiais, mas classificação e comportamento transacional variam. O que importa operacionalmente é saber o que será removido, quais referências participam e se o SGBD permite reversão.
DML consulta e modifica conjuntos de linhas
Data Manipulation Language opera o estado armazenado nos objetos existentes.
INSERT cria linhas
INSERT INTO trilha (titulo, situacao, publicada_em)
VALUES ('Banco de Dados e SQL', 'publicada', DATE '2026-08-30');
Listar as colunas torna a intenção explícita e reduz o acoplamento com a ordem física da definição. Defaults e colunas de identidade continuam sendo aplicados pelo banco.
SELECT produz uma relação de resultado
SELECT trilha_id, titulo
FROM trilha
WHERE situacao = 'publicada'
ORDER BY titulo;
O resultado também possui linhas e colunas. A consulta não altera os dados nesse exemplo. Filtros, ordenação, aliases e NULL serão aprofundados na próxima aula.
UPDATE modifica as linhas selecionadas
UPDATE trilha
SET situacao = 'arquivada'
WHERE trilha_id = 42;
DELETE remove as linhas selecionadas
DELETE FROM trilha
WHERE trilha_id = 42;
O alcance de UPDATE e DELETE é definido pela condição. Sem WHERE, todas as linhas elegíveis são afetadas.
MERGE decide a ação por correspondência
O padrão SQL e diversos produtos oferecem MERGE para comparar uma origem com um destino e escolher ações como inserção, atualização ou exclusão. A sintaxe, as condições permitidas e detalhes de concorrência variam. Não substitua uma sequência bem entendida por MERGE apenas para reduzir linhas de código.
SQL trabalha com conjuntos
Uma instrução pode afetar zero, uma ou muitas linhas. Isso muda a forma de raciocinar:
UPDATE matricula
SET situacao = 'concluida'
WHERE progresso = 100
AND situacao <> 'concluida';
Não há um laço explícito por matrícula. A condição define o conjunto e o SGBD decide como localizá-lo. O retorno “1 linha afetada” ou “10 mil linhas afetadas” não muda a natureza da instrução.
Os três componentes essenciais são:
- alvo: qual relação será consultada ou modificada;
- expressão: quais valores serão lidos ou produzidos;
- predicado: quais linhas pertencem ao conjunto.
DCL controla privilégios sobre objetos
Data Control Language é o agrupamento didático de comandos que concedem ou retiram capacidades. Em vez de entregar acesso amplo a toda aplicação, atribuímos somente os privilégios necessários.
No PostgreSQL, usuários e grupos são representados por roles. Um exemplo simplificado seria:
CREATE ROLE leitor_catalogo;
GRANT SELECT
ON TABLE trilha
TO leitor_catalogo;
REVOKE INSERT, UPDATE, DELETE
ON TABLE trilha
FROM leitor_catalogo;
CREATE ROLE é colocado por alguns materiais em DDL por criar um objeto, enquanto GRANT e REVOKE são associados a DCL. A fronteira reforça por que as siglas não substituem a documentação.
Privilégios podem existir em níveis diferentes: banco, esquema, tabela, sequência, função e até colunas, dependendo do produto. Também há distinção entre:
- possuir um objeto;
- ter um privilégio sobre ele;
- poder conceder esse privilégio a terceiros;
- herdar capacidades de outra role;
- acessar uma tabela por meio de uma visão ou função.
O princípio do menor privilégio orienta a concessão: a role da aplicação não deve ser proprietária de todas as tabelas nem possuir poderes administrativos por conveniência. Migrações, leitura analítica e operação da aplicação podem usar papéis distintos.
TCL delimita a unidade de trabalho
Transaction Control Language reúne, na classificação didática, comandos que iniciam, confirmam, desfazem ou marcam pontos dentro de uma transação.
Considere a matrícula de um estudante e o registro de auditoria correspondente:
START TRANSACTION;
INSERT INTO matricula (
estudante_id,
trilha_id,
matriculada_em,
situacao
)
VALUES (18, 7, CURRENT_DATE, 'ativa');
INSERT INTO evento_auditoria (
tipo,
entidade_id,
ocorrido_em
)
VALUES ('matricula_criada', 18, CURRENT_TIMESTAMP);
COMMIT;
COMMIT torna permanentes os efeitos da unidade de trabalho. Se a segunda inserção falhar e as duas operações precisarem ser indivisíveis, a aplicação deve executar ROLLBACK em vez de confirmar uma matrícula sem auditoria.
SAVEPOINT oferece reversão parcial
START TRANSACTION;
UPDATE matricula
SET situacao = 'concluida'
WHERE estudante_id = 18
AND trilha_id = 7;
SAVEPOINT antes_do_certificado;
INSERT INTO certificado (estudante_id, trilha_id, emitido_em)
VALUES (18, 7, CURRENT_TIMESTAMP);
ROLLBACK TO SAVEPOINT antes_do_certificado;
COMMIT;
Nesse exemplo didático, a inserção posterior ao savepoint é desfeita, enquanto a alteração anterior pode ser confirmada. Isso só é correto se a regra do negócio aceitar conclusão sem certificado; transações devem refletir uma unidade semântica, não apenas agrupar comandos próximos.
Autocommit muda a fronteira percebida
Clientes e ferramentas frequentemente operam em autocommit: cada instrução executada fora de um bloco explícito é confirmada ao terminar com sucesso. Executar dois comandos em sequência não significa que formem automaticamente uma única transação.
Verifique:
- configuração do driver ou ferramenta;
- ponto em que a aplicação inicia e encerra a transação;
- comportamento depois de uma exceção;
- limites impostos por procedures, conexões e pools;
- diferenças do SGBD para DDL.
As propriedades ACID, anomalias de concorrência e níveis de isolamento terão aulas próprias. Aqui, o objetivo é reconhecer os comandos e não confundir “executei em sequência” com “confirmei atomicamente”.
DDL dentro de transações varia entre SGBDs
Não assuma que CREATE, ALTER ou DROP obedeçam à mesma regra transacional em todos os produtos.
No PostgreSQL, muitas alterações de esquema participam de transações, embora existam exceções e efeitos não transacionais em recursos específicos. No Oracle Database, instruções DDL normalmente provocam COMMIT implícito antes e depois da execução. Uma migração que pode ser revertida num produto talvez não possa ser tratada da mesma maneira em outro.
Antes de executar uma migração:
- consulte a documentação da versão e do comando;
- teste numa cópia representativa;
- verifique bloqueios e duração;
- prepare avanço e recuperação, não apenas um script inverso;
- monitore a aplicação durante a mudança.
Sintaxe básica: palavras, identificadores e valores
Uma instrução combina palavras-chave, identificadores, literais, operadores e delimitadores:
SELECT titulo
FROM trilha
WHERE publicada_em >= DATE '2026-01-01';
SELECT,FROM,WHEREeDATEsão palavras-chave;titulo,trilhaepublicada_emsão identificadores;'2026-01-01'participa de um literal de data;>=é um operador;;encerra a instrução em muitas ferramentas.
Palavras-chave não precisam estar em maiúsculas, mas a convenção melhora a leitura. Identificadores delimitados, sensibilidade a maiúsculas, tipos e funções variam; evite depender de grafias exóticas sem necessidade.
Comentários ajudam em scripts revisáveis:
-- Publica somente a trilha aprovada nesta operação.
UPDATE trilha
SET situacao = 'publicada'
WHERE trilha_id = 7
AND situacao = 'rascunho';
O comentário deve explicar a intenção ou a condição de segurança, não repetir palavra por palavra o comando.
Valores externos devem ser parametrizados
Uma aplicação não deve montar SQL concatenando dados recebidos:
"SELECT ... WHERE email = '" + entrada + "'"
Esse padrão mistura código e dado e abre espaço para injeção de SQL. Use parâmetros do driver:
SELECT estudante_id, nome
FROM estudante
WHERE email = $1;
$1 é a forma usada por clientes PostgreSQL; outros drivers usam ?, :email ou parâmetros nomeados. O princípio é o mesmo: o texto SQL e o valor seguem canais separados.
Parâmetros representam valores, não qualquer parte da gramática. Nome de tabela, direção de ordenação ou palavra-chave normalmente exigem uma escolha controlada pela aplicação, baseada numa lista permitida — não a entrada livre do usuário.
Um fluxo seguro para escrever e executar SQL
- Declare o objetivo em linguagem de negócio.
- Identifique o objeto, conjunto de linhas e privilégios necessários.
- Consulte a documentação da versão do SGBD.
- Escreva o comando com colunas e condições explícitas.
- Parametrize valores vindos de fora.
- Teste com dados fictícios e casos-limite.
- Para alterações, visualize antes o conjunto afetado.
- Defina a fronteira transacional e a resposta a falhas.
- Execute com uma role de menor privilégio.
- Confira quantidade afetada, resultado e logs.
Erros comuns
- tratar SQL apenas como linguagem de consulta: definição, privilégios e transações também fazem parte do seu alcance;
- decorar siglas como norma universal: classificações variam entre materiais e produtos;
- presumir que toda instrução afeta uma linha: SQL opera conjuntos;
- executar
UPDATEouDELETEsem conferir o predicado: a ausência deWHEREpode atingir todas as linhas; - usar a role proprietária na aplicação: amplia desnecessariamente o impacto de uma falha;
- confundir autenticação com autorização: conectar não significa poder acessar qualquer objeto;
- achar que dois comandos consecutivos formam uma transação: autocommit pode confirmar cada um separadamente;
- supor que DDL sempre aceita rollback: o comportamento depende do SGBD e do comando;
- concatenar valores em SQL: parâmetros separam dados da gramática;
- usar extensões sem identificá-las: portabilidade exige distinguir padrão e recurso do fornecedor.
O que você deve guardar
SQL é uma linguagem ampla para definir estruturas, operar conjuntos de dados, controlar privilégios e delimitar transações. DDL, DML, DCL e TCL são um mapa de intenções, não uma taxonomia rígida. A referência do SGBD determina sintaxe, compatibilidade e efeitos reais.
Comandos trabalham em conjunto: DDL cria uma tabela e suas restrições; DML consulta ou altera suas linhas; DCL define quem pode agir; TCL decide quais alterações permanecem como unidade. Segurança depende de predicados explícitos, parâmetros, menor privilégio, transações bem delimitadas e validação do resultado.
Na próxima aula, aprofundaremos SELECT, filtros, ordenação, aliases e valores NULL.
Referências
- ISO — ISO/IEC 9075-1:2023, Database languages SQL — Framework. Acesso em 30 ago. 2026.
- ISO — ISO/IEC 19075-10:2024, Guidance for the SQL model. Acesso em 30 ago. 2026.
- PostgreSQL Global Development Group — The SQL Language. Acesso em 30 ago. 2026.
- PostgreSQL Global Development Group — Data Definition. Acesso em 30 ago. 2026.
- PostgreSQL Global Development Group — SQL Commands. Acesso em 30 ago. 2026.
- PostgreSQL Global Development Group — Privileges. Acesso em 30 ago. 2026.
- PostgreSQL Global Development Group — START TRANSACTION. Acesso em 30 ago. 2026.
- Oracle — About Data Definition Language statements. Acesso em 30 ago. 2026.
