Kontakt aufnehmen

MySQL: Mit SELECT Daten auslesen

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 heißt 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.

Du arbeitest in einer Agentur oder als Freelancer?
Dann wirf doch mal einen Blick auf unsere Software FeatValue.

Weiterlesen: ⯈ Daten einfügen mit INSERT

Über uns

Stefan Wienströer

Wir entwickeln Webanwendungen mit viel Leidenschaft. Unser Wissen geben wir dabei gerne weiter. Mehr über a coding project

Cookie-Einstellungen

Helfen Sie dabei, uns noch besser zu machen. Wir nutzen Cookies und ähnliche Technologien, um die Website auf Ihre Bedürfnisse anzupassen. Zur Datenschutzerklärung

Auswahl speichern