sql >> Databasteknik >  >> RDS >> Mysql

TOP 5 MySQL Ta bort syntax med tips för T-SQL-utvecklare

Vår resa till MySQL började med CREATE TABLE följt av INSERT. Idag går vi vidare till MySQL DELETE-satsen. Det är nästan lika vanligt som MySQL UPDATE-satsen.

Eftersom du är bekant med T-SQL DELETE, är målet att göra dig mer produktiv med MySQL-syntaxen. Det finns mindre skillnader i dessa DELETE-satser, men det finns inget som du inte kan hantera. Låt oss komma igång.

Förbereda provdata

Ett av de vanligaste behoven är uppgiften MySQL radera rad. Vi ska undersöka det här, men först måste vi förbereda vårt arbetsområde. För att radera några poster måste vi först ha dem. Låt oss därför bygga en databas i MySQL.

Jag känner mig nostalgisk över tv-serier från 80-talet, så jag kommer att använda avsnitt från MacGyver och Quantum Leap för exempeldata. Jag har den sista Excel-filen för att importera data till en ny databas. Den här filen har 2 ark med namnet Titlar och avsnitt . Vi kommer att importera dem båda till två tabeller.

Innan vi importerar data bör vi komma med en databas som heter tv-serier med två tabeller som heter Titlar och avsnitt . MySQL skapa tabell-jobbet är elementärt med rätt verktyg. Jag använder dbForge Studio för MySQL, och följande figurer 1 och 2 visar den visuella tabellstrukturen för min databas som presenteras av det verktyget.

Manuset för tabellerna är nedan:

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);

Efter att ha skapat databasen och tabellerna kan vi importera våra data från Excel-filen.

Det mest enkla och kraftfulla verktyget jag använde för att importera Excel-filer till MySQL är dbForge Studio för MySQL. Jag uppskattar särskilt tillägget av en ny kolumn som en primärnyckel i måltabellen. Även formatet för automatisk identifiering av datum och tid är bra stöd. Den konverterar datum med en textdatatyp och konstiga datumformat utan krångel.

Eftersom vi ska jämföra MySQL-syntaxen med T-SQL kan du även importera Excel-filen till en ny databas på SQL Server. Använd sedan samma databas- och tabellnamn som i MySQL.

Mer information

  • MySQL-import- och exportverktyg i dbForge Studio för MySQL

1. Ta bort all data från tabellen

Först, det enklaste. Låt oss försöka säkerhetskopiera avsnitten tabell och radera sedan posterna för säkerhetskopieringen. Vi kommer att utföra den vanliga MySQL-borttagningen av alla rader som du kan behöva göra i olika situationer.

CREATE TABLE episodes_backup AS
SELECT * FROM episodes;

DELETE FROM episodes_backup;

Som du ser är syntaxen densamma som för T-SQL. Frågan kommer att radera alla poster i episodes_backup bord.

Några anteckningar till dig:

  1. Om du behöver ta bort flera rader eller alla rader är TRUNCATE TABLE snabbare än DELETE utan en WHERE-sats. Detta gäller för både MySQL och SQL Server.
  2. Om du kör ovanstående kod i MySQL Workbench utlöses en felkod 1175 . Det är inte tillåtet eftersom MySQL Workbench har som standard uppdatering i felsäkert läge. Således är en radering eller uppdatering av en tabell utan en WHERE-sats inte tillåten. Ändå kan du inaktivera den här funktionen i Inställningar .

2. Ta bort WHERE i MySQL

Den andra punkten handlar om att använda DELETE med ett villkor, MySQL delete från select operation. På så sätt kan du radera en eller flera poster i ett enda uttalande, men inte alla. Ta till exempel bort första raden eller andra specifika rader. Vad händer om du letar efter ett sätt att undvika dubbletter av poster i SQL? Att använda WHERE-villkoret skulle vara lösningen.

Återigen är syntaxen densamma i 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);

Inget extraordinärt här, men nästa avsnitt kommer att bli annorlunda.

3. MySQL DELETE LIMIT

BEGRÄNSA? Vilken LIMIT?

LIMIT motsvarar TOP i T-SQL. Innan vi har ett DELETE-exempel, låt oss fråga poster som vi ska radera. Kolla in koden nedan:

SELECT * FROM episodes
WHERE year(AirDate) = 1987
ORDER BY SeasonNo, EpisodeNo
LIMIT 2;

Här är din LIMIT. Det kommer att resultera i 2 poster som visas i figur 3 för kortvyn i dbForge Studio för MySQL:

Nu ska vi försöka ta bort dem. Ta en titt på exemplet nedan:

DELETE FROM episodes
WHERE year(AirDate) = 1987
ORDER BY SeasonNo, EpisodeNo
LIMIT 2;

Innan MySQL tog bort 2 avsnitt frågade MySQL alla avsnitt från 1987. Sedan sorterades de i säsong och avsnittsnummer. Slutligen begränsade det resultaten till 2 poster. Det är också en lämplig metod när vi behöver ta bort dubbletter av rader. Det låter oss specificera villkoren för radering och se till att vi inte raderar något nödvändigt (men att göra en säkerhetskopia skulle fortfarande ge datasäkerheten).

