Logo Logo
InfoHome Themen Projekte Links Software
Themen
JavaHamster
BlueJ
Java
HTML
XHTML
CSS
XML
Datenbanken
MySQL
SELECT
INSERT
UPDATE
DELETE
Tippspiel-DB
Theoretische Informatik
PHP
Kara
Lego-Roboter
Algorithmen

SELECT-Anweisung

Der SELECT-Befehl ist der mächtigste MySQL-Befehl. Mit Hilfe von SELECT lassen sich alle Arten von Datenbankabfragen formulieren, insbesondere die relationalen Operationen Projektion, Selektion, katesisches Produkt und Join.

Alles auswählen

Die einfachste SELECT-Anweisung lautet

SELECT * FROM <tabellenname>;
SELECT * FROM Mitarbeiter;

und liefert als Ergebnis die Menge aller Tupel einer Tabelle. Das Sternsymbol bedeutet hier, dass alle Spalten ausgewählt werden.

Die (bereits leicht vereinfachte) Grund-Syntax von SELECT lautet

SELECT [DISTINCT] <spaltenname1>, <spaltenname2>, ... FROM <tabellenname1>, <tabellenname2>, ...
[WHERE <where-Bedingung>]
[GROUP BY <spaltenname1>, <spaltenname2>, ...]
[HAVING <where-Bedingung>]
[ORDER BY <spaltenname1>[ASC|DESC], <spaltenname2>[ASC|DESC], ...]
[LIMIT [offset,] <zeilenanzahl>];

Terme in eckigen Klammern sind optional, d.h. müssen nicht Teil einer SELECT-Anfrage sein. Zeilenwechsel innerhalb eines Anfrageausdrucks sind zulässig und erhöhen bei längeren Ausdrücken die Lesbarkeit.

GROUP BY / HAVING

Die GROUP BY / HAVING-Anweisung wird nur in Verbindung mit den Gruppenfunktionen benutzt, um mehrere Tupel mit identischen Attributen zu Gruppen zusammenzufassen. Anwendungsbeispiele finden sich weiter unten.

ORDER BY

Mit dieser angehängten Klausel lassen sich die Ergebnisdatensätze nach einer bestimmten Spalte auf- (Schlüsselwort: ASC) oder absteigend (Schlüsselwort: DESC) sortieren. Falls in dieser Spalte gleiche Werte stehen, kann man eine zweite (dritte, vierte, ...) Spalten angeben, nach der als zweites Ordnungskriterium sortiert werden soll. Standardmäßig wird aufsteigend sortiert.

SELECT * FROM Mitarbeiter ORDER BY Name;

LIMIT

SELECT * FROM Mitarbeiter ORDER BY Name LIMIT 5,10; # gibt die Ergebnistupel 6-10 zurück
SELECT * FROM Mitarbeiter ORDER BY Name LIMIT 5; # gibt die ersten fünf Ergebnistupel zurück

Mit LIMIT kann angegeben werden, wie viele Zeilen man maximal von der SELECT-Anweisung zurückgeliefert haben will. Mit offset kann man außerdem festlegen, ab welchem Ergebnistupel angefangen werden soll. Ohne Angaben wird 0 angenommen.

Wie man in diesem Beispiel sieht, werden zeilenweise Kommentare in MySQL vom #-Symbol eingeleitet.

Projektion

Möchte man eine Projektion auf bestimmte Spalten durchführen, ersetzt man den Stern durch eine Kommaliste mit den entsprechenden Spaltennamen.

SELECT <spaltenname1>, <spaltenname2>,... FROM <tabellenname>;
SELECT Name, Vorname, AbtNr FROM Mitarbeiter;

Doppelte Tupel enfernt mit Hilfe des Schlüsselwortes DISTINCT:

SELECT DISTINCT AbtNr FROM Mitarbeiter;

Die Abfrage gibt alle Abteilungsnummern aus.

Selektion

Eine Selektion erreicht man durch das Anhängen einer WHERE-Klausel, die eine Bedingung enthält, nach der selektiert werden soll.

SELECT * FROM <tabellenname> WHERE <where-Bedingung>;

Eine where-Bedingung kann aus mehreren Teilbedingungen bestehen, die man mit AND oder OR verknüpft. Eine Teilbedingung besteht im einfachsten Fall aus einem Spaltennamen, einem Operator und einer Konstanten. Konstante Zeichenketten müssen in Hochkommata eingeschlossen werden.

