In den vorherigen Abschnitten haben wir uns mit der Arbeit beim Abrufen von Daten aus vorab erstellten Tabellen befasst. Jetzt ist es an der Zeit, herauszufinden, wie wir Tabellen erstellen/löschen, neue Datensätze hinzufügen und alte löschen können. Für diese Zwecke in SQL Es gibt Betreiber wie: ERSTELLEN- erstellt eine Tabelle, ÄNDERN- ändert die Tabellenstruktur, FALLEN- löscht eine Tabelle oder ein Feld, EINFÜGEN- Fügt Daten zur Tabelle hinzu. Beginnen wir mit der Bekanntschaft mit dieser Gruppe von Operatoren vom Betreiber EINFÜGEN.
Wie der Name schon sagt, der Betreiber EINFÜGEN Wird zum Einfügen (Anhängen) von Zeilen in eine Datenbanktabelle verwendet. Das Hinzufügen kann auf verschiedene Arten erfolgen:
Um also einer Tabelle eine neue Zeile hinzuzufügen, müssen wir den Tabellennamen angeben, die Spaltennamen auflisten und den Wert für jede Spalte mithilfe des Konstrukts angeben EINFÜGEN IN Tabellenname (Feld1, Feld2 ...) WERTE (Wert1, Wert2...). Schauen wir uns ein Beispiel an.
IN DIE WERTE DER VERKÄUFER (ID, Adresse, Stadt, Verkäufername, Land) EINFÜGEN(„6“, „1st Street“, „Los Angeles“, „Harry Monroe“, „USA“)
Sie können auch die Reihenfolge der Spaltennamen ändern, müssen jedoch gleichzeitig die Reihenfolge der Werte im Parameter ändern WERTE.
Im vorherigen Beispiel bei Verwendung des Operators EINFÜGEN Wir haben die Tabellenspaltennamen explizit markiert. Mit dieser Syntax können wir einige Spalten überspringen. Das bedeutet, dass Sie für einige Spalten Werte eingeben, für andere jedoch keine Werte bereitstellen. Zum Beispiel:
IN DIE WERTE DER VERKÄUFER (ID, Stadt, VERKÄUFERNAME) EINFÜGEN(„6“, „Los Angeles“, „Harry Monroe“)
In diesem Beispiel haben wir keinen Wert für zwei Spalten angegeben Adresse Und Land. Sie können einige Spalten aus der Anweisung ausschließen EINFÜGEN IN, sofern dies die Tabellendefinition zulässt. In diesem Fall muss eine der Bedingungen erfüllt sein: Diese Spalte ist als gültig definiert NULL(Fehlen eines Werts) oder der angegebene Standardwert in der Tabellendefinition. Das heißt, wenn kein Wert angegeben wird, wird der Standardwert verwendet. Wenn Ihnen eine Spalte in einer Tabelle fehlt, in deren Zeilen keine Werte angezeigt werden können NULL und kein Standardwert definiert ist, generiert das DBMS eine Fehlermeldung und die Zeile wird nicht hinzugefügt.
Im vorherigen Beispiel haben wir Daten in Tabellen eingefügt, indem wir sie manuell in die Abfrage eingegeben haben. Allerdings der Betreiber EINFÜGEN IN ermöglicht es uns, diesen Prozess zu automatisieren, wenn wir Daten aus einer anderen Tabelle einfügen möchten. Zu diesem Zweck gibt es in SQL eine solche Konstruktion wie EINFÜGEN IN ... AUSWÄHLEN .... Dieses Design ermöglicht es Ihnen, gleichzeitig Daten aus einer Tabelle auszuwählen und in eine andere einzufügen. Nehmen wir an, wir haben einen anderen Tisch Verkäufer_EU mit einer Liste der Verkäufer unserer Waren in Europa und wir müssen sie zur allgemeinen Tabelle hinzufügen Verkäufer. Die Struktur dieser Tabellen ist dieselbe (gleiche Spaltenanzahl und gleiche Namen), aber die Daten sind unterschiedlich. Dazu können wir die folgende Abfrage schreiben:
EINFÜGEN IN Verkäufer (ID, Adresse, Stadt, Verkäufername, Land) AUSWÄHLENID, Adresse, Stadt, Verkäufername, Land VON Sellers_EU
Sie müssen darauf achten, dass sich die Werte interner Schlüssel nicht wiederholen (Feld AUSWEIS), sonst kommt es zu einem Fehler. Operator WÄHLEN kann auch Anregungen enthalten WO um Daten zu filtern. Es ist auch zu beachten, dass das DBMS nicht auf die Namen der in der Anweisung enthaltenen Spalten achtet WÄHLEN Wichtig ist ihr nur die Reihenfolge, in der sie angeordnet sind. Daher sind die Daten in der ersten angegebenen Spalte, die aufgrund ausgewählt wurde WÄHLEN, wird in jedem Fall in die erste Spalte der Tabelle eingetragen Verkäufer, angegeben nach dem Operator EINFÜGEN IN, unabhängig vom Feldnamen.
Bei der Arbeit mit Datenbanken besteht häufig die Notwendigkeit, Kopien beliebiger Tabellen zu Sicherungs- oder Änderungszwecken zu erstellen. Um eine vollständige Kopie einer Tabelle zu erstellen, stellt SQL eine separate Anweisung bereit AUSWÄHLEN IN. Beispielsweise müssen wir eine Kopie der Tabelle erstellen Verkäufer, müssen Sie die Anfrage wie folgt schreiben:
SELECT * INTO Sellers_new FROM Sellers
Im Gegensatz zum vorherigen Design EINFÜGEN IN ... AUSWÄHLEN ... Wenn Daten zu einer vorhandenen Tabelle hinzugefügt werden, kopiert der Entwurf die Daten in die neue Tabelle. Man kann auch sagen, dass das erste Konstrukt Daten importiert und das zweite exportiert. Bei Verwendung des Designs WÄHLEN ... IN ... VON ... Folgendes sollte berücksichtigt werden:
Allgemeine Syntax:
a) Einfügen einer neuen Zeile in die Tabelle:
EINFÜGEN<таблица>[(Säulen)]
WERTE
b) Einfügen einer oder mehrerer Zeilen in die Tabelle aus der in der Unterabfrage angegebenen Quelle:
EINFÜGEN<таблица>[(Säulen)]
Regeln:
Die Anzahl der Elemente im Abschnitt „Spalten“ muss mit der Anzahl der Elemente im Abschnitt „Werte“ übereinstimmen; Datentypen müssen übereinstimmen oder eine implizite Konvertierung zulassen;
Falls es keinen Abschnitt „Spalten“ gibt, muss der Abschnitt „Werte“ die gleiche Anzahl an Werten enthalten, wie es insgesamt Spalten in der zu bearbeitenden Tabelle gibt, außerdem müssen die Werte in derselben Liste aufgeführt sein Reihenfolge, in der die Tabellenspalten deklariert werden; Daher empfiehlt es sich, die Liste der Spalten, zu denen neue Werte hinzugefügt werden, immer explizit anzugeben;
Bei Verwendung der Syntax (b) kann die SELECT-Unterabfrage entweder an dieselbe Tabelle oder an eine andere Tabelle in der Datenbank oder an eine andere Datenbank auf dem Server gerichtet werden;
Wenn für eine bestimmte Tabellenspalte ein Standardwert angegeben ist und Sie diesen Wert im hinzugefügten Datensatz verwenden möchten, müssen Sie im Abschnitt „Werte“ für diese Spalte das Schlüsselwort DEFAULT schreiben.
Beispiele :
INSERT INTO Detail (detail_name)
WERTE
INSERT INTO Supply (supplier_id, Supply_quantity, Supply_cost,
Supply_Date, Detail_ID)
WERTE (4, 177, 453,45, „25.09.2009“, 1)
Lieferant einfügen (Lieferantentyp, Lieferantenname)
WERTE (STANDARD, „Smirnov S. S.“)
Allgemeine Syntax:
AKTUALISIEREN<таблица>
SATZ<столбец> = <значение> [, <столбец> = <значение>]
Beispiele :
SET-Gewicht = 210
SET material_name = "Zinn"
WO material_id = 2
SET abteilungs_id = NULL,
Lieferdatum = Lieferdatum + 1 /*Lieferdatum um einen Tag erhöhen
WO Liefer_ID = 1 ODER Abteilungs-ID > 3
SET detail_name = detail_name + „!!!“
WHERE detail_name WIE „_а%“ UND Gewicht ZWISCHEN 6 UND 10
Allgemeine Syntax:
LÖSCHEN<таблица>
<условие>
Beispiele :
WHERE detail_id IN (2, 5, 8)
WO Gewicht NULL ist
Übung:
Füllen Sie die Datenbank mit ManagementStudio. Nutzen Sie dazu den Befehl „Tabelle öffnen“ des Tabellenkontextmenüs im „Objektbrowser“ (Abb. 4.1).
WÄHLEN<список столбцов>
AUS<таблица(-ы) источник>
Die SELECT- und FROM-Klauseln müssen in jeder Abfrage vorhanden sein; andere Abschnitte können fehlen oder teilweise vorhanden sein.
Die einfachsten Abfragen:
1. Wählen Sie den Namen und das Gewicht der Teile aus
Reis. 5.1. Ergebnisse der Abfrage Nr. 1
2. Wählen Sie alle Informationen aus der Materialtabelle aus
Reis. 5.2. Ergebnisse der Abfrage Nr. 2
Die Einzigartigkeit von DISTINCT
3. Wählen Sie eindeutige Lieferantencodes aus der Angebotstabelle aus
Reis. 5.3. Ergebnisse der Abfrage Nr. 3
WHERE-Einschränkung
4. Wählen Sie die Menge und den Liefertermin des Teils mit Code 1 aus
Reis. 5.4. Ergebnisse der Abfrage Nr. 4
5. Wählen Sie Lieferantennamen mit den Codes 1, 4 und 6 aus
Reis. 5.5. Ergebnisse der Abfrage Nr. 5
6. Wählen Sie alle Informationen zu Lieferungen aus, die vor dem 1. Oktober 2009 erfolgten
Reis. 5.6. Ergebnisse der Abfrage Nr. 6
7. Wählen Sie alle Informationen zu Teilen aus, die (auf keinen Fall) mit dem Buchstaben „B“ beginnen und deren Gewicht weniger als 50 beträgt
Reis. 5.7. Ergebnisse der Abfrage Nr. 7
8. Wählen Sie den Namen und den Materialcode für Teile mit einem Gewicht von 5 bis 10 g oder mit dem Buchstaben „n“ an dritter Stelle im Namen
Reis. 5.8. Ergebnisse der Abfrage Nr. 8
9. Wählen Sie Lieferantennamen aus, die nicht länger als 15 Zeichen sind
Reis. 5.9. Ergebnisse der Abfrage Nr. 9
10. Wählen Sie Monate und Jahre der Ersatzteilversorgung aus
Reis. 5.10. Ergebnisse der Abfrage Nr. 10
Sortierung ORDER BY
11. Sortieren Sie Lieferungen zunächst nach Lieferantencode und dann nach Lieferdatum
Reis. 5.11. Ergebnisse der Abfrage Nr. 11
12. Wählen Sie die Namen der Lieferanten mit den Codes 4, 6, 8, 9 aus, alphabetisch in umgekehrter Reihenfolge sortiert
Reis. 5.12. Ergebnisse der Abfrage Nr. 12
Aggregation und Gruppierung GROUP BY
Reis. 5.13. Ergebnisse der Abfrage Nr. 13
14. Bestimmen Sie das durchschnittliche Gewicht von Teilen aus Material mit Code 2
Reis. 5.14. Ergebnisse der Abfrage Nr. 2
15. Wählen Sie aus Lieferungen, die vor dem 1. Oktober 2009 erfolgten, die größte und die kleinste Lieferung aus
Reis. 5.15. Ergebnisse der Abfrage Nr. 15
16. Berechnen Sie für Lieferanten mit Codes im Bereich 5 bis 8 die Gesamtzahl der von ihnen gelieferten Teile
Reis. 5.16. Ergebnisse der Abfrage Nr. 16
Reis. 5.17. Ergebnisse der Abfrage Nr. 17
Einschränkungen für HAVING-Gruppen
18. Wählen Sie Materialien aus, bei denen das Gesamtgewicht der daraus hergestellten Teile nicht mehr als 20 beträgt
Reis. 5.18. Ergebnisse der Abfrage Nr. 18
19. Wählen Sie aus den Lieferungen im Jahr 2008 Teile aus, die mehr als einmal geliefert wurden
Reis. 5.19. Ergebnisse der Abfrage Nr. 19
TypkonvertierungGIESSEN
20. Erhalten Sie Informationen über Liefertermine in Textform
Reis. 5.20. Ergebnisse der Abfrage Nr. 20
21. Informationen aus der Teiletabelle in Form von Zeilen „Teil X hat Gewicht Y“ abrufen
Reis. 5.21. Ergebnisse der Abfrage Nr. 21
AlternativenFALL
22. Teilen Sie die Teile in leichte (bis zu 20), mittlere (zwischen 20 und 50) und schwere Teile
Reis. 5.22. Ergebnisse der Abfrage Nr. 22
Umgang mit NULL-Werten
23. Erhalten Sie Informationen über Teile und deren Gewichte. Wenn das Gewicht des Teils nicht angegeben ist, schreiben Sie -100 anstelle von NULL
Reis. 5.23. Ergebnisse der Abfrage Nr. 23
Existenzfunktion EXISTS
24. Wählen Sie nur den Namen und den Materialcode der Teile aus, die jemals geliefert wurden
Reis. 5.24. Ergebnisse der Abfrage Nr. 24
25. Wählen Sie die Namen der Materialien aus, aus denen kein einziges Teil besteht
Reis. 5.25. Ergebnisse der Abfrage Nr. 25
Unterabfragen
26. Informieren Sie sich über die letzte Lieferung (nach Datum).
Reis. 5.26. Ergebnisse der Abfrage Nr. 26
27. Erhalten Sie alle Lieferungen von Teilen aus Materialcode 2
Reis. 5.27. Ergebnisse der Abfrage Nr. 27
28. Informieren Sie sich für jeden Lieferanten über den ersten Liefertermin (nach Datum).
Reis. 5.28. Ergebnisse der Abfrage Nr. 28
29. Erfragen Sie für jeden Lieferanten seinen Namen und das Datum der letzten Bestellung
Reis. 5.29. Ergebnisse der Abfrage Nr. 29
Tabellen mit JOIN verbinden
30. Erstellen Sie eine Tabelle der Form: Name des Teils, Name des Materials, aus dem dieses Teil besteht
Reis. 5.30. Ergebnisse der Abfrage Nr. 30
31. Holen Sie sich eine Tabelle wie: Lieferant, Teilename, Menge und Lieferdatum für Teile, die ein bestimmtes Gewicht haben
Reis. 5.31. Ergebnisse der Abfrage Nr. 31
32. Wählen Sie alle Informationen zu den jemals gelieferten Teilen aus
Reis. 5.32. Ergebnisse der Abfrage Nr. 32
Reis. 5.33. Ergebnisse der Abfrage Nr. 33
34. Wählen Sie die Namen der Materialien und daraus hergestellten Teile aus
Reis. 5.34. Ergebnisse der Abfrage Nr. 34
35. Erhalten Sie alle Daten zu Lieferanten, Lieferungen und Teilen
Reis. 5.35. Ergebnisse der Abfrage Nr. 35
Beitritt zu UNION-Tabellen
36. Erstellen Sie eine Tabelle mit Namen und Gewichten der Teile. Die letzte Zeile der Tabelle sollte die Summen in Form des Gesamtgewichts aller Teile enthalten
Reis. 5.36. Ergebnisse der Abfrage Nr. 36
37. Erstellen Sie eine Tabelle mit zwei Feldern, wobei das erste Feld den Namen des Teils, des Materials, des Lieferanten oder des Lieferdatums enthält und das zweite Feld die Länge der Zeile vom ersten Feld angibt
Reis. 5.37. Ergebnisse der Abfrage Nr. 37
SQL-Anweisungen INSERT INTO und INSERT SELECT werden zum Einfügen neuer Zeilen in eine Tabelle verwendet. Es gibt zwei Möglichkeiten, Anweisungen zu verwenden:
Syntax:
INSERT INTO Tabellenname VALUES (Wert1, Wert2, Wert3,...); Tabellenname: Tabellenname. value1, value2,.. : Werte der ersten Spalte, der zweiten Spalte,... für den neuen Datensatz
Syntax:
INSERT INTO Tabellenname (Spalte1, Spalte2, Spalte3,..) VALUES (Wert1, Wert2, Wert3,...); Tabellenname: Tabellenname. Spalte1: Name der ersten Spalte, zweiten Spalte ... Wert1, Wert2, ...: Werte der ersten Spalte, zweiten Spalte, ... für neuen Datensatz
Anfragen:
Methode 1 ( nur Werte einfügen):
INSERT INTO Student VALUES („5“, „HARSH“, „WEST BENGAL“, „8759770477“, „19“);
Ergebnis :
Nach der Verwendung von INSERT INTO SELECT sieht die Student-Tabelle nun wie folgt aus:
ROLL_NR | NAME | ADRESSE | TELEFON | Alter |
1 | RAM | Delhi | 9455123451 | 18 |
2 | RAMESH | GURGAON | 9562431543 | 18 |
3 | SUJIT | ROHTAK | 9156253131 | 20 |
4 | SICHER | Delhi | 9156768971 | 18 |
3 | SUJIT | ROHTAK | 9156253131 | 20 |
2 | RAMESH | GURGAON | 9562431543 | 18 |
5 | HARSCH | WEST BENGAL | 8759770477 | 19 |
Methode 2 ( Einfügen von Werten nur in angegebene Spalten):
INSERT INTO Student (ROLL_NO, NAME, Age) VALUES („5“, „PRATIK“, „19“);
Ergebnis :
Die Student-Tabelle sieht nun wie folgt aus:
ROLL_NR | NAME | ADRESSE | TELEFON | Alter |
1 | RAM | Delhi | 9455123451 | 18 |
2 | RAMESH | GURGAON | 9562431543 | 18 |
3 | SUJIT | ROHTAK | 9156253131 | 20 |
4 | SICHER | Delhi | 9156768971 | 18 |
3 | SUJIT | ROHTAK | 9156253131 | 20 |
2 | RAMESH | GURGAON | 9562431543 | 18 |
5 | PRATIK | Null | Null | 19 |
Beachten Sie, dass Spalten, für die keine Werte angegeben sind, auf null gesetzt werden.
Mit der MySQL-Anweisung INSERT SELECT können Sie Zeilen aus einer Tabelle kopieren und in eine andere einfügen.
Die Verwendung dieser Anweisung ähnelt der Verwendung von INSERT INTO. Der Unterschied besteht darin, dass die SELECT-Anweisung zum Auswählen von Daten aus einer anderen Tabelle verwendet wird. Im Folgenden sind die verschiedenen Möglichkeiten aufgeführt, INSERT INTO SELECT zu verwenden:
Syntax:
INSERT INTO first_table SELECT * FROM second_table; first_table: Name der ersten Tabelle. second_table: Name der zweiten Tabelle.
Wir haben eine SELECT-Anweisung verwendet, um Daten aus einer Tabelle zu kopieren, und eine INSERT INTO-Anweisung, um sie in eine andere einzufügen.
Syntax:
INSERT INTO first_table(column_names1) SELECT columns_names2 FROM second_table; first_table: Name der ersten Tabelle. second_table: Name der zweiten Tabelle. col_names1: durch Komma(,) getrennte Spaltennamen für Tabelle 1. col_names2: durch Komma(,) getrennte Spaltennamen für Tabelle 2.
Wir haben die SELECT-Anweisung verwendet, um Daten nur aus den ausgewählten Spalten der zweiten Tabelle zu kopieren, und die MySQL-Anweisung INSERT INTO SELECT, um sie in die erste Tabelle einzufügen.
Syntax:
Tabelle 2: LateralStudent
ROLL_NR | NAME | ADRESSE | TELEFON | Alter |
7 | SOUVIK | DUMDUM | 9876543210 | 18 |
8 | NIRAJ | NOIDA | 9786543210 | 19 |
9 | Irgendwas | ROHTAK | 9687543210 | 20 |
Anfragen:
Methode 1 ( Fügen Sie alle Zeilen und Spalten ein):
INSERT INTO Student SELECT * FROM LateralStudent;
Ergebnis :
Diese Abfrage fügt alle Daten aus der LateralStudent-Tabelle in die Student-Tabelle ein. Nach der Verwendung von SQL INSERT INTO SELECT sieht die Student-Tabelle folgendermaßen aus:
ROLL_NR | NAME | ADRESSE | TELEFON | Alter |
1 | RAM | Delhi | 9455123451 | 18 |
2 | RAMESH | GURGAON | 9562431543 | 18 |
3 | SUJIT | ROHTAK | 9156253131 | 20 |
4 | SICHER | Delhi | 9156768971 | 18 |
3 | SUJIT | ROHTAK | 9156253131 | 20 |
2 | RAMESH | GURGAON | 9562431543 | 18 |
7 | SOUVIK | DUMDUM | 9876543210 | 18 |
8 | NIRAJ | NOIDA | 9786543210 | 19 |
9 | Irgendwas | ROHTAK | 9687543210 | 20 |
Methode 2 ( Einfügen einzelner Spalten):
INSERT INTO Student(ROLL_NO,NAME,Age) SELECT ROLL_NO, NAME, Age FROM LateralStudent;
Ergebnis :
Diese Abfrage fügt Daten aus den Spalten ROLL_NO, NAME und Age der LateralStudent-Tabelle in die Student-Tabelle ein. Die verbleibenden Spalten der Student-Tabelle werden auf null gesetzt. Nach der Verwendung von SQL INSERT SELECT sieht die Tabelle folgendermaßen aus:
ROLL_NR | NAME | ADRESSE | TELEFON | Alter |
1 | RAM | Delhi | 9455123451 | 18 |
2 | RAMESH | GURGAON | 9562431543 | 18 |
3 | SUJIT | ROHTAK | 9156253131 | 20 |
4 | SICHER | Delhi | 9156768971 | 18 |
3 | SUJIT | ROHTAK | 9156253131 | 20 |
2 | RAMESH | GURGAON | 9562431543 | 18 |
7 | SOUVIK | Null | Null | 18 |
8 | NIRAJ | Null | Null | 19 |
9 | Irgendwas | Null | Null | 20 |
Ergebnis :
Diese Abfrage wählt nur die erste Zeile aus der LateralStudent-Tabelle aus, um sie in die Student-Tabelle einzufügen. Nach der Verwendung von INSERT SELECT sieht die Tabelle folgendermaßen aus:
ROLL_NR | NAME | ADRESSE | TELEFON | Alter |
1 | RAM | Delhi | 9455123451 | 18 |
2 | RAMESH | GURGAON | 9562431543 | 18 |
3 | SUJIT | ROHTAK | 9156253131 | 20 |
4 | SICHER | Delhi | 9156768971 | 18 |
3 | SUJIT | ROHTAK | 9156253131 | 20 |
2 | RAMESH | GURGAON | 9562431543 | 18 |
7 | SOUVIK | DUMDUM | 9876543210 | 18 |
Diese Veröffentlichung ist eine Übersetzung des Artikels „SQL INSERT INTO Statement“, erstellt vom freundlichen Projektteam
Änderungsabfragen werden zum Hinzufügen (INSERT INTO), Löschen (DELETE) und Aktualisieren (UPDATE) von Datensätzen in Tabellen verwendet.
Mit dem Befehl INSERT INTO können am Ende einer Tabelle ein oder mehrere Datensätze hinzugefügt werden.
Die Syntax des INSERT INTO-Befehls lautet wie folgt:
INSERT INTO Table_Name [(Field_Name)] VALUES (Data_Values);
Platzieren wir beispielsweise in der Tabelle „Gruppen“ einen Datensatz mit Daten (1, BF-16a, 1, 1) in den entsprechenden Spalten (Gruppencode, Name, Kurs, Semester).
Fordern Sie dazu im Format an:
IN Gruppen einfügen (Gruppencode, Titel, Kurs, Semester) WERTE (1, BF-16a, 1, 1);
Geben Sie die Abfrage in das Formular ein, indem Sie den Befehl „Query Builder“ auf der Registerkarte „Erstellung“ im Modus „SQL-Modus“ im Menü „Ansicht“ ausführen.
Speichern Sie die Anfrage unter dem Namen „Add_1_records“. Als Ergebnis wird im „Navigationsbereich“ ein unabhängiges Objekt angezeigt – „Add_1_records“ (Abb. 1).
Reis. 1.
Nachdem Sie die Anfrage gespeichert haben, müssen Sie diese ausführen, indem Sie auf das Symbol „Ausführen“ klicken. Als Ergebnis der Ausführung des Befehls „Add_1_records“ erscheint der erste Datensatz in der leeren Tabelle (Abb. 2).
Reis. 2.
Der UPDATE-Befehl dient zum Ändern vorhandener Datensätze in Tabellenspalten, wodurch Sie die Werte in bestimmten Tabellenspalten aktualisieren können.
Die UPDATE-Befehlssyntax lautet wie folgt:
UPDATE Table_Name SET Column_Name = New_Value WHERE Selection_Condition;
Die SET-Klausel gibt die Namen der Spalten an, deren Daten geändert werden müssen. Die WHERE-Klausel ist optional, kann jedoch verwendet werden, um nur die Zeilen in den Spalten (Tabellen) anzugeben, die aktualisiert werden müssen.
Erstellen wir eine Anfrage zum Ändern eines Datensatzes in der Tabelle „Gruppen“ der Datenbank sql_training_st.mdb.
Ändern wir beispielsweise einen vorhandenen Eintrag für die erste Schlüsselfeld-ID in der Spalte „Name“ der Tabelle „Gruppen“.
Anfrage im Format:
UPDATE-Gruppen SET Name = „BF-16b“ WHERE ID = 1;
Speichern Sie die Anfrage unter dem Namen „Change_record_1“. Als Ergebnis erscheint das Objekt „Change_record_1“ im „Übergangsbereich“ (Abb. 3.).
Reis. 3.
Nachdem Sie die Anfrage gespeichert haben, müssen Sie diese ausführen, indem Sie auf das Symbol „Ausführen“ klicken. Als Ergebnis der Ausführung des Befehls „Change_record_1“ erscheint ein Dialogfeld, in dem Sie den Wert des Parameters ID=1 eingeben und auf OK klicken müssen. Nach diesen Aktionen ändert sich in der Tabelle „Gruppen“ der Eintrag im Feld „Name“ von BF-16a zu BF-16b (Abb. 4.).
Reis. 4.
Der DELETE-Befehl dient zum Löschen von Datensätzen aus einer Tabelle.
Format einer Anfrage zum Löschen von Datensätzen:
DELETE FROM Table_Name WHERE Selection_Condition;
Erstellen wir eine Anfrage zum Ändern eines Datensatzes in der Tabelle „Gruppen“ der Datenbank sql_training_st.mdb.
Löschen wir beispielsweise den vorhandenen Datensatz für die erste Schlüsselfeld-ID in allen Spalten (Feldern) der Tabelle „Gruppen“.
Fordern Sie dazu im Format an:
DELETE FROM Groups WHERE ID=1;
Erstellen Sie eine Abfrage im Formular, indem Sie den Befehl „Query Builder“ auf der Registerkarte „Erstellung“ im Modus „SQL-Modus“ im Menü „Ansicht“ ausführen.
Wir speichern die Anfrage unter dem Namen „Delete_record_1“. Als Ergebnis erscheint das Objekt „Delete_record_1“ im „Übergangsbereich“ (Abb. 5.).
Reis. 5.
Nachdem Sie die Anfrage gespeichert haben, müssen Sie diese ausführen, indem Sie auf das Symbol „Ausführen“ klicken. Als Ergebnis der Ausführung des Befehls „Delete_record_1“ erscheint ein Dialogfeld, in dem Sie den Wert des Parameters ID=1 eingeben und auf OK klicken müssen. Nach diesen Schritten öffnet sich das Dialogfenster „Löschung der Datensätze bestätigen“. Nach der Bestätigung werden die Daten in allen Feldern in der Tabelle „Gruppen“ gelöscht, d.h. Der Eintrag wurde gelöscht (Abb. 6.).
Reis. 6.
Es ist zu beachten, dass es zum Löschen von Daten in bestimmten Feldern einer Tabelle ratsam ist, den UPDATE-Befehl zu verwenden und die Werte in den erforderlichen Feldern durch Null zu ersetzen. Wenn Sie eine Tabelle als Ganzes löschen müssen, sollten Sie den DROP TABLE-Operator verwenden (Operatorsyntax: DROP TABLE Table_Name;).
Lassen Sie uns den ersten Datensatz in der Tabelle „Gruppen“ wiederherstellen, indem wir den Befehl „Add_1_records“ ausführen. Als Ergebnis stellen wir den ersten Datensatz wieder her (Abb. 7.).
Reis. 7.
Manchmal verspüren Programmierer den brennenden Wunsch, etwas aus der Datenbank zu lesen. Programmierer werden nervös und gereizt, verlieren den Schlaf und zeigen hektisch mit dem Finger auf die Tastatur. Zum Wohle aller und zum Wohle des Weltfriedens werfen wir einen Blick auf die einfache Datenbankverwaltung von C# mit ADO.NET und OLE DB. Obwohl dieser Mechanismus verschiedene Datenbanken wie Oracle unterstützt, werden wir hier und jetzt MS SQL Server verwenden.
Zwei Hauptaufgaben bei der Arbeit mit einer Datenbank
2. Ausführen eines SQL-Befehls, der etwas auf dem Server ausführt (Einfügen, Aktualisieren, Löschen, Aufrufen einer Funktion oder gespeicherten Prozedur).
3. Sequentielles Lesen aus der ausgewählten Auswahl Zeile für Zeile. Es wird hauptsächlich in Webanwendungen verwendet; in Desktopanwendungen ist es einfacher, die gesamte Auswahl auf einmal in den RAM herunterzuladen; die Einsparungen durch das Lesen nur der erforderlichen Zeilen sind vernachlässigbar.
4. Seltener Fall. Automatische Aktualisierung einer Tabelle in der Datenbank basierend auf Änderungen in der DataTable (normalerweise bearbeitet über eine visuelle Schnittstelle). Im wirklichen Leben werden Daten normalerweise über eine komplexe Heap-Join-Abfrage oder -Ansicht gelesen, sodass eine automatische Synchronisierung nicht geeignet ist.
Die für diese Zwecke verwendeten Hauptklassen: OleDbConnection – eine Verbindung zur Datenbank, erstellt mit einer Zeichenfolge, die Verbindungsparameter enthält, open, close, OleDbCommand – erstellt mit einer Verbindungsinstanz und einem SQL-Befehl, wenn Sie nur ein Update oder Get durchführen müssen Ein einzelner Wert, dann reicht die Klasse OleDbDataAdapter – erstellt mit OleDbCommand, ist auf das einmalige Lesen von Zeilensätzen in einer DataTable spezialisiert, kann automatisch DataTable-Spalten basierend auf einer Auswahl erstellen und Änderungen von der DataTable in eine Tabelle in übertragen Datenbank, OleDbDataReader – sequentielles Lesen von Zeilen in der DataTable einzeln (funktioniert intern OleDbDataAdapter), DataTable / DataSet – der Hauptcontainer für Daten. Die OleDbType-Enumeration speichert die Datentypen der Datenbank.
Verwenden von System.Data; mit System.Data.OleDb; // Verbindungszeichenfolge, Windows-Benutzersystem wird verwendet (Integrated Security=SSPI;) string connString = "Provider=SQLOLEDB.1;Integrated Security=SSPI;Persist Security Info=False;Initial Catalog=databaseName;Data Source=serverName"; // alternative Verbindungszeichenfolge mit MS SQL Server-Authentifizierung // connString = "Provider=SQLOLEDB.1;Persist Security Info=False;Initial Catalog=databaseName;Connect Timeout=20;Data Source=serverName;Uid=userName;Pwd=userPassword ; " OleDbConnection dbConn = new OleDbConnection(connString); dbConn.Open(); someDataTable = new DataTable(); OleDbDataAdapter dbAdapter = new OleDbDataAdapter("select COLUMN1, COLUMN2 from TEST_TABLE ORDER BY COLUMN2", dbConn); // Die interne Struktur einer leeren Tabelle wird automatisch basierend auf den gelesenen Daten erstellt. Wenn die Tabellenstruktur bereits angegeben wurde (z. B. durch ein typisiertes DataSet), werden die Daten in Spalten mit übereinstimmenden Namen oder neu geschrieben Spalten werden hinzugefügt dbAdapter.Fill(someDataTable); // eine alternative Option zum Füllen einer Tabelle in einem DataSet // dbAdapter.Fill(someDataSet, "someDataTable"); dbConn.Close();
2. Ausführen eines SQL-Befehls, der etwas auf dem Server ausführt (Einfügen, Aktualisieren, Löschen, Aufrufen einer Funktion oder gespeicherten Prozedur)..
Besonders hervorzuheben sind die Probleme mit den Terminen. Die Implementierung von Datumsangaben in .Net ist äußerst schief – anfangs können Datumsangaben nicht leer sein, aber im wirklichen Leben sind sie die ganze Zeit leer. Die korrekteste Lösung besteht darin, eine spezielle Datumsklasse zu verwenden, die die Fehler von Microsoft-Programmierern korrigiert. Lazier-Entwickler behalten alle Datumsangaben im Code als Zeichenfolgen bei und konvertieren sie nur bei Bedarf in DateTime, beispielsweise beim Schreiben in eine Datenbank oder DataTable. Nullable DateTime hilft nicht, da ein leeres Datum in der Schnittstelle wie eine leere Zeichenfolge aussehen sollte und beim Schreiben in die Datenbank als DBNull.Value selbst eine banale Null im Code nicht ohne zusätzliches Tanzen in diese Werte umgewandelt wird ein Tamburin.
Die erste Option besteht darin, einfach eine Abfragezeichenfolge zusammenzuführen. Gilt als schlechte Praxis und ist in Webanwendungen besonders gefährlich, da sie anfällig für Hackerangriffe ist. Das Problem mit leeren Terminen lässt sich nicht so einfach lösen. Darüber hinaus tritt beim Arbeiten mit Datumsangaben ein zusätzliches Problem auf: unterschiedliche Datumszeichenfolgenformate abhängig von den regionalen Einstellungen des .Net Frameworks, der Entwicklungsumgebung und des SQL Servers. Es sieht vielleicht surreal aus – die gleiche Abfrage funktioniert in SQL Managment Studio, stürzt jedoch ab, wenn sie über den Code ausgeführt wird. Teilweise gespeichert durch das spezielle Format der Datumszeichenfolge. Dies geschieht jedoch häufig in kleinen Programmen für den internen Gebrauch, von deren Existenz die Außenwelt nie erfahren wird.
OleDbCommand dbCommand = dbConn.CreateCommand(); dbCommand.CommandText = "INSERT INTO TEST_TABLE (INT_COLUMN, VARCHAR_COLUMN, DATETIME_COLUMN) VALUES (" + intVariable", " + stringVariable", " + dateTimeVariable.ToString("yyyyMMdd") +"); dbCommand.ExecuteNonQuery();
Die richtige Option besteht darin, einen Befehl mit einer Reihe stark typisierter Parameter zu erstellen. Bedenken Sie, dass der vorherige Absatz nicht existierte.
OleDbCommand dbCommand = dbConn.CreateCommand(); dbCommand.CommandText = "INSERT INTO TEST_TABLE (INT_COLUMN, VARCHAR_COLUMN, DATETIME_COLUMN) VALUES (?, ?, ?)"; dbCommand.Parameters.Add("INT_COLUMN", OleDbType.Integer).Value = intVariable; dbCommand.Parameters.Add("VARCHAR_COLUMN", OleDbType.VarChar).Value = stringVariable; if (stringDate == "") ( dbCommand.Parameters.Add("DATETIME_COLUMN", OleDbType.DateTime).Value = DBNull.Value; ) else ( dbCommand.Parameters.Add("DATETIME_COLUMN", OleDbType.DateTime).Value = Convert.ToDateTime(stringDate); ) dbCommand.ExecuteNonQuery();
Die gespeicherte Prozedur wird auf genau die gleiche Weise aufgerufen, der Vielfalt halber gibt es eine andere Möglichkeit, Werte in Parameter zu schreiben (diese bezieht sich nicht speziell auf die gespeicherte Prozedur):
OleDbCommand someDbComm = new OleDbCommand("someStoredProcedure", this.dbConn); someDbComm.CommandType = CommandType.StoredProcedure; someDbComm.Parameters.Add("@parameter1", OleDbType.VarChar); someDbComm.Parameters.Add("@parameter2", OleDbType.VarChar); someDbComm.Parameters.Value = "Jedes Problem hat immer eine Lösung – einfach, bequem und natürlich falsch"; someDbComm.Parameters.Value = "Henry Louis Mencken"; someDbComm.ExecuteNonQuery(); !}
Eine erweiterte Version der Parameterbeschreibung, die die Feldgröße und die Bindung an eine bestimmte Tabellenspalte angibt.
DbCommand.Parameters.Add("VARCHAR_COLUMN", OleDbType.VarChar, 100, "VARCHAR_COLUMN").Value = stringVariable;
Wenn wir keinen Befehlsparameter an ein bestimmtes DataTable-Feld binden müssen, ist es am besten, die Größe überhaupt nicht anzugeben. Wenn die Zeichenfolge beispielsweise kleiner als die angegebene Varchar-Länge ist, fügt das gute .Net-Framework hinzu Leerzeichen werden bis zur angegebenen Länge in die Zeichenfolge eingefügt, wodurch die an den Server übertragenen Daten beschädigt werden.
Der Wert eines einzelnen Feldes wird von der Methode ExecuteScalar() gelesen
OleDbCommand dbCommand = dbConn.CreateCommand(); dbCommand.CommandText = "SELECT TEST_COLUMN FROM TEST_TABLE WHERE ID_COLUMN = ?"; dbCommand.Parameters.Add("INT_COLUMN", OleDbType.Integer).Value = intVariable; int result = Convert.ToInt32(dbCommand.ExecuteScalar());
Es ist besonders zu beachten, dass ExecuteScalar ein Objekt zurückgibt. Wenn die Anfrage überhaupt nichts zurückgibt, ist das Ergebnis null und die Konvertierung in einen normalen Datentyp schlägt mit einem Fehler fehl. Wenn eine Situation möglich ist, in der wir keine Antwort erhalten, müssen wir Folgendes tun:
OleDbCommand dbCommand = dbConn.CreateCommand(); dbCommand.CommandText = "SELECT TEST_COLUMN FROM TEST_TABLE WHERE ID_COLUMN = ?"; dbCommand.Parameters.Add("INT_COLUMN", OleDbType.Integer).Value = intVariable; object resultObj = dbCommand.ExecuteScalar() int result = -1; // Standardwert bedeutet leeres Ergebnis if(resultObj != null) ( result = Convert.ToInt32(dbCommand.ExecuteScalar()); )
3. Sequentielles Lesen aus der ausgewählten Auswahl Zeile für Zeile
Lesen einer Zeile (mehrere werden in einer Schleife gelesen);
OleDbCommand dbCommand = new OleDbCommand(select PERSON_ID, NAME, NURNAME from TEST_TABLE, dbConn); OleDbDataReader dbReader = dbCommand.ExecuteReader(); dbReader.Read(); string name = Convert.ToString(dbReader["NAME"]); string Nachname = Convert.ToString(dbReader["SURNAME"]); dbReader.Close();
4. Seltener Fall. Automatische Aktualisierung einer Tabelle in der Datenbank basierend auf Änderungen in der DataTable (normalerweise bearbeitet über eine visuelle Schnittstelle).
Für jeden möglichen Fall müssen vier Befehle für DbAdapter geschrieben werden: Auswählen, Einfügen, Aktualisieren, Löschen.
DbAdapter.InsertCommand = new OleDbCommand("in TEST_TABLE (NAME, FAMIL, AGE) Werte (?, ?, ?) einfügen", dbConnection); dbAdapter.InsertCommand.Parameters.Add("NAME", OleDbType.VarChar, 100, "NAME"); dbAdapter.InsertCommand.Parameters.Add("FAMIL", OleDbType.VarChar, 100, "FAMIL"); // für Datentypen mit konstanter Länge wird die im Befehl angegebene Länge ignoriert dbAdapter.InsertCommand.Parameters.Add("AGE", OleDbType.Integer, 100, "AGE"); // einen Aktualisierungsbefehl hinzufügen dbAdapter.UpdateCommand = new OleDbCommand("update TEST_TABLE set NAME = ?, FAMIL = ?, AGE = ? where ID = ?, dbConnection); dbAdapter.UpdateCommand.Parameters.Add("NAME", OleDbType.VarChar,100, "NAME"); dbAdapter.UpdateCommand.Parameters.Add("FAMIL", OleDbType.VarChar, 100, "FAMIL"); dbAdapter.UpdateCommand.Parameters.Add("AGE", OleDbType.Integer, 100, "AGE"); dbAdapter.UpdateCommand.Parameters.Add("ID", OleDbType.Integer, 100, "ID"); // Löschbefehl hinzufügen dbAdapter.DeleteCommand = new OleDbCommand("delete from TEST_TABLE where ID = ?", dbConnection); dbAdapter.DeleteCommand.Parameters.Add("ID", OleDbType.Integer, 100, "ID"); try ( // überträgt alle Änderungen von der DataTable in die Tabelle in der Datenbank dbAdapter.Update(table); ) Catch (Exception error) ( MessageBox.Show("Fehler beim Speichern von Daten! " + error.Message); return; ) MessageBox. Show("Änderungen gespeichert!");