Bei der Datenbankprogrammierung gibt es vier grundlegende Operationen:Erstellen , lesen , aktualisieren und löschen – CRUD Operationen. Sie sind der erste Schritt in der Datenbankprogrammierung.
Der Begriff CRUD tauchte erstmals in James Martins Buch „Managing the Database Environment“ auf. Seitdem ist dieser Begriff populär geworden. In diesem Artikel werden wir die CRUD-Operation in Bezug auf SQL Server untersuchen, da sich die Operationssyntax von anderen relationalen und NoSQL-Datenbanken unterscheiden kann.
Vorbereitungen
Die Grundidee relationaler Datenbanken ist das Speichern von Daten in Tabellen. Die Tabellendaten können gelesen, eingefügt, gelöscht werden. Auf diese Weise manipulieren CRUD-Operationen die Tabellendaten.
C | C REATE | Zeile(n) in eine Tabelle einfügen |
R | R EAD | Zeile(n) aus einer Tabelle lesen (auswählen) |
U | Du PDATE | Zeile/Zeilen in der Tabelle bearbeiten |
D | D LÖSCHEN | Zeile(n) aus der Tabelle löschen |
Zur Veranschaulichung der CRUD-Operationen benötigen wir eine Datentabelle. Lassen Sie uns eine erstellen. Es enthält nur drei Spalten. Die erste Spalte speichert Ländernamen, die zweite den Kontinent dieser Länder und die letzte Spalte die Bevölkerung dieser Länder. Wir können diese Tabelle mit Hilfe der T-SQL-Anweisung erstellen und ihr den Titel TblCountry geben .
CREATE TABLE [dbo].[TblCountry]
(
[CountryName] VARCHAR(50),
[ContinentNames] VARCHAR(50) NULL,
[CountryPopulation] BIGINT NULL
)
Sehen wir uns nun die CRUD-Vorgänge an, die für TblCountry durchgeführt wurden Tabelle.
C – ERSTELLEN
Um neue Zeilen zu einer Tabelle hinzuzufügen, verwenden wir das INSERT INTO Befehl. In diesem Befehl müssen wir den Namen der Zieltabelle angeben und die Spaltennamen in Klammern auflisten. Die Anweisungsstruktur sollte mit VALUES:
endenINSERT INTO TblCountry
(CountryName,ContinentNames,CountryPopulation)
VALUES ('Germany','Europe',8279000 )
Um der Tabelle mehrere Zeilen hinzuzufügen, können wir den folgenden Typ der INSERT-Anweisung verwenden:
INSERT INTO TblCountry
(CountryName,ContinentNames,CountryPopulation)
VALUES
('Germany','Europe',8279000 ),
('Japan','Asia',126800000 ),
('Moroco','Africa',35740000)
Beachten Sie, dass die INTO Das Schlüsselwort ist optional und Sie müssen es nicht in den Einfügeanweisungen verwenden.
INSERT TblCountry
(CountryName,ContinentNames,CountryPopulation)
VALUES
('Germany','Europe',8279000 ),
('Japan','Asia',126800000 ),
('Moroco','Africa',35740000)
Sie können auch das folgende Format verwenden, um mehrere Zeilen in die Tabelle einzufügen:
INSERT INTO TblCountry
SELECT 'Germany','Europe',8279000
UNION ALL
SELECT 'Japan','Asia',126800000
UNION ALL
SELECT 'Moroco','Africa',35740000
Jetzt kopieren wir Daten direkt aus der Quelltabelle in die Zieltabelle. Diese Methode ist als INSERT INTO … SELECT bekannt Aussage.
INSERT INTO … SELECT erfordert übereinstimmende Datentypen der Quell- und Zieltabellen. In der folgenden INSERT INTO … SELECT-Anweisung fügen wir die Daten der SourceCountryTbl ein Tabelle in das TblCountry Tabelle.
Zuerst fügen wir einige synthetische Daten in die SourceCountryTbl ein Tabelle für diese Demonstration.
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)
Jetzt führen wir die Anweisung INSERT INTO … SELECT aus.
INSERT INTO TblCountry
SELECT * FROM SourceCountryTbl
Die obige Insert-Anweisung fügte alle SourceCountryTbl hinzu Daten an das TblCountry Tisch. Wir können auch das WHERE hinzufügen -Klausel, um die Select-Anweisung zu filtern.
INSERT INTO TblCountry
SELECT * FROM SourceCountryTbl WHERE TargetCountryName='UK'
SQL Server ermöglicht es uns, Tabellenvariablen (Objekte, die helfen, temporäre Tabellendaten im lokalen Bereich zu speichern) mit den INSERT INTO … SELECT-Anweisungen zu verwenden. In der folgenden Demonstration verwenden wir die Tabellenvariable als Quelltabelle:
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
Tipp :Microsoft hat eine Funktion in SQL Server 2016 angekündigt, die parallele Einfügung ist . Diese Funktion ermöglicht es uns, INSERT-Operationen in parallelen Threads auszuführen.
Wenn Sie den TABLOCK hinzufügen Hinweis am Ende Ihrer Insert-Anweisung kann SQL Server eine Parallele zum Verarbeitungsausführungsplan gemäß dem maximalen Parallelitätsgrad Ihres Servers oder dem Kostenschwellenwert für Parallelitätsparameter auswählen.
Die parallele Einfügeverarbeitung reduziert auch die Ausführungszeit der Einfügeanweisung. Der TABLOCK hint erwirbt während des Einfügevorgangs die Sperre der eingefügten Tabelle. Weitere Informationen zum parallelen Insert finden Sie unter Real World Parallel INSERT…SELECT.
Eine weitere praktische Anweisung ist SELECT INTO. Mit dieser Methode können wir Daten aus einer Tabelle in eine neu erstellte Tabelle kopieren. In der folgenden Anweisung NewCountryTable existierte vor der Ausführung der Abfrage nicht. Die Abfrage erstellt die Tabelle und fügt alle Daten aus TblCountry ein Tabelle.
SELECT * INTO NewCountryTable
FROM TblCountry
Gleichzeitig können wir für bestimmte Spalten der Quelltabelle eine neue Tabelle erstellen.
In einigen Fällen müssen wir eingefügte Werte aus der INSERT-Anweisung zurückgeben und verwenden. Seit SQL Server 2005 ermöglicht uns die INSERT-Anweisung, fragliche Werte aus der INSERT-Anweisung abzurufen.
Jetzt löschen und erstellen wir unsere Testtabelle und fügen eine neue Identitätsspalte hinzu. Außerdem fügen wir dieser Spalte eine Standardeinschränkung hinzu. Wenn wir also keinen expliziten Wert in diese Spalte einfügen, wird automatisch ein neuer Wert erstellt.
Im folgenden Beispiel deklarieren wir eine Tabelle mit einer Spalte und fügen die Ausgabe der SeqID ein Spaltenwert zu dieser Tabelle mit Hilfe der OUTPUT-Spalte:
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 – Lesen
Das Lesen Die Operation ruft Daten aus einer Tabelle ab und gibt eine Ergebnismenge mit den Datensätzen der Tabelle zurück. Falls wir Daten aus mehr als einer Tabelle abrufen möchten, können wir den JOIN-Operator verwenden und eine logische Beziehung zwischen Tabellen erstellen.
Die SELECT-Anweisung spielt eine einzige primäre Rolle beim read Betrieb. Es basiert auf drei Komponenten:
- Spalte – wir definieren die Spalten, aus denen wir Daten abrufen möchten
- Tisch – wir Geben Sie die Tabelle an, aus der wir Daten erhalten möchten
- Filter – wir kann die Daten filtern, die wir lesen möchten. Dieser Teil ist optional.
Die einfachste Form der select-Anweisung lautet wie folgt:
SELECT column1, column2,...,columnN
FROM table_name
Jetzt gehen wir die Beispiele durch. Zuerst brauchen wir eine Beispieltabelle zum Lesen. Lassen Sie es uns erstellen:
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 Spalten in der Tabelle lesen
Der Operator Sternchen (*) wird in den SELECT-Anweisungen verwendet, weil er alle Spalten in der Tabelle zurückgibt:
SELECT * FROM TblCountry
Tipp Hinweis:Der Operator Sternchen (*) kann die Leistung negativ beeinflussen, da er mehr Netzwerkverkehr verursacht und mehr Ressourcen verbraucht. Wenn Sie also nicht alle Daten aus allen zurückgegebenen Spalten abrufen müssen, vermeiden Sie die Verwendung des Sternchens (*) in der SELECT-Anweisung.
Lesen bestimmter Spalten der Tabelle
Wir können auch bestimmte Spalten der Tabelle lesen. Sehen wir uns das Beispiel an, das nur den CountryName zurückgibt und CountryPopulation Spalten:
SELECT CountryName,CountryPopulation FROM TblCountry
Alias in den SELECT-Anweisungen verwenden
In den SELECT-Anweisungen können wir der Tabelle oder den Spalten temporäre Namen geben. Diese temporären Namen sind Aliase. Lassen Sie uns die vorherigen zwei Abfragen mit Tabellen- und Spaltenaliasen umschreiben.
In der folgenden Abfrage wird die TblC alias gibt den Tabellennamen an:
SELECT TblC.* FROM TblCountry TblC
Im folgenden Beispiel stellen wir Aliase für die Spaltennamen bereit. Wir ändern CountryName zu CName , und CountryPopulation – zu CPop .
SELECT TblC.CountryName AS [CName], CountryPopulation AS [CPop] FROM TblCountry TblC
Die Zwecke des Alias sind:
- Machen Sie die Abfrage lesbarer, wenn die Tabellen- oder Spaltennamen komplex sind.
- Stellen Sie sicher, dass Sie eine Abfrage für die Tabelle mehr als einmal verwenden.
- Vereinfachen Sie das Schreiben von Abfragen, wenn der Tabellen- oder Spaltenname lang ist.
Filtern von SELECT-Anweisungen
SELECT-Anweisungen ermöglichen es uns, die Ergebnismengen durch die WHERE-Klausel zu filtern. Beispielsweise möchten wir die SELECT-Anweisung nach CountryName filtern Spalte und geben nur die Daten von Deutschland in die Ergebnismenge zurück. Die folgende Abfrage führt den Lesevorgang mit einem Filter aus:
SELECT TblC.* FROM TblCountry TblC
WHERE TblC.CountryName='Germany'
Ergebnisse der SELECT-Anweisungen sortieren
Die ORDER BY-Klausel hilft uns, die Ergebnismenge der SELECT-Anweisung nach der angegebenen Spalte oder den angegebenen Spalten zu sortieren. Mit Hilfe der ORDER BY-Klausel können wir aufsteigend oder absteigend sortieren.
Wir sortieren das TblCountry Tabelle nach der Bevölkerung der Länder in aufsteigender Reihenfolge:
SELECT TblC.* FROM TblCountry TblC
ORDER BY TblC.CountryPopulation ASC
Tipp :Sie können den Spaltenindex in der ORDER BY-Klausel verwenden, und Spaltenindexnummern beginnen bei 1.
Wir können auch die vorherige Abfrage schreiben. Die Zahl drei (3) gibt die CountyPopulation an Spalte:
SELECT TblC.* FROM TblCountry TblC
ORDER BY 3 ASC
U – Update
Die UPDATE-Anweisung ändert die vorhandenen Daten in der Tabelle. Diese Anweisung muss die SET-Klausel enthalten, damit wir die Zielspalte zum Ändern der Daten definieren können.
Die folgende Abfrage ändert alle Zeilen der CountyPopulation Spaltenwert auf 1.
UPDATE TblCountry SET CountryPopulation=1
GO
SELECT TblC.* FROM TblCountry TblC
In den UPDATE-Anweisungen können wir die WHERE-Klausel verwenden, um eine bestimmte Zeile oder Zeilen in der Tabelle zu ändern.
Lassen Sie uns das Japan ändern Reihe von CountyPopulation bis 245000:
UPDATE TblCountry SET CountryPopulation=245000
WHERE CountryName = 'Japan'
GO
SELECT TblC.* FROM TblCountry TblC
Die UPDATE-Anweisung ist eine Vereinigung der delete- und insert-Anweisungen. Wir können also die eingefügten und gelöschten Werte über die OUTPUT-Klausel zurückgeben.
Machen wir ein Beispiel:
UPDATE TblCountry SET CountryPopulation=22
OUTPUT inserted.CountryPopulation AS [Insertedvalue],
deleted.CountryPopulation AS [Deletedvalue]
WHERE CountryName = 'Germany'
Wie Sie sehen können, haben wir die CountryPopulation geändert Wert von 1 bis 22. Dann können wir die eingefügten und gelöschten Werte herausfinden. Zusätzlich können wir diese Werte in eine Tabellenvariable einfügen (ein spezieller Variablentyp, der als Tabelle verwendet werden kann).
Wir werden die eingefügten und gelöschten Werte in die Tabellenvariable einfügen:
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 ist eine Systemvariable, die die Anzahl der betroffenen Zeilen in der letzten Anweisung zurückgibt. Daher können wir diese Variable verwenden, um einige geänderte Zeilen in der Update-Anweisung anzuzeigen.
Im folgenden Beispiel ändert die Aktualisierungsabfrage 3 Zeilen, und die Systemvariable @@ROWCOUNT gibt 3 zurück.
UPDATE TblCountry SET CountryPopulation=1
SELECT @@ROWCOUNT AS [AffectedRowNumber]
D – Löschen
Die Delete-Anweisung entfernt vorhandene Zeilen/Zeilen aus der Tabelle.
Lassen Sie uns zunächst sehen, wie die WHERE-Klausel in den DELETE-Anweisungen verwendet wird. Meistens möchten wir gelöschte Zeilen filtern.
Das folgende Beispiel veranschaulicht, wie eine bestimmte Zeile entfernt wird:
SELECT TblC.* FROM TblCountry TblC
DELETE FROM TblCountry WHERE CountryName='Japan'
SELECT TblC.* FROM TblCountry TblC
Mit der DELETE-Anweisung können wir jedoch alle Datensätze aus der Tabelle entfernen. Die DELETE-Anweisung ist jedoch sehr einfach und wir verwenden die WHERE-Bedingung nicht.
SELECT TblC.* FROM TblCountry TblC
DELETE FROM TblCountry
SELECT TblC.* FROM TblCountry TblC
Trotzdem löscht die DELETE-Anweisung unter bestimmten Umständen des Datenbankdesigns die Zeile(n) nicht, wenn sie Fremdschlüssel oder andere Beschränkungen verletzt.
Zum Beispiel in AdventureWorks Datenbank können wir Zeilen der ProductCategory nicht löschen Tabelle, weil ProductCategoryID als Fremdschlüssel in dieser Tabelle angegeben ist.
Lassen Sie uns versuchen, eine Zeile aus der ProductCategory zu löschen Tabelle – ohne Zweifel werden wir auf den folgenden Fehler stoßen:
DELETE FROM [Production].[ProductCategory]
WHERE ProductCategoryID=1
Schlussfolgerung
Daher haben wir die CRUD-Operationen in SQL untersucht. Die INSERT-, SELECT-, UPDATE- und DELETE-Anweisungen sind die Grundfunktionen der SQL-Datenbank, und Sie müssen sie beherrschen, wenn Sie die SQL-Datenbankprogrammierung erlernen möchten. Die CRUD-Theorie könnte ein guter Ausgangspunkt sein, und viel Übung wird Ihnen helfen, ein Experte zu werden.