HTMLWorld - HTML, CSS, JavaScript, PHP, Java, Flash und vieles mehrHTMLWorld:   Home | Impressum |
 

 
 

Anzeige 
 
               Forum
 
 
HTMLWorld » MySQL » Daten bearbeiten

MySQL: Daten bearbeiten

von Stephan Steege

Im Folgenden werden die Befehle beschrieben, mit denen man Daten in MySQL auswählen, anzeigen, ändern, hinzufügen oder löschen kann: SELECT, UPDATE, INSERT, REPLACE, DELETE. Jeder dieser Befehle hat mehr oder weniger viele Varianten. Alle zu beschreiben, ist in diesem Rahmen nicht möglich. Wir beschränken uns deshalb auf die wichtigsten.

Anzeige

SELECT  nach oben

SELECT dient der Auswahl von Daten, es erfolgt hier keine Änderung innerhalb der Tabelle jeweiligen Tabelle(n). Meist dient SELECT zur Anzeige ausgewählter Daten einer Tabelle. Dann sieht das Grundgerüst einer SELECT-Anweisung so aus:

SELECT Felder FROM Tabelle WHERE [Bedingung] [Ergänzungen]

Felder (Spalten)

Nach dem Wort SELECT muss immer ein Ausdruck angegeben werden, der beschreibt welche Felder ausgegeben werden sollen - hier notiert man z.B. die Feldnamen einer Tabelle. Mehrere Spalten werden durch Komma getrennt:

SELECT Spalte1, Spalte2, Spalte3 FROM meineTabelle

... liefert alle Zeilen mit den Spalten Spalte1, Spalte2 und Spalte3 aus der Tabelle meineTabelle. Die Reihenfolge der Spaltennamen kann beliebig gewählt werden . Außerdem kann der Stern (*) dazu verwendet werden um alle Spalten einer Tabelle auszuwählen und diese nicht alle aufzählen zu müssen. Beispiel:

SELECT * FROM meineTabelle

Bei der Spaltenauswahl müssen die korrekten Spaltennamen verwendet werden, die in der Tabelle angelegt worden sind. Man kann aber andere Namen mit Hilfe von AS zuordnen, sogenannte Alias-Namen:

SELECT Einkaufspreis AS ep, Verkaufspreis AS vp ...

Tabelle

Nach dem Wort FROM (das nie fehlen darf) erwartet SQL den Namen einer Tabelle. Die Tabelle muss unter diesem Namen existieren. Man kann Alias-Namen zuordnen, z.B.

SELECT * FROM Preis

Auch hier können mehrere Tabellen wieder durch Kommata getrennt angegeben werden. Möchte man die Daten aus mehreren Tabellen auswählen, so müssen die einzelnen Spalten einer Tabelle zusätzlich mit dem Tabellennamen angesprochen werden. Beispiel:

SELECT A.spalteA, B.spalteA FROM tabelleA AS A, tabelleB AS B

Bedingung (die Where-Klausel)

Normalerweise wählt SQL immer automatisch alle Zeilen der Tabelle(n) aus. Um die Auswahl auf bestimmte Zeilen zu begrenzen können Bedingungen eingesetzt werden, die stets nach den Tabellennamen und dem Wort WHERE notiert werden. Sie kann nicht nur bei SELECT angewendet werden, sondern identisch auch bei UPDATE und DELETE. Beispiel:

SELECT * FROM tabelle WHERE ...

"Bedingung" heißt bei SQL z.B., dass in einer Spalte ein bestimmter Wert steht (manchmal auch in mehreren Spalten bestimmte Werte). Beispiel:

SELECT * FROM Preis WHERE ArtikelNr = 1;

So werden alle Datensätze der Tabelle "Preis" ausgewählt, bei denen die ArtikelNr = 1 ist. Den Inhalt von Textfeldern muss man in Hochkommas setzen:

SELECT * FROM Artikel WHERE Hersteller = 'Stifty';

Das = (Gleichheitszeichen) nennt man Operator oder Operand. Es steht hier zwischen dem Feldnamen und dem Wert. MySQL soll also die auswählen, wo Hersteller gleich 'Stifty' ist. Anstelle des Gleichheitszeichens können auch andere Operanden stehen, z.B. != (ungleich), > (größer), < (kleiner) usw.. Welche Operanden möglich sind wird im späteren Kapitel "Operanden" beschrieben.

Bedingungen können auch mehrere angeben werden, das einleitende Schlüsselwort WHERE darf aber nur einmal vorhanden sein. Verkettet werden die Bedingungen nicht mit Komma, sondern mit speziellen Zeichen, die auch Operanden heißen, z.B. AND oder OR. Beispiel:

SELECT * FROM Artikel 
   WHERE Hersteller = 'Stifty' AND Bezeichnung = 'Faserino'

