Rheinwerk Computing < openbook > Rheinwerk Computing - Professionelle Bücher. Auch für Einsteiger.
Professionelle Bücher. Auch für Einsteiger.

Inhaltsverzeichnis
Vorwort
1 Einführung
2 Mathematische und technische Grundlagen
3 Hardware
4 Netzwerkgrundlagen
5 Betriebssystemgrundlagen
6 Windows
7 Linux
8 Mac OS X
9 Grundlagen der Programmierung
10 Konzepte der Programmierung
11 Software-Engineering
12 Datenbanken
13 Server für Webanwendungen
14 Weitere Internet-Serverdienste
15 XML
16 Weitere Datei- und Datenformate
17 Webseitenerstellung mit (X)HTML und CSS
18 Webserveranwendungen
19 JavaScript und Ajax
20 Computer- und Netzwerksicherheit
A Glossar
B Zweisprachige Wortliste
C Kommentiertes Literatur- und Linkverzeichnis
Stichwort

Buch bestellen
Ihre Meinung?

Spacer
IT-Handbuch für Fachinformatiker von Sascha Kersken
Der Ausbildungsbegleiter
Buch: IT-Handbuch für Fachinformatiker

IT-Handbuch für Fachinformatiker
Rheinwerk Computing
1216 S., 6., aktualisierte und erweiterte Auflage, geb.
34,90 Euro, ISBN 978-3-8362-2234-1
Pfeil 12 Datenbanken
Pfeil 12.1 Die verschiedenen Datenbanktypen
Pfeil 12.1.1 Einzeltabellendatenbanken
Pfeil 12.1.2 Relationale Datenbanken
Pfeil 12.1.3 Objektorientierte Datenbanken
Pfeil 12.2 MySQL – ein konkretes RDBMS
Pfeil 12.2.1 MySQL installieren und konfigurieren
Pfeil 12.2.2 Erste Schritte mit dem mysql-Client
Pfeil 12.3 SQL-Abfragen
Pfeil 12.3.1 Datenbanken und Tabellen erzeugen
Pfeil 12.3.2 Auswahlabfragen
Pfeil 12.3.3 Einfüge-, Lösch- und Änderungsabfragen
Pfeil 12.3.4 Transaktionen
Pfeil 12.4 MySQL-Administration
Pfeil 12.4.1 mysqladmin
Pfeil 12.4.2 Benutzerverwaltung
Pfeil 12.4.3 Import und Export von Daten, Backups
Pfeil 12.4.4 Konfigurationsdateien
Pfeil 12.4.5 Log-Dateien
Pfeil 12.4.6 Replikation
Pfeil 12.5 Grundlagen der Datenbankprogrammierung
Pfeil 12.6 Zusammenfassung

Rheinwerk Computing - Zum Seitenanfang

12.3 SQL-AbfragenZur nächsten Überschrift

In diesem Abschnitt werden einige Einzelheiten der Datenbankabfrage SQL näher erläutert. So gut wie alle relationalen Datenbanksysteme verstehen irgendeine Version dieser Sprache. Die hier vorgestellten SQL-Funktionen und -Merkmale funktionieren allesamt unter MySQL und sind, falls nicht anders vermerkt, konform mit dem SQL99-Standard. Beachten Sie jedoch, dass SQL99 einige weitere Fähigkeiten besitzt, die von MySQL bisher noch immer nicht voll unterstützt werden. Um die Beispiele im vorliegenden Abschnitt unter anderen RDBMS wie PostgreSQL, Microsoft SQL Server oder Oracle auszuführen, sind gegebenenfalls Anpassungen erforderlich, die Sie der Dokumentation Ihres Datenbanksystems entnehmen müssen.

Die Bezeichnung Abfrage (Query) ist ein wenig irreführend, weil Sie mithilfe von Abfragen nicht nur die Inhalte von Datenbanktabellen lesen, sondern auch ändern können. SQL unterstützt im Wesentlichen vier Arten von Datenbankabfragen:

  • Auswahlabfragen (Select Queries) liefern ausgesuchte Felder einer oder mehrerer Tabellen zurück; optional können Kriterien angegeben werden, nach denen die Datensätze gefiltert werden sollen.
  • Einfügeabfragen (Insert Queries) fügen neue Datensätze in eine Tabelle ein.
  • Änderungsabfragen (Update Queries) ändern die Werte bestimmter Felder nach bestimmten Regeln und Kriterien.
  • Löschabfragen (Delete Queries) entfernen Datensätze, die bestimmte Bedingungen erfüllen.

