Unterschiede

Hier werden die Unterschiede zwischen zwei Versionen angezeigt.

Link zu dieser Vergleichsansicht

Nächste Überarbeitung
Vorhergehende Überarbeitung
modul:m290_guko:learningunits:lu06:theorie:a_where_bedingungen [2025/09/20 14:26] – angelegt gkochmodul:m290_guko:learningunits:lu06:theorie:a_where_bedingungen [2025/09/20 15:05] (aktuell) gkoch
Zeile 1: Zeile 1:
-====== Vertiefung: SQL-Abfragen mit Bedingungen ======+====== LU06 - Vertiefte SQL-Abfragen ======
  
-Mit einer **WHERE-Bedingung** können wir Datensätze **einschränken**.   +In **LU02** haben Sie gelernt, wie Sie mit   
-Anstatt die ganze Tabelle anzuzeigen, wählen wir nur die Zeilen aus, die bestimmte Kriterien erfüllen.  +  //SELECT// Spalten auswählen   
 +  * //FROM// die Tabelle bestimmen   
 +  * //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 //DISTINCT// doppelte Werte vermeiden können.  
  
 ===== Vergleichsoperatoren ===== ===== Vergleichsoperatoren =====
  
-**Beispiele mit der Filmtabelle `imdb_top_1000`:**+Die **einfachsten Bedingungen** vergleichen Werte mit den Operatoren:   
 +<WRAP center box 80% round><code sql>= , < , > , <= , >= , <></code></WRAP>
  
-  * Gleichheit +<WRAP center box 80% round><code sql>SELECT Series_Title, Released_Year 
-    <code sql> +FROM imdb_top_1000 
-    SELECT Series_Title, Released_Year +WHERE Series_Title 'Interstellar';</code></WRAP>
-    FROM imdb_top_1000 +
-    WHERE Released_Year 2010; +
-    </code> +
-    → Zeigt alle Filme, die im Jahr **2010** erschienen sind.+
  
-  * Größer/Kleiner +Beachten Sie:   
-    <code sql> +Wir haben hier nach einem Wert vom Typ **Text** gesucht  
-    SELECT Series_Title, IMDB_Rating +Texte sind **alphanumerische Zeichen** und müssen immer in **Anführungszeichen** stehen:   
-    FROM imdb_top_1000 +  * //"Interstellar"// oder //'Interstellar'//   
-    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 **über 8.5**.+
  
----+Beispiele:   
 + 
 +<WRAP center box round 80%><code sql> 
 +-- Filme vor 1970 
 +SELECT Series_Title, Released_Year 
 +FROM imdb_top_1000 
 +WHERE Released_Year < 1970; 
 +</code></WRAP> 
 + 
 +<WRAP center box round 80%><code sql> 
 +-- Filme mit Bewertung über 9.0 
 +SELECT Series_Title, IMDB_Rating 
 +FROM imdb_top_1000 
 +WHERE IMDB_Rating > 9.0; 
 +</code></WRAP>
  
 ===== BETWEEN ===== ===== BETWEEN =====
  
-Frage: *Liegt ein Wert zwischen zwei Grenzen?*   +Prüfen, ob ein Wert zwischen zwei Grenzen liegt.  
-Die Grenzen werden **eingeschlossen**.+
  
-<code sql>+<WRAP center box round 80%><code sql> 
 +-- Filme aus den 90ern
 SELECT Series_Title, Released_Year SELECT Series_Title, Released_Year
 FROM imdb_top_1000 FROM imdb_top_1000