AND bedeutet, dass beide Bedingungen erfüllt sein müssen, die damit verknüpft wurden. Es werden also nur die Datensätze ausgewählt, bei denen der Hersteller "Stifty" ist und die gleichzeitig die Bezeichnung "Faserino" tragen. OR bedeutet, dass eine oder beide Bedingungen erfüllt sein müssen.
Werden mehrere Bedingungen verwendet, können zusätzlich Klammern dazu verwendet werden um die Abgrenzung der einzelnen Bedingung zu beschreiben (ähnlich wie in Mathe).

ORDER BY

Mit ORDER BY können Sie die Auflistung nach einer oder mehreren Spalte(n) sortieren. Geben Sie dazu einfach nach den zwei Worten den oder die Namen der Spalten an nach denen sortiert werden soll. Beispiel:

SELECT * FROM Artikel ORDER BY Bezeichnung, Hersteller

Die Tabelle ist dann primär nach der Spalte "Bezeichnung" alphabetisch sortiert. Gibt es mehrere Zeilen mit gleichen Bezeichnung-Werten, werden diese wiederum untereinander nochmals nach Hersteller sortiert. Ohne Zusatz erfolgt die Sortierung aufsteigend (das heisst der kleinste Wert zuerst), mit den Zusatz DESC oder DESCENDING erfolgt die Sortierung absteigend (der höchste Wert zuerst).

GROUP BY

Um Datensätze zu Gruppen zusammen zu fassen verwendet man GROUP BY. In eine Gruppe kommen jeweils alle Zeilen, die bei den angegebenen Feldern gleiche Werte aufweisen. Jede Gruppe wird nur einmal angezeigt.
Setzt man z.B. die folgende Abfrage auf eine imaginäre Produkttabelle an, erhält man eine Auflistung der aller Hersteller - ohne die Gruppierung würden die einzelnen Hersteller so oft ausgegeben werden, wie sie in der Tabelle enthalten sind.

SELECT Hersteller FROM Produkte GROUP BY Hersteller;

Solche Gruppierungen eignen sich gut, um z.B. zu zählen wie die Werte in einer Tabelle verteilt sind. Dazu benutzt man Funktionen. Dazu gehören z.B. count(*), min(Feldname) oder max(Feldname). Mit count(*) zählt man, wieviele Datensätze zu dieser Gruppe gehören. Beispiel:

SELECT Typ, count(*) FROM Artikel GROUP BY Typ;

HAVING

Das ist eine Sonderform, die es nur in Zusammenhang mit GROUP BY gibt. Sie wirkt bei Gruppierungen genauso wie die WHERE-Klausel bei SELECT-Statements. Mit HAVING kann man das Ergebnis von Funktionen auswerten, was mit WHERE nicht gehen würde. Beispiel.

SELECT Hersteller, COUNT(*) AS Anzahl 
FROM Artikel GROUP BY Hesteller HAVING Anzahl > 1;

Listet die Hersteller auf, die in mehr als einem Datensatz vertreten sind (die uns mehr als einen Artikel anbieten).

Verknüpfung von Tabellen

Oft findet man die Daten, die aufgelistet werden sollen, nicht nur in einer einzigen Tabelle, sondern sie sind über mehrere Tabellen verteilt. Diese Philosophie des relationalen Datenmodells schlägt sich auch in den SQL-Befehlen nieder. Verknüpfungen mehrerer Tabellen in einem einzigen Befehl sind nur in Verbindung mit SELECT möglich. Alle anderen Befehle (UPDATE, INSERT, DELETE, REPLACE) wirken immer nur auf eine Tabelle.
Das Grundprinzip ist bei allen Verknüpfungen gleich: Hinter dem Schlüsselwort FROM werden mehrere Tabellen als Datenquelle angegeben:

SELECT * FROM Artikel, Preis;

Dies ist die einfachste Form, der CROSS JOIN. Sozusagen kreuz und quer wird hier jeder Satz von Tabelle Artikel mit jedem Satz von Preis verknüpft. Tabelle Artikel hat 3 Sätze, Preis 5. Das Ergebnis sind 3 * 5 = 15 Sätze. In der Praxis ist das selten sinnvoll. Deshalb wird meist eingeschränkt durch eine WHERE- oder eine JOIN-Klausel. Bei den folgenden Varianten handelt es sich um eine INNER JOIN-Verknüpfung. In unserem Beispiel ist die Verknüpfung durch die ArtikelNr sinnvoll:

SELECT * FROM Artikel, Preis 
WHERE Preis.ArtikelNr = Artikel.ArtikelNr

Es gibt andere Varianten des gleichen Befehls:

SELECT * FROM Artikel 
   INNER JOIN Preis ON Artikel.ArtikelNr = Preis.ArtikelNr


