sql >> Databáze >  >> RDS >> Sqlserver

SQL Server Delete Statement:Jak odebrat jeden nebo více řádků z tabulky

Správné použití příkazu DELETE pro odstranění dat je zásadní a zahrnuje spoustu problémů. Přesto existují standardní postupy použití příkazu DELETE, které všechny takové úkoly zjednodušují.

Tento článek prozkoumá některé scénáře profesního života, aby vás vybavil nejužitečnějšími tipy pro správné používání příkazu DELETE. Data z tabulky můžete odstranit různými způsoby. Prozkoumejte rozdíl mezi DELETE a TRUNCATE v SQL Server, který byl pokryt praktickými příklady.

T-SQL Smazat Příkaz Základy

Nejprve bychom se měli co nejjednodušším způsobem seznámit s příkazem T-SQL Delete.

Příkaz Delete, jak název napovídá, je příkaz, který nám pomáhá smazat data z databázové tabulky.

Stůl je struktura, kterou vytvoříte v databázi pro ukládání dat. Například můžeme mít tabulku knih pro ukládání záznamů souvisejících s těmito knihami.

Databáze je organizovaná sbírka dat a datových struktur, které tato data uchovávají. Jinými slovy, data mohou být uložena v databázi ve formě tabulek.

Jak smazat jeden řádek nebo více řádků

Pomocí příkazu delete můžeme z tabulky odstranit jeden nebo více záznamů (běžně známých jako řádky).

Příkaz Delete odstraní některá nebo všechna data (řádky) z tabulky.

Podle dokumentace společnosti Microsoft odstraní příkaz Delete jeden nebo více řádků z tabulky nebo zobrazení na serveru SQL Server.

Někdo by se mohl divit, jak příkaz definuje, zda odstranit některá nebo všechna data (řádky) z tabulky. Odpověď spočívá v kritériích nebo podmínkách určujících, co je třeba odstranit.

Odstranit příkaz v SQL Server

Nejjednodušší syntaxe příkazu je následující:

Delete FROM <TableName> WHERE <Condition>

Musíte zadat název tabulky a kritéria/podmínku pro odstranění dat (řádků) z tabulky.

Poznámka:Je důležité použít příkaz DELETE s podmínkou (klauzule WHERE), ačkoli požadavek na podmínku není nutností.

Pokud provedete příkaz DELETE table bez podmínky WHERE, smažete z tabulky všechny řádky (data). Zvykněte si proto používat podmínku WHERE, pokud nechcete odstranit všechny řádky.

Kompatibilita

Toto prohlášení je kompatibilní s mnoha verzemi SQL Server, včetně následujících:

  1. SQL Server 2012 a novější verze.
  2. Cloudová databáze SQL Server (Azure SQL Database).
  3. Cloudový datový sklad SQL (Azure Synapse Analytics).

Kontrolní seznam krok za krokem k odstranění řádků z tabulky

Nyní prozkoumáme použití příkazu Delete s několika praktickými scénáři.

Shrnutí kroků

  1. Nastavte vzorovou databázi.
  2. Zobrazit data.
  3. Smažte data.
  4. Vložte další data zpět do tabulky.
  5. Zobrazit data před smazáním.
  6. Jak smazat data ve sloupci na základě podmínky.
  7. Zobrazte data po smazání.
  8. Vložte další data zpět do tabulky.
  9. Zobrazit data před smazáním.
  10. Smažte data na základě jiné podmínky.
  11. Zobrazte data po smazání.
  12. Vložte data zpět do tabulky.
  13. Tentokrát smažte data na základě dvou podmínek.
  14. Zobrazte data po smazání.

Nastavení ukázkové databáze (BooksSample)

Potřebujeme vzorovou databázi k testování a spuštění skriptů. Nejprve musíme nastavit ukázkovou databázi, která bude zahrnovat následující kroky:

  1. Vytvořte vzorovou databázi.
  2. Vytvořte tabulku ve vzorové databázi.
  3. Vložte data (dva řádky) do tabulky databáze.

Otevřete SQL Server Management Studio nebo dbForge Studio pro SQL Server a spusťte následující skript pro nastavení ukázkové databáze:

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

Zobrazení dat (tabulka knihy)

Podívejme se na nedávno vytvořenou a naplněnou tabulku v databázi. Spusťte níže uvedený skript:

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

Výstup je:

Vidíme dva řádky tabulky (Kniha). V tuto chvíli jsou to všechna data uvedená v této tabulce.

Smazat data

Jak si pamatujeme, existuje riziko smazání všech řádků v tabulce, pokud zapomeneme uvést podmínku/kritéria pro správné odstranění.

Vždy používejte klauzuli WHERE s příkazem Delete, abyste předešli náhodné ztrátě dat. Jedinou výjimkou by měl být případ, kdy potřebujete všechna data smazat záměrně.

Chcete-li odebrat všechna data (řádky) z tabulky ukázkové databáze, spusťte následující skript:

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

Výstup je:

Zobrazení dat po smazání

Nyní musíme zkontrolovat, zda byly smazány všechny řádky:

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

Výsledky jsou:

Tímto způsobem jsme úspěšně smazali všechny řádky z Knihy stůl. Za tímto účelem jsme použili příkaz DELETE bez jakýchkoli kritérií/podmínek odstranění.

