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

Operace SQL Server CRUD

V databázovém programování existují čtyři základní operace:vytvoření , přečíst , aktualizace a smazat CRUD operace. Jsou prvním krokem v programování databáze.

Termín CRUD se poprvé objevil v knize Jamese Martina ‚Managing the Database Environment.‘ Od té doby se tento termín stal populárním. V tomto článku prozkoumáme operaci CRUD z hlediska SQL Serveru, protože syntaxe operace se může lišit od jiných relačních a NoSQL databází.

Přípravy

Hlavní myšlenkou relačních databází je ukládání dat do tabulek. Data tabulky lze číst, vkládat, mazat. Tímto způsobem operace CRUD manipulují s daty tabulky.

C C REATE Vložit řádek/řádky do tabulky
R R EAD Čtení (výběr) řádků/řádků z tabulky
U U PDATE Upravit řádek/řádky v tabulce
D D ELETE Odstranit řádek/řádky z tabulky

Pro ilustraci operací CRUD potřebujeme datovou tabulku. Pojďme si jeden vytvořit. Bude obsahovat pouze tři sloupce. V prvním sloupci budou uloženy názvy zemí, ve druhém budou uloženy kontinenty těchto zemí a v posledním sloupci bude uložena populace těchto zemí. Tuto tabulku můžeme vytvořit pomocí příkazu T-SQL a pojmenovat ji jako TblCountry .

CREATE TABLE [dbo].[TblCountry]
(
	[CountryName]		VARCHAR(50), 
    [ContinentNames]	VARCHAR(50) NULL, 
    [CountryPopulation]		BIGINT NULL 
)

Nyní se podívejme na operace CRUD prováděné na TblCountry tabulka.

C – VYTVOŘIT

Chcete-li přidat nové řádky do tabulky, použijeme INSERT INTO příkaz. V tomto příkazu musíme zadat název cílové tabulky a názvy sloupců uvedeme v závorkách. Struktura příkazu by měla končit VALUES:

INSERT INTO TblCountry  
(CountryName,ContinentNames,CountryPopulation) 
VALUES   ('Germany','Europe',8279000 )

Pro přidání více řádků do tabulky můžeme použít následující typ příkazu INSERT:

INSERT INTO TblCountry  
(CountryName,ContinentNames,CountryPopulation) 
VALUES   
('Germany','Europe',8279000 ), 
('Japan','Asia',126800000 ),
('Moroco','Africa',35740000)

Všimněte si, že INTO klíčové slovo je nepovinné a nemusíte ho používat v příkazech insert.

INSERT  TblCountry  
(CountryName,ContinentNames,CountryPopulation) 
VALUES   
('Germany','Europe',8279000 ), 
('Japan','Asia',126800000 ),
('Moroco','Africa',35740000)

Pro vložení více řádků do tabulky můžete také použít následující formát:

INSERT INTO TblCountry
SELECT 'Germany','Europe',8279000 
UNION ALL
SELECT 'Japan','Asia',126800000 
UNION ALL
SELECT 'Moroco','Africa',35740000

Nyní zkopírujeme data přímo ze zdrojové tabulky do cílové tabulky. Tato metoda je známá jako INSERT INTO … SELECT prohlášení.

INSERT INTO … SELECT vyžaduje shodu datových typů zdrojové a cílové tabulky. V následujícím příkazu INSERT INTO … SELECT vložíme data SourceCountryTbl tabulky do TblCountry tabulka.

Nejprve vložíme některá syntetická data do SourceCountryTbl tabulka pro tuto ukázku.

DROP TABLE IF EXISTS [SourceCountryTbl]
CREATE TABLE [dbo].[SourceCountryTbl]
(
	[SourceCountryName]		VARCHAR(50), 
    [SourceContinentNames]	VARCHAR(50) NULL, 
    [SourceCountryPopulation]		BIGINT NULL 
	
)


INSERT INTO [SourceCountryTbl] 
VALUES 
('Ukraine','Europe',44009214  ) ,
('UK','Europe',66573504) ,
('France','Europe',65233271)

