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/22 07:32] (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 " | ||
| - | Die wichtigsten Operatoren im Überblick: | + | <WRAP center box round 80%>< |
| + | -- Alle verschiedenen Genres | ||
| + | SELECT DISTINCT Certificate | ||
| + | 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. | ||