====== LU06 - Vertiefte SQL-Abfragen ======
In **LU02** haben Sie gelernt, wie Sie mit
* //SELECT// Spalten auswählen
* //FROM// die Tabelle bestimmen
* //WHERE// Bedingungen setzen
* //ORDER BY// die Ergebnisse sortieren
Daten aus einer Tabelle abfragen können.
In dieser Lektion gehen wir einen Schritt weiter: Wir schauen uns an, **wie Bedingungen in WHERE noch mächtiger kombiniert werden können**, wie Sie mit //LIMIT// die Ergebnismenge einschränken und mit //DISTINCT// doppelte Werte vermeiden können.
===== Vergleichsoperatoren =====
Die **einfachsten Bedingungen** vergleichen Werte mit den Operatoren:
= , < , > , <= , >= , <>
SELECT Series_Title, Released_Year
FROM imdb_top_1000
WHERE Series_Title = 'Interstellar';
Beachten Sie:
Wir haben hier nach einem Wert vom Typ **Text** gesucht.
Texte sind **alphanumerische Zeichen** und müssen immer in **Anführungszeichen** stehen:
* //"Interstellar"// oder //'Interstellar'//
* Ohne Anführungszeichen versteht MySQL das Wort als **Namen einer Tabelle oder Spalte**.
Beispiele:
-- Filme vor 1970
SELECT Series_Title, Released_Year
FROM imdb_top_1000
WHERE Released_Year < 1970;
-- Filme mit Bewertung über 9.0
SELECT Series_Title, IMDB_Rating
FROM imdb_top_1000
WHERE IMDB_Rating > 9.0;
===== BETWEEN =====
Prüfen, ob ein Wert zwischen zwei Grenzen liegt.
-- Filme aus den 90ern
SELECT Series_Title, Released_Year
FROM imdb_top_1000
WHERE Released_Year BETWEEN 1990 AND 1999;
Achtung:
Der Operator //BETWEEN// schliesst die beiden Grenzen **ein** (also inkl. 1990 und 1999).
Die folgenden beiden Bedingungen sind also **gleichwertig**:
Released_Year BETWEEN 1990 AND 1999
Released_Year >= 1990 AND Released_Year <= 1999
===== IN =====
Prüfen, ob ein Wert in einer **Liste** vorkommt.
-- Filme von Nolan oder Coppola
SELECT Series_Title, Director
FROM imdb_top_1000
WHERE Director IN ('Christopher Nolan', 'Sofia Coppola');
===== LIKE =====
Mit //LIKE// können Sie nach **Textmustern** suchen.
* //%// = beliebig viele Zeichen
* //_// = genau ein Zeichen
-- Alle Filme, die mit "The" beginnen
SELECT Series_Title
FROM imdb_top_1000
WHERE Series_Title LIKE 'The%';
-- Alle Filme, die "Star" im Titel enthalten
SELECT Series_Title
FROM imdb_top_1000
WHERE Series_Title LIKE '%Star%';
===== IS NULL / IS NOT NULL =====
Der Wert **NULL** (sprich: *nall*, englisch ausgesprochen) bedeutet in SQL:
→ Es ist **kein Wert vorhanden**.
Das heisst, dass in dem entsprechenden Feld nichts in der Tabelle eingetragen ist.
Das ist etwas anderes als **0** (Zahl) oder ein leerer Text ''.
Beispiel in unserer Filmdatenbank: Manche Filme haben **keinen Metascore**((Der Metascore ist ein Wert, den die Plattform Metacritic vergibt. Er basiert auf Kritiken von professionellen Filmkritiker:innen (z. B. aus Zeitungen, Magazinen, Online-Portalen). Alle Kritiken werden in eine numerische Skala von 0 bis 100 umgerechnet.
Anschliessend bildet Metacritic daraus einen gewichteten Durchschnittswert.
)).
-- Filme ohne Metascore
SELECT Series_Title, Meta_score
FROM imdb_top_1000
WHERE Meta_score IS NULL;
-- Filme mit Metascore
SELECT Series_Title, Meta_score
FROM imdb_top_1000
WHERE Meta_score IS NOT NULL;
===== Logische Verknüpfungen (AND / OR / NOT) =====
Mehrere Bedingungen können kombiniert werden:
-- Alle Sci-Fi-Filme von Christopher Nolan
SELECT Series_Title, Genre, Director
FROM imdb_top_1000
WHERE Director = 'Christopher Nolan'
AND Genre LIKE '%Sci-Fi%';
-- Filme von Nolan oder Coppola
SELECT Series_Title, Director
FROM imdb_top_1000
WHERE Director = 'Christopher Nolan'
OR Director = 'Sofia Coppola';
-- Alle Filme, die KEINE Komödie sind
SELECT Series_Title, Genre
FROM imdb_top_1000
WHERE NOT Genre LIKE '%Comedy%';
===== DISTINCT =====
Mit //DISTINCT// werden **doppelte Werte entfernt**.
Beispiel: In der Tabelle gibt es viele Genres mehrfach.
-- Alle verschiedenen Genres
SELECT DISTINCT Genre
FROM imdb_top_1000;
Ohne //DISTINCT// würde jedes Genre so oft erscheinen, wie es in der Tabelle vorkommt.
===== LIMIT =====
Oft ist es nicht sinnvoll, **alle Zeilen** auszugeben. Mit //LIMIT// können Sie die Anzahl der Zeilen einschränken.
-- Die 5 bestbewerteten Filme
SELECT Series_Title, IMDB_Rating
FROM imdb_top_1000
ORDER BY IMDB_Rating DESC
LIMIT 5;
-- Die ersten 10 Filme in der Tabelle
SELECT Series_Title, Released_Year
FROM imdb_top_1000
LIMIT 10;
===== Zusammenfassung =====
Sie können WHERE-Bedingungen mit vielen Operatoren kombinieren:
^ Operator ^ Beispiel ^
| = , < , > , <= , >= , <> | //IMDB_Rating > 9.0// |
| BETWEEN ... AND ... | //Released_Year BETWEEN 1990 AND 1999// |
| IN (...) | //Director IN ('Nolan','Coppola')// |
| LIKE | //Series_Title LIKE 'The%'// |
| IS NULL | //Meta_score IS NULL// |
| IS NOT NULL | //Meta_score IS NOT NULL// |
| AND / OR / NOT | //Director = 'Nolan' AND Genre LIKE '%Sci-Fi%'// |
| DISTINCT | //SELECT DISTINCT Genre// keine Doppelten Ergebnisse |
| LIMIT | //LIMIT 5// für die ersten 5 Ergebnisse |