Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

5 principais sintaxes de exclusão do MySQL com dicas para desenvolvedores T-SQL


Nossa jornada para o MySQL começou com CREATE TABLE seguido por INSERT. Hoje, estamos prosseguindo com a instrução MySQL DELETE. É quase tão comum quanto a instrução UPDATE do MySQL.

Como você está familiarizado com o T-SQL DELETE, o objetivo é torná-lo mais produtivo usando a sintaxe do MySQL. Existem pequenas diferenças nessas instruções DELETE, mas não há nada que você não possa lidar. Vamos começar.

Preparando os dados de amostra


Uma das necessidades mais comuns é a tarefa de exclusão de linha do MySQL. Vamos examiná-lo aqui, mas primeiro temos que preparar nossa área de trabalho. Para excluir quaisquer registros, primeiro precisamos tê-los. Assim, vamos construir um banco de dados no MySQL.

Estou me sentindo nostálgico com as séries de TV dos anos 80, então vou usar episódios de MacGyver e Quantum Leap para dados de amostra. Eu tenho o arquivo final do Excel para importar os dados para um novo banco de dados. Este arquivo tem 2 planilhas chamadas Títulos e Episódios . Vamos importá-los para duas tabelas.

Antes de importar dados, devemos criar um banco de dados chamado tv-series com duas tabelas chamadas Títulos e Episódios . O trabalho de criação de tabela do MySQL é elementar com a ferramenta adequada. Estou usando o dbForge Studio para MySQL e as Figuras 1 e 2 a seguir exibem a estrutura visual da tabela do meu banco de dados apresentada por essa ferramenta.

O script para as tabelas está abaixo:
CREATE DATABASE IF NOT EXISTS `tv-series`;

USE `tv-series`;

CREATE TABLE `tv-series`.titles (
  TitleID int NOT NULL AUTO_INCREMENT,
  Title varchar(50) DEFAULT NULL,
  `From` int DEFAULT NULL,
  `To` int DEFAULT NULL,
  PRIMARY KEY (TitleID)
)
ENGINE = INNODB,
AUTO_INCREMENT = 3,
AVG_ROW_LENGTH = 8192,
CHARACTER SET utf8mb4,
COLLATE utf8mb4_0900_ai_ci;

CREATE TABLE `tv-series`.episodes (
  EpisodeID int NOT NULL AUTO_INCREMENT,
  TitleID int DEFAULT NULL,
  EpisodeTitle varchar(100) DEFAULT NULL,
  AirDate date DEFAULT NULL,
  Synopsis text DEFAULT NULL,
  EpisodeNo int NOT NULL,
  SeasonNo int NOT NULL,
  PRIMARY KEY (EpisodeID)
)
ENGINE = INNODB,
AUTO_INCREMENT = 160,
AVG_ROW_LENGTH = 414,
CHARACTER SET utf8mb4,
COLLATE utf8mb4_0900_ai_ci;

ALTER TABLE `tv-series`.episodes
ADD INDEX IDX_episodes_TitleID (TitleID);

Após criar o banco de dados e as tabelas, podemos importar nossos dados do arquivo Excel.

A ferramenta mais simples e poderosa que usei para importar arquivos do Excel para o MySQL é o dbForge Studio for MySQL. Aprecio especialmente a adição de uma nova coluna como chave primária na tabela de destino. Além disso, o formato de data e hora de detecção automática é um ótimo suporte. Ele converte datas com um tipo de dados de texto e formatos de data estranhos sem aborrecimentos.

Como vamos comparar a sintaxe do MySQL com o T-SQL, você também pode importar o arquivo Excel para um novo banco de dados no SQL Server. Em seguida, use os mesmos nomes de banco de dados e tabelas do MySQL.

Mais informações

  • Ferramenta de importação e exportação MySQL no dbForge Studio para MySQL

1. Excluir todos os dados da tabela


