sql >> Databasteknik >  >> RDS >> Sqlserver

SQL Server Delete Statement:Hur man tar bort en eller multiplicerar rader från tabellen

Rätt tillämpning av DELETE-satsen för borttagning av data är avgörande, och det involverar många problem. Ändå finns det standardpraxis för användningen av DELETE-satsen som förenklar alla sådana uppgifter.

Den här artikeln kommer att utforska några av scenarierna för yrkeslivet för att förse dig med de mest användbara tipsen för att använda DELETE-satsen korrekt. Du kan ta bort data från en tabell på olika sätt. Utforska skillnaden mellan DELETE och TRUNCATE i SQL Server som har täckts med praktiska exempel.

T-SQL Ta bort Kommando Grunderna

Först och främst bör vi bekanta oss med T-SQL Delete-satsen på enklast möjliga sätt.

Delete-satsen, som namnet indikerar, är en sats som hjälper oss att radera data från databastabellen.

Ett bord är en struktur som du skapar i en databas för att lagra dina data. Till exempel kan vi ha en tabell med böcker för att lagra poster relaterade till dessa böcker.

En databas är en organiserad samling av data och datastrukturerna för att hålla dessa data. Data kan med andra ord lagras i databasen i form av tabeller.

Hur man tar bort en rad eller flera rader

Vi kan ta bort en eller flera poster (allmänt kända som rader) från en tabell med hjälp av delete-satsen.

Delete-satsen tar bort vissa eller alla data (rader) från en tabell.

Enligt Microsofts dokumentation tar Delete-satsen bort en eller flera rader från en tabell eller vy i SQL Server.

Man kan undra hur satsen definierar om en del eller alla data (rader) ska tas bort från en tabell. Svaret ligger i kriterierna eller villkoren som anger vad som måste tas bort.

Ta bort kommando i SQL Server

Den enklaste syntaxen för uttalandet är följande:

Delete FROM <TableName> WHERE <Condition>

Du måste ange tabellnamnet och kriterierna/villkoret för radering av data (rader) från tabellen.

Obs:Det är viktigt att använda DELETE-satsen med ett villkor (WHERE-klausul) även om villkorskravet inte är ett måste.

Om du kör kommandot DELETE table utan WHERE-villkoret kommer du att radera alla rader (data) från tabellen. Gör det därför till en vana att använda villkoret WHERE om du inte vill ta bort alla rader.

Kompatibilitet

Detta uttalande är kompatibelt med många versioner av SQL Server, inklusive följande:

  1. SQL Server 2012 och senare versioner.
  2. Molnbaserad SQL Server Database (Azure SQL Database).
  3. Molnbaserat SQL Data Warehouse (Azure Synapse Analytics).

Steg-för-steg checklista för att ta bort rader från tabellen

Nu ska vi utforska användningen av Delete-satsen med flera praktiska scenarier.

Sammanfattning av steg

  1. Konfigurera en exempeldatabas.
  2. Visa data.
  3. Ta bort data.
  4. Sätt tillbaka mer data i tabellen.
  5. Visa data före radering.
  6. Hur man tar bort data i en kolumn baserat på ett villkor.
  7. Visa data efter radering.
  8. Sätt tillbaka mer data i tabellen.
  9. Visa data före radering.
  10. Ta bort data baserat på ett annat villkor.
  11. Visa data efter radering.
  12. Sätt tillbaka data i tabellen.
  13. Radera data baserat på två villkor den här gången.
  14. Visa data efter radering.

Konfigurera exempeldatabas (BooksSample)

Vi behöver en exempeldatabas för att testa och köra skripten. Först måste vi ställa in den exempeldatabasen, som täcker följande steg:

  1. Skapa en exempeldatabas.
  2. Skapa en tabell i exempeldatabasen.
  3. Infoga data (två rader) i databastabellen.

Öppna SQL Server Management Studio eller dbForge Studio för SQL Server och kör följande skript för att ställa in exempeldatabasen:

-- Connect to the 'master' database to run this snippet
USE master
GO
-- Create a new database if it does not already exist
IF NOT EXISTS (
    SELECT [name]
FROM sys.databases
WHERE [name] = N'BooksSample'
)
CREATE DATABASE BooksSample
GO

USE BooksSample

-- Create the table book
CREATE TABLE [dbo].[Book]
(
    [BookNumber] INT NOT NULL PRIMARY KEY,-- Primary Key column
    [Title] VARCHAR(150) NOT NULL,
    [Stock] SMALLINT NOT NULL
    
);
GO

