Bij het programmeren van databases zijn er vier fundamentele bewerkingen:create , lees , bijwerken , en verwijderen – CRUD activiteiten. Ze zijn de eerste stap in het programmeren van databases.
De term CRUD verscheen voor het eerst in James Martins boek ‘Managing the Database Environment’. Sindsdien is deze term populair geworden. In dit artikel gaan we de CRUD-bewerking onderzoeken in termen van SQL Server, omdat de syntaxis van de bewerking kan verschillen van andere relationele en NoSQL-databases.
Voorbereidingen
Het belangrijkste idee van relationele databases is het opslaan van gegevens in tabellen. De tabelgegevens kunnen worden gelezen, ingevoegd, verwijderd. Op deze manier manipuleren CRUD-bewerkingen de tabelgegevens.
C | C REATE | Rij/rijen in een tabel invoegen |
R | R EAD | Lees (selecteer) rij/rijen uit een tabel |
U | U PDATE | Bewerk rij(en) in de tabel |
D | D ELETE | Verwijder rij(en) uit de tabel |
Om de CRUD-bewerkingen te illustreren, hebben we een gegevenstabel nodig. Laten we er een maken. Het zal slechts drie kolommen bevatten. In de eerste kolom worden landnamen opgeslagen, in de tweede kolom het continent van deze landen en in de laatste kolom de bevolking van deze landen. We kunnen deze tabel maken met behulp van de T-SQL-instructie en deze de titel geven als TblCountry .
CREATE TABLE [dbo].[TblCountry]
(
[CountryName] VARCHAR(50),
[ContinentNames] VARCHAR(50) NULL,
[CountryPopulation] BIGINT NULL
)
Laten we nu eens kijken naar de CRUD-bewerkingen die zijn uitgevoerd op de TblCountry tafel.
C – MAKEN
Om nieuwe rijen aan een tabel toe te voegen, gebruiken we de INSERT INTO opdracht. In deze opdracht moeten we de naam van de doeltabel specificeren en de kolomnamen tussen haakjes weergeven. De instructiestructuur moet eindigen op VALUES:
INSERT INTO TblCountry
(CountryName,ContinentNames,CountryPopulation)
VALUES ('Germany','Europe',8279000 )
Om meerdere rijen aan de tabel toe te voegen, kunnen we het volgende type INSERT-statement gebruiken:
INSERT INTO TblCountry
(CountryName,ContinentNames,CountryPopulation)
VALUES
('Germany','Europe',8279000 ),
('Japan','Asia',126800000 ),
('Moroco','Africa',35740000)
Merk op dat de INTO trefwoord is optioneel en u hoeft het niet te gebruiken in de insert-statements.
INSERT TblCountry
(CountryName,ContinentNames,CountryPopulation)
VALUES
('Germany','Europe',8279000 ),
('Japan','Asia',126800000 ),
('Moroco','Africa',35740000)
U kunt ook het volgende formaat gebruiken om meerdere rijen in de tabel in te voegen:
INSERT INTO TblCountry
SELECT 'Germany','Europe',8279000
UNION ALL
SELECT 'Japan','Asia',126800000
UNION ALL
SELECT 'Moroco','Africa',35740000
Nu zullen we gegevens rechtstreeks van de brontabel naar de doeltabel kopiëren. Deze methode staat bekend als de INSERT INTO … SELECT verklaring.
INSERT INTO … SELECT vereist afstemming van de gegevenstypen van de bron- en doeltabellen. In de volgende INSERT INTO … SELECT-instructie zullen we de gegevens van de SourceCountryTbl invoegen tabel in de TblCountry tafel.
Eerst voegen we wat synthetische gegevens in de SourceCountryTbl tabel voor deze demonstratie.
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)
Nu gaan we de instructie INSERT INTO … SELECT uitvoeren.
INSERT INTO TblCountry
SELECT * FROM SourceCountryTbl
De bovenstaande insert-instructie heeft alle SourceCountryTbl . toegevoegd gegevens naar het TblCountry tafel. We kunnen ook de WAAR . toevoegen clausule om de select-instructie te filteren.
INSERT INTO TblCountry
SELECT * FROM SourceCountryTbl WHERE TargetCountryName='UK'
Met SQL Server kunnen we tabelvariabelen gebruiken (objecten die helpen om tijdelijke tabelgegevens op te slaan in de lokale scope) met de INSERT INTO ... SELECT-instructies. In de volgende demonstratie gebruiken we de tabelvariabele als brontabel:
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 :Microsoft heeft een functie aangekondigd in SQL Server 2016 die parallel insert is . Met deze functie kunnen we INSERT-bewerkingen in parallelle threads uitvoeren.
Als u de TABLOCK . toevoegt hint aan het einde van uw insert-instructie, SQL Server kan een parallel kiezen met het uitvoeringsplan voor de verwerking volgens de maximale mate van parallellisme van uw server of de kostendrempel voor parallellisme-parameters.
Parallelle invoegverwerking zal ook de uitvoeringstijd van de invoegopdracht verkorten. De TABLOCK hint zal de vergrendeling van de ingevoegde tafel verkrijgen tijdens de invoegbewerking. Voor meer informatie over de parallelle insert kunt u de Real World Parallel INSERT…SELECT raadplegen.
Een ander handig statement is SELECT INTO. Met deze methode kunnen we gegevens van de ene tabel naar een nieuw gemaakte tabel kopiëren. In de volgende verklaring, NewCountryTable bestond niet voordat de query werd uitgevoerd. De query maakt de tabel en voegt alle gegevens in uit de TblCountry tafel.
SELECT * INTO NewCountryTable
FROM TblCountry
Tegelijkertijd kunnen we een nieuwe tabel maken voor bepaalde kolommen van de brontabel.
In sommige gevallen moeten we ingevoegde waarden uit de INSERT-instructie retourneren en gebruiken. Sinds SQL Server 2005 stelt de INSERT-instructie ons in staat om de betreffende waarden uit de INSERT-instructie op te halen.
Nu zullen we onze testtabel laten vallen en maken en een nieuwe identiteitskolom toevoegen. We zullen ook een standaardbeperking aan deze kolom toevoegen. Daarbij, als we geen expliciete waarde invoegen in deze kolom, zal deze automatisch een nieuwe waarde creëren.
In het volgende voorbeeld zullen we een tabel met één kolom declareren en de uitvoer van de SeqID invoegen kolomwaarde toe aan deze tabel met behulp van de OUTPUT-kolom:
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 – Lezen
De Lees bewerking haalt gegevens op uit een tabel en retourneert een resultatenset met de records van de tabel. Als we gegevens uit meer dan één tabel willen ophalen, kunnen we de JOIN-operator gebruiken en een logische relatie tussen tabellen maken.
De SELECT-instructie speelt een enkele primaire rol in de read operatie. Het is gebaseerd op drie componenten:
- Kolom – we definiëren de kolommen waaruit we gegevens willen ophalen
- Tabel – wij specificeer de tabel waaruit we gegevens willen halen
- Filteren – wij kunnen de gegevens filteren die we willen lezen. Dit deel is optioneel.
De eenvoudigste vorm van de select-instructie is als volgt:
SELECT column1, column2,...,columnN
FROM table_name
Nu gaan we de voorbeelden doornemen. Eerst hebben we een voorbeeldtabel nodig om te lezen. Laten we het maken:
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)
Alle kolommen in de tabel lezen
De asterisk (*)-operator wordt gebruikt in de SELECT-instructies omdat deze alle kolommen in de tabel retourneert:
SELECT * FROM TblCountry
Tip :De asterisk (*)-operator kan de prestaties negatief beïnvloeden omdat deze meer netwerkverkeer veroorzaakt en meer bronnen verbruikt. Als u dus niet alle gegevens uit alle kolommen hoeft te retourneren, vermijd dan het gebruik van de asterisk (*) in de SELECT-instructie.
Bepaalde kolommen van de tabel lezen
We kunnen ook bepaalde kolommen van de tabel lezen. Laten we het voorbeeld bekijken dat alleen de Landnaam . retourneert en Landbevolking kolommen:
SELECT CountryName,CountryPopulation FROM TblCountry
Een alias gebruiken in de SELECT-instructies
In de SELECT-instructies kunnen we tijdelijke namen geven aan de tabel of kolommen. Deze tijdelijke namen zijn aliassen. Laten we de vorige twee zoekopdrachten herschrijven met tabel- en kolomaliassen.
In de volgende zoekopdracht wordt de TblC alias specificeert de tabelnaam:
SELECT TblC.* FROM TblCountry TblC
In het volgende voorbeeld geven we aliassen voor de kolomnamen. We veranderen Landnaam naar CName , en Landbevolking – naar CPop .
SELECT TblC.CountryName AS [CName], CountryPopulation AS [CPop] FROM TblCountry TblC
De doeleinden van de alias zijn:
- Maak de zoekopdracht leesbaarder als de tabel- of kolomnamen complex zijn.
- Zorg ervoor dat u een query voor de tabel meer dan één keer gebruikt.
- Vereenvoudig het schrijven van de query als de tabel- of kolomnaam lang is.
SELECT-instructies filteren
Met SELECT-instructies kunnen we de resultaatsets filteren via de WHERE-component. We willen bijvoorbeeld de SELECT-instructie filteren op de Landnaam kolom en retourneer alleen de gegevens van Duitsland in de resultatenset. De volgende query voert de leesbewerking uit met een filter:
SELECT TblC.* FROM TblCountry TblC
WHERE TblC.CountryName='Germany'
Sorteren van resultaten van SELECT-statements
De ORDER BY-component helpt ons de resultatenset van de SELECT-instructie te sorteren op de opgegeven kolom of kolommen. We kunnen oplopend of aflopend sorteren met behulp van de ORDER BY-clausule.
We sorteren de TblCountry tabel volgens de bevolking van de landen in oplopende volgorde:
SELECT TblC.* FROM TblCountry TblC
ORDER BY TblC.CountryPopulation ASC
Tip :U kunt de kolomindex gebruiken in de ORDER BY-clausule, en de indexnummers van kolommen beginnen met 1.
We kunnen ook de vorige vraag schrijven. Het getal drie (3) geeft de CounrtyPopulation . aan kolom:
SELECT TblC.* FROM TblCountry TblC
ORDER BY 3 ASC
U – Update
De UPDATE-instructie wijzigt de bestaande gegevens in de tabel. Deze instructie moet de SET-component bevatten, zodat we de doelkolom kunnen definiëren om de gegevens te wijzigen.
De volgende zoekopdracht verandert alle rijen van de CounrtyPopulation kolomwaarde naar 1.
UPDATE TblCountry SET CountryPopulation=1
GO
SELECT TblC.* FROM TblCountry TblC
In de UPDATE-instructies kunnen we de WHERE-component gebruiken om een bepaalde rij of rijen in de tabel te wijzigen.
Laten we de Japan . veranderen rij van CounrtyPopulation tot 245000:
UPDATE TblCountry SET CountryPopulation=245000
WHERE CountryName = 'Japan'
GO
SELECT TblC.* FROM TblCountry TblC
Het UPDATE-statement is een samenvoeging van de delete- en insert-statements. We kunnen dus de ingevoegde en verwijderde waarden retourneren via de OUTPUT-clausule.
Laten we een voorbeeld maken:
UPDATE TblCountry SET CountryPopulation=22
OUTPUT inserted.CountryPopulation AS [Insertedvalue],
deleted.CountryPopulation AS [Deletedvalue]
WHERE CountryName = 'Germany'
Zoals je kunt zien, hebben we de CountryPopulation . aangepast waarde van 1 tot 22. Dan kunnen we de ingevoegde en verwijderde waarden achterhalen. Bovendien kunnen we deze waarden invoegen in een tabelvariabele (een speciaal type variabele dat als tabel kan worden gebruikt).
We gaan de ingevoegde en verwijderde waarden invoegen in de tabelvariabele:
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 is een systeemvariabele die het aantal betrokken rijen in de laatste instructie retourneert. We kunnen deze variabele dus gebruiken om enkele gewijzigde rijen in de update-instructie weer te geven.
In het volgende voorbeeld verandert de update-query 3 rijen en retourneert de systeemvariabele @@ROWCOUNT 3.
UPDATE TblCountry SET CountryPopulation=1
SELECT @@ROWCOUNT AS [AffectedRowNumber]
D – Verwijderen
De instructie Delete verwijdert bestaande rij(en) uit de tabel.
Laten we eerst eens kijken hoe we de WHERE-component in de DELETE-instructies kunnen gebruiken. Meestal willen we verwijderde rijen filteren.
Het onderstaande voorbeeld illustreert hoe u een bepaalde rij verwijdert:
SELECT TblC.* FROM TblCountry TblC
DELETE FROM TblCountry WHERE CountryName='Japan'
SELECT TblC.* FROM TblCountry TblC
Met de DELETE-instructie kunnen we echter alle records uit de tabel verwijderen. De instructie DELETE is echter erg basaal en we gebruiken de WHERE-voorwaarde niet.
SELECT TblC.* FROM TblCountry TblC
DELETE FROM TblCountry
SELECT TblC.* FROM TblCountry TblC
Toch, onder bepaalde omstandigheden van de database-ontwerpen, verwijdert de DELETE-instructie de rij/rijen niet als deze externe sleutels of andere beperkingen schendt.
Bijvoorbeeld in de AdventureWorks database, kunnen we geen rijen verwijderen uit de ProductCategory tabel omdat ProductCategoryID is gespecificeerd als een externe sleutel in die tabel.
Laten we proberen een rij te verwijderen uit de ProductCategory tabel – we zullen ongetwijfeld de volgende fout tegenkomen:
DELETE FROM [Production].[ProductCategory]
WHERE ProductCategoryID=1
Conclusie
Daarom hebben we de CRUD-bewerkingen in SQL onderzocht. De INSERT-, SELECT-, UPDATE- en DELETE-instructies zijn de basisfuncties van de SQL-database en u moet ze beheersen als u het programmeren van SQL-databases wilt leren. De CRUD-theorie kan een goed startpunt zijn, en veel oefenen zal je helpen een expert te worden.