-WHERE Released_Year BETWEEN 1990 AND 2000+WHERE Released_Year BETWEEN 1990 AND 1999
-</code> +</code></WRAP
-→ Alle Filme, die zwischen **1990 und 2000** (inklusiveerschienen sind.  + 
 +Achtung:   
 +Der Operator //BETWEEN// schliesst die beiden Grenzen **ein** (also inkl. 1990 und 1999).   
 +Die folgenden beiden Bedingungen sind also **gleichwertig**:   
 + 
 +<WRAP center box round 80%><code sql> 
 +Released_Year BETWEEN 1990 AND 1999 
 +</code></WRAP> 
 + 
 +<WRAP center box round 80%><code sql> 
 +Released_Year >= 1990 AND Released_Year <= 1999 
 +</code></WRAP>
  
---- 
  
 ===== IN ===== ===== IN =====
  
-Mit `IN` können Sie eine **Liste von möglichen Werten** vergleichen.  +Prüfen, ob ein Wert in einer **Liste** vorkommt.  
  
-<code sql>+<WRAP center box round 80%><code sql> 
 +-- Filme von Nolan oder Coppola
 SELECT Series_Title, Director SELECT Series_Title, Director
 FROM imdb_top_1000 FROM imdb_top_1000
-WHERE Director IN ("Christopher Nolan""Sofia Coppola"); +WHERE Director IN ('Christopher Nolan''Sofia Coppola'); 
-</code> +</code></WRAP>
-→ Alle Filme, die entweder von **Nolan** oder von **Coppola** sind. +
- +
----+
  
 ===== LIKE ===== ===== LIKE =====
  
-Mit `LIKEkö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 "The" beginnen
 SELECT Series_Title SELECT Series_Title
 FROM imdb_top_1000 FROM imdb_top_1000
-WHERE Series_Title LIKE "The%"+WHERE Series_Title LIKE 'The%'
-</code> +</code></WRAP>
-→ Alle Filme, deren Titel mit **"The"** beginnt.  +
  
-<code sql>+<WRAP center box round 80%><code sql> 
 +-- Alle Filme, die "Star" im Titel enthalten
 SELECT Series_Title SELECT Series_Title
 FROM imdb_top_1000 FROM imdb_top_1000
-WHERE Series_Title LIKE "Ma_er"+WHERE Series_Title LIKE '%Star%'
-</code> +</code></WRAP>
-→ Findet Titel wie **"Maier"** oder **"Mayer"**.  +
  
---- 
  
 ===== IS NULL / IS NOT NULL ===== ===== IS NULL / IS NOT NULL =====
  
-NULL bedeutet: **kein Wert eingetragen**.  +Der Wert **NULL** (sprich: *nall*, englisch ausgesprochen) bedeutet in SQL  
 +→ 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: 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. 
 +)).   
 + 
 +<WRAP center box round 80%><code sql> 
 +-- Filme ohne Metascore
 SELECT Series_Title, Meta_score SELECT Series_Title, Meta_score
 FROM imdb_top_1000 FROM imdb_top_1000
 WHERE Meta_score IS NULL; WHERE Meta_score IS NULL;
-</code> +</code></WRAP>
-→ Filme ohne **Metascore**.  +
  
-<code sql>+<WRAP center box round 80%><code sql> 
 +-- Filme mit Metascore
 SELECT Series_Title, Meta_score SELECT Series_Title, Meta_score
 FROM imdb_top_1000 FROM imdb_top_1000
 WHERE Meta_score IS NOT NULL; WHERE Meta_score IS NOT NULL;
-</code> +</code></WRAP>
-→ 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 kombinieren.  +Mehrere Bedingungen können kombiniert werden:  
  
-  * **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, GenreDirector
- +
-Beispiele:   +
- +
-<code sql> +
-SELECT Series_Title, Released_YearIMDB_Rating+
 FROM imdb_top_1000 FROM imdb_top_1000
-WHERE Released_Year > 2010 AND IMDB_Rating > 8.0+WHERE Director = 'Christopher Nolan' 
-</code> +  AND Genre LIKE '%Sci-Fi%'
-→ Filme **nach 2010**, die gleichzeitig eine Bewertung über 8.0 haben.  +</code></WRAP>
  
-<code sql>+<WRAP center box round 80%><code sql> 
 +-- Filme von Nolan oder Coppola
 SELECT Series_Title, Director SELECT Series_Title, Director
 FROM imdb_top_1000 FROM imdb_top_1000
-WHERE Director = "Christopher NolanOR Director = "Sofia Coppola"+WHERE Director = 'Christopher Nolan
-</code> +   OR Director = 'Sofia Coppola'
-→ Filme, die von **Nolan** oder **Coppola** sind.  +</code></WRAP>
  
-<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%'
-</code> +</code></WRAP>
-→ Alle Filme, die **keine Komödie** sind.  +
  
----+===== DISTINCT =====
  
-===== Zusammenfassung =====+Mit //DISTINCT// werden **doppelte Werte entfernt**.   
 +Beispiel: In der Tabelle gibt es viele Genres mehrfach.  
  
-Die wichtigsten Operatoren im Überblick:  +<WRAP center box round 80%><code sql> 
 +-- Alle verschiedenen Genres 
 +SELECT DISTINCT Genre 
 +FROM imdb_top_1000; 
 +</code></WRAP> 
 + 
 +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.   
 + 
 +<WRAP center box round 80%><code sql> 
 +-- Die 5 bestbewerteten Filme 
 +SELECT Series_Title, IMDB_Rating 
 +FROM imdb_top_1000 
 +ORDER BY IMDB_Rating DESC 
 +LIMIT 5; 
 +</code></WRAP> 
 + 
 +<WRAP center box round 80%><code sql> 
 +-- Die ersten 10 Filme in der Tabelle 
 +SELECT Series_Title, Released_Year 
 +FROM imdb_top_1000 
 +LIMIT 10; 
 +</code></WRAP> 
 + 
 +===== Zusammenfassung =====
  
-^ Operator ^ Bedeutung ^ Beispiel ^ +Sie können WHERE-Bedingungen mit vielen Operatoren kombinieren:  
-| = | gleich | `Released_Year = 2010` | +
-| > , < , >= , <= | größer/kleiner | `IMDB_Rating >= 8.5` | +
-| BETWEEN ... AND ... | zwischen zwei Werten | `Released_Year BETWEEN 1990 AND 2000` | +
-| IN (...) | Wert aus einer Liste | `Director IN ("Nolan", "Coppola")` | +
-| LIKE | Mustervergleich | `Series_Title LIKE "The%"` | +
-| IS NULL | kein Wert | `Meta_score IS NULL` | +
-| IS NOT NULL | Wert vorhanden | `Meta_score IS NOT NULL` | +
-| AND | beide Bedingungen | `Released_Year > 2000 AND IMDB_Rating > 8.0` | +
-| OR | mindestens eine Bedingung | `Director = "Nolan" OR Director = "Coppola"` | +
-| NOT | Bedingung verneinen | `NOT Genre LIKE "%Comedy%"` |+
  
----+^ 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 |
  
-**Merksatz:**   
-Mit `WHERE` können Sie gezielt **Filme auswählen**, statt die ganze Tabelle zu sehen.   
-So werden SQL-Abfragen praktisch und nützlich.   
  
  • modul/m290_guko/learningunits/lu06/theorie/a_where_bedingungen.1758371216.txt.gz
  • Zuletzt geändert: 2025/09/20 14:26
  • von gkoch