Voltar para a lista de artigos Artigos
6 minutos de leitura

O que é a Declaração DELETE em SQL?

Este artigo explicará o uso da declaração DELETE, um dos principais métodos de remoção de registros existentes de seu banco de dados. Em primeiro lugar, vamos analisar a sintaxe, seguida de alguns exemplos fáceis de entender.

A declaração DELETE em SQL é extremamente útil. Ela permite que você remova quaisquer dados obsoletos ou "ruins" de seu banco de dados. Você deve ter cuidado ao usar a declaração DELETE, pois a operação não é reversível. Não haverá caixa de diálogo solicitando que você confirme a operação. Assim que você executar uma consulta DELETE, os dados desaparecerão - para sempre!

A declaração DELETE é conhecida como um comando de manipulação de dados. Este artigo cobre os outros comandos deste tipo, que são INSERIR e ATUALIZAR.

Vamos explorar a sintaxe do SQL DELETE.

Sintaxe do SQL DELETE

A sintaxe da declaração do DELETE é a seguinte:

DELETE FROM  [WHERE ]

A tabela da qual você gostaria de excluir dados vem após a declaração DELETE.

Os colchetes indicam que esta cláusula WHERE é inteiramente opcional. Mas na prática, você usará esta cláusula quase sempre - se você não incluir uma cláusula WHERE, todos os dados da tabela serão excluídos.

É por isso que é sempre uma boa idéia usar SELECT para visualizar os dados que você gostaria de excluir. Quando o resultado de sua consulta SELECT for igual aos dados que você pretende excluir, basta substituir o SELECT em sua consulta pela declaração DELETE. Cada outra parte de sua consulta pode permanecer a mesma. Isto garantirá que você não apague acidentalmente alguns dados vitais por engano.

Isto conclui nosso olhar sobre a sintaxe do SQL DELETE. É hora de olhar alguns exemplos práticos, que demonstrarão alguns usos diferentes da declaração DELETE e tocar em algumas questões de permissão que você pode enfrentar.

Permissões SQL DELETE

Antes de rever nossos exemplos, é importante observar que (dependendo do dialeto SQL que você usa) você pode ter que alterar as permissões do usuário para que possa modificar os registros com a declaração DELETE.

Por padrão, o MySQL Workbench inicia em modo seguro; você não pode usar UPDATE ou DELETE sem uma condição WHERE.

Por exemplo, ao utilizar o MySQL você encontrará a mensagem: "Você está utilizando o modo de atualização seguro e tentou atualizar uma tabela sem uma coluna ONDE utiliza uma coluna KEY". Para desativar o modo seguro, alterne a opção em Preferências → Editor SQL e reconecte".

Para retificar isto, você tem duas opções.

  1. Mude suas configurações dessa forma:
    1. Ir para Edit →
    2. Clique na aba Editor SQL e desmarque a caixa de seleção Safe Updates.
    3. Clique em Query → Reconectar ao Servidor.
    4. Execute sua consulta SQL.
  2. Ou você pode executar a seguinte consulta:
    SET SQL_SAFE_UPDATES = 0;

Após completar qualquer uma destas opções, você deve poder usar DELETE para remover os dados de suas tabelas.

Agora, passemos aos exemplos!

Exemplos SQL DELETE

DELETE simples

Imagine que estamos mantendo um banco de dados de funcionários e acabamos de saber que alguns de nossos funcionários deixaram a empresa. Vamos removê-los de nosso employees mesa. Vamos dar uma olhada no estado atual desta mesa:

employee_idfirst_namelast_nameage
1JohnLennon34
2PaulMcCartney36
3GeorgeHarrison41
4RingoStarr49

Imagine que tivemos que retirar George Harrison e Ringo Starr de nossa mesa. Quais são nossas opções?

Devemos nos certificar dos valores da coluna employee_id antes de remover estes registros. Depois de fazermos isso, a consulta DELETE ficaria assim:

DELETE FROM employees
WHERE employee_id = 3 OR employee_id = 4

Isto removeria George e Ringo da nossa mesa com sucesso.

Você também pode especificar uma única condição que capturaria estes dois registros de uma só vez. Neste caso, como tanto George e Ringo têm mais de 40 anos de idade, poderíamos usar a coluna age:

DELETE FROM employees
WHERE age > 40

A execução desta consulta nos deixará com os seguintes registros em nossa employees mesa.