-- Insert rows into table 'Book' 
INSERT INTO [dbo].[Book]
    ( -- Columns to insert data into
    [BookNumber], [Title], [Stock]
    )
VALUES
    ( -- First row: values for the columns in the list above
        1, 'Learn SQL in 7 Days', 50
),
    ( -- Second row: values for the columns in the list above
        2, 'Creating Databases in Minutes', 50
);

GO

Visa data (boktabell)

Låt oss se den nyligen skapade och ifyllda tabellen i databasen. Kör skriptet nedan:

-- View data (rows) from the table (Book)
SELECT b.BookNumber, b.Title, b.Stock FROM dbo.Book b

Utdata är:

Vi kan se de två raderna i tabellen (bok). För tillfället är dessa all data som finns i den här tabellen.

Ta bort data

Som vi minns finns det en risk att radera alla rader i en tabell om vi glömmer att nämna villkoret/kriterierna för korrekt radering.

Använd alltid WHERE-satsen med Delete-satsen för att undvika oavsiktlig dataförlust. Det enda undantaget bör vara fallet när du behöver radera all data avsiktligt.

För att ta bort all data (rader) från exempeldatabastabellen, kör följande skript:

-- Delete all the data (rows) from the table Book
DELETE FROM dbo.Book

Utdata är:

Visa data efter raderingen

Nu måste vi kontrollera om alla rader har raderats:

-- View data (rows) from the table (Book)
SELECT b.BookNumber, b.Title, b.Stock FROM dbo.Book b

Resultaten är:

På så sätt har vi raderat alla rader från boken tabell. För det använde vi DELETE-satsen utan några raderingskriterier/villkor.

Infoga data tillbaka i tabellen (med samma titel)

Vi kan infoga data (rader) tillbaka i tabellen och sedan tillämpa DELETE-satsen baserat på vissa villkor/kriterier.

Den här gången väljer vi att infoga fler rader, men med avsikt att ha samma titel:

-- Insert rows into table 'Book' 
INSERT INTO [dbo].[Book]
    ( -- Columns to insert data into
    [BookNumber], [Title], [Stock]
    )
VALUES
    ( -- First row: values for the columns in the list above
        1, 'Learn SQL in 7 Days', 50
),
    ( -- Second row: values for the columns in the list above
        2, 'Creating Databases in Minutes', 50
),
	( -- Third row: values for the columns in the list above
        3, 'Creating Databases in Minutes', 50
),
    ( -- Fourth row: values for the columns in the list above
        4, 'Creating Databases in Minutes', 50
);

GO

Utgången är som följer:

Obs :För att återställa raderade eller ändrade data kan du använda de dedikerade mjukvarulösningarna. Lösningen dbForge Transaction Log låter dig både återställa dessa data och se vem och när som har tagits bort eller ändrat dem.

Visa data före radering

För att se data, kör följande skript:

-- View data (rows) from the table (Book)
SELECT b.BookNumber, b.Title, b.Stock FROM dbo.Book b

Utdata är:

Resultatet visar att vi har infogat tre rader med samma boktitel av misstag. Det är ett problem. Den enkla lösningen är att ta bort de onödiga raderna genom att tillämpa det specifika villkoret för att ta bort rader med dubbletter av titlar.

Hur man tar bort data i SQL-kolumn baserat på ett villkor (boknummer)

Viktigt:Vi kan överväga ett av följande sätt att lösa problemet:

  1. Ta bort med boknummer
  2. Ta bort efter titel

I mitt scenario väljer jag att inte ta bort efter titel. Om vi ​​tar bort efter titel, tar vi bort alla rader som innehåller den titeln, inklusive de vi behöver behålla. Därför är det rekommenderade tillvägagångssättet att ta bort tabellen baserat på BookNumber kolumn.

Om vi ​​tittar på resultatuppsättningen kan vi lätt förstå att BookNumber:3 och Boknummer:4 är dubbletter av rader. Tidigare har det förklarats i detalj hur man tar bort dubbletter i SQL. Vi måste ta bort dem för att hålla databasen konsekvent.

Återigen uppstår följande alternativ:

  1. Ta bort där boknummer (BookNumber) är större än 2.
  2. Ta bort där BookNumber är 3 och 4.

Låt oss välja det första alternativet. Kom dock ihåg att det bara är giltigt om det inte finns några rader efter de dubbletter vi känner till.

Kör följande skript:

-- Delete all the data (rows) from the table Book where BookNumber is greater than 2
DELETE FROM dbo.Book
WHERE BookNumber>2

Visa data efter raderingen

Låt oss kontrollera tabellen efter att ha raderat data:

-- View data (rows) from the table (Book)
SELECT b.BookNumber, b.Title, b.Stock FROM dbo.Book b

Utdata är:

Infoga mer data i tabellen (mer lager)

För att lägga till mer data (rad) relaterad till aktien använder vi skriptet nedan:

-- Insert rows into table 'Book' 
INSERT INTO [dbo].[Book]
    ( -- Columns to insert data into
    [BookNumber], [Title], [Stock]
    )
VALUES
    ( -- First row: values for the columns in the list above
        3, 'Basic Data Structures', 60
),
    ( -- Second row: values for the columns in the list above
        4, 'Advanced Data Structures', 0
)
GO

Visa data före radering

Ta en titt på tabellen:

-- View data (rows) from the table (Book)
SELECT b.BookNumber, b.Title, b.Stock FROM dbo.Book b

Utdata är:

Ta bort data baserat på ett annat tillstånd

Antag att vi måste ta bort böcker som inte är i lager för att behålla mer korrekt information i databasen. För att göra detta bör vi leta efter de raderna där Stock är 0.

Vi kan använda DELETE-satsen med villkoret baserat på aktie kolumnvärde 0:

-- Delete all the out of stock (Where Stock is 0) books (rows) from the table Book 
DELETE FROM dbo.Book
WHERE Stock=0

Visa data efter raderingen

-- View data (rows) from the table (Book)
SELECT b.BookNumber, b.Title, b.Stock FROM dbo.Book b

Infoga mer data i tabellen (fler titlar och lager)

Vi lägger till ytterligare två rader i tabellen:

-- Insert rows into table 'Book' 
INSERT INTO [dbo].[Book]
    ( -- Columns to insert data into
    [BookNumber], [Title], [Stock]
    )
VALUES
    ( -- First row: values for the columns in the list above
        4, 'Learn Azure SQL Database in 10 Days', 0
),
    ( -- Second row: values for the columns in the list above
        5, 'Azure SQL Database Concepts', 1
)
GO

Visa data före radering

Kontrollera raderna innan du tar bort något ytterligare, baserat på kravet:

-- View data (rows) from the table (Book)
SELECT b.BookNumber, b.Title, b.Stock FROM dbo.Book b

Tabellutgången är:

Ta bort data baserat på två villkor

Den här gången måste vi ta bort alla böcker (rader) där titlar innehåller ordet SQL och de är slut i lager (deras lagervärde är 0).

Med andra ord tar vi bort alla SQL-relaterade out of stock-böcker.

I det här fallet måste vi ange mer än ett villkor med DELETE-satsen. Vi måste se till att vi bara tar bort böcker som inte finns i lager och endast de böcker som har ordet SQL i sin titel.

Visa följande skript:

-- Delete all the out of stock (Where Stock is 0) SQL related (Title contains SQL) books (rows) from the table Book 
DELETE FROM dbo.Book
WHERE Title LIKE '%SQL%' and Stock=0

Visa data efter raderingen

Vi ser data för sista gången:

Viktigt tips :Innan du raderar data, kör SELECT-satsen baserat på samma villkor som du kommer att använda för radering. På så sätt säkerställer du att dina raderingsaktiviteter kommer att gälla för korrekt data.

Kör till exempel SELECT-frågan först för att säkerställa att du bara får de rader som är avsedda för radering:

SELECT * FROM dbo.Book
WHERE Title LIKE '%SQL%' and Stock=0

När du är säker kan du förvandla din SELECT till DELETE-satsen:

DELETE FROM dbo.Book
WHERE Title LIKE '%SQL%' and Stock=0

Grattis!

Du har lyckats bemästra uppgiften att ta bort (ta bort) en eller flera rader från en tabell enligt kraven.

Håll kontakten för avancerade raderingsscenarier och andra professionella tips angående användningen av DELETE-satsen.

Saker att göra

Nu när du framgångsrikt kan ta bort rader från en tabell kan du träna och förbättra dina färdigheter ytterligare:

  1. Försök att ta bort rader där det bara finns en vara i lager.
  2. Ta bort alla böcker där titeln innehåller ordet Struktur.
  3. Ta bort alla böcker (rader) utom boknummer (BookNumber) 1.

Upptäck mer avancerade scenarier om SQL DELETE-satsen.


  1. Hur man sammanfogar sträng- och NULL-värden i SQL Server

  2. Begäran misslyckades med HTTP-status 401:Obehörig I SSRS

  3. LEFT JOIN vs. LEFT OUTER JOIN i SQL Server

  4. SQL Server:Hämta tabell primärnyckel med SQL-fråga