Einführung in SQL: SQL-Befehle
Aus Wikibooks
Manchen Einsteigern mag SQL sehr sperrig erscheinen. SQL ist weniger für improvisierte Einmalabfragen gedacht, als vielmehr zur Entwicklung von stabilen, dauerhaft nutzbaren Abfragen. Wenn die Abfrage einmal entwickelt ist, wird sie meistens in eine
GUI- oder
HTML-Umgebung eingebunden, sodass der Benutzer mit dem SQL-Code gar nicht mehr in Berührung kommt.
Es gibt zwar einen SQL-Standard, der möglichst von allen Datenbanken übernommen werden soll, aber leider hält sich kein angebotenes DBMS (Datenbank-Management-System) vollständig daran. Es kann also je nach DBMS zu leichten bis großen Abweichungen kommen, und für Sie führt kein Weg daran vorbei, immer wieder in der Dokumentation ihrer persönlichen Datenbank nachzulesen. Das gilt natürlich besonders für Features, die im SQL-Standard gar nicht enthalten sind, von Ihrem DBMS trotzdem angeboten werden.
| Die Abweichungen eines bestimmten DBMS vom SQL-Standard werden häufig als SQL-Dialekt bezeichnet. |
Inhaltsverzeichnis |
[Bearbeiten] Allgemeine Hinweise
Die gesamte Menge an Befehlen ist recht überschaubar; Schwierigkeiten machen hierbei die vielen variantenreichen Befehlsparameter.
Der Übersicht halber wurde SQL in Teilbereiche gegliedert; allerdings gibt es auch für diese Aufteilung Unterschiede bei den DBMS, den Dokumentationen und in Fachbüchern. Diese Aufteilung dient aber nicht nur der Übersicht, sondern hat auch praktische Gründe:
- DML-Befehle werden vor allem von "einfachen" Anwendern benutzt.
- DDL-und TCL-Befehle dienen Programmierern.
- DCL-Befehle gehören zum Aufgabenbereich von Systemadministratoren.
Dies sind die Bestandteile eines einzelnen Befehls:
- der Name des Befehls
- der Name des Objekts (Datenbank, Tabelle, Spalte usw.)
- ein Hinweis zur Maßnahme, soweit diese nicht durch den Befehl klar ist
- weitere Einzelheiten
- das Semikolon als Zeichen für den Abschluss eines SQL-Befehls
Damit dies alles eindeutig ist, gibt es eine Reihe von Schlüsselwörtern (key words, reserved words, non-reserved words), anhand derer das DBMS die Informationen innerhalb eines Befehls erkennt.
Die Schreibweise eines Befehls ist flexibel.
- Groß- und Kleinschreibung der Schlüsselwörter wird nicht unterschieden.
- Ein Befehl kann beliebig auf eine oder mehrere Zeilen verteilt werden; der wichtigste Gesichtspunkt dabei ist die Lesbarkeit auch für Sie selbst beim Schreiben.
- Das Semikolon ist nicht immer erforderlich, wird aber empfohlen. Bei manchen DBMS wird der Befehl erst nach einem folgenden GO o.ä. ausgeführt.
Für eigene Bezeichner, d.h. die Namen von Tabellen, Spalten oder eigenen Funktionen gilt:
- Vermeiden Sie unbedingt, Schlüsselwörter dafür zu verwenden; dies führt schnell zu Problemen auch dort, wo es möglich wäre.
- Das Wort muss in der Regel mit einem der Buchstaben a…z, A…Z oder dem Unterstrich beginnen. Danach folgen beliebig Ziffern und Buchstaben.
- Inwieweit andere Zeichen und länderspezifische Buchstaben (Umlaute) möglich sind, hängt vom DBMS ab. Ich rate davon ab, aber das mag Geschmackssache sein. Unter Namen von Tabellen und Spalten plädiere ich sowieso für englische Bezeichnungen.
Dieses Buch geht davon aus, dass Schlüsselwörter nicht als Bezeichner dienen und auch Umlaute nicht benutzt werden.
Kommentare können in SQL-Befehle fast beliebig eingefügt werden (nur die Schlüsselwörter dürfen natürlich nicht "zerrissen" werden). Es gibt zwei Arten von Kommentaren:
-- (doppelter Bindestrich, am besten mit Leerzeichen dahinter)
Alles, was dahinter kommt (einschließlich der beiden Striche) bis zum Ende dieser Zeile gilt als Kommentar und nicht als Bestandteil des Befehls.
/* (längerer Text, gerne auch über mehrere Zeilen) */
Alles, was zwischen '/*' und '*/' steht (einschließlich dieser Begrenzungszeichen), gilt als Kommentar und nicht als Bestandteil des Befehls.
[Bearbeiten] DML – Data Manipulation Language
DML beschäftigt sich mit dem Inhalt des Datenbestandes. "Manipulation" ist dabei nicht nur im Sinne von "Manipulieren" zu verstehen, sondern allgemeiner im Sinne von "in die Hand nehmen" (lat. manus = Hand).
Der SELECT-Befehl dient der Abfrage von Daten und wird in DML (1) - Daten abfragen behandelt.
- Gelegentlich finden Sie dafür auch den Begriff "Data Query Language (DQL)". Diese Einführung fasst ihn aber als Teilgebiet der DML auf; nur aus Gründen der Übersicht gibt es getrennte Kapitel.
Die Befehle INSERT, UPDATE, DELETE dienen der Speicherung von Daten und werden in DML (2) - Daten speichern behandelt.
Bei diesen Befehlen ist immer genau eine Tabelle – nur bei SELECT auch mehrere – anzugeben, dazu Art und Umfang der Arbeiten sowie in aller Regel mit WHERE eine Liste von Bedingungen, welche Datensätze bearbeitet werden sollen.
Die folgenden Erläuterungen sind einheitlich für alle DML-Befehle zu beachten.
[Bearbeiten] Datenmengen, nicht einzelne Datensätze
Bitte beachten Sie, dass SQL grundsätzlich mengenorientiert arbeitet. DML-Befehle wirken sich meistens nicht nur auf einen Datensatz aus, sondern auf eine ganze Menge, die aus 0, einem oder mehreren Datensätzen bestehen kann. Auch die WHERE-Bedingungen sorgen "nur" für den Umfang der Datenmenge; aber das Ergebnis ist immer eine Datenmenge.
Im Einzelfall wissen Sie als Anwender oder Programmierer aufgrund der Bedingungen natürlich häufig, ob die Datenmenge 0, 1 oder n Datensätze enthalten kann oder soll. Aber Sie müssen selbst darauf achten, denn SQL oder das DBMS können das nicht wissen.
Die Struktur als Datenmenge führt auch dazu, dass es bei einem SELECT-Befehl keine "natürliche" Reihenfolge gibt, in der die Daten angezeigt werden. Manchmal kommen sie in der Reihenfolge, in der sie gespeichert wurden; aber bei umfangreicheren Tabellen mit vielen Änderungen sieht es eher nach einem großen Durcheinander aus – es sei denn, Sie verwenden die ORDER BY-Klausel.
[Bearbeiten] SQL-Ausdrücke
In vielen Fällen wird der Begriff Ausdruck verwendet. Dies ist ein allgemeiner Begriff für verschiedene Situationen:
- An Stellen, an denen ein einzelner Wert angegeben werden muss, kann auch ein Werte-Ausdruck verwendet werden: ein konstanter Wert (Zahl, Text, boolescher Wert), das Ergebnis einer Funktion, die einen solchen Wert zurückgibt, oder eine Abfrage, die als Ergebnis einen einzigen Wert liefert.
- An Stellen, an denen eine oder mehrere Zeilen einer Datenmenge angegeben werden müssen, kann auch ein SQL-Ausdruck (im SQL-Standard als "query expression" bezeichnet) verwendet werden. Dabei handelt es sich um einen SQL-Befehl (in der Regel einen SELECT-Befehl), der als Ergebnis eine Menge von Datensätzen liefert.
- An Stellen, an denen eine Liste einzelner Werte angegeben werden muss, kann ebenfalls ein SQL-Ausdruck verwendet werden; dieser muss dann als Ergebnis eine Menge passender Werte liefern.
[Bearbeiten] Datenintegrität
Bei allen Datenmanipulationen ist zu beachten, dass die Bedingungen für Querverweise erhalten bleiben, siehe das Kapitel Fremdschlüssel-Beziehungen. Beispielsweise darf ein Datensatz in der Tabelle Abteilung erst dann gelöscht werden, wenn alle ihr zugeordneten Mitarbeiter gelöscht wurden.
[Bearbeiten] Hinweis für Programmierer: Parameter benutzen!
Immer dann, wenn ein SQL-Befehl in einem Programm eingebunden wird, sollte er nicht als "langer String" mit festen Zeichenketten erstellt werden, sondern mit
Parametern. Das erleichtert die variable Wiederverwendung, die Einbindung unterschiedlichster Werte, umgeht Probleme mit der Formatierung von Zahlen und Datumsangaben und verhindert
SQL-Injection.
In DML (2) - Daten speichern steht unter UPDATE folgendes Beispiel:
Dies korrigiert die Schreibweise des Namens beim Mitarbeiter mit der Personalnummer 20001
SQL-Quelltext:
UPDATE Mitarbeiter SET Name = 'Mayer' WHERE Personalnummer = 20001;
Dieses Beispiel sieht besser so aus:
In einem Programm mit ADO.NET und Visual Basic für MS-SQL wird dieser Befehl wie folgt verwendet. (Das sieht zwar nach mehr Schreibarbeit aus, ist aber tatsächlich wesentlich einfacher und sicherer.)
Dim sel As String = "UPDATE ... @PersNr;" Dim cmd As SqlCommand = new SqlCommand(sel) cmd.Parameters.AddWithValue("@Name", "Mayer") cmd.Parameters.AddWithValue("@PersNr", 20001)
Zwar unterscheidet sich die Art, wie die Parameter bezeichnet werden, nach Programmiersprache und DBMS. Aber diese Unterschiede sind viel geringer als die Unterschiede nach den Datentypen und machen die Arbeit viel sicherer.
Parameter gibt es nur für DML-Befehle, nicht für DDL oder DCL.
[Bearbeiten] DDL – Data Definition Language
DDL definiert die Struktur einer Datenbank.
Hierzu gibt es die Befehle CREATE, ALTER, DROP; diese werden für Datenbank-Objekte DATABASE, TABLE, VIEW usw. verwendet.
Einzelheiten werden in DDL - Struktur der Datenbank behandelt.
[Bearbeiten] TCL – Transaction Control Language
Damit die Daten dauerhaft zusammenpassen, d.h. dass die
Datenintegrität gewahrt bleibt, sollen Änderungen, die zusammengehören, auch "am Stück" übertragen und gespeichert werden. Falls eine einzelne dieser Änderungen nicht funktioniert, muss der gesamte Vorgang rückgängig gemacht werden.
Dies wird durch Transaktionen gesteuert, die mit COMMIT oder ROLLBACK abgeschlossen werden.
Einzelheiten werden in TCL - Ablaufsteuerung behandelt.
[Bearbeiten] DCL – Data Control Language
Eine "vollwertige" SQL-Datenbank regelt umfassend die Rechte für den Zugriff auf Objekte (Tabellen, einzelne Felder, interne Funktionen usw.). Hierzu kommen die Befehle GRANT und REVOKE zum Einsatz.
Einzelheiten werden in DCL - Zugriffsrechte behandelt.
[Bearbeiten] Zusammenfassung
In diesem Kapitel lernten wir grundlegende Informationen zu SQL-Befehlen kennen:
- Die Befehle der DML (Data Manipulation Language) bearbeiten die Daten und gehören zum Aufgabenbereich eines jeden Benutzers.
- Mit SELECT werden Daten abgerufen, mit INSERT und UPDATE gespeichert und mit DELETE gelöscht.
- Die DML-Befehle arbeiten mengenorientiert; anstelle konkreter Werte werden häufig Ausdrücke verwendet.
- Die Befehle der DDL (Data Definition Language) steuern die interne Struktur der Datenbank und gehören zum Aufgabenbereich von Programmentwicklern.
- Die Befehle der TCL (Transaction Control Language) sorgen für die Integrität der Daten beim Speichern und gehören ebenfalls zum Aufgabenbereich von Programmentwicklern.
- Die Befehle der DCL (Data Control Language) sorgen für die Zugriffssicherheit und gehören zum Aufgabenbereich von Systemadministratoren.
Die Bestandteile der SQL-Befehle werden anhand von Schlüsselwörtern erkannt und ausgewertet.