Finns det en T-SQL-motsvarighet? Tror du att det här kommer att fungera?

DELETE TOP (2) FROM episodes
WHERE year(AirDate) = 2020
ORDER BY SeasonNo, EpisodeNo
GO

Om du klistrar in ovanstående kod i SQL Server Management Studio kommer du att få snirkliga rader i ORDER BY-satsen. Ändå är TOP tillåtet.

Om du tar bort ORDER BY-satsen kommer din fråga dock att radera två slumpmässiga poster. Slutligen kommer ovanstående kod inte att köras som förväntat.

För att få samma resultat som i MySQL behöver du följande kod:

DELETE FROM episodes
WHERE EpisodeID IN
(SELECT TOP 2 EpisodeID FROM Episodes
 WHERE YEAR(AirDate) = 1987
 ORDER BY SeasonNo, EpisodeNo)

Det är lite längre i T-SQL än i MySQL. Men det finns mer.

4. MySQL DELETE med JOIN

Ett annat sätt att radera poster är att använda det med en JOIN som kommer att filtrera poster du vill ta bort. Som många användare definierar det är det MySQL delete join-uppgiften. Ingenting ser annorlunda ut när du inte använder ett tabellalias. Kontrollera exemplet nedan:

DELETE episodes
FROM episodes
INNER JOIN titles ON titles.TitleID = episodes.TitleID
WHERE titles.TitleID = 3
AND episodes.SeasonNo = 3;

Detta kommer också att fungera i T-SQL. Men om vi använder ett tabellalias så här:

DELETE episodes
FROM episodes e
INNER JOIN titles t ON t.TitleID = e.TitleID
WHERE t.TitleID = 3
AND e.SeasonNo = 3;

MySQL kommer att ge ett fel. Rätt syntax finns nedan:

DELETE e
FROM episodes e
INNER JOIN titles t ON t.TitleID = e.TitleID
WHERE t.TitleID = 3
AND e.SeasonNo = 3;

Observera skillnaden!

5. Ta bort underfråga i MySQL

Slutligen försöker vi använda underfrågor. Det är ett annat sätt att filtrera poster som du vill radera. Du har redan sett exemplet tidigare, men låt oss ta det igen:

DELETE FROM episodes
WHERE EpisodeID IN
(SELECT TOP 2 EpisodeID FROM Episodes
 WHERE YEAR(AirDate) = 1987
 ORDER BY SeasonNo, EpisodeNo)

Detta är helt giltig syntax i T-SQL. Men kommer det att fungera i MySQL? Låt oss ändra det något:

DELETE FROM episodes
WHERE EpisodeID IN
(SELECT EpisodeID FROM Episodes
 WHERE YEAR(AirDate) = 1987
 ORDER BY SeasonNo, EpisodeNo
 LIMIT 2);

hoppsan! Det verkar som om vi träffade väggen. Så här säger MySQL:

Denna version av MySQL stöder ännu inte "LIMIT &IN/ALL/ALL/NOG/SOME subquery"

Vad händer om vi tar bort sökordet LIMIT? Det utlöser ett annat fel:

Du kan inte ange måltabellen "avsnitt" för en uppdatering i FROM-satsen.

Finns det en lösning? Att ändra koden till en kapslad underfråga kommer att fungera bra:

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)

Det borde göra det. Men låt oss ta ett mer förnuftigt exempel:

DELETE FROM episodes
WHERE TitleID IN
(SELECT TitleID FROM titles
 WHERE `From` BETWEEN 1995 AND 2000);

Vad är grejen med dessa exempel? Låt oss se:

  1. MySQL accepterar inte DELETE-satsen med ett subquery-filter som använder nyckelordet LIMIT. Inte än.
  2. MySQL accepterar inte DELETE från måltabellen lika med underfrågetabellen som filtrerar den.

[sendpulse-form id=”13566″]

Slutsats

Än så länge är allt bra. Du har tre DELETE-syntaxjämförelser för MySQL och T-SQL. Jag hoppas att den tredje delen också kommer att vara användbar för dig i framtiden.

Det här inlägget framhävde MySQL-syntaxen vid borttagning

  • Alla poster,
  • 1 eller flera poster med en WHERE-sats,
  • Med LIMIT,
  • Med JOIN,
  • Använda underfrågor.

Du kan enkelt se hur MySQL-raderingskolumnen presterar, eller ta bort valfri rad, flera rader och specifika poster efter villkor.

Om du gillade det här inlägget får du gärna dela det på dina favoritplattformar för sociala medier. Låt oss också veta vad du tycker i kommentarsektionen nedan.


  1. Det går inte att infoga post i SQLite Database från Firebase Message Service när appen är i bakgrunden eller är stängt

  2. Kontrollera statusen för alla databaspostmeddelanden i SQL Server (T-SQL)

  3. Hur man åtgärdar "Begäran COMMIT TRANSACTION har ingen motsvarande BEGIN TRANSACTION" i SQL Server

  4. SCD typ 1