O ponto e vírgula: quando apertar esse botão
Muita gente usa ponto e vírgula como se fosse um ponto final com atitude, mas na prática ele tem uma função bem específica no SQL e em outras linguagens. Primeiro, a regra básica. O ponto e vírgula marca o fim de uma instrução. Sem ele, o interpretador não sabe onde a query termina e começa a reclamar. No MySQL, por exemplo, você pode rodar múltiplas instruções sem ponto e vírgula entre elas usando o comando DELIMITER, mas isso é exceção, não regra. Na maioria dos casos, cada_statement_ precisa terminar com ;
qdo usar ponto e virgula
Aqui vai o que realmente importa: use ponto e vírgula sempre que você estiver executando instruções independentes, uma após a outra. SELECT; INSERT; UPDATE; DELETE. Cada uma é um bloco fechado. Se você escrever dois SELECTs sem separá-los, o engine vai tentar analisar tudo como uma coisa só e vai dar erro de sintaxe. Já vi pessoal passar meia hora debugging porque esqueceu o ponto e vírgula entre um CREATE TABLE e um INSERT. O ponto e vírgula também é obrigatório em transações com múltiplas operações. Assim:
BEGIN WORK;
UPDATE pedidos SET status = 'enviado' WHERE id = 1042;
UPDATE estoque SET quantidade = quantidade - 1 WHERE produto_id = 789;
COMMIT; Cada linha é executada como uma instrução distinta dentro da transação. Tirar o ponto e vírgula do UPDATE de estoque e fazer o COMMIT junto transforma tudo num único bloco malformado e o banco recusa.
👉 Clique no botão abaixo para saber mais sobre o assunto!
Agora o caso prático que me deu trabalho. Em um projeto recente, estávamos importando dados massivos usando um script Python que montava queries dinamicamente. As queries vinham de templates onde os desenvolvedores frequentemente colocavam ponto e vírgula no final, mas às vezes esqueciam. Quando o script chamava cursor.executemany(), o psycopg2 simplesmente ignorava o ponto e vírgula extra — mas se você usava cursor.execute() com string solta, o banco podia ou não aceitar dependendo da versão. A solução foi padronizar: nunca colocar ponto e vírgula nas strings passed para execute, deixar o driver cuidar disso. Isso eliminou erros intermitentes que demoraram três dias para identificar. Outra nuance que pouca gente mencionou: em stored procedures e funções, o ponto e vírgula é usado como terminador de statement_ dentro do corpo, mas não no final do CREATE PROCEDURE inteiro. A declaração CREATE em si não leva ponto e vírgula após o fechamento do END. Se você colocar, algumas engines tratam como uma nova instrução e geram erro de sintaxe estranho. Use DELIMITER para trocar o terminador durante a definição do procedure e volte ao normal depois. É chato, mas funciona consistentemente.
Há situações onde o ponto e vírgula é opcional ou até problemático. Em interactive shells como o psql, uma linha em branco ou um Ctrl+D também encerram a instrução. Em ferramentas de migração como Flyway ou Liquibase, cada arquivo SQL é tratado como um batch e o ponto e vírgula no final do arquivo pode causar comportamento diferente dependendo do driver JDBC usado. Às vezes funciona, às vezes trava a execução. Teste no seu ambiente específico antes de confiar cegamente. O que eu recomendo na prática é simples: use ponto e vírgula no final de cada statement_ isolado, evite depender de comportamentos implícitos do driver ou da ferramenta, e documente o padrão no time. Ter gente usando de um jeito e outra de outro gera inconsistência que vira dor de cabeça em produção. Um script de lint SQL ou uma configuração no IDE que sinaliza ausência de ponto e vírgula economiza horas de troubleshooting mensal.
Se o seu sistema não suporta ponto e vírgula como terminador padrão — alguns ORMs e abstrações de banco removem isso automaticamente — o caminho é aprender a sintaxe específica daquela ferramenta. Não adianta insistir no padrão SQL padrão se a camada de abstração resolve isso de forma diferente por baixo. Verifique a documentação do driver que você está usando antes de assumir qualquer coisa. Resumindo de forma útil: ponto e vírgula termina statement_, não query complexa com subcláusulas. Dentro de um único SELECT com JOINs, subqueries e CTEs, não se coloca ponto e vírgula no meio. Só entre instruções distintas. Fora isso, trate o ponto e vírgula como parte do contrato com o banco e seja consistente.