SQL ist die Abkürzung für "Structured Query Language". Mithilfe dieser strukturierten Sprache kann man Datenbanken erzeugen, auslesen und manipulieren.
Jede SELECT-Abfrage enthält mindestens zwei Hauptbefehle: SELECT (engl.: wähle) & FROM (engl.: aus/von). Mit SELECT wählst Du die Spalten aus, auf die projiziert werden soll, dh. mit denen Du arbeiten möchtest, während Du mit FROM die Tabelle(n) bestimmst, die die vorher gewählten Spalten enthält.
Wir lassen uns alle Spalten der Tabelle "customer" ausgeben:
SELECT * FROM customer;
Ergebnis (Ausschnitt):
store_id |
first_name |
last_name |
---|---|---|
1 |
MARY |
SMITH |
1 |
PATRICIA |
JOHNSON |
1 |
LINDA |
WILLIAMS |
1 |
ELIZABETH |
BROWN |
1 |
MARIA |
MILLER |
1 |
DOROTHY |
TAYLOR |
1 |
NANCY |
THOMAS |
1 |
HELEN |
HARRIS |
1 |
DONNA |
THOMPSON |
Bei Namen von Datenbanken, Tabellen und Spalten musst Du unbedingt auf die Groß- & Kleinschreibung achten!
Wenn Du in einer Abfrage einen Wert verwendest, der nicht nur aus Zahlen besteht, so musst Du ihn in Anführungszeichen setzten.
SELECT * FROM customer
WHERE first_name = "Mary";
SELECT * FROM customer
WHERE store_id = 10;
Eine standartmäßige SELECT-Abfrage besteht aus drei Teilen: SELECT {Attribut} FROM {Tabelle} WHERE {Bedingung}. In der WHERE-Klausel kann man mit den Operatoren kleiner, kleiner gleich, gleich, ungleich, größer gleich und größer (<, <=, =, <>, >= und >) Vergleichsbedingungen formulieren.
Wir suchen nach den vollen Namen der Kunden, deren Kunden ID kleiner gleich 5 ist.
SELECT customer_id, first_name, last_name
FROM customer
WHERE customer_id <= 5;
Ergebnis (Ausschnitt):
customer_id |
first_name |
last_name |
---|---|---|
1 |
MARY |
SMITH |
2 |
PATRICIA |
JOHNSON |
3 |
LINDA |
WILLIAMS |
4 |
BARBARA |
JONES |
5 |
ELIZABETH |
BROWN |
In der WHERE-Klausel kann man mit den Operatoren AND, OR und NOT logische Bedingungen formulieren.
Der volle Name der Kunden aus Laden 2 soll ausgegeben werden, deren Kunden ID kleiner 10 ist.
SELECT customer_id, store_id, first_name, last_name
FROM customer
WHERE store_id = 2
AND customer_id < 10;
Ergebnis:
customer_id |
store_id |
first_name |
last_name |
---|---|---|---|
4 |
2 |
BARBARA |
JONES |
6 |
2 |
JENNIFER |
DAVIS |
8 |
2 |
SUSAN |
WILSON |
9 |
2 |
MARGARET |
MOORE |
Nun wollen wir herausfinden, wie die Personen heißen, deren KundenID zwischen 5 und 10 liegt. In der WHERE-Klausel "customer_id >= 5 AND <= 10" zu benutzen, um einen Bereichsvergleich durchzuführen, wird nicht funktionieren, da der Vergleichspartner fehlt. Daher verwendet man hierfür den BETWEEN-Operator.
Wir wollen den vollen Namen der Kunden, deren Kunden ID zwischen 55 und 60 liegt, wissen.
SELECT customer_id, first_name, last_name
FROM customer
WHERE customer_id BETWEEN 55 AND 60;
Ergebnis:
customer_id |
first_name |
last_name |
---|---|---|
55 |
DORIS |
REED |
56 |
GLORIA |
COOK |
57 |
EVELYN |
MORGAN |
58 |
JEAN |
BELL |
59 |
CHERYL |
MURPHY |
60 |
MILDRED |
BAILEY |
Den LIKE-Operator benutzt Du als Muster für String-Vergleiche. Hierbei steht das Prozentzeichen (%) für eine beliebige Folge von Zeichen, während der Unterstrich (_) für ein einziges beliebiges Zeichen steht.
Den LIKE-Operator kann man ebenfalls mit NOT zusammen verwenden: WHERE "a" NOT LIKE "%b%".
Wir wollen den vollen Namen aller Kunden ausgeben, deren Nachname "Ray" enthält.
SELECT first_name, last_name
FROM customer
WHERE last_name LIKE "%Ray%";
Ergebnis:
first_name |
last_name |
---|---|
JUDY |
GRAY |
THELMA |
MURRAY |
AUDREY |
RAY |
Wenn man eine Reihe von Kriterien hat, die der gesuchte Datensatz erfüllen muss, so nutzt man den IN-Operator.
Diesen kann man auch in Verbindung mit NOT benutzen: WHERE "a" NOT IN "b".
Wir möchten uns die KundenID und den Vornamen von den Kunden "Coy", "Spear" und "Gamez" anschauen.
SELECT customer_id, first_name, last_name
FROM customer
WHERE last_name IN ("COY", "SPEAR", "GAMEZ");
Ergebnis (Ausschnitt):
customer_id |
first_name |
last_name |
---|---|---|
324 |
GARY |
COY |
328 |
JEFFREY |
SPEAR |
391 |
CLARENCE |
GAMEZ |
Sollte ein Wert einer Tabelle noch unbekannt sein, nutzt Du den NULL-Wert als Platzhalter.
Ein Zusammenspiel aus dem IS-Operator und dem NULL-Ausdruck ermöglicht es Dir NULL-Werte zu finden. Auch kannst Du diesen Operator in einer Kombination mit NOT verwenden: WHERE "a" IS NOT "b".
Wir wollen wissen, welche Inventare von welchen Kunden kein Rückgabedatum haben.
SELECT inventory_id, customer_id, return_date
FROM rental
WHERE return_date IS NULL;
Ergebnis (Ausschnitt):
inventory_id |
customer_id |
return_date |
---|---|---|
2145 |
80 |
NULL |
387 |
60 |
NULL |
1132 |
114 |
NULL |
857 |
438 |
NULL |
177 |
317 |
NULL |
Der DISTINCT-Operator sorgt dafür, dass Einträge der Ergebnistabelle nur einmal vorkommen, und schneidet somit alle mehrfach vorkommenden Werte weg.
Wir wollen wissen, welche Filmkategorien es gibt.
SELECT DISTINCT category_id
FROM film_category;
Ergebnis (Ausschnitt):
category_id |
---|
6 |
11 |
8 |
9 |
5 |
15 |
category_id |
---|
6 |
11 |
6 |
11 |
8 |
9 |
Mit den Grundrechenarten (+, -, *, /) kannst Du in der SELECT-Klausel Berechnungen durchführen.
Der AS-Operator gibt Dir die Möglichkeit, Spalten einen individuellen Namen zu geben. Dies verändert den Namen der Spalte jedoch nicht in der Datenbank, sondern lässt MySQL Dir bei der Ergebnisausgabe die Spalte mit dem von Dir gewählten Namen anzeigen.
Wir möchten erfahren, wie hoch die Kosten sind, wenn man den Film "Desire Alien" dreimal ausleiht.
SELECT title, rental_rate, rental_rate * 3 AS Kosten
FROM film
WHERE title = "DESIRE ALIEN";
Ergebnis:
title |
rental_rate |
Kosten |
---|---|---|
DESIRE ALIEN |
2.99 |
8.97 |
Wenn Du die ausgegebenen Daten sortiert angezeigt haben möchtest, nutzte den Operator ORDER BY. Hierbei werden Zahlen der Größe nach und alle anderen Zeichen der alphabetischen Reihenfolge nach sortiert.
Zusätzlich kannst Du noch die Attribute ASC (engl. ascending = aufsteigend) und DESC (engl. descending = absteigend) in Deiner Abfrage verwenden.
Benutzt Du ORDER BY "a" DESC, so werden die Daten in absteigender Reihenfolge, mit ORDER BY "a" ASC in aufsteigender Reihenfolge sortiert. Das standardmäßige Attribut ist ASC, dh. beim Benutzen von ORDER BY "a" ohne Zusatz, werden die Daten aufsteigend sortiert.
Wir wollen alle Filme, ihren Ersatzkosten nach, absteigend sortiert ausgeben.
SELECT title, replacement_cost
FROM film
ORDER BY replacement_cost DESC;
Ergebnis (Ausschnitt):
title |
replacement_cost |
---|---|
ARABIA DOGMA |
29.99 |
... |
... |
AIRPLANE SIERRA |
28.99 |
... |
... |
ALTER VICTORY |
27.99 |
... |
... |
AFFAIR PREJUDICE |
26.99 |
Wenn Du nach dem ORDER BY eine Aufzählung an Spalten macht, kann nach mehreren Kriterien sortiert werden.
Um das Ergebnis zu sortieren reicht es aus, wenn Du anstatt des Spaltennamens die Spaltenzahl angibst.
Auf unser Beispiel bezogen, lassen wir uns nun den Titel absteigend und die Ersatzkosten aufsteigend ausgeben:
SELECT title, replacement_cost
FROM film
ORDER BY 1 DESC, 2 ASC;
Mit dem LIMIT-Operator kannst Du die Zahl der ausgegebenen Datensätze beschränken. Vergiss aber nicht, dem Operator einen oder sogar zwei nummerische Parameter zu übergeben.
LIMIT 5 gibt die ersten 5 Datensätze aus.
LIMIT 4, 10 gibt 10 Datensätze aus, jedoch beginnt das Zählen erst nach dem 4. Datensatz. Somit werden die Datensätze 5-14 ausgegeben.
Wir wollen uns die letzten 3 Filme der Top 5 Filme mit den höchsten Ersatzkosten ausgeben lassen.
SELECT title, replacement_cost
FROM film
ORDER BY replacement_cost DESC
LIMIT 2, 3;
Ergebnis:
title |
replacement_cost |
---|---|
BLINDNESS GUN |
29.99 |
BONNIE HOLOCAUST |
29.99 |
CHARIOTS CONSPIRACY |
29.99 |