SELECT * FROM Mitarbeiter WHERE Name = 'Meier';
SELECT * FROM Mitarbeiter WHERE Name = 'Meier' AND AbtNr = 1;

Die Teilbedingungen können auch mit NOT verneint werden.

SELECT * FROM Mitarbeiter WHERE NOT Name = 'Meier';

Die Reihenfolge der Teilbedingungen kann durch Klammern beeinflusst werden. Als Operatoren stehen die Vergleichsoperatoren sowie die Operatoren LIKE, BETWEEN und IN zur Auswahl.

Übersicht: Vergleichsoperatoren

Operator Bedeutung
= gleich
<> oder != ungleich
> größer
< kleiner
>= größer gleich
<= kleiner gleich

Selbstverständlich lassen sich auch WHERE-Bedingungen aus mehreren Teilbedingungen konstruieren. Hierfür gibt es die bekannten logischen Operatoren:

Übersicht: Logische Operatoren

Operator Bedeutung
NOT
!
Logisches 'Nicht'. 
AND
&&
Logisches 'Und'.
OR
||
Logisches 'Oder'.

Like-Operator

Immer dann, wenn man Datensätze nach bestimmten Teilzeichenketten suchen möchte, können die Vergleichsoperatoren nicht verwendet werden. Zwei Beispiele zur Verdeutlichung: Es sollen alle Mitarbeiter ausgegeben werden, bei denen die Telefon-Vorwahl auf 96 endet.

SELECT Name, Telefon FROM Mitarbeiter WHERE Telefon LIKE '%96/%';

Es soll ein Mitarbeiter mit Namen Meier ausgegeben werden. Allerdings ist unbekannt, ob er sich mit ei oder ai schreibt. Es sollen also alle Möglichkeiten ausgegeben werden.

SELECT Name FROM Mitarbeiter WHERE Name LIKE 'M_ier';

Wie wir sehen, gibt es zwei Jokerzeichen:

% steht für eine beliebige Anzahl (auch 0) beliebiger Zeichen
_ steht für genau ein beliebiges Zeichen

BETWEEN-Operator

Der BETWEEN-Operator wählt alle Tupel aus, bei denen die Werte in der angegebenen Spalte zwischen einer bestimmten oberen und unteren Grenze liegen. Beispiel: Es sollen alle Mitarbeiter ausgewählt werden, deren Abteilungs-Nummer zwischen 2 und 5 liegt.

SELECT * FROM Mitarbeiter WHERE AbtNr BETWEEN 2 AND 5;

BETWEEN kann bei Textspalten, Datumsspalten und numerischen Spalten verwendet werden.

IN-Operator

Der Operator IN wird benutzt, wenn man nicht mit einem einzelnen Wert, sondern mit einer Wertemenge vergleichen will. Zur Verdeutlichung: Es sollen alle Mitarbeiter ausgegeben werden, deren Telefonnummer 06196/671797 oder 069/764758 ist.

SELECT * FROM Mitarbeiter WHERE Telefon IN ('06196/671797','069/764758');

Der IN-Operator kann bei Textspalten, Datumsspalten und numerischen Spalten verwendet werden. Die Verneinung des IN-Operators ist NOT IN.

Kartesisches Produkt

Das kartesische Produkt mehrerer Relationen erhält man, indem man in der SELECT-Anweisung eine Kommaliste der beteiligten Relationen angibt.

SELECT <spaltenliste> FROM <tabellenname1>, <tabellenname2>, ...
SELECT * FROM Mitarbeiter, Abteilung;

Join

Ein Join lässt sich in verschiedenen Varianten formulieren. In der ersten Variante geht man vom kartesischen Produkt aus und hängt die Join-Bedingung (gleiche Attributwerte in der Spalte, über die gejoint wird) als WHERE-Bedingung hinten an:

SELECT * FROM Mitarbeiter m, Abteilung a WHERE m.AbtNr = a.AbtNr;
SELECT m.Name, m.AbtNr, a.Name, a.AbtNr FROM Mitarbeiter m, Abteilung a WHERE m.AbtNr = a.AbtNr;