Vložit data zpět do tabulky (se stejným názvem)

Můžeme vložit data (řádky) zpět do tabulky a poté použít příkaz DELETE na základě určitých podmínek/kritérií.

Tentokrát jsme se rozhodli vložit více řádků, ale záměrně se stejným názvem:

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

Výstup je následující:

Poznámka :Chcete-li obnovit smazaná nebo změněná data, můžete použít speciální softwarová řešení. Řešení dbForge Transaction Log vám umožňuje jak obnovit tato data, tak zobrazit, kdo a kdy je smazal nebo změnil.

Zobrazit data před smazáním

Chcete-li zobrazit data, spusťte následující skript:

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

Výstup je:

Výstup ukazuje, že jsme omylem vložili tři řádky se stejným názvem knihy. je to problém. Jednoduchým řešením je odstranit nepotřebné řádky pomocí specifické podmínky pro odstranění řádků s duplicitními názvy.

Jak odstranit data ve sloupci SQL na základě podmínky (BookNumber)

Důležité:Tento problém můžeme vyřešit jedním z následujících způsobů:

  1. Smazat podle BookNumber
  2. Smazat podle názvu

V mém scénáři jsem se rozhodl nemazat podle názvu. Pokud odstraníme podle názvu, nakonec smažeme všechny řádky obsahující daný název, včetně těch, které potřebujeme zachovat. Proto se doporučuje odstranit tabulku na základě BookNumber sloupec.

Pokud se podíváme na sadu výsledků, snadno pochopíme, že BookNumber:3 a BookNumber:4 jsou duplicitní řádky. Dříve bylo podrobně vysvětleno, jak odstranit duplikáty v SQL. Aby byla databáze konzistentní, musíme je odstranit.

Opět se nabízejí následující možnosti:

  1. Smažte, kde je číslo knihy (BookNumber) větší než 2.
  2. Smažte, kde BookNumber je 3 a 4.

Zvolme první možnost. Pamatujte však, že je platný pouze v případě, že za duplicitními řádky, o kterých víme, nejsou žádné řádky.

Spusťte následující skript:

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

Zobrazení dat po smazání

Po smazání dat zkontrolujeme tabulku:

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

Výstup je:

Vložit více dat do tabulky (více zásob)

Chcete-li vložit více dat (řádek) souvisejících se skladem, použijeme níže uvedený skript:

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

Zobrazit data před smazáním

Podívejte se na tabulku:

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

Výstup je:

Smazat data na základě jiné podmínky

Předpokládejme, že potřebujeme odstranit knihy ze skladu, abychom v databázi uchovali přesnější informace. Chcete-li to provést, měli bychom hledat ty řádky, kde je Stock 0.

Můžeme použít příkaz DELETE s podmínkou na základě Stock hodnota sloupce 0:

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

Zobrazení dat po smazání

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

Vložit další data do tabulky (více titulů a akcií)

Do tabulky přidáváme další dva řádky:

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

Zobrazit data před smazáním

Před odstraněním čehokoli dalšího zkontrolujte řádky na základě požadavku:

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

Výstup tabulky je:

Smažte data na základě dvou podmínek

Tentokrát musíme smazat všechny knihy (řádky), kde názvy obsahují slovo SQL a nejsou na skladě (hodnota jejich zásob je 0).

Jinými slovy, odstraníme všechny knihy související s SQL, které nejsou na skladě.

V tomto případě musíme zadat více než jednu podmínku pomocí příkazu DELETE. Musíme zajistit, že odstraňujeme pouze knihy, které nejsou na skladě, a pouze knihy, které mají v názvu slovo SQL.

Zobrazte následující 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

Zobrazení dat po smazání

Data prohlížíme naposledy:

Důležitý tip :Před odstraněním dat spusťte příkaz SELECT na základě stejné podmínky, jakou chcete použít pro odstranění. Tímto způsobem zajistíte, že se vaše aktivity mazání budou vztahovat na správná data.

Například nejprve spusťte dotaz SELECT, abyste se ujistili, že získáváte pouze ty řádky, které jsou určeny k odstranění:

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

Jakmile si budete jisti, můžete změnit svůj SELECT na příkaz DELETE:

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

Blahopřejeme!

Úspěšně jste zvládli úkol odebrat (smazat) jeden nebo více řádků z tabulky podle požadavků.

Zůstaňte v kontaktu pro pokročilé scénáře mazání a další profesionální tipy týkající se použití příkazu DELETE.

Co dělat

Nyní, když můžete úspěšně odstranit řádky z tabulky, můžete dále trénovat a zlepšovat své dovednosti:

  1. Zkuste odstranit řádky, kde je na skladě pouze jedna položka.
  2. Smažte všechny knihy, jejichž název obsahuje slovo Struktura.
  3. Smažte všechny knihy (řádky) kromě knihy číslo (BookNumber) 1.

Objevte pokročilejší scénáře příkazu SQL DELETE.


  1. Jak vyvolat chybu ve funkci MySQL

  2. DROP DATABASE MySQL

  3. ORDER BY ... POUŽITÍ klauzule v PostgreSQL

  4. Co je Percona DB