Nyní provedeme příkaz INSERT INTO … SELECT.

INSERT INTO TblCountry
SELECT * FROM SourceCountryTbl

Výše uvedený příkaz insert přidal všechny SourceCountryTbl údaje do TblCountry stůl. Můžeme také přidat WHERE klauzule k filtrování příkazu select.

INSERT INTO TblCountry
SELECT * FROM SourceCountryTbl WHERE TargetCountryName='UK'

SQL Server nám umožňuje používat proměnné tabulky (objekty, které pomáhají ukládat dočasná data tabulky v lokálním rozsahu) pomocí příkazů INSERT INTO … SELECT. V následující ukázce použijeme proměnnou table jako zdrojovou tabulku:

  DECLARE @SourceVarTable AS TABLE
  ([TargetCountryName]		VARCHAR(50), 
    [TargetContinentNames]	VARCHAR(50) NULL, 
    [TargetCountryPopulation]		BIGINT NULL 
   )


    INSERT INTO @SourceVarTable 
     VALUES 
     ('Ukraine','Europe',44009214  ) ,
     ('UK','Europe',66573504) ,
     ('France','Europe',65233271)


INSERT INTO TblCountry
SELECT * FROM @SourceVarTable

Tip :Společnost Microsoft oznámila funkci v SQL Server 2016, kterou je paralelní vkládání . Tato funkce nám umožňuje provádět operace INSERT v paralelních vláknech.

Pokud přidáte TABLOCK nápověda na konci vašeho příkazu insert, SQL Server si může vybrat paralelu s plánem provádění zpracování podle maximálního stupně paralelismu vašeho serveru nebo prahu nákladů pro parametry paralelismu.

Paralelní zpracování vložení také zkrátí dobu provádění příkazu vložení. Nicméně TABLOCK hint získá zámek vložené tabulky během operace vkládání. Další informace o paralelní vložce najdete v Real World Parallel INSERT…SELECT.

Dalším užitečným příkazem je SELECT INTO. Tato metoda nám umožňuje kopírovat data z jedné tabulky do nově vytvořené tabulky. V následujícím prohlášení NewCountryTable před provedením dotazu neexistovalo. Dotaz vytvoří tabulku a vloží všechna data z TblCountry tabulka.

SELECT * INTO NewCountryTable 
FROM TblCountry

Zároveň můžeme vytvořit novou tabulku pro jednotlivé sloupce zdrojové tabulky.

V některých případech musíme vrátit a použít vložené hodnoty z příkazu INSERT. Od SQL Server 2005 nám příkaz INSERT umožňuje získat příslušné hodnoty z příkazu INSERT.

Nyní vypustíme a vytvoříme naši testovací tabulku a přidáme nový sloupec identity. Také do tohoto sloupce přidáme výchozí omezení. Pokud tedy do tohoto sloupce nevložíme žádnou explicitní hodnotu, automaticky se vytvoří nová hodnota.

V následujícím příkladu deklarujeme tabulku s jedním sloupcem a vložíme výstup SeqID hodnotu sloupce do této tabulky pomocí sloupce OUTPUT:

DROP TABLE IF EXISTS TblCountry
CREATE TABLE [dbo].[TblCountry]
(
	[CountryName]		VARCHAR(50), 
    [ContinentNames]	VARCHAR(50) NULL, 
    [CountryPopulation]		BIGINT NULL ,
	SeqID uniqueidentifier  default(newid())
)	



DECLARE @OutputID AS TABLE(LogID uniqueidentifier) 
 
INSERT  TblCountry  
(CountryName,ContinentNames,CountryPopulation) 
OUTPUT INSERTED.SeqId INTO @OutputID
VALUES   
('Germany','Europe',8279000 )

SELECT * FROM @OutPutId

R – čtení

Číst operace načte data z tabulky a vrátí sadu výsledků se záznamy tabulky. V případě, že chceme načíst data z více než jedné tabulky, můžeme použít operátor JOIN a vytvořit mezi tabulkami logický vztah.