Neben diesen grundlegenden Abfragetypen, die bereits bestehende Tabellen betreffen, bietet SQL Befehle zum Anlegen und Entfernen von Datenbanken und von Tabellen innerhalb dieser Datenbanken.

Da SQL-Datenbanken zumindest auf Unix-Systemen zwischen Groß- und Kleinschreibung bei Tabellennamen unterscheiden, sollten Sie die Schreibung Ihrer Tabellen- und Feldbezeichnungen stets konsistent halten. Bei den SQL-Anweisungen und -Funktionen selbst wird dagegen nicht zwischen Groß- und Kleinschreibung unterschieden; traditionell werden sie komplett in Großbuchstaben geschrieben. Übrigens ist es egal, in wie viele Zeilen Sie eine Abfrage unterteilen. Falls sie mehrzeilig ist, muss sie allerdings durch ein Semikolon abgeschlossen werden.[Anm.: Der Kommandozeilen-Client mysql benötigt das Semikolon immer, weil er sonst davon ausgeht, dass eine Abfrage nach dem Zeilenumbruch weitergeht.]


Rheinwerk Computing - Zum Seitenanfang

12.3.1 Datenbanken und Tabellen erzeugenZur nächsten ÜberschriftZur vorigen Überschrift

Um über SQL eine ganz neue Datenbank anzulegen, wird der Befehl CREATE DATABASE verwendet. Beispielsweise erzeugt die folgende Abfrage eine neue Datenbank namens supermarkt, die anschließend die bereits besprochenen Tabellen adressen, artikel und kaeufe enthalten soll:

CREATE DATABASE supermarkt;

Eine Tabelle wird per SQL über die Funktion CREATE TABLE angelegt. In Klammern werden – durch Komma getrennt – die einzelnen Feldnamen, ihre Datentypen und Optionen aufgelistet. Indizes, mit Ausnahme des Primärschlüssels, werden nicht beim Erstellen des jeweiligen Feldes, sondern separat über das Schlüsselwort INDEX angelegt.

Die SQL-Abfrage, mit deren Hilfe die Tabelle adressen eingerichtet wird, sieht folgendermaßen aus:

CREATE TABLE adressen (
adressnr INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(50) NOT NULL,
strasse VARCHAR(50) NOT NULL,
hausnr CHAR(10) NOT NULL,
plz CHAR(5) NOT NULL,
ort VARCHAR(40) NOT NULL,
INDEX (name),
INDEX (ort)
);

Die Tabelle artikel wird mithilfe der folgenden Abfrage erstellt:

CREATE TABLE artikel (
artnr INT AUTO_INCREMENT PRIMARY KEY,
artname VARCHAR (30),
preis INT,
mwst ENUM ('7', '19'),
INDEX (artname)
);

Schließlich wird noch die Tabelle kaeufe benötigt, die durch die folgende Abfrage erstellt werden kann:

CREATE TABLE kaeufe (
kaufnr INT AUTO_INCREMENT PRIMARY KEY,
adressnr INT,
artnr INT,
stueck INT,
datum DATE
);

Falls Sie eine Tabelle wieder löschen möchten, wird die Funktion DROP TABLE verwendet. Die folgende SQL-Anweisung entfernt beispielsweise die Tabelle unwichtig:

DROP TABLE unwichtig;

Analog dazu können Sie mithilfe von DROP DATABASE eine ganze Datenbank löschen.

Felddatentypen und -optionen

Für jede Tabellenspalte, die Sie über eine CREATE TABLE-Abfrage einrichten, müssen Sie die folgenden Informationen angeben:

  • Einen selbst gewählten Feldnamen. Dieser Name darf Buchstaben, Ziffern und Unterstriche enthalten, aber nicht mit einer Ziffer beginnen.
  • Einen Felddatentyp. Die diversen möglichen Datentypen werden im weiteren Verlauf des Kapitels aufgezählt.
  • Weitere Optionen. Hier können Sie besondere Eigenschaften der Spalte angeben, beispielsweise PRIMARY KEY (Primärschlüssel), AUTO_INCREMENT (automatisches Durchnummerieren) oder NOT NULL (das Feld muss einen Wert besitzen).

Die verschiedenen in SQL definierten Datentypen sind folgende:

  • Ganzzahlen verschiedener Wortbreite
    Je nach Bedarf können Sie sich einen der folgenden ganzzahligen Datentypen aussuchen. Die tatsächliche Wortbreite ist allerdings abhängig von der Implementierung. Die Angaben gelten für MySQL und können je nach konkretem Datenbanksystem abweichen:
    • TINYINT (8 Bit)
    • SMALLINT (16 Bit)
    • MEDIUMINT (24 Bit)
    • INT (32 Bit)
    • BIGINT (64 Bit)
  • Fließkommazahlen verschiedener Genauigkeit
    SQL bietet zwei verschieden genaue Datentypen für Fließkommawerte an. In MySQL gelten die folgenden Wortbreiten:
    • FLOAT (4 Byte)
    • DOUBLE (8 Byte)

    Ein zulässiges Synonym für DOUBLE ist übrigens REAL.

  • Der Datentyp DECIMAL definiert eine Festkommazahl. Die Gesamtzahl der Stellen sowie die Anzahl der Nachkommastellen werden durch Komma getrennt in Klammern geschrieben. Beispielsweise wäre DECIMAL (6,2) für Währungsbeträge in Supermärkten geeignet.

    Festkommazahlen können eine beliebige Stellenzahl besitzen und werden intern als Strings gespeichert. Sie sollten sie nur in Ausnahmefällen verwenden, da ihre Rechenperformance sehr langsam ist.

  • Datums- und Uhrzeitwerte
    SQL bietet verschiedene Datentypen für die Angabe von Kalenderdaten und Uhrzeiten:
    • DATE ist ein Datum im Format "20090411". Der zulässige Bereich ist "00010101" bis "99991231".
    • TIME enthält eine Uhrzeitangabe im Format "18:59:37".
    • DATETIME kombiniert eine Datums- und eine Uhrzeitangabe in der Schreibweise "20090411 18:59:37".
    • YEAR enthält eine Jahreszahl zwischen 1900 und 2155.
    • TIMESTAMP ist ein spezielles Feld, das beim Erstellen oder Ändern des zugehörigen Datensatzes automatisch ausgefüllt wird; es ist damit ideal für die nützliche Information, wann der Datensatz zuletzt geändert wurde. Das Format entspricht DATETIME.
  • Textdatentypen
    Für Textinformationen existieren verschiedene Datentypen, die hier aufgelistet werden:
    • CHAR(n) ist eine Zeichenkette mit einer festen Länge von n Zeichen. Der angegebene Wert darf höchstens 255 sein. »Feste Länge« bedeutet, dass auf jeden Fall die angegebene Anzahl von Zeichen gespeichert wird, selbst wenn der eigentliche Text kürzer sein sollte. Dies erhöht die Verarbeitungsgeschwindigkeit, aber auch den Speicherbedarf.
    • VARCHAR(n) gibt eine Zeichenkette variabler Länge mit bis zu n (maximal 65.535) Zeichen an. Ein VARCHAR-Feld belegt nur so viel Speicher, wie es tatsächlich Zeichen enthält. Dafür werden VARCHAR-Felder langsamer gefunden als CHAR-Felder.
    • TINYTEXT ist ein Synonym für VARCHAR (255).
    • TEXT gibt Text variabler Länge mit bis zu 65.535 Zeichen an.
    • MEDIUMTEXT darf maximal über 16,7 Millionen Zeichen enthalten.
    • LONGTEXT darf sogar über 4 Milliarden Zeichen enthalten.
  • Binärdaten
    Zum sicheren Abspeichern von Binärdaten wie Bildern, Audiodaten und sonstigen proprietären Datenformaten wird von SQL das BLOB-Format (Binary Large Object) angeboten. Es gibt folgende Ausprägungen von BLOBs unterschiedlicher Größe:
    • TINYBLOB (bis zu 255 Byte)
    • BLOB (bis zu 65.535 Byte)
    • MEDIUMBLOB (über 16,7 Millionen Byte)
    • LONGBLOB (über 4 Milliarden Byte)
  • Aufzählungstypen
    Mitunter ist es effektiver, eine Liste vorgefertigter Werte anzugeben, als ein frei ausfüllbares Textfeld einzurichten. MySQL definiert zu diesem Zweck die beiden folgenden Aufzählungstypen:
    • ENUM ist eine Aufzählung von maximal 65.535 verschiedenen Zeichenketten. Intern wird der Wert eines Feldes als Nummer des jeweiligen Aufzählungselements gespeichert.
    • SET enthält dagegen eine Aufzählung von maximal 255 verschiedenen Zeichenketten. Der Wert eines Feldes in einer solchen Spalte kann aus beliebig vielen kommagetrennten Werten aus der Aufzählung bestehen. Dazu besetzt jeder mögliche Wert ein eigenes Bit (1, 2, 4, 8, 16 und so weiter), und die Wertemischung in einem Feld ist die Summe dieser Bits.

    Beide Arten von Listen werden hinter dem Datentyp in Klammern und durch Komma getrennt angegeben. Das folgende Beispiel zeigt, wie es funktioniert:

    steuerklasse ENUM ('I', 'II', 'III', 'IV', 'V', 'VI')

Hinter der Angabe des Datentyps können unter anderem folgende Optionen für Felder angegeben werden:

  • BINARY ist eine Option, die Textdatentypen in Binärtypen umwandelt, in denen das Abspeichern binärer Daten unabhängig von Zeichensätzen und Zeilenumbruchlogik sicher möglich ist.
  • UNSIGNED sorgt dafür, dass der Wertebereich eines ganzzahligen Typs ohne Vorzeichen betrachtet wird. Beispielsweise besitzt ein TINYINT dadurch nicht mehr den Wertebereich –128 bis +127, sondern 0 bis 255.
  • ZEROFILL füllt alle Felder bis zur angegebenen Maximallänge nach links mit Nullen auf. Die Option impliziert automatisch UNSIGNED.
  • NULL oder NOT NULL legen fest, ob ein Feld leer sein darf (NULL) oder nicht (NOT NULL). Der Standard ist NULL.
  • DEFAULT gibt einen Standardwert für jedes Feld einer Spalte vor, das keinen sonstigen Wert besitzt.
  • AUTO_INCREMENT richtet eine Spalte so ein, dass diese Spalte bei der Erzeugung neuer Zeilen automatisch fortlaufende Werte erhält. Dies ist beispielsweise für Primärschlüssel gut geeignet.
  • PRIMARY KEY richtet ein Feld als Primärschlüssel ein, und zwar nur genau eines pro Tabelle. Für zusammengesetzte Primärschlüssel muss stattdessen die Option PRIMARY KEY(Feld1, Feld2, ...) außerhalb der Felddefinitionen genutzt werden.

Wie bereits erwähnt, werden Indizes außer dem Primärschlüssel erst nach dem Erstellen der Spalten eingerichtet. Neben dem Schlüsselwort INDEX, das einen einfachen Index einleitet, werden die alternativen Angaben UNIQUE (ein bestimmter Feldwert darf nur einmal in der Tabelle vorkommen) und FULLTEXT für die Volltextsuche unterstützt.


Rheinwerk Computing - Zum Seitenanfang

12.3.2 AuswahlabfragenZur nächsten ÜberschriftZur vorigen Überschrift

Um Daten aus einer Datenbank zu lesen, wird die SQL-Anweisung SELECT verwendet. Schematisch sieht ein solcher Aufruf folgendermaßen aus:

SELECT feld1, feld2, ...
FROM tabelle1, tabelle2, ...
WHERE kriterium;

Diese Abfrage wählt die Felder feld1, feld2 und so weiter derjenigen Datensätze aus den Tabellen tabelle1, tabelle2 und folgenden aus, auf die die Kriterien zutreffen.

Statt der einzelnen Felder können Sie auch * schreiben, um alle Felder einer Tabelle auszuwählen. Die folgende Abfrage zeigt beispielsweise die gesamte Tabelle adressen an:

SELECT * FROM adressen;

Benötigen Sie dagegen nur die Namen und die Postleitzahlen der Kunden, wird die folgende Schreibweise verwendet:

SELECT name, plz FROM adressen;

Wenn Sie nur ein Feld auswählen, ist manchmal der Modifikator DISTINCT nützlich: Er zeigt doppelt vorkommende Feldinhalte nur jeweils einmal an. Die folgende Abfrage zeigt jede unterschiedliche Postleitzahl aus adressen genau einmal an:

SELECT DISTINCT plz FROM adressen;

Wenn Sie Werte aus mehreren Tabellen auswählen (bevorzugt über die Verknüpfung durch Joins; siehe den nächsten Abschnitt), müssen Sie denjenigen Spaltenbezeichnungen den Tabellennamen voranstellen, die in mehreren Tabellen identisch vorkommen. Beispielsweise müssten Sie adressen.nr und kaeufe.nr schreiben, wenn beide in derselben Abfrage vorkämen.

Um dies zu umgehen, empfiehlt es sich in der Praxis, allen Feldnamen jeder Tabelle ein Kürzel für die jeweilige Tabellenbezeichnung voranzustellen. Beispielsweise könnten die Felder der Tabelle adressen mit ad_ beginnen, also etwa ad_nr, ad_name oder ad_plz.

Häufiger werden Auswahlabfragen verwendet, bei denen über die WHERE-Klausel Bedingungen angegeben werden. Die Bedingungen vergleichen in der Regel die Werte einzelner Felder mit bestimmten Ausdrücken oder miteinander. Beispielsweise liefert die folgende Abfrage den Namen, die Postleitzahl und den Ort aller Kunden aus der Tabelle adressen, die in Köln wohnen:

SELECT name, plz, ort
FROM adressen
WHERE ort="Köln";

Die folgende Abfrage wählt dagegen die vollständigen Daten aller Kunden mit Postleitzahlen aus, die mit einer 5 beginnen:

SELECT *
FROM adressen
WHERE plz LIKE "5%"

Die LIKE-Klausel vergleicht den Wert eines Felds mit einem einfachen Muster, in dem ein % für beliebig viele Zeichen und ein _ für genau ein Zeichen steht. Hier sehen Sie einige Beispiele für solche Muster:

  • name LIKE "a%" liefert alle Personen, deren Name mit a anfängt.
  • name LIKE "%b%" gibt alle Personen zurück, in deren Namen mindestens ein b vorkommt.
  • strasse LIKE "%weg" liefert alle Straßenangaben, die auf »-weg« enden.
  • name LIKE "Me_er" steht für alle Kunden, die Meier oder Meyer heißen.
  • name LIKE "M%r" gibt alle Leute zurück, die Maier, Mayer, Meier, Meyer oder Mayr heißen; natürlich werden auch Müller, Mecker, Monster und so weiter gefunden.

Für einfache Wertüberprüfungen, die keinen Mustervergleich verwenden, können Sie die Operatoren =, <, >, <=, >= und <> (ungleich) benutzen. Mehrere Überprüfungen können Sie mit AND oder OR verknüpfen.

Übrigens können Sie sowohl bei der SELECT-Anweisung selbst als auch bei der WHERE-Klausel beliebige Berechnungen ausführen. Bei WHERE müssen Sie allerdings darauf achten, dass das Endergebnis ein boolescher Wahrheitswert sein muss. Beispielsweise ist die Klausel WHERE preis * 2 unvollständig und damit verboten; WHERE preis * 2 < 10 ist dagegen zulässig und gibt alle Felder zurück, deren doppelter Preis kleiner als 10 ist.

Wenn Sie in der SELECT-Anweisung keine einzelnen Felder auswählen, sondern Berechnungen anstellen, können Sie der Ergebnisspalte über die AS-Klausel einen Namen zuweisen (wobei Sie das Schlüsselwort AS selbst auch weglassen können). Beispielsweise könnten Sie folgendermaßen die Nettopreise aller Waren in der Tabelle artikel ermitteln:

SELECT artname, preis / (100 + mwst) * 100
AS netto
FROM artikel;

Der entsprechende Mehrwertsteuersatz wird also zu 100 addiert; das Teilen des Preises durch diesen Gesamtwert und die Multiplikation mit 100 ergibt natürlich den Nettopreis. Die Spalte in der Ergebnistabelle der Abfrage wird als NETTO bezeichnet, was erheblich lesefreundlicher ist als »PREIS / (100 + MWST) * 100«.

Neben den einfachen arithmetischen Berechnungen bietet SQL auch eine Reihe von Funktionen an. Die wichtigsten von ihnen werden als Aggregatfunktionen bezeichnet, da sie die Anzahl der zurückgegebenen Datensätze verkleinern können, indem sie mehrere zusammenfassen. Hier einige Aggregatfunktionen im Überblick:

  • SUM gibt die Summe der Werte in der Spalte zurück, auf die SUM angewendet wird. Wenn Sie weitere Spalten in das SELECT aufnehmen, erhalten Sie so viele Einzelergebnisse, wie es unterschiedliche Wertepaare in diesen Spalten gibt. Beispielsweise ergibt die folgende Abfrage die Summe aller Artikelpreise in der Tabelle artikel:
    SELECT SUM(preis) AS summe FROM artikel;

    Diese Abfrage liefert dagegen die Summen der beiden Artikelgruppen mit unterschiedlicher Mehrwertsteuer getrennt:

    SELECT SUM(preis) AS summe, mwst FROM ARTIKEL;

    Sinnvollere Beispiele erfordern die Kombination mehrerer Tabellen; Sie finden sie in Abschnitt »Joins«.

  • MIN gibt den kleinsten Wert eines Feldes innerhalb einer Gruppe zurück.
  • MAX liefert entsprechend das Feld mit dem höchsten Wert.
  • COUNT schließlich gibt die Anzahl der Felder einer Spalte oder Gruppe zurück. Beispielsweise gibt die folgende Abfrage die Anzahl aller Kunden zurück:
    SELECT COUNT(*) AS kundenzahl FROM adressen;

    Wenn Sie die Anzahlen der Artikel mit den beiden unterschiedlichen Mehrwertsteuersätzen getrennt voneinander erhalten möchten, funktioniert dies folgendermaßen:

    SELECT COUNT(artnr) AS anzahl, mwst FROM artikel GROUP BY mwst

Wichtig ist noch, wie Sie die Ergebnisdatensätze in einer Auswahlabfrage sortieren können. Dies funktioniert mithilfe der ORDER BY-Klausel. Anzugeben ist dabei die Spalte, nach deren Werten sortiert werden soll, sowie ASC (ascending) für aufsteigende Reihenfolge und DESC (descending) für absteigende Reihenfolge. Das folgende Beispiel zeigt, wie Sie die Kunden nach ihren Namen alphabetisch sortieren:

SELECT * FROM adressen
ORDER BY name ASC;

Joins

Für die praktische Anwendung von Beziehungen ist es wichtig, das Konzept der Joins zu verstehen. Der Beziehungstyp, der bei einer 1:n-Beziehung zwischen dem Primärschlüssel der einen und einem Fremdschlüssel in einer anderen Tabelle besteht, wird als Inner Join bezeichnet, wenn nur diejenigen Ergebnisse gewünscht werden, die aus Datensätzen beider Tabellen stammen.

Um beispielsweise die Namen aller Kunden auszugeben, die überhaupt etwas gekauft haben, wird folgende Syntax verwendet:

SELECT name FROM adressen
INNER JOIN kaeufe ON adressen.adressnr = kaeufe.adressnr;

Dies gibt eine Liste der Kundennamen in der Reihenfolge aus, in der die Kunden in der Tabelle kaeufe über das Feld nr referenziert werden. Eine alternative Schreibweise, die auch mit älteren und seltener verwendeten Datenbanksystemen kompatibel ist, verwendet eine WHERE-Klausel statt der INNER JOIN-Angabe. Die zuvor formulierte Abfrage lässt sich also auch folgendermaßen formulieren:

SELECT name FROM adressen
WHERE adressen.adressnr = kaeufe.adressnr;

Auf dieselbe Art und Weise erhalten Sie auch den Gesamtpreis jedes einzelnen Kaufs:

SELECT preis * stueck FROM artikel, kaeufe
WHERE artikel.artnr = kaeufe.artnr;

Auch Aggregatfunktionen lassen sich mit Joins kombinieren. Das folgende Beispiel gibt den Gesamtumsatz jedes einzelnen Tages aus:

SELECT SUM(preis * stueck) AS tagesumsatz, datum
FROM artikel.kaeufe GROUP BY datum
WHERE artikel.artnr = kaeufe.artnr;

Das folgende, etwas komplexere Beispiel stellt jeden Kauf jedes Kunden mit allen interessanten Zusatzdaten dar:

SELECT kaufnr, name, artname, stueck,
stueck * preis AS gesamtpreis
FROM adressen, artikel, kaeufe
WHERE adresssen.adressnr = kaeufe.adressnr
AND artikel.artnr = kaeufe.artnr;

Das Ergebnis dieser Abfrage können Sie sich in Tabelle 12.5 ansehen.

Neben dem Inner Join existieren auch Left (Outer) Join und Right (Outer) Join. Der Unterschied besteht darin, dass das Ergebnis auf jeden Fall alle infrage kommenden Datensätze der links beziehungsweise rechts von der Join-Klausel stehenden Tabelle enthält und für die Felder der jeweils anderen Tabelle gegebenenfalls NULL.


Rheinwerk Computing - Zum Seitenanfang

12.3.3 Einfüge-, Lösch- und ÄnderungsabfragenZur nächsten ÜberschriftZur vorigen Überschrift

Mithilfe von INSERT werden Daten in eine Datenbanktabelle eingefügt. Die Syntax lautet folgendermaßen:

INSERT INTO tabelle (spalte1, spalte2, ...)
VALUES (WERT1, WERT2, ...);

Beachten Sie, dass Sie mindestens alle Spalten nennen müssen, die die Bedingung NOT NULL aufweisen. Die folgende Anweisung fügt beispielsweise einen neuen Artikel hinzu:

INSERT INTO artikel (artname, preis, mwst)
VALUES ("Gurke", 39, "7");

Falls alle Spalten der Tabelle einen Wert erhalten sollen, funktioniert auch die folgende Kurzfassung:

INSERT INTO tabelle
VALUES (wert1, wert2, ...);

Sie können sogar das aktuelle Ergebnis einer SELECT-Abfrage permanent in einer neuen Tabelle ablegen. Das folgende Beispiel speichert jede einzelne Postleitzahl aufsteigend sortiert in der neuen einspaltigen Tabelle plzs:

CREATE TABLE plzs (
plz INT
);
INSERT INTO plzs
SELECT DISTINCT plz FROM adressen
ORDER BY plz ASC;

Um Datensätze aus einer Tabelle zu löschen, wird die Anweisung DELETE verwendet. Welche Datensätze Sie entfernen möchten, können Sie wie bei einer Auswahlabfrage über eine WHERE-Klausel angeben:

DELETE FROM tabelle
WHERE kriterium;

Wenn Sie beispielsweise alle Kunden aus der Tabelle adressen löschen möchten, die nicht im PLZ-Gebiet 5 wohnen, funktioniert dies folgendermaßen:

DELETE FROM adressen
WHERE plz NOT LIKE "5%"

Wenn Sie die Werte von Feldern ändern möchten, geschieht dies durch die Anweisung UPDATE. Wichtig ist auch hier die WHERE-Klausel, damit Sie dem gewünschten Feld nicht einfach in allen Datensätzen einen neuen Wert zuweisen. Angenommen, der Kunde Schmidt ist aus dem Kleinen Weg 1 in die Große Allee 25 gezogen. Eine entsprechende Änderungsabfrage sieht folgendermaßen aus:

UPDATE adressen
SET strasse="Große Allee", hausnr="25"
WHERE adressnr=1;

Selbstverständlich müssen Sie auf den Kunden über den Primärschlüssel (hier die Kundennummer) zugreifen, da der Name doppelt vorkommen könnte.

Die folgende Abfrage zeigt dagegen ein Beispiel, in dem bewusst mehrere Datensätze geändert werden: Alle Artikel mit 19% Mehrwertsteuer werden für eine Sonderaktion um 20 % billiger:

UPDATE artikel
SET preis = 0.8 * preis
WHERE mwst = "19";


Rheinwerk Computing - Zum Seitenanfang

12.3.4 TransaktionenZur vorigen Überschrift

Moderne relationale Datenbanksysteme bieten eine interessante Erweiterung normaler SQL-Abfragen: Transaktionen ermöglichen es, beliebig viele Einzelschritte zusammenzufassen und am Ende zu bestätigen (Commit) oder rückgängig zu machen (Rollback). Eine vollwertige Implementierung von Datenbanktransaktionen genügt einem Standard namens ACID, bestehend aus den folgenden vier Komponenten:

  • Atomicity – die Transaktion verbindet alle enthaltenen MySQL-Anweisungen zu einer atomaren Einheit, die nach außen hin einer einzelnen Anweisung entspricht.
  • Consistency – wenn die Transaktion durch Commit oder Rollback abgeschlossen wird, muss die Datenbank in einem konsistenten Zustand verbleiben.
  • Isolation – jede Transaktion muss gegenüber allen anderen Datenbankoperationen und Transaktionen isoliert ausgeführt werden; während sie abläuft, bemerken andere Operationen nichts von ihren Änderungen und umgekehrt.
  • Durability – nach einem Commit müssen die Änderungen durch die Transaktion dauerhaft in der Datenbank gespeichert bleiben.

In MySQL werden Transaktionen bisher nur durch den speziellen Tabellentyp InnoDB unterstützt. InnoDB gehört schon seit Jahren zum Oracle-Konzern, der 2009 auch den MySQL-Besitzer Sun Microsystems aufgekauft hat. Damit gehören MySQL und InnoDB seit einigen Jahren derselben Firma.

Um eine InnoDB-Tabelle zu erzeugen, müssen Sie eine CREATE TABLE-Abfrage wie folgt ergänzen:

CREATE TABLE tabellenname (
...
) ENGINE=InnoDB

In MySQL für Windows ist InnoDB der Standard-Tabellentyp. Unter Unix wird dagegen automatisch die MySQL-eigene Engine MyISAM gewählt. Da diese performanter ist als InnoDB, lohnt es sich, Engine=MyISAM explizit anzugeben, wann immer Sie keine Transaktionen oder andere InnoDB-spezifischen Features benötigen.

Die Durchführung von Transaktionen ist sehr einfach. Geben Sie zunächst

START TRANSACTION;

ein, um eine neue Transaktion zu beginnen. Wenn Sie alle zur Transaktion gehörenden Anweisungen ausgeführt haben, können Sie entweder

COMMIT;

eingeben, um die Änderungen endgültig zu bestätigen, oder aber

ROLLBACK;

falls Sie alle Modifikationen auf den Ursprungszustand zurücksetzen wollen. Mit der Anweisung

SAVEPOINT name;

können Sie übrigens einen benannten Zwischenspeicherstand der Transaktion erstellen, zu dem Sie jederzeit mithilfe von

ROLLBACK TO name;

zurückgehen können.

Wenn Sie Transaktionen in Ruhe ausprobieren möchten, öffnen Sie einfach zwei mysql-Client-Fenster, und starten Sie in einem der Fenster eine Transaktion. Wie Sie feststellen werden, können Sie die Veränderungen aus der Transaktion in dem anderen Fenster bis zum COMMIT nicht sehen.



Ihr Kommentar

Wie hat Ihnen das <openbook> gefallen? Wir freuen uns immer über Ihre freundlichen und kritischen Rückmeldungen.

>> Zum Feedback-Formular
<< zurück




Copyright © Rheinwerk Verlag GmbH 2013
Für Ihren privaten Gebrauch dürfen Sie die Online-Version natürlich ausdrucken. Ansonsten unterliegt das <openbook> denselben Bestimmungen, wie die gebundene Ausgabe: Das Werk einschließlich aller seiner Teile ist urheberrechtlich geschützt. Alle Rechte vorbehalten einschließlich der Vervielfältigung, Übersetzung, Mikroverfilmung sowie Einspeicherung und Verarbeitung in elektronischen Systemen.


[Rheinwerk Computing]

Rheinwerk Verlag GmbH, Rheinwerkallee 4, 53227 Bonn, Tel.: 0228.42150.0, Fax 0228.42150.77, service@rheinwerk-verlag.de


  Zum Katalog
Zum Katalog: IT-Handbuch für Fachinformatiker






IT-Handbuch für Fachinformatiker
Jetzt bestellen


 Ihre Meinung?
Wie hat Ihnen das <openbook> gefallen?
Ihre Meinung

 Buchempfehlungen
Zum Katalog: Java ist auch eine Insel






 Java ist auch
 eine Insel


Zum Katalog: Linux Handbuch






 Linux Handbuch


Zum Katalog: Computer Netzwerke






 Computer Netzwerke


Zum Katalog: Schrödinger lernt HTML5, CSS3 und JavaScript






 Schrödinger lernt
 HTML5, CSS3
 und JavaScript


Zum Katalog: Windows 8.1 Pro






 Windows 8.1 Pro


 Shopping
Versandkostenfrei bestellen in Deutschland und Österreich
InfoInfo