employee_idfirst_namelast_nameage
1JohnLennon34
2PaulMcCartney36

Nossos registros foram apagados com sucesso! Se você quiser ver mais exemplos de DELETE, verifique este artigo do livro de receitas, que mostra como excluir uma única ou várias linhas de dados.

Vamos a seguir considerar um exemplo mais avançado que usa uma subconsulta para apagar dados.

Subconsulta DELETE

Você também pode excluir dados de suas tabelas usando subconsultas. Uma subconsulta é quando uma consulta é usada como parte de outra. Você pode saber mais sobre subconsultas lendo este artigo para iniciantes. Vamos ver um cenário onde podemos usar um DELETE com uma subconsulta.

Vamos usar nossa employees tabela novamente:

employee_idfirst_namelast_nameage
1JohnLennon34
2PaulMcCartney36
3GeorgeHarrison41
4RingoStarr49

Também temos uma sales_team tabela que contém registros para todos no departamento de vendas da empresa:

idfirst_namelast_name
1JohnLennon
3GeorgeHarrison

Acabamos de receber a terrível notícia de que a equipe de vendas está sendo liberada. É nosso trabalho atualizar a employees e sales_team tabelas.

Vou demonstrar como uma subconsulta pode nos ajudar neste cenário em particular. Aqui está a pergunta:

DELETE FROM employees
WHERE employee_id 
IN (SELECT id
FROM sales_team)

Ok, vamos quebrar isto.

A consulta entre parênteses (ou seja, a subconsulta) retorna todos os valores id da tabela de sales_team mesa:

SELECT id FROM sales_team

Esta consulta nos dá os valores 1 e 3.

Vejamos a parte DELETE da consulta principal:

DELETE FROM employees
WHERE employee_id 
IN...

Repare na cláusula WHERE. Nesta parte da consulta, estamos procurando excluir registros onde o employee_id está nos resultados de nossa subconsulta. Lembre-se da subconsulta avaliada para 1 e 3. Portanto, esta consulta é avaliada para:

DELETE FROM employees
WHERE employee_id 
IN (1,3)

Suponha que executamos a consulta completa e utilizamos a consulta SELECT abaixo para visualizar os resultados:

SELECT employee_id, first_name, last_name, age
FROM employees

Isto é o que obtemos:

employee_idfirst_namelast_nameage
2PaulMcCartney36
4RingoStarr49

Aí a temos! A equipe de vendas foi removida com sucesso da employees mesa. Você pode ver como uma subconsulta foi útil para este caso de uso.

Este tem sido um caso de uso um pouco mais avançado. Ao discutir a declaração DELETE, vale a pena mencionar as declarações TRUNCATE e DROP:

  • TRUNCATE é mais rápida que DELETE, pois não escaneia a tabela antes de remover os registros. Devido a este fato, ela não pode ser usada com a condição WHERE ou dizer quantas linhas foram apagadas quando a operação está completa.
  • O comando DROP TABLE removerá tudo o que tem a ver com aquela tabela: a definição da tabela e todos os índices relacionados, gatilhos e restrições.

Para saber mais sobre estes dois métodos de remoção de dados, leia este artigo sobre como usar subconsultas com INSERT, UPDATE, e DELETE. Você também pode conferir este artigo que discute a diferença entre DELETE, TRUNCATE, e DROP.

Eliminação de chaves primárias e restrições de chaves estrangeiras

Mais uma coisa que devemos discutir são as restrições da chave primária (PK) e da chave estrangeira (FK). Ao trabalhar em exemplos menores como os mostrados neste artigo, você não terá que se preocupar com as restrições de PK e FK. Mas se você trabalhar com um grande banco de dados já existente, com certeza você os encontrará.

Ao excluir dados de uma tabela, você também pode querer remover quaisquer restrições associadas aos dados dessa tabela. Verifique os exemplos a seguir se isto se aplica a você:

  • Este exemplo lhe mostra como apagar uma chave primária.
  • Este exemplo mostra como eliminar uma restrição de chave estrangeira.

Mantenha seus dados relevantes com o SQL DELETE

Isso conclui nosso olhar abrangente sobre a declaração SQL DELETE. Demonstramos sua sintaxe e exploramos os usos potenciais deste comando através de vários exemplos.

Se você gostaria de uma educação mais abrangente sobre SQL, confira nossa faixa de aprendizagem SQL A-Z que ensina o básico e depois avança para tópicos mais avançados.