Příkaz SELECT hraje jedinou primární roli při čtení úkon. Je založen na třech složkách:

  • Sloupec – definujeme sloupce, ze kterých chceme data načítat
  • Stůl – my specifikovat tabulku, ze které chceme získat data
  • Filtr – my můžeme filtrovat data, která chceme číst. Tato část je volitelná.

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

SELECT column1, column2,...,columnN
FROM table_name

Nyní si projdeme příklady. Nejprve potřebujeme ke čtení vzorovou tabulku. Pojďme to vytvořit:

DROP TABLE  IF EXISTS TblCountry
 GO
CREATE TABLE [dbo].[TblCountry]
(
	[CountryName]		VARCHAR(50), 
    [ContinentNames]	VARCHAR(50) NULL, 
    [CountryPopulation]		BIGINT NULL 
)

GO
INSERT INTO TblCountry  
(CountryName,ContinentNames,CountryPopulation) 
VALUES   
('Germany','Europe',8279000 ), 
('Japan','Asia',126800000 ),
('Moroco','Africa',35740000)

Čtení všech sloupců v tabulce

Operátor hvězdička (*) se používá v příkazech SELECT, protože vrací všechny sloupce v tabulce:

SELECT * FROM TblCountry

Tip :Operátor hvězdička (*) může negativně ovlivnit výkon, protože způsobuje větší síťový provoz a spotřebovává více zdrojů. Pokud tedy nepotřebujete získat všechna vrácená data ze všech sloupců, vyhněte se použití hvězdičky (*) v příkazu SELECT.

Čtení konkrétních sloupců tabulky

Můžeme číst i jednotlivé sloupce tabulky. Podívejme se na příklad, který vrátí pouze CountryName a CountryPopulation sloupce:

SELECT CountryName,CountryPopulation FROM TblCountry

Použití aliasu v příkazech SELECT

V příkazech SELECT můžeme přiřadit dočasné názvy tabulce nebo sloupcům. Tyto dočasné názvy jsou aliasy. Přepišme předchozí dva dotazy pomocí aliasů tabulek a sloupců.

V následujícím dotazu TblC alias určí název tabulky:

SELECT TblC.* FROM TblCountry TblC

V následujícím příkladu poskytneme aliasy pro názvy sloupců. Změníme Název země na Cname a CountryPopulation – do CPop .

SELECT TblC.CountryName AS [CName], CountryPopulation AS [CPop] FROM TblCountry TblC

Účely aliasu jsou:

  • Udělejte dotaz čitelnějším, pokud jsou názvy tabulek nebo sloupců složité.
  • Zajistěte použití dotazu pro tabulku více než jednou.
  • Zjednodušte psaní dotazu, pokud je název tabulky nebo sloupce dlouhý.

Filtrování příkazů SELECT

Příkazy SELECT nám umožňují filtrovat sady výsledků pomocí klauzule WHERE. Například chceme filtrovat příkaz SELECT podle Název země a do výsledkové sady vrátit pouze data Německa. Následující dotaz provede operaci čtení s filtrem:

SELECT TblC.* FROM TblCountry TblC
WHERE TblC.CountryName='Germany'

Řazení výsledků příkazů SELECT

Klauzule ORDER BY nám pomáhá třídit sadu výsledků příkazu SELECT podle zadaného sloupce nebo sloupců. Vzestupné nebo sestupné řazení můžeme provádět pomocí klauzule ORDER BY.

Seřadíme TblCountry tabulka podle počtu obyvatel zemí ve vzestupném pořadí:

SELECT TblC.* FROM TblCountry TblC
ORDER BY TblC.CountryPopulation ASC

Tip :Můžete použít index sloupců v klauzuli ORDER BY a čísla indexů sloupců začínají 1.

Můžeme napsat i předchozí dotaz. Číslo tři (3) označuje CountryPopulation sloupec:

SELECT TblC.* FROM TblCountry TblC
ORDER BY 3 ASC

U – Aktualizace

Příkaz UPDATE upravuje existující data v tabulce. Tento příkaz musí obsahovat klauzuli SET, abychom mohli definovat cílový sloupec pro úpravu dat.

Následující dotaz změní všechny řádky CountryPopulation hodnota sloupce na 1.