Häufig haben Attribute über die man Tabellen joinen möchte in diesen Tabellen auch den gleichen Namen. Damit eindeutig auf jede dieser Spalten Bezug genommen werden kann, benötigt man Aliase (Ersatznamen, Abkürzungen). Im Beispiel werden die Aliase m (für die Relation Mitarbeiter) und a (für die Relation Abteilung) festgelegt, indem sie mit einer Leerstelle getrennt hinter dem Tabellennamen angegeben werden. Die Spalten der beteiligten Relationen lassen nun sich mit Hilfe der Schreibweise m.<Spaltenname> bzw. a.<Spaltenname> eindeutig ansprechen. Insbesondere lässt sich so die Join-Bedingung formulieren.

Eine zweite Variante zur Durchführung eines Joins, die ohne Aliase auskommt, lautet folgendermaßen:

SELECT <spaltenliste> FROM <tabellenname1> JOIN <tabellenname2> ON <join-Bedingung>;
SELECT * FROM Mitarbeiter m JOIN Abteilung a ON m.AbtNr = a.AbtNr;

Die Tabellen die gejoint werden sollen, werden hier über das Schlüsselwort JOIN miteinander verknüpft. Hinter ON folgt eine Liste von Spalten über die der Join durchgeführt werden soll.

Haben die Spalten über die gejoint werden soll in den beteiligten Tabellen denselbem Namen, kann man auch folgende Syntax für den Join nutzen:

SELECT <spaltenliste> FROM <tabellenname1> JOIN <tabellenname2> USING (<spaltenname1>, ...);
SELECT * FROM Mitarbeiter JOIN Abteilung USING (AbtNr);

Funktionen

In einem SELECT-Ausdruck können neben Konstanten und Spaltenwerten auch Funktionen verwendet werden. Es gibt zwei Arten von Funktionen, zum einen die sog. Singlerow-Funktionen und zum anderen die Gruppenfunktionen. Singlerow-Funktionen werden auf jedes Ergebnistupel angewendet, während die Gruppenfunktionen immer auf eine Gruppe von Zeilen angewendet werden.

SINGLEROW-Funktionen

[...]

GRUPPENFUNKTIONEN

Gruppenfunktionen werden auf eine Gruppe von Tupeln, die mit der GROUP-BY-Klausel zusammengefasst worden sind angewandt. Die Gruppierung wird über gleiche Spaltenwerte in einer oder mehreren angegebenen Spalten vorgenommen.

SELECT count(*), AbtNr FROM Mitarbeiter GROUP BY AbtNr;

Im Beispiel werden die Tupel in der Mitarbeiter-Tabelle nach gleichen Attributwerten in der AbtNr-Spalte zusammengefasst. Ausgegeben wird schließlich mit Hilfe der Gruppenfunktion count(*) die Anzahl der Mitarbeiter in einer Abteilung.

In Verbindung mit Gruppenfunktionen darf streng genommen kein Spaltenname mehr in der Spalteliste nach SELECT stehen. Die einzige Ausnahme ist dann gegeben, wenn der Spaltenname in der GROUP BY-Anweisung steht (wie oben AbtNr).

In der folgenden Tabelle sind ein Teil der verfügbaren Gruppenfunktionen aufgeführt.

Gruppenfunktionen in SQL

 COUNT(<expr>) zählt die Tupel, deren Werte ungleich NULL sind
 AVG(<expr>) durchschnittlicher Wert
 MIN(<expr>) kleinster Wert
 MAX(<expr>) größter Wert
 SUM(<expr>) Summe

Für <expr> ist immer der Name der Spalte einzusetzen, mit der diese Operation erfolgen soll.

Will man zusätzliche Bedingungen für eine Auswahl formulieren, die sich auf das Ergebnis einer Gruppenfunktion beziehen, so hilft ein WHERE-Teil nicht weiter. Innerhalb eines WHERE-Teils kann man nur Spaltenwerte verarbeiten. Die Lösung stellt das Schlüsselwort HAVING dar, dass man hinter die GROUP-BY-Klausel hängen darf. Möchte man im obigen Beispiel nur die Abteilungen ausgeben, die mehr als zwei Mitarbeiter beschäftigen, schreibt man:

SELECT COUNT(*) AS Anzahl FROM Mitarbeiter GROUP BY AbtNr HAVING Anzahl > 2;

Im Beispiel wird außerdem mit Hilfe des Schlüsselwortes AS ein Spaltenalias festgelegt.

» drucken: pdf | html

© 2004-2024 M. Blanke · Ursulaschule · Kleine Domsfreiheit 11-18 · 49074 Osnabrück