Primeiro, o mais fácil. Vamos tentar fazer backup dos Episódios tabela e, em seguida, exclua os registros do backup. Vamos realizar a operação padrão de exclusão de todas as linhas do MySQL que você pode precisar fazer em diferentes situações.
CREATE TABLE episodes_backup AS
SELECT * FROM episodes;

DELETE FROM episodes_backup;

Como você vê, a sintaxe é a mesma do T-SQL. A consulta excluirá todos os registros no episodes_backup tabela.

Algumas notas para você:
  1. Se você precisar excluir várias linhas ou todas as linhas, TRUNCATE TABLE é mais rápido que DELETE sem uma cláusula WHERE. Isso vale tanto para o MySQL quanto para o SQL Server.
  2. Executar o código acima no MySQL Workbench acionará um Código de erro 1175 . Não é permitido porque o MySQL Workbench assume como padrão a atualização do modo de segurança. Assim, uma exclusão ou atualização de uma tabela sem uma cláusula WHERE não é permitida. No entanto, você pode desativar esse recurso em Preferências .

2. Excluir WHERE no MySQL


O segundo ponto é sobre o uso de DELETE com uma condição, a operação delete from select do MySQL. Dessa forma, você pode excluir um ou mais registros em uma única instrução, mas não todos. Por exemplo, exclua a primeira linha ou outras linhas/linhas específicas. E se você estiver procurando uma maneira de evitar registros duplicados no SQL? Usar a condição WHERE seria a solução.

Novamente, a sintaxe é a mesma no T-SQL:
-- Delete 1 record using an equality operator
DELETE FROM episodes
WHERE EpisodeID = 150;

-- Delete 3 records using IN
DELETE FROM episodes
WHERE EpisodeID IN (151,152,153);

Nada de extraordinário aqui, mas a próxima seção será diferente.

3. LIMITE DE EXCLUSÃO do MySQL


LIMITE? Qual LIMITE?

LIMIT é equivalente a TOP em T-SQL. Antes de termos um exemplo DELETE, vamos consultar os registros que vamos excluir. Confira o código abaixo:
SELECT * FROM episodes
WHERE year(AirDate) = 1987
ORDER BY SeasonNo, EpisodeNo
LIMIT 2;

Aqui está o seu LIMITE. Isso resultará em 2 registros conforme mostrado na Figura 3 para a visualização do cartão no dbForge Studio for MySQL:

Agora, vamos tentar excluí-los. Dê uma olhada no exemplo abaixo:
DELETE FROM episodes
WHERE year(AirDate) = 1987
ORDER BY SeasonNo, EpisodeNo
LIMIT 2;

Antes de excluir 2 episódios, o MySQL consultou todos os episódios de 1987. Em seguida, classificou-os em números de temporada e episódio. Por fim, limitou os resultados a 2 registros. Também é um método adequado quando precisamos excluir linhas duplicadas. Ele nos permite especificar as condições de exclusão e garantir que não excluiremos nada necessário (mas fazer um backup ainda garantiria a segurança dos dados).

Existe um equivalente T-SQL? Você acha que isso vai funcionar?
DELETE TOP (2) FROM episodes
WHERE year(AirDate) = 2020
ORDER BY SeasonNo, EpisodeNo
GO

Se você colar o código acima no SQL Server Management Studio, obterá linhas onduladas na cláusula ORDER BY. No entanto, TOP é permitido.

No entanto, se você remover a cláusula ORDER BY, sua consulta excluirá 2 registros aleatórios. Finalmente, o código acima não será executado conforme o esperado.

Para ter o mesmo resultado que no MySQL, você precisa do seguinte código:
DELETE FROM episodes
WHERE EpisodeID IN
(SELECT TOP 2 EpisodeID FROM Episodes
 WHERE YEAR(AirDate) = 1987
 ORDER BY SeasonNo, EpisodeNo)

É um pouco mais longo no T-SQL do que no MySQL. Mas há mais.

4. MySQL DELETE com JOIN