UPDATE TblCountry SET CountryPopulation=1
GO
SELECT TblC.* FROM TblCountry TblC

V příkazech UPDATE můžeme použít klauzuli WHERE k úpravě konkrétního řádku nebo řádků v tabulce.

Pojďme změnit Japonsko řádek CountryPopulation na 245 000:

UPDATE TblCountry SET CountryPopulation=245000
WHERE CountryName = 'Japan'
GO
SELECT TblC.* FROM TblCountry TblC

Příkaz UPDATE je spojením příkazů delete a insert. Můžeme tedy vrátit vložené a odstraněné hodnoty prostřednictvím klauzule OUTPUT.

Udělejme příklad:

UPDATE TblCountry SET CountryPopulation=22
OUTPUT inserted.CountryPopulation AS [Insertedvalue],
deleted.CountryPopulation AS [Deletedvalue]
WHERE CountryName = 'Germany'

Jak můžete vidět, upravili jsme CountryPopulation hodnotu od 1 do 22. Poté můžeme zjistit vložené a smazané hodnoty. Navíc můžeme tyto hodnoty vložit do proměnné tabulky (speciální typ proměnné, kterou lze použít jako tabulku).

Vložené a smazané hodnoty vložíme do proměnné tabulky:

DECLARE @LogTable TABLE(InsertValLog INT , DelValLog INT) 


UPDATE TblCountry SET CountryPopulation=45
OUTPUT inserted.CountryPopulation ,
deleted.CountryPopulation INTO @LogTable
WHERE CountryName = 'Germany'


SELECT * FROM @LogTable

@@ROWCOUNT je systémová proměnná, která vrací počet řádků ovlivněných v posledním příkazu. Tuto proměnnou tedy můžeme použít k odhalení některých upravených řádků v příkazu update.

V následujícím příkladu aktualizační dotaz změní 3 řádky a systémová proměnná @@ROWCOUNT vrátí 3.

UPDATE TblCountry SET CountryPopulation=1
SELECT @@ROWCOUNT AS [AffectedRowNumber]

D – Smazat

Příkaz Delete odstraní existující řádek/řádky z tabulky.

Nejprve se podívejme, jak použít klauzuli WHERE v příkazech DELETE. Většinu času chceme filtrovat smazané řádky.

Níže uvedený příklad ukazuje, jak odstranit konkrétní řádek:

SELECT TblC.* FROM TblCountry TblC
DELETE FROM TblCountry WHERE CountryName='Japan'
SELECT TblC.* FROM TblCountry TblC

I když pomocí příkazu DELETE můžeme z tabulky odstranit všechny záznamy. Příkaz DELETE je však velmi základní a nepoužíváme podmínku WHERE.

SELECT TblC.* FROM TblCountry TblC
DELETE FROM TblCountry
SELECT TblC.* FROM TblCountry TblC

Přesto za určitých okolností návrhů databáze příkaz DELETE neodstraní řádek/řádky, pokud poruší cizí klíče nebo jiná omezení.

Například v AdventureWorks databáze, nemůžeme odstranit řádky ProductCategory tabulka, protože ProductCategoryID je v této tabulce zadán jako cizí klíč.

Zkusme smazat řádek z ProductCategory tabulka – bezpochyby budeme čelit následující chybě:

DELETE FROM [Production].[ProductCategory]
WHERE ProductCategoryID=1

Závěr

Proto jsme prozkoumali operace CRUD v SQL. Příkazy INSERT, SELECT, UPDATE a DELETE jsou základní funkce SQL databáze a pokud se chcete naučit programovat SQL databáze, musíte je ovládat. Teorie CRUD by mohla být dobrým výchozím bodem a spousta praxe vám pomůže stát se odborníkem.


  1. Oracle na PostgreSQL — Kurzory a běžné tabulkové výrazy

  2. Zdroje zálohování databáze MySQL a MariaDB

  3. Zvýšení výkonu pomocí čtení a zápisu rozdělení databázového provozu s Moodle 3.9

  4. Jak funguje DAYOFMONTH() v MariaDB