O comando DELETE exclui da tabela especificada as linhas que satisfazem a cláusula WHERE. Se a cláusula WHERE estiver ausente, o efeito será excluir todas as linhas da tabela. O resultado será uma tabela válida, porém vazia.
Dica: O comando TRUNCATE é uma extensão do PostgreSQL que fornece um mecanismo mais rápido para excluir todas as linhas da tabela.
Por padrão, o comando DELETE exclui linhas da tabela especificada e de todas as suas tabelas descendentes. Se for desejado excluir linhas apenas da tabela especificada, deve ser utilizada a cláusula ONLY.
É necessário possuir o privilégio DELETE na tabela para excluir linhas da mesma, assim como o privilégio SELECT para todas as tabelas cujos valores são lidos pela condição.
O nome (opcionalmente qualificado pelo esquema) de uma tabela existente.
Uma expressão retornando um valor do tipo boolean, que determina as linhas a serem excluídas.
Ao término bem-sucedido, o comando DELETE retorna uma linha de fim de comando na forma
DELETE contador
O contador é o número de linhas excluídas. Se contador for igual a 0, então nenhuma linha correspondeu à condição (isto não é considerado um erro).
O PostgreSQL permite que se faça referência a colunas de outras tabelas na condição WHERE. Por exemplo, para excluir todos os filmes produzidos por um determinado produtor pode ser utilizado:
DELETE FROM filmes WHERE filmes.id_produtor = produtores.id_produtor AND produtores.nome = 'foo';
Essencialmente o que acontece neste comando é uma junção entre as tabelas filmes e produtores, com todas as linhas de filmes juntadas com sucesso sendo marcadas para exclusão. Esta sintaxe não é padrão. Uma forma mais padrão de se fazer isto é:
DELETE FROM filmes WHERE id_produtor IN (SELECT id_produtor FROM produtores WHERE nome = 'foo');
Em alguns casos o estilo junção é mais fácil de ser escrito ou mais rápido de executar do que o estilo subseleção. Uma objeção ao estilo junção é que não existe uma lista explícita de quais tabelas estão sendo utilizadas, o que torna este estilo propenso a erros; também não pode tratar autojunções.
Excluir todos os filmes, exceto os musicais:
DELETE FROM filmes WHERE tipo <> 'Musical';
Limpar a tabela filmes:
DELETE FROM filmes;