Unterschiede
Hier werden die Unterschiede zwischen zwei Versionen angezeigt.
Nächste Überarbeitung | Vorhergehende Überarbeitung | ||
modul:m290_guko:learningunits:lu06:theorie:a_where_bedingungen [2025/09/20 14:26] – angelegt gkoch | modul:m290_guko:learningunits:lu06:theorie:a_where_bedingungen [2025/09/20 15:05] (aktuell) – gkoch | ||
---|---|---|---|
Zeile 1: | Zeile 1: | ||
- | ====== | + | ====== |
- | Mit einer **WHERE-Bedingung** können wir Datensätze | + | In **LU02** haben Sie gelernt, wie Sie mit |
- | Anstatt | + | |
+ | * // | ||
+ | * //WHERE// Bedingungen setzen | ||
+ | * //ORDER BY// die Ergebnisse sortieren | ||
- | Eine Bedingung ist immer **wahr (TRUE)** oder **falsch (FALSE)**. | + | 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 // |
===== Vergleichsoperatoren ===== | ===== Vergleichsoperatoren ===== | ||
- | **Beispiele mit der Filmtabelle `imdb_top_1000`: | + | Die **einfachsten Bedingungen** vergleichen Werte mit den Operatoren: |
+ | <WRAP center box 80% round>< | ||
- | * Gleichheit | + | <WRAP center box 80% round><code sql> |
- | | + | FROM imdb_top_1000 |
- | | + | WHERE Series_Title |
- | FROM imdb_top_1000 | + | |
- | WHERE Released_Year | + | |
- | | + | |
- | → Zeigt alle Filme, die im Jahr **2010** erschienen sind. | + | |
- | * Größer/ | + | Beachten Sie: |
- | < | + | Wir haben hier nach einem Wert vom Typ **Text** gesucht. |
- | SELECT Series_Title, | + | Texte sind **alphanumerische Zeichen** und müssen immer in **Anführungszeichen** stehen: |
- | FROM imdb_top_1000 | + | * //" |
- | WHERE IMDB_Rating > 8.5; | + | * Ohne Anführungszeichen versteht MySQL das Wort als **Namen einer Tabelle oder Spalte**. |
- | </code> | + | |
- | → Zeigt alle Filme mit einer Bewertung | + | |
- | --- | + | Beispiele: |
+ | |||
+ | <WRAP center box round 80%>< | ||
+ | -- Filme vor 1970 | ||
+ | SELECT Series_Title, | ||
+ | FROM imdb_top_1000 | ||
+ | WHERE Released_Year < 1970; | ||
+ | </ | ||
+ | |||
+ | <WRAP center box round 80%>< | ||
+ | -- Filme mit Bewertung über 9.0 | ||
+ | SELECT Series_Title, | ||
+ | FROM imdb_top_1000 | ||
+ | WHERE IMDB_Rating > 9.0; | ||
+ | </ | ||
===== BETWEEN ===== | ===== BETWEEN ===== | ||
- | Frage: *Liegt | + | Prüfen, ob ein Wert zwischen zwei Grenzen |
- | Die Grenzen werden **eingeschlossen**. | + | |
- | <code sql> | + | <WRAP center box round 80%><code sql> |
+ | -- Filme aus den 90ern | ||
SELECT Series_Title, | SELECT Series_Title, | ||
FROM imdb_top_1000 | FROM imdb_top_1000 | ||
- | WHERE Released_Year BETWEEN 1990 AND 2000; | + | WHERE Released_Year BETWEEN 1990 AND 1999; |
- | </ | + | </code></ |
- | → Alle Filme, | + | |
+ | Achtung: | ||
+ | Der Operator //BETWEEN// schliesst | ||
+ | Die folgenden beiden Bedingungen sind also **gleichwertig**: | ||
+ | |||
+ | <WRAP center box round 80%>< | ||
+ | Released_Year BETWEEN 1990 AND 1999 | ||
+ | </ | ||
+ | |||
+ | <WRAP center box round 80%>< | ||
+ | Released_Year >= 1990 AND Released_Year <= 1999 | ||
+ | </ | ||
- | --- | ||
===== IN ===== | ===== IN ===== | ||
- | Mit `IN` können Sie eine **Liste | + | Prüfen, ob ein Wert in einer **Liste** |
- | <code sql> | + | <WRAP center box round 80%><code sql> |
+ | -- Filme von Nolan oder Coppola | ||
SELECT Series_Title, | SELECT Series_Title, | ||
FROM imdb_top_1000 | FROM imdb_top_1000 | ||
- | WHERE Director IN ("Christopher Nolan", "Sofia Coppola"); | + | WHERE Director IN ('Christopher Nolan', 'Sofia Coppola'); |
- | </ | + | </ |
- | → Alle Filme, die entweder von **Nolan** oder von **Coppola** sind. | + | |
- | + | ||
- | --- | + | |
===== LIKE ===== | ===== LIKE ===== | ||
- | Mit `LIKE` können Sie nach **Mustern im Text** suchen. | + | Mit //LIKE// können Sie nach **Textmustern** suchen. |
- | + | * //%// = beliebig viele Zeichen | |
- | * `%` steht für **beliebig viele Zeichen** | + | * //_// = genau ein Zeichen |
- | * `_` steht für **genau ein Zeichen** | + | |
- | <code sql> | + | <WRAP center box round 80%><code sql> |
+ | -- Alle Filme, die mit " | ||
SELECT Series_Title | SELECT Series_Title | ||
FROM imdb_top_1000 | FROM imdb_top_1000 | ||
- | WHERE Series_Title LIKE "The%"; | + | WHERE Series_Title LIKE 'The%'; |
- | </ | + | </ |
- | → Alle Filme, deren Titel mit **" | + | |
- | <code sql> | + | <WRAP center box round 80%><code sql> |
+ | -- Alle Filme, die " | ||
SELECT Series_Title | SELECT Series_Title | ||
FROM imdb_top_1000 | FROM imdb_top_1000 | ||
- | WHERE Series_Title LIKE " | + | WHERE Series_Title LIKE ' |
- | </ | + | </ |
- | → Findet Titel wie **" | + | |
- | --- | ||
===== IS NULL / IS NOT NULL ===== | ===== IS NULL / IS NOT NULL ===== | ||
- | NULL bedeutet: **kein Wert eingetragen**. | + | Der Wert **NULL** (sprich: *nall*, englisch ausgesprochen) |
+ | → Es ist **kein Wert vorhanden**. | ||
- | <code sql> | + | 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: | ||
+ | Anschliessend bildet Metacritic daraus einen gewichteten Durchschnittswert. | ||
+ | )). | ||
+ | |||
+ | <WRAP center box round 80%><code sql> | ||
+ | -- Filme ohne Metascore | ||
SELECT Series_Title, | SELECT Series_Title, | ||
FROM imdb_top_1000 | FROM imdb_top_1000 | ||
WHERE Meta_score IS NULL; | WHERE Meta_score IS NULL; | ||
- | </ | + | </ |
- | → Filme ohne **Metascore**. | + | |
- | <code sql> | + | <WRAP center box round 80%><code sql> |
+ | -- Filme mit Metascore | ||
SELECT Series_Title, | SELECT Series_Title, | ||
FROM imdb_top_1000 | FROM imdb_top_1000 | ||
WHERE Meta_score IS NOT NULL; | WHERE Meta_score IS NOT NULL; | ||
- | </ | + | </ |
- | → Filme, bei denen ein **Metascore** vorhanden ist. | + | |
- | + | ||
- | --- | + | |
===== Logische Verknüpfungen (AND / OR / NOT) ===== | ===== Logische Verknüpfungen (AND / OR / NOT) ===== | ||
- | Mit `AND`, `OR` und `NOT` können Sie Bedingungen | + | Mehrere |
- | * **AND** → beide Bedingungen müssen zutreffen | + | <WRAP center box round 80%><code sql> |
- | * **OR** → mindestens eine Bedingung muss zutreffen | + | -- Alle Sci-Fi-Filme von Christopher Nolan |
- | * **NOT** → kehrt eine Bedingung um | + | SELECT Series_Title, |
- | + | ||
- | Beispiele: | + | |
- | + | ||
- | <code sql> | + | |
- | SELECT Series_Title, | + | |
FROM imdb_top_1000 | FROM imdb_top_1000 | ||
- | WHERE Released_Year > 2010 AND IMDB_Rating > 8.0; | + | WHERE Director = ' |
- | </ | + | |
- | → Filme **nach 2010**, die gleichzeitig eine Bewertung über 8.0 haben. | + | </ |
- | <code sql> | + | <WRAP center box round 80%><code sql> |
+ | -- Filme von Nolan oder Coppola | ||
SELECT Series_Title, | SELECT Series_Title, | ||
FROM imdb_top_1000 | FROM imdb_top_1000 | ||
- | WHERE Director = "Christopher Nolan" | + | WHERE Director = 'Christopher Nolan' |
- | </ | + | OR Director = 'Sofia Coppola'; |
- | → Filme, die von **Nolan** oder **Coppola** sind. | + | </ |
- | <code sql> | + | <WRAP center box round 80%><code sql> |
- | SELECT Series_Title | + | -- Alle Filme, die KEINE Komödie sind |
+ | SELECT Series_Title, Genre | ||
FROM imdb_top_1000 | FROM imdb_top_1000 | ||
- | WHERE NOT Genre LIKE "%Comedy%"; | + | WHERE NOT Genre LIKE '%Comedy%'; |
- | </ | + | </ |
- | → Alle Filme, die **keine Komödie** sind. | + | |
- | --- | + | ===== DISTINCT ===== |
- | ===== Zusammenfassung ===== | + | Mit // |
+ | Beispiel: In der Tabelle gibt es viele Genres mehrfach. | ||
- | Die wichtigsten Operatoren im Überblick: | + | <WRAP center box round 80%>< |
+ | -- Alle verschiedenen Genres | ||
+ | SELECT DISTINCT Genre | ||
+ | FROM imdb_top_1000; | ||
+ | </ | ||
+ | |||
+ | Ohne // | ||
+ | |||
+ | |||
+ | ===== LIMIT ===== | ||
+ | |||
+ | Oft ist es nicht sinnvoll, **alle Zeilen** auszugeben. Mit //LIMIT// können Sie die Anzahl der Zeilen einschränken. | ||
+ | |||
+ | <WRAP center box round 80%>< | ||
+ | -- Die 5 bestbewerteten Filme | ||
+ | SELECT Series_Title, | ||
+ | FROM imdb_top_1000 | ||
+ | ORDER BY IMDB_Rating DESC | ||
+ | LIMIT 5; | ||
+ | </ | ||
+ | |||
+ | <WRAP center box round 80%>< | ||
+ | -- Die ersten 10 Filme in der Tabelle | ||
+ | SELECT Series_Title, | ||
+ | FROM imdb_top_1000 | ||
+ | LIMIT 10; | ||
+ | </ | ||
+ | |||
+ | ===== Zusammenfassung ===== | ||
- | ^ Operator ^ Bedeutung ^ Beispiel ^ | + | Sie können WHERE-Bedingungen |
- | | = | gleich | `Released_Year = 2010` | | + | |
- | | > , < , >= , <= | größer/ | + | |
- | | BETWEEN ... AND ... | zwischen zwei Werten | `Released_Year BETWEEN 1990 AND 2000` | | + | |
- | | IN (...) | Wert aus einer Liste | `Director IN (" | + | |
- | | LIKE | Mustervergleich | `Series_Title LIKE " | + | |
- | | IS NULL | kein Wert | `Meta_score IS NULL` | | + | |
- | | IS NOT NULL | Wert vorhanden | `Meta_score IS NOT NULL` | | + | |
- | | AND | beide Bedingungen | + | |
- | | OR | mindestens eine Bedingung | `Director = " | + | |
- | | NOT | Bedingung verneinen | `NOT Genre LIKE " | + | |
- | --- | + | ^ Operator ^ Beispiel ^ |
+ | | = , < , > , <= , >= , <> | // | ||
+ | | BETWEEN ... AND ... | // | ||
+ | | IN (...) | //Director IN (' | ||
+ | | LIKE | // | ||
+ | | IS NULL | // | ||
+ | | IS NOT NULL | // | ||
+ | | AND / OR / NOT | //Director = ' | ||
+ | | DISTINCT | //SELECT DISTINCT Genre// keine Doppelten Ergebnisse | | ||
+ | | LIMIT | //LIMIT 5// für die ersten 5 Ergebnisse | | ||
- | **Merksatz: | ||
- | Mit `WHERE` können Sie gezielt **Filme auswählen**, | ||
- | So werden SQL-Abfragen praktisch und nützlich. | ||