Outra maneira de excluir registros é usá-lo com um JOIN que filtrará os registros que você deseja excluir. Como muitos usuários definem, é a tarefa de junção de exclusão do MySQL. Nada parece diferente quando você não está usando um alias de tabela. Verifique o exemplo abaixo:
DELETE episodes
FROM episodes
INNER JOIN titles ON titles.TitleID = episodes.TitleID
WHERE titles.TitleID = 3
AND episodes.SeasonNo = 3;

Isso também funcionará em T-SQL. Mas se usarmos um alias de tabela como este:
DELETE episodes
FROM episodes e
INNER JOIN titles t ON t.TitleID = e.TitleID
WHERE t.TitleID = 3
AND e.SeasonNo = 3;

O MySQL lançará um erro. A sintaxe correta está abaixo:
DELETE e
FROM episodes e
INNER JOIN titles t ON t.TitleID = e.TitleID
WHERE t.TitleID = 3
AND e.SeasonNo = 3;

Observe a diferença!

5. Excluir subconsulta no MySQL


Finalmente, tentamos usar subconsultas. É uma maneira diferente de filtrar os registros que você deseja excluir. Você já viu o exemplo anterior, mas vamos tê-lo novamente:
DELETE FROM episodes
WHERE EpisodeID IN
(SELECT TOP 2 EpisodeID FROM Episodes
 WHERE YEAR(AirDate) = 1987
 ORDER BY SeasonNo, EpisodeNo)

Esta é uma sintaxe perfeitamente válida em T-SQL. Mas vai funcionar no MySQL? Vamos mudar um pouco:
DELETE FROM episodes
WHERE EpisodeID IN
(SELECT EpisodeID FROM Episodes
 WHERE YEAR(AirDate) = 1987
 ORDER BY SeasonNo, EpisodeNo
 LIMIT 2);

Ops! Parece que batemos na parede. Veja o que o MySQL diz:

Esta versão do MySQL ainda não suporta a subconsulta 'LIMIT &IN/ALL/ANY/SOME'

E se removermos a palavra-chave LIMIT? Ele aciona outro erro:

Você não pode especificar os 'episódios' da tabela de destino para uma atualização na cláusula FROM.

Existe uma solução alternativa? Alterar o código para uma subconsulta aninhada funcionará bem:
DELETE FROM episodes
WHERE EpisodeID IN
(SELECT EpisodeID FROM (SELECT EpisodeID FROM Episodes
 WHERE YEAR(AirDate) = 1987
 ORDER BY SeasonNo, EpisodeNo
 LIMIT 5) AS T)

Isso deve resolver. Mas vamos a um exemplo mais sensato:
DELETE FROM episodes
WHERE TitleID IN
(SELECT TitleID FROM titles
 WHERE `From` BETWEEN 1995 AND 2000);

Agora, qual é o grande problema com esses exemplos? Vamos ver:
  1. O MySQL não aceitará a instrução DELETE com um filtro de subconsulta usando a palavra-chave LIMIT. Ainda não.
  2. O MySQL não aceitará DELETE da tabela de destino igual à tabela de subconsulta que a filtra.

[id do formulário de envio=”13566″]

Conclusão


Até agora tudo bem. Você tem três comparações de sintaxe DELETE para MySQL e T-SQL. Espero que a terceira parte também seja útil para você no futuro.

Esta postagem destacou a sintaxe do MySQL ao excluir
  • Todos os registros,
  • 1 ou mais registros com uma cláusula WHERE,
  • Usando LIMIT,
  • Usando JOIN,
  • Usando subconsultas.

Você pode ver facilmente as formas de desempenho da tarefa de exclusão da coluna do MySQL ou excluir qualquer linha, várias linhas e registros específicos por condições.

Se você gostou deste post, sinta-se à vontade para compartilhá-lo em suas redes sociais favoritas. Deixe-nos também saber o que você pensa na seção de comentários abaixo.