SELECT * FROM Artikel INNER JOIN Preis USING (ArtikelNr)

Der beschriebene INNER JOIN hat den Nachteil, dass nur Datensätze angezeigt werden, bei denen die ArtikelNr in beiden Tabellen enthalten ist. Die anderen werden einfach weggelassen.
Um Datensätze, deren Schlüssel nicht in beiden Tabellen existiert, auch anzuzeigen, gibt es gibt es den OUTER JOIN in der Form LEFT JOIN und RIGHT JOIN.
LEFT JOIN schreibt man, wenn von der Tabelle, die links im SELECT-Befehl steht, alle Datensätze angezeigt werden sollen:

SELECT * FROM Artikel LEFT JOIN Preis USING (ArtikelNr)

Analog zu LEFT JOIN gibt es den RIGHT JOIN. Für unser Beispiel würde RIGHT JOIN bedeuten, dass auch Datensätze der Tabelle Preis angezeigt werden sollen, deren ArtikelNr es in der Tabelle Artikel nicht gibt:

SELECT * FROM Artikel RIGHT JOIN Preis USING (ArtikelNr)

Wer SQL aus anderen Anwendungen kennt, z.B. Oracle, vermisst vielleicht folgende Variante:

SELECT * FROM Preis WHERE ArtikelNr 
 IN (SELECT ArtikelNr FROM Artikel WHERE Hersteller = 'Stifty');

Diese Variante mit Unterabfragen ist in MySQL bisher nicht möglich. Um das gleiche Ergebnis zu erzielen, führt man 2 SELECT's aus.
Unsere Beispiele zeigen nur Verknüpfungen zwischen 2 Tabellen. In der Praxis werden oft SELECT-Befehle mit mehrfachen Verknüpfungen benutzt. Je mehr JOINS in einem SELECT, desto höher ist allerdings die Laufzeit. Manchmal ist es sinnvoller, statt einem SELECT mit vielen JOINS mehrere SELECT's hintereinander auszuführen und die Zwischenergebnisse in temporären Tabellen zu speichern, die nachher wieder gelöscht werden.
JOINS lassen sich nicht nur auf reine SELECT-Befehle anwenden, sondern auch auf UPDATE- und DELETE-Befehle. Dort ist die Syntax für verknüpfte Tabellen aber nur eingeschränkt benutzbar. Letztlich muss der Interpreter eindeutig erkennen, in welcher Tabelle er welche Datensätze ändern oder löschen soll.

INSERT  nach oben

Die INSERT-Anweisung fügt neue Datensätze in eine Tabelle ein. Eingefügt wird immer nur komplette Datensätze (alle Felder): Felder, für die kein Wert angeben wird, werden leer (sog. Null-Wert) angehängt. Es gibt in MySQL 2 Varianten der Syntax: die Aufzählungs- und die SET-Variante. Die Aufzählungsvariante ist kompatibel zu anderen Datenbank-Systemen, deshalb wird sie hier zuerst beschrieben.

INSERT mit Aufzählung  nach oben

Syntax

INSERT INTO Tabelle (Feldname1, Feldname2, ..., FeldnameN) 
  VALUES (Wert1, Wert2,...WertN);

Tabelle

Hinter INSERT folgt immer INTO, dahinter die Tabelle. Eine INSERT-Anweisung kann immer nur in eine Tabelle einfügen. Wenn man Datensätze in mehrere Tabellen einfügen will, muss man also mehrere INSERT-Anweisungen schreiben.

FIELDS und VALUES

Den FIELDS-Teil kann man unter Umständen auch weglassen, dann muss ich allerdings hinter VALUES alle Felder angeben, und zwar genau in der Reihenfolge, wie sie in der Tabelle stehen. Beispiel:

INSERT INTO Preis VALUES (3, 'grün', 0.5, Null);

Null bedeutet, dass das Feld nicht gefüllt werden soll. Voraussetzung ist allerdings, dass das Feld Verkaufspreis nicht als NOT NULL definiert ist.
Bei Tabellen mit vielen Feldern, von denen nur einige wenige mit Werten gefüllt werden sollen, ist es sinnvoller, nur die Feldinhalte aufzuzählen, die nicht Null sein sollen. Dann muss aber den FIELDS-Teil einfügen, um dort die Feldnamen in der Reihenfolge anzugeben, wie man nachher die Feldinhalte angibt:

INSERT INTO Preis (ArtikelNr, Farbe, Einkaufspreis) 
           VALUES (3        , 'grün', 0.5);

Eine weitere Sonderform von INSERT, die allerdings nicht kompatibel zum offiziellen SQL-Standard ist, ermöglicht es in MySQL , mit einem INSERT-Befehl mehrere Datensätze einzufügen:

INSERT INTO Artikel VALUES 
('Faserstift', 'Stifty',    'Schreibersglück', 1),
('Faserstift', 'Stifty',    'Faserino',        2),
('Faserstift', 'Fasanetic', 'Fasano',          3);

Sonderform: INSERT mit SELECT

Diese Sonderform erlaubt es, beliebig viele Datensätze aus einer Tabelle in eine andere einzufügen. Welche eingefügt werden, hängt vom SELECT-Teil ab. Auch kompliziertere SELECT-Konstruktionen sind möglich. Beispiel:

INSERT INTO Tabelle1 SELECT * FROM Tabelle2;

INSERT mit SET  nach oben

Diese Form lehnt sich an die Syntax von UPDATE an und ist übersichtlicher als der INSERT mit Aufzählung. Sie ist aber nur in MySQL benutzbar. Beispiel:

INSERT INTO Tabelle SET Feldname1=Wert1, Feldname2=Wert2, ...;

Update  nach oben

Update ändert den Inhalt vorhandener (bereits gespeicherter) Datensätze.

Syntax

UPDATE Tabelle SET Feld1 = Wert1, Feld2 = Wert2, ... 
  WHERE [where-Klausel];

Tabelle

In einer UPDATE-Anweisung kann immer nur eine Tabelle angesprochen werde. Will man beispielsweise Werte in 3 Tabellen ändern, muss man also 3 UPDATE-Anweisungen schreiben.

SET

Hinter dem Schlüsselwort SET erwartet SQL einen Feldnamen der angegebenen Tabelle. Pro UPDATE-Anweisung darf nur einmal SET enthalten sein.

Feld = Wert

Die Spalte wird mit dem Wert gefüllt, der hinter dem Gleichheitszeichen steht. Die Einschränkung auf bestimmte Zeilen nimmt man in der WHERE-Klausel vor. Sie gilt für alle Feldzuweisungen eines Befehls.
Man kann in einer UPDATE-Anweisung praktisch beliebig viele Zuweisungen dieser Art vornehmen, allerdings darf jede Spalte nur einmal genannt werden. Die Zuweisungen werden durch Komma voneinander getrennt:

UPDATE Preis 
SET Farbe = 'grün', Einkaufspreis = 0.75, Verkaufspreis = 0.8 
WHERE ArtikelNr = 1 AND Farbe = 'rot';

WHERE-Klausel

Die WHERE-Klausel funktioniert bei UPDATE genauso wie bei SELECT wird sie weggelassen, werden alle Datensätze der angesprochenen Tabelle geändert, ohne Einschränkungen. Beispiel siehe oben.

DELETE  nach oben

DELETE löscht bestimmte Datensätze aus einer Tabelle. Feldnamen dürfen bei DELETE nicht angegeben werden. Das wäre auch sinnlos, denn DELETE wirkt immer auf ganze Datensätze.

DELETE FROM Tabelle WHERE [where-Klausel];

Die Regeln für die WHERE-Klausel sind bei DELETE die gleichen wie bei SELECT und UPDATE. Wird keine WHERE-Klausel angegeben, werden alle Zeilen der Tabelle gelöscht.

REPLACE  nach oben

Die Syntax von REPLACE ist genauso wie die von INSERT (beide Varianten - siehe dort). REPLACE ist eine Anweisung, die es als Standard nur in MySQL gibt. REPLACE ändert den Inhalt vorhandener Datensätze, wenn es welche findet, und fügt einen neuen Datensatz ein, wenn es keinen findet.
Damit ist REPLACE eine Kombination von UPDATE und INSERT und löst zugleich deren Schwachstellen: UPDATE ändert nur Datensätze, die es auch findet. Wenn man nicht sicher ist, ob es den betreffenden Satz gibt, muss man vorher ein SELECT ausführen und auswerten. Wenn man andererseits INSERT nimmt, ohne zu prüfen, ob der gleiche Datensatz schon da ist, läuft man Gefahr, dass man ihn nachher doppelt in der Tabelle hat. Das kann man zwar durch einen eindeutigen Index verhindern, der würde dann aber wiederum eine störende Fehlermeldung auslösen. All das kann man mit REPLACE umgehen.
REPLACE hat allerdings eine entscheidende Schwachstelle: Die WHERE-Klausel und die Tabelle müssen so angelegt sein, dass MySQL problemlos unterscheiden kann, ob Datensätze geändert oder hinzugefügt werden müssen. Dazu braucht es eindeutige Schlüssel. Im schlimmsten Fall kann sich das so auswirken, dass man nach dem REPLACE weniger Datensätze hat als vorher.



« zurück weiter »
Bewerten

 

MySQL

.Autor:Jan Winkler.
. Bewertung:
MySQL: Daten bearbeiten HTMLWorld
(5/5 bei 1 Votes)
.
. Community: 91 Beiträge im MySQL Forum .

Navigation


 
     
 

Anzeige