Abfragen mit SELECT

Lerne, Fragen anhand der Daten in einer Datenbanktabelle zu beantworten. Wähle mit SELECT und FROM Spalten aus, behalte mit WHERE, Vergleichsoperatoren, AND, OR und NOT die benötigten Zeilen und gleiche mit IN, BETWEEN und LIKE Listen, Bereiche und Textmuster ab. Finde und behandle fehlende Werte mit IS NULL, liste unterschiedliche Werte mit DISTINCT auf und sortiere und begrenze Ergebnisse mit ORDER BY und LIMIT. Die Beispiele verwenden SQL, das in SQLite und PostgreSQL läuft, einschließlich der weit verbreiteten LIMIT-Klausel. Hinweise erläutern die Standardform und die Unterschiede bei MySQL, SQL Server und Oracle.

AnfängerEinheit 2 von 6 in Kurs: SQL – Datenbanken abfragen mit SELECT, JOIN und GROUP BY

Was du lernst

  1. Schreibe Abfragen, die ausgewählte Spalten aus einer Tabelle lesen, verstehe die zurückgegebene Ergebnismenge und liste mit DISTINCT die unterschiedlichen Werte einer Spalte auf.
    • Eine einfache SELECT-Abfrage schreiben
      Benenne mit SELECT die anzuzeigenden Spalten und mit FROM die auszulesende Tabelle, beachte die grundlegenden Syntaxregeln und verstehe, wie das Ergebnis aussieht.
    • Unterschiedliche Werte mit DISTINCT auflisten
      Entferne mit SELECT DISTINCT wiederholte Zeilen aus einem Ergebnis und sage voraus, wie viele Zeilen übrig bleiben, auch bei mehreren Spalten oder fehlenden Werten.
  2. Behalte nur die Zeilen, die eine Frage beantworten. Schreibe dazu Bedingungen mit Vergleichsoperatoren für Zahlen, Texte und Datumswerte und verknüpfe Bedingungen mit AND, OR und NOT.
    • Zahlen mit Vergleichsoperatoren vergleichen
      Wähle mit WHERE und =, <>, <, >, <= und >= Zeilen anhand numerischer Werte aus und wähle den zur Formulierung einer Frage passenden Operator.
    • Texte und Datumswerte richtig vergleichen
      Schreibe Text- und Datumswerte in der richtigen Form, sage voraus, wie Groß- und Kleinschreibung, alphabetische Reihenfolge und Datumsformate einen Vergleich beeinflussen, und vermeide typische Fehler bei Anführungszeichen und Datumswerten.
    • Bedingungen mit AND, OR und NOT verknüpfen
      Verknüpfe mehrere Bedingungen mit AND und OR, kehre eine Bedingung mit NOT um und verwende Klammern, damit die Abfrage genau das prüft, wonach gefragt wird.
  3. Formuliere Bedingungen kürzer und genauer: mit IN für Wertelisten, BETWEEN für Bereiche und LIKE für Textmuster. Berücksichtige auch ihre NOT-Formen und typische Fehlerquellen.
    • Mit IN gegen eine Werteliste prüfen
      Verwende IN und NOT IN, um Zeilen zu behalten, deren Wert einem von mehreren aufgeführten Werten entspricht, und verstehe, wie Listen mit AND und fehlenden Werten zusammenwirken.
    • Einen Bereich mit BETWEEN auswählen
      Verwende BETWEEN und NOT BETWEEN für Bereiche aus Zahlen, Datumswerten und Text. Beachte, dass beide Bereichsgrenzen eingeschlossen sind und wo das zu Fehlern führt.
    • Mit LIKE nach Textmustern suchen
      Finde mit LIKE sowie % und _ Text, der mit bestimmten Zeichen beginnt, endet oder sie enthält, und gehe mit Groß- und Kleinschreibung, wörtlichen Platzhalterzeichen und fehlenden Werten um.
  4. Erkenne NULL als fehlenden Wert, finde ihn mit IS NULL und IS NOT NULL und sage voraus, wie fehlende Werte das Ergebnis aller anderen Arten von Bedingungen verändern.
    • Fehlende Werte mit IS NULL finden
      Unterscheide NULL von null und einer leeren Zeichenkette und finde mit IS NULL und IS NOT NULL Zeilen, in denen ein Wert fehlt oder erfasst ist.
    • Vorhersagen, wie sich NULL auf Bedingungen auswirkt
      Wende die dreiwertige Logik (wahr, falsch, unbekannt) auf Vergleiche, AND, OR, NOT, IN, BETWEEN und LIKE an und entscheide, ob Zeilen mit fehlenden Werten in eine Antwort gehören.
  5. Bringe Ergebniszeilen mit ORDER BY in eine sinnvolle Reihenfolge, sortiere nach mehreren Spalten und gehe dabei mit gleichen und fehlenden Werten um. Gib mit LIMIT und OFFSET die ersten Zeilen oder eine Seite von Zeilen zurück.
    • Zeilen mit ORDER BY sortieren
      Sortiere ein Ergebnis nach einer Spalte aufsteigend oder absteigend und sage voraus, wie Zahlen, Datumswerte und Text angeordnet werden.
    • Nach mehreren Spalten sortieren und mit gleichen Werten und NULL umgehen
      Sortiere nach mehreren Spalten mit jeweils eigener Sortierrichtung, ergänze nachrangige Sortierkriterien für eine wiederholbare Reihenfolge und lege fest, wo fehlende Werte erscheinen.
    • Die ersten Zeilen und einzelne Seiten mit LIMIT und OFFSET ausgeben
      Gib mit LIMIT die ersten Zeilen eines sortierten Ergebnisses zurück, überspringe mit OFFSET Zeilen, um spätere Seiten anzuzeigen, und formuliere dieselbe Anfrage in anderen SQL-Dialekten.
  6. Kombiniere alle Klauseln zu korrekten, lesbaren Abfragen, verstehe die Reihenfolge, in der eine Abfrage verarbeitet wird, und übersetze alltägliche Fragen in Abfragen, deren Ergebnisse du prüfst.
    • Klauseln richtig anordnen und wissen, wie eine Abfrage verarbeitet wird
      Schreibe SELECT, FROM, WHERE, ORDER BY und LIMIT in der vorgeschriebenen Reihenfolge und nutze die logische Verarbeitungsreihenfolge, um vorherzusagen, welche Daten jeder Klausel zur Verfügung stehen.
    • Eine Frage in eine Abfrage übersetzen und das Ergebnis prüfen
      Übersetze eine alltägliche Frage Schritt für Schritt in eine Abfrage über eine einzelne Tabelle und prüfe dann das Ergebnis auf Grenzwerte, fehlende Werte, Groß- und Kleinschreibung und gleiche Werte.

Abfragen mit SELECT einfach erklärt

6 Kapitel

1

Die anzuzeigenden Daten auswählen

Eine nützliche Abfrage beginnt mit der Auswahl der Tabelle und der Spalten, die deine Frage beantworten. Das Ergebnis kann jeden Datensatz, einige Felder aus jedem Datensatz oder eine Liste unterschiedlicher Werte anzeigen. Du arbeitest mit zwei kleinen Tabellen, sodass du jedes Ergebnis auf die gespeicherten Daten zurückführen kannst. Wenn du die Spaltennamen sorgfältig liest und zwischen Spalten- und Zeilenreihenfolge unterscheidest, verstehst du spätere Filter und Sortierungen leichter.

1.1 SELECT, FROM und die Ergebnistabelle

Eine Abfrage fragt Daten aus einer Datenbank ab. Eine einfache SELECT-Abfrage liest die gespeicherte Tabelle, ohne sie zu ändern. SELECT benennt die anzuzeigenden Spalten und FROM die auszulesende Tabelle.

Die Textbeispiele verwenden den gewöhnlichen Gleichheitsvergleich in SQLite und PostgreSQL, der Groß- und Kleinschreibung beachtet. Einstellungen der Sortierfolge können ändern, wie Text verglichen und sortiert wird.

Zwei Tabellen zum Arbeiten

Die Tabelle employees hat diese acht Zeilen. salary ist das Jahresgehalt in Dollar; hire_date ist Text in der Form YYYY-MM-DD. NULL kennzeichnet einen fehlenden Wert.

employee_idfirst_namelast_namedepartmentcitysalaryhire_datephone
1AnaLopezSalesChicago520002019-03-15312-555-0147
2BenCarterITDenver710002021-07-01NULL
3ChloeNguyenSalesChicago480002023-01-09312-555-0198
4DavidKimMarketingBoston600002020-11-23617-555-0110
5EmmaBrownSalesDenver650002018-05-30NULL
6FaridHaddadITChicago830002017-09-12312-555-0175
7GraceOkaforNULLBoston450002024-02-19617-555-0133
8HugoO'NeillMarketingChicago580002022-08-05NULL

Die Tabelle products erfasst Preise in Dollar und den Lagerbestand in Stück.

product_idnamecategorypricestock
1Desk LampLighting24,9940
2Floor LampLighting89,0012
3Lamp ShadeLighting15,500
4Office ChairFurniture149,008
5Standing DeskFurniture349,005
6Desk OrganizerStorage18,7560
7BookshelfFurniture120,00NULL
8Paper TrayStorage9,9925
Den Aufbau der Abfrage lesen
SELECT city, first_name
FROM employees;

Die Ergebnismenge ist eine weitere Tabelle: acht Zeilen und zwei Spalten, mit city an erster Stelle. Es gibt keinen Filter, daher trägt jede beschäftigte Person eine Zeile bei. SQL garantiert keine Zeilenreihenfolge, solange du kein ORDER BY ergänzt.

SELECT * FROM products; zeigt alle Spalten in der in der Tabelle definierten Reihenfolge an. Der Stern ist beim Erkunden nützlich. Wenn du in einer gespeicherten Abfrage die Spalten benennst, bleibt das Ergebnis auf das Nötige beschränkt und eine neu hinzugefügte Tabellenspalte ändert seinen Aufbau nicht.

Die Syntax lesbar gestalten

Trenne Spalten durch Kommas, ohne ein abschließendes Komma vor FROM. Beende die Anweisung mit einem Semikolon. Bei Schlüsselwörtern spielt die Groß- und Kleinschreibung keine Rolle, sodass select funktioniert. Großbuchstaben machen Klauseln aber leicht auffindbar. Leerzeichen und Zeilenumbrüche trennen Wörter; sie ändern die Bedeutung dieser Abfrage nicht. Ein ---Kommentar reicht bis zum Ende seiner Zeile.

Namen müssen im Schema gefunden werden können. Führt frist_name zu einem Fehler wegen einer fehlenden Spalte, vergleiche die Schreibweise mit first_name. Standard-SQL verwendet doppelte Anführungszeichen für Namen, die Leerzeichen enthalten oder reservierte Wörter sind, etwa "order date". PostgreSQL wandelt Namen ohne Anführungszeichen in Kleinbuchstaben um, während "City" genau diesen großgeschriebenen Namen sucht. MySQL verwendet normalerweise Graviszeichen; doppelte Anführungszeichen kennzeichnen Namen im Modus ANSI_QUOTES. SQL Server akzeptiert auch eckige Klammern und bei eingeschaltetem QUOTED_IDENTIFIER, seiner Standardeinstellung, doppelte Anführungszeichen.

Wichtige Erkenntnisse

  • SELECT wählt die angezeigten Spalten; FROM bezeichnet ihre Tabelle.
  • Die Ergebnisspalten folgen der SELECT-Liste; für eine Zeilenreihenfolge ist ORDER BY nötig.
  • SELECT * zeigt alle Spalten; ausdrückliche Namen beschränken gespeicherte Abfragen auf das Nötige.
  • Verwende Kommas zwischen Spalten und ein Semikolon zum Beenden einer Anweisung.
  • Vergleiche Namen mit dem Schema und beachte die Regeln der Datenbank für Anführungszeichen um Bezeichner.

1.2 Unterschiedliche Werte und Wertekombinationen

Ein wiederholter Wert in einem Abfrageergebnis ist oft nützlich. Mehrere Beschäftigte können in derselben Stadt wohnen und trotzdem braucht jede Person eine Zeile. Verwende DISTINCT, wenn die Frage nach unterschiedlichen Werten oder unterschiedlichen Kombinationen fragt.

Festlegen, was als Duplikat zählt
SELECT DISTINCT city
FROM employees;

Das Ergebnis enthält Chicago, Denver und Boston, ohne garantierte Reihenfolge. Das einfache SELECT city würde acht Zeilen zurückgeben, weil jede beschäftigte Person eine Stadt beisteuert. Mit DISTINCT wird die Anzeige auf drei unterschiedliche Werte reduziert. Alle acht Datensätze der Beschäftigten bleiben gespeichert.

Der Vergleich umfasst jede ausgewählte Spalte. Betrachte:

SELECT DISTINCT department, city
FROM employees;

Ana und Chloe steuern beide (Sales, Chicago) bei, sodass dieses Paar einmal erscheint. Emma steuert (Sales, Denver) bei, das anders ist und erhalten bleibt. Die anderen Paare sind (IT, Denver), (Marketing, Boston), (IT, Chicago), (NULL, Boston) und (Marketing, Chicago). Es gibt sieben Ergebniszeilen. Wiederholte Abteilungen bleiben erhalten, weil eine Abteilung mit einer anderen Stadt eine andere Ergebniszeile bildet.

Schreibe DISTINCT einmal direkt nach SELECT. Es gilt für die gesamte ausgewählte Zeile. Zwischen Spaltennamen, wie in SELECT department, DISTINCT city, ist es ein Syntaxfehler.

Auf die einbezogenen Spalten achten

Fügst du employee_id zu den ausgewählten Spalten hinzu, wird jede Zeile unterschiedlich. SELECT DISTINCT employee_id, city FROM employees; gibt weiterhin acht Zeilen zurück: Jede ID ist eindeutig, auch wenn sich die Stadt wiederholt. Um „In welchen Städten gibt es Beschäftigte?“ zu beantworten, wähle nur die Stadt. Für „Welche Beschäftigten wohnen in welcher Stadt?“ behalte identifizierende Spalten und erwarte wiederholte Städte.

Beim Entfernen von Duplikaten werden wiederholte NULL-Werte als Duplikate behandelt. SELECT DISTINCT department FROM employees; gibt Sales, IT, Marketing und eine NULL-Zeile zurück. Die NULL-Zeile zeigt, dass eine Abteilung fehlt; sie ist kein vierter Abteilungsname. Diese Duplikatregel unterscheidet sich von NULL = NULL, was in einem Filter unbekannt ergibt.

Textvergleiche folgen einer Sortierfolge, den Regeln der Datenbank für den Abgleich und die Anordnung von Text. Bei den gewöhnlichen Vergleichen dieser SQLite- und PostgreSQL-Beispiele, die Groß- und Kleinschreibung beachten, sind Chicago und chicago unterschiedliche Werte. Eine DISTINCT-Liste kann uneinheitliche Groß- und Kleinschreibung sichtbar machen. Das Entfernen wiederholter Anzeigen korrigiert nicht die Schreibweise in den gespeicherten Daten.

DISTINCT mit einer sortierten Auswahlliste kombinieren
SELECT DISTINCT city
FROM employees
ORDER BY city
LIMIT 2;

Zuerst verschwinden doppelte Städte. Danach werden die drei Städte sortiert. Schließlich bleiben zwei Ergebniszeilen: Boston und Chicago, in dieser Reihenfolge. Würde die Begrenzung zuerst auf die Zeilen der Beschäftigten angewendet, beantwortete das eine andere Frage.

Nimm bei einer DISTINCT-Abfrage die Sortierspalten in die SELECT-Liste auf. PostgreSQL verlangt das; SQLite erlaubt manche Abfragen, die nach einer nicht ausgewählten Spalte sortieren. Die Auswahl zwischen unterschiedlichen verborgenen Werten macht ihre Reihenfolge aber schwer deutbar. Wiederholt sich ein Ergebnis unerwartet, prüfe, welche Spalten du ausgewählt hast, bevor du entscheidest, ob DISTINCT in die Abfrage gehört.

Wichtige Erkenntnisse

  • DISTINCT entfernt doppelte vollständige Ergebniszeilen, ohne gespeicherte Zeilen zu ändern.
  • Zusätzliche Spalten ändern, welche Zeilen als Duplikate zählen; ein eindeutiger Schlüssel hält jede Zeile unterschiedlich.
  • DISTINCT gruppiert wiederholte NULL-Werte zusammen.
  • Duplikate werden entfernt, bevor das sortierte Ergebnis begrenzt wird.
2

Die Zeilen behalten, die die Frage beantworten

Durch Filtern wird eine Tabelle zu einer Antwort über bestimmte Datensätze: einen Gehaltsbereich, eine Stadt oder eine Gruppe, die mehrere Bedingungen erfüllt. Kleine Entscheidungen sind wichtig, etwa ob eine Bereichsgrenze zählt und ob zwei Bedingungen beide erfüllt sein müssen. Für numerische Vergleiche, Text- und Datumswerte sowie gruppierte logische Bedingungen gelten jeweils eigene Regeln. Eine Abfrage kann erfolgreich ausgeführt werden und trotzdem die falsche Frage stellen. Deshalb verfolgst du, welche Zeilen jede Prüfung bestehen.

2.1 Zahlen und Grenzwerte

Die WHERE-Klausel behält eine Zeile nur, wenn ihre Bedingung wahr ist. Sie folgt auf FROM und kann jede Spalte der Tabelle prüfen, auch eine Spalte, die du nicht anzeigst.

Formulierung und Operator zuordnen
AnfrageOperatorBeispielbedingung
Gleich=stock = 0
Ungleich<>stock <> 0
Mehr als>salary > 60000
Mindestens>=salary >= 60000
Weniger als<price < 20.50
Höchstens<=price <= 20.50

<> ist die Standard-SQL-Schreibweise für „ungleich“. Die fünf hier besprochenen Datenbanken akzeptieren auch !=. Verwende für Gleichheit ein Gleichheitszeichen. SQLite akzeptiert ==, PostgreSQL lehnt diese Form aber ab.

Eine Zeile am Grenzwert verfolgen
SELECT first_name, salary
FROM employees
WHERE salary > 60000;

Ben hat 71.000, Emma 65.000 und Farid 83.000. Das sind die drei passenden Zeilen, ohne festgelegte Reihenfolge. David verdient genau 60.000. Seine Zeile erfüllt > 60000 nicht, weil „mehr als“ Gleichheit ausschließt.

Ändere nur den Operator zu >=. David kommt nun zum Ergebnis hinzu, sodass es vier Zeilen enthält. So unterscheidet sich „mindestens 60.000“ von „mehr als 60.000“. Bei einer hilfreichen Grenzwertprüfung fragst du, was mit einem Wert geschieht, der genau dem Schwellenwert entspricht; Werte weit darüber können diesen Fehler nicht aufdecken.

Bei „höchstens 20,50“ erfüllt ein Preis von 20,50 die Bedingung, ein Preis von 20,51 dagegen nicht. Gibt eine Anfrage sowohl eine Unter- als auch eine Obergrenze an, prüfe jede Grenze einzeln, bevor du die Prüfungen verknüpfst.

Numerische Werte als Zahlen schreiben

Verwende in SQL-Bedingungen nur Ziffern: 60000, ohne Tausenderkomma oder Währungszeichen. Ein Komma trennt SQL-Einträge; WHERE salary > 60,000 ist ein Syntaxfehler. Dezimalwerte werden mit Punkt geschrieben, wie in WHERE price < 20.50. Gehälter und Preise gehören in numerische Spalten, damit Vergleiche ihre numerische Größe berücksichtigen.

Text, der wie eine Zahl aussieht, folgt beim Textvergleich den Regeln für Text. Der Textwert '9' wird nach '10' einsortiert, weil sein erstes Zeichen später kommt. Das sagt etwas über Zeichen aus, nicht darüber, dass neun größer als zehn wäre. Lies den Datentyp der Spalte, bevor du einen unerwarteten Vergleich deutest.

Filtern, ohne die geprüfte Spalte anzuzeigen
SELECT first_name
FROM employees
WHERE salary < 50000;

Chloe und Grace erfüllen die Bedingung. Ihre Gehälter werden zum Prüfen der Zeilen verwendet, fehlen aber im Ergebnis. Du musst das Gehalt nicht zu SELECT hinzufügen, damit der Filter funktioniert. Beim Prüfen einer Abfrage kann es helfen, das Gehalt vorübergehend anzuzeigen, um den Grund für jede passende Zeile zu untersuchen.

Ein Gleichheitsvergleich mit einem Primärschlüssel ermöglicht das direkte Nachschlagen eines Datensatzes: WHERE employee_id = 6 findet Farid. Ein Primärschlüssel identifiziert eine Zeile, sodass dieser Gleichheitsvergleich nicht mehrere Beschäftigte mit derselben ID zurückgeben kann.

Fehlende Daten brauchen besondere Aufmerksamkeit. WHERE stock <> 0 gibt sechs Produkte zurück. Lamp Shade wird ausgelassen, weil sein bekannter Lagerbestand null ist. Bookshelf wird ebenfalls ausgelassen: Sein Lagerbestand ist NULL, sodass der Vergleich unbekannt ist und WHERE die Zeile nicht behält. Eine Ungleichheitsprüfung nimmt fehlende Werte nicht in ihr Ergebnis auf.

Wichtige Erkenntnisse

  • WHERE behält nur Zeilen, deren Bedingung wahr ist.
  • > und < schließen ihre Schwellenwerte aus; >= und <= schließen sie ein.
  • Schreibe numerische Literale ohne Währungszeichen, Anführungszeichen oder Tausendertrennzeichen.
  • Ein Filter kann eine Spalte prüfen, die nicht angezeigt wird.
  • Verwende einen Gleichheitsvergleich mit einem Schlüssel, um einen Datensatz nachzuschlagen.
  • Gewöhnliche Vergleiche mit NULL passieren einen WHERE-Filter nicht.

2.2 Text, Anführungszeichen und vollständige Datumswerte

Text- und Datumsbedingungen brauchen Werte in einer Form, die die Datenbank interpretieren kann. Ein falsch geschriebener Wert kann stillschweigend keine Zeilen zurückgeben, während ein fehlendes Anführungszeichen dazu führen kann, dass der Wert als Spaltenname gelesen wird.

Einen Wert von einem Namen unterscheiden
SELECT first_name
FROM employees
WHERE city = 'Chicago';

Die einfachen Anführungszeichen machen 'Chicago' zu einem Textwert. Das Ergebnis enthält Ana, Chloe, Farid und Hugo. Ohne Anführungszeichen wird Chicago als Name gelesen, sodass die Datenbank nach einer Spalte mit diesem Namen sucht. Die doppelten Anführungszeichen des Standards kennzeichnen ebenfalls Namen. PostgreSQL lehnt city = "Chicago" ab, wenn keine solche Spalte existiert. Manche SQLite-Konfigurationen akzeptieren aus historischen Gründen Zeichenketten in doppelten Anführungszeichen; verwende für Werte durchgehend einfache Anführungszeichen.

Ein Apostroph innerhalb eines Werts wird verdoppelt:

SELECT first_name
FROM employees
WHERE last_name = 'O''Neill';

Das findet Hugo. Die beiden aufeinanderfolgenden einfachen Anführungszeichen stehen für einen Apostroph innerhalb des Werts; die äußeren Anführungszeichen kennzeichnen dessen Anfang und Ende. Standard-SQL verwendet keinen umgekehrten Schrägstrich als Escape-Zeichen für diesen Apostroph.

Die Vergleichsregeln prüfen

Eine Sortierfolge steuert die Gleichheit und Sortierung von Text, einschließlich der Behandlung von Groß- und Kleinschreibung und Buchstaben mit Akzenten. Bei den hier verwendeten gewöhnlichen SQLite- und PostgreSQL-Vergleichen, die Groß- und Kleinschreibung beachten, unterscheiden sich 'Chicago' und 'chicago'. WHERE city = 'chicago' gibt keine Zeilen zurück. MySQL und SQL Server verwenden häufig Sortierfolgen, die Groß- und Kleinschreibung ignorieren, sodass ihre üblichen Einstellungen beide Schreibweisen abgleichen können.

Auch Bereichsvergleiche von Text folgen der Sortierfolge. Bei diesen Namen gibt WHERE last_name < 'M' Brown, Carter, Haddad, Kim und Lopez zurück. Werte werden von links verglichen. Ein längerer Wert, der mit denselben Zeichen beginnt, kommt nach seinem Präfix: 'Martin' steht nach 'M'. Eine Grenze bei 'M' ist nicht dasselbe wie „alle Namen, die mit M beginnen“.

Das Jahr zuerst setzen

Die Beispielspalte hire_date speichert vollständige Datumswerte als Text: Jahr, Monat, dann Tag, jeweils mit fester Länge. Dadurch stimmt die Textreihenfolge mit der Kalenderreihenfolge überein.

SELECT first_name, hire_date
FROM employees
WHERE hire_date >= '2022-01-01';

Chloe, Grace und Hugo erfüllen die Bedingung. PostgreSQL hat auch einen echten DATE-Typ, der dieses Literal akzeptiert. Seine typisierte Standardschreibweise ist DATE '2022-01-01'; SQLite verwendet diese Syntax für typisierte Literale nicht.

Eine lokale Datumszeichenkette wie '03/04/2024' ist in einer Datumsspalte mehrdeutig, weil sie je nach Einstellung den 4. März oder den 3. April bedeuten kann. Als Text gespeicherte Datumswerte mit dem Monat an erster Stelle werden zuerst nach dem Monat und dann nach dem Jahr verglichen. So wird '12/01/2021' nach '03/15/2024' einsortiert, obwohl das erste Kalenderdatum früher liegt.

Die vollständige Datumsgrenze übersetzen

„Nach 2022 eingestellt“ bedeutet ab '2023-01-01'. Ein Textvergleich mit '2022' lässt dagegen auch das Einstellungsdatum '2022-08-05' von Hugo zu: Der längere Text wird nach dem übereinstimmenden Präfix einsortiert.

Enthält eine Spalte Uhrzeiten, wählt ein Gleichheitsvergleich mit einem Datum allein nicht jede Uhrzeit an diesem Tag aus. Um den 31. März 2024 einzuschließen, verwende ordered_at >= '2024-03-31' AND ordered_at < '2024-04-01'. Das behält alle Uhrzeiten vom Beginn des 31. März bis zum Beginn des 1. April, ohne diesen einzuschließen.

Wichtige Erkenntnisse

  • Verwende einfache Anführungszeichen für Textwerte; verdopple einen Apostroph innerhalb eines Werts.
  • Die Sortierfolge bestimmt, wie Groß- und Kleinschreibung und Zeichen in Texten verglichen werden.
  • Verwende vollständige Datumswerte in der Form YYYY-MM-DD, damit Textdatumswerte mit fester Länge chronologisch sortiert werden.
  • Um einen ganzen Tag mit Uhrzeiten abzudecken, schließe seinen Anfang ein und den Anfang des nächsten Tages aus.

2.3 AND, OR, NOT und gruppierte Bedingungen

Eine Zeile muss möglicherweise mehrere Prüfungen bestehen. AND verlangt, dass beide Bedingungen wahr sind. OR verlangt, dass mindestens eine wahr ist. NOT kehrt wahr und falsch um; ist eine Bedingung wegen NULL unbekannt, lässt NOT sie unbekannt.

Entscheiden, ob beide Prüfungen erfüllt sein müssen
SELECT first_name
FROM employees
WHERE department = 'Sales' AND city = 'Chicago';

Ana und Chloe bestehen beide Prüfungen. Emma arbeitet in Sales, wohnt aber in Denver und erfüllt dieses AND daher nicht. Ersetzt man AND durch OR, kommen auch Emma, Farid und Hugo hinzu: Die fünf passenden Beschäftigten erfüllen eine oder beide Prüfungen.

Eine zusätzliche AND-Bedingung kann das Ergebnis gleich lassen oder verkleinern. Eine zusätzliche OR-Bedingung kann es gleich lassen oder vergrößern. Das ermöglicht dir eine schnelle Prüfung, wenn du einen Filter schrittweise aufbaust.

Jeder Vergleich muss vollständig sein. Schreibe department = 'IT' OR department = 'Marketing' und wiederhole dabei Spalte und Operator. department = 'IT' OR 'Marketing' drückt den zweiten Vergleich nicht aus. PostgreSQL lehnt dies ab; SQLite behandelt den Text allein als falsch und gibt nur Beschäftigte aus IT zurück. Schreibe ebenso salary > 50000 AND salary < 70000, mit salary auf beiden Seiten von AND.

Gruppen von Alternativen übersetzen

„Beschäftigte in Boston und Denver“ fragt gewöhnlich nach Personen in einer der beiden Städte. Jede Zeile hat eine Stadt, verwende daher city = 'Boston' OR city = 'Denver'. Das gibt Ben, David, Emma und Grace zurück. Ein AND zwischen diesen Gleichheitsvergleichen verlangt, dass ein Stadtwert beide Orte zugleich ist, und gibt keine Zeilen zurück.

Werden Operatoren gemischt, wird NOT vor AND und AND vor OR ausgewertet. Ohne Klammern:

WHERE department = 'Sales'
   OR department = 'Marketing' AND city = 'Chicago'

Das bedeutet Beschäftigte aus Sales an beliebigen Orten und zusätzlich Beschäftigte aus Marketing in Chicago. Emma erfüllt die Bedingung, weil der Vergleich mit Sales ausreicht. Um beide Abteilungen auf Chicago zu beschränken, gruppiere die Alternativen:

SELECT first_name
FROM employees
WHERE (department = 'Sales' OR department = 'Marketing')
  AND city = 'Chicago';

Nun erfüllen Ana, Chloe und Hugo die Bedingung. Die Klammern stellen beide Abteilungsoptionen unter eine gemeinsame Stadtbedingung. Verwende sie, um einen gemischten AND/OR-Filter verständlich zu machen, auch wenn die Standardreihenfolge bereits richtig wäre.

Eine ganze Gruppe umkehren

NOT (city = 'Chicago' OR city = 'Denver') gibt David und Grace in Boston zurück. Keine der beiden aufgeführten Städte ist erlaubt. Für diese Werte ist das gleichbedeutend mit city <> 'Chicago' AND city <> 'Denver'.

OR zwischen diesen beiden Ungleichheitsprüfungen zu verwenden, ist eine häufige Falle. Eine Chicago-Zeile unterscheidet sich von Denver und eine Denver-Zeile von Chicago. Alle Beschäftigten mit einer erfassten Stadt bestehen mindestens eine Prüfung, sodass OR keine der beiden Städte ausschließt.

Baue eine komplexe Bedingung Stück für Stück auf. Prüfe die Zeilen nach der ersten Prüfung und dann nach dem Hinzufügen der nächsten. Du kannst die beiden Seiten eines AND oder eines OR vertauschen, ohne die Antwort zu ändern. Wähle die Anordnung, bei der die Gruppen am leichtesten zu lesen sind.

Wichtige Erkenntnisse

  • AND braucht beide Bedingungen; OR braucht mindestens eine.
  • Schreibe auf jeder Seite eines logischen Operators einen vollständigen Vergleich.
  • NOT wird vor AND ausgewertet, danach folgt OR; Klammern machen die beabsichtigte Gruppierung ausdrücklich.
  • Alternativen für eine Spalte brauchen gewöhnlich OR, auch wenn die Anfrage „und“ sagt.
  • Um beide Möglichkeiten auszuschließen, verneine die OR-Gruppe oder verbinde die beiden Ausschlüsse mit AND.
3

Listen, Bereiche und Textmuster abgleichen

Manche Fragen verlangen mehrere genaue Auswahlmöglichkeiten, andere einen Wertebereich oder einen Teil eines Namens. IN, BETWEEN und LIKE geben jeder Art von Anfrage eine klare Form. Die Wahl beginnt damit, was eine Übereinstimmung bedeutet: ein ganzer Wert, ein Wert zwischen Bereichsgrenzen oder Text, der auf ein Muster passt. Du prüfst auch fehlende Werte und Einzelheiten, die eine Antwort verändern, darunter eingeschlossene Bereichsgrenzen, die Platzierung von Platzhaltern und die Beachtung der Groß- und Kleinschreibung.

3.1 Listen genauer Auswahlwerte mit IN

Verwende IN, wenn eine Spalte einem beliebigen Wert einer Liste entsprechen darf. Es verkürzt eine Gruppe von Gleichheitsvergleichen, die durch OR verbunden sind, und behält dabei ihre Bedeutung.

Eine Liste von Alternativen erstellen
SELECT first_name
FROM employees
WHERE department IN ('IT', 'Marketing');

Ben, David, Farid und Hugo erfüllen die Bedingung. Jede dieser Personen hat einen der beiden Abteilungswerte. Dieselbe Prüfung ließe sich als department = 'IT' OR department = 'Marketing' schreiben.

Setze Listeneinträge in Klammern und trenne sie durch Kommas. Setze Text in einfache Anführungszeichen; numerische Werte bleiben ohne Anführungszeichen. Zum Beispiel wählt employee_id IN (2, 4, 6) Ben, David und Farid aus. Die Reihenfolge der Listeneinträge sortiert das Ergebnis nicht. Ein wiederholter Eintrag wiederholt keine passende Zeile: IN (6, 2, 2, 4) wählt dieselben Datensätze aus. Verwende ORDER BY, wenn du eine Ergebnisreihenfolge brauchst.

IN gleicht ganze Werte nach denselben Vergleichsregeln wie ein Gleichheitsvergleich ab. city IN ('Chi') trifft nicht auf Chicago zu. Auch city IN ('chicago') trifft bei den hier verwendeten gewöhnlichen Vergleichen, die Groß- und Kleinschreibung beachten, nicht darauf zu. Für die Suche nach einem Teilwert brauchst du LIKE; die Behandlung der Groß- und Kleinschreibung hängt von der Sortierfolge ab.

Eine weitere Regel auf jede Auswahl anwenden
SELECT first_name
FROM employees
WHERE department IN ('IT', 'Marketing')
  AND city = 'Chicago';

Farid und Hugo erfüllen die Bedingung. IN ist eine Bedingung, sodass AND die Stadtprüfung auf die gesamte Abteilungsauswahl anwendet. Setze in der ausgeschriebenen OR-Variante Klammern um die beiden Abteilungsvergleiche. Ohne sie lässt department = 'IT' OR department = 'Marketing' AND city = 'Chicago' auch Ben zu, weil AND stärker bindet und die Stadtregel nur für Marketing gilt.

Die aufgeführten Werte ausschließen

WHERE city NOT IN ('Chicago', 'Denver') gibt David und Grace zurück. Eine erfasste Stadt erfüllt die Bedingung nur, wenn sie sich von beiden Einträgen unterscheidet. Diese Form ist für mehrere Ausschlüsse nützlich und vermeidet den Fehler, Ungleichheitsbedingungen mit OR zu verbinden.

Fehlende Werte erfüllen keine der beiden Formen. Grace hat die Abteilung NULL, sodass department NOT IN ('Sales') sie nicht einschließt. Die Datenbank kann nicht feststellen, dass sich die fehlende Abteilung von Sales unterscheidet. Um auch Beschäftigte ohne zugewiesene Abteilung einzuschließen, schreibe department NOT IN ('Sales') OR department IS NULL.

Ein NULL innerhalb einer NOT-IN-Liste verursacht ein umfassenderes Problem. department NOT IN ('Sales', NULL) verlangt sowohl department <> 'Sales' als auch department <> NULL. Der zweite Vergleich ist immer unbekannt, sodass die kombinierte Prüfung nie wahr ist und WHERE keine Zeilen zurückgibt. Halte Prüfungen auf fehlende Werte von der Werteliste getrennt.

Bei IN ist eine tatsächliche Übereinstimmung weiterhin erfolgreich, auch wenn ein anderer Listeneintrag NULL ist. department IN ('Sales', NULL) behält die drei Beschäftigten aus Sales, nimmt Grace aber nicht hinzu. Verwende IS NULL, um fehlende Werte ausdrücklich anzufordern.

Eine gewöhnliche SQL-IN-Liste braucht mindestens einen Eintrag. PostgreSQL lehnt IN () ab; SQLite akzeptiert es als falsch. Erstellt ein Programm eine Liste aus der Auswahl von Nutzern, behandle eine leere Liste vor dem Absenden der Abfrage, damit das Verhalten über Datenbanken hinweg bewusst festgelegt ist.

Wichtige Erkenntnisse

  • IN gleicht jeden ganzen Wert in seiner geklammerten, durch Kommas getrennten Liste ab.
  • Listenreihenfolge und wiederholte Einträge bestimmen weder die Ergebnisreihenfolge noch vervielfachen sie passende Zeilen.
  • IN wird als eine Bedingung mit AND verknüpft.
  • NOT IN schließt aufgeführte Werte aus, schließt aber fehlende Werte nicht ein.
  • Ein NULL innerhalb einer NOT-IN-Liste verhindert, dass irgendeine Zeile die WHERE-Prüfung besteht.

3.2 Bereiche und eingeschlossene Bereichsgrenzen

BETWEEN prüft einen Bereich, wobei beide Grenzen eingeschlossen sind. Verwende es, wenn „von“ und „bis“ die genannten Grenzwerte einschließen; verwende ausdrückliche Vergleiche, wenn eine der Grenzen ausgeschlossen werden muss.

Die beiden Grenzen prüfen
SELECT name, price
FROM products
WHERE price BETWEEN 15.50 AND 89.00;

Desk Lamp, Floor Lamp, Lamp Shade und Desk Organizer erfüllen die Bedingung. Floor Lamp kostet genau 89,00 und Lamp Shade genau 15,50, sodass beide erhalten bleiben. Die Bedingung bedeutet price >= 15.50 AND price <= 89.00.

Setze den kleineren Wert zuerst. price BETWEEN 89.00 AND 15.50 fragt nach einem Preis von mindestens 89,00 und höchstens 15,50. Die Syntax ist gültig, aber es gibt keine Übereinstimmungen. Ein gewöhnliches BETWEEN ordnet die Bereichsgrenzen nicht für dich um. PostgreSQL bietet dafür BETWEEN SYMMETRIC an, verwende aber für eine auch mit SQLite genutzte Abfrage die Form mit dem kleineren Wert zuerst.

Für „mehr als 15,50 und weniger als 89,00“ schreibe price > 15.50 AND price < 89.00. Nur Desk Lamp und Desk Organizer erfüllen die Bedingung. Dieser Unterschied betrifft die Bereichsgrenzen der Frage, nicht die Anzeige des Ergebnisses.

Außerhalb eines Bereichs

price NOT BETWEEN 20 AND 100 bedeutet price < 20 OR price > 100. Es gibt Lamp Shade, Office Chair, Standing Desk, Desk Organizer, Bookshelf und Paper Tray zurück. Werte von genau 20 oder 100 lägen innerhalb des ursprünglichen Bereichs und erfüllten NOT BETWEEN nicht.

Ein fehlender geprüfter Wert ergibt bei beiden Prüfungen unbekannt. Für den Lagerbestand wählt BETWEEN 5 AND 40 fünf Produkte aus und NOT BETWEEN zwei: Lamp Shade mit 0 und Desk Organizer mit 60. Bookshelf hat den Lagerbestand NULL und gehört zu keinem der beiden Ergebnisse. Ein Bereich und seine Verneinung müssen daher nicht jede gespeicherte Zeile abdecken.

Datumswerte und Uhrzeiten

Vollständige Datumszeichenketten in der Reihenfolge YYYY-MM-DD erlauben Datumsbereiche. hire_date BETWEEN '2020-01-01' AND '2022-12-31' wählt Ben, David und Hugo aus und deckt in dieser Spalte, die nur Datumswerte enthält, alle drei Kalenderjahre ab.

Eine Spalte mit Uhrzeiten braucht für einen ganzen Monat eine andere obere Grenze. Eine Bereichsgrenze, die nur ein Datum enthält, bedeutet in einer Zeitstempelspalte Mitternacht zu Beginn dieses Tages. Als Text wird selbst '2024-03-31 00:00:00' nach dem kürzeren Präfix '2024-03-31' einsortiert. Um alle Uhrzeiten im März einzuschließen, verwende:

WHERE ordered_at >= '2024-03-01'
  AND ordered_at < '2024-04-01'

Das schließt den Beginn des März ein und endet unmittelbar vor dem April, ohne den letzten Sekundenbruchteil am 31. März erraten zu müssen.

Textbereiche und die zwei Funktionen von AND

Bereichsgrenzen bei Text sind vollständige Werte. last_name BETWEEN 'A' AND 'C' schließt Brown ein, aber Carter aus, weil Carter nach seinem Präfix C einsortiert wird. Nach diesen Textregeln deckt last_name >= 'A' AND last_name < 'D' Namen ab, die mit A, B oder C beginnen, und gibt Brown und Carter zurück.

In price BETWEEN 10 AND 100 AND category = 'Lighting' trennt das erste AND die Bereichsgrenzen; das zweite verbindet die Bereichsprüfung mit der Kategorieprüfung. Die passenden Produkte sind Desk Lamp, Floor Lamp und Lamp Shade. Zeilenumbrüche können die beiden Funktionen leichter erkennbar machen.

Wichtige Erkenntnisse

  • BETWEEN schließt beide Bereichsgrenzen ein und erwartet die untere Grenze zuerst.
  • NOT BETWEEN wählt Werte unterhalb der unteren oder oberhalb der oberen Grenze aus.
  • Mit ausdrücklichen Vergleichen kannst du eine oder beide Bereichsgrenzen ausschließen.
  • Für einen ganzen Monat mit Uhrzeiten schließe seinen Anfang ein und ende vor dem nächsten Monat.
  • Eine Bereichsgrenze bei Text ist ein vollständiger Wert, nicht jeder Wert mit diesem Anfangsbuchstaben.
  • NULL in der geprüften Spalte erfüllt keine der beiden Bereichsprüfungen.

3.3 Textmuster mit LIKE

LIKE gleicht Text mit einem Muster ab. Verwende es, um nach einem Anfang, einem Ende oder einem Textteil zu suchen, wenn ein Gleichheitsvergleich einen vollständig übereinstimmenden Wert verlangen würde.

Die Platzhalter setzen
MusterBedeutungPassende Produktnamen
'Lamp%'Beginnt mit LampLamp Shade
'%Lamp'Endet mit LampDesk Lamp, Floor Lamp
'%Lamp%'Enthält LampDesk Lamp, Floor Lamp, Lamp Shade
'Lamp'Genau LampKeine

Das Muster muss auf den ganzen Wert passen. % kann null oder mehr Zeichen darstellen, einschließlich Leerzeichen. In '%Lamp%' kann jedes der beiden Prozentzeichen auch auf nichts passen, sodass der Text mit Lamp beginnen oder enden und es auch in der Mitte enthalten kann.

_ steht für genau ein Zeichen. last_name LIKE '_im' findet Kim. Vier Unterstriche in first_name LIKE '____' finden Emma und Hugo, die Vornamen mit genau vier Buchstaben. Der Unterstrich steht nicht für ein optionales Zeichen.

SELECT first_name, phone
FROM employees
WHERE phone LIKE '312-%';

Ana, Chloe und Farid erfüllen die Bedingung, weil der erfasste Text ihrer Telefonnummern mit 312- beginnt. Das Prozentzeichen deckt alle übrigen Zeichen ab.

Operator und Regel für Groß- und Kleinschreibung wählen

Platzhalter gehören zu LIKE-Mustern. name = '%Lamp%' sucht nach tatsächlichen Prozentzeichen und gibt hier keine Produkte zurück. Die Platzhalter * und ? aus der Dateisuche haben bei LIKE keine besondere Bedeutung; name LIKE 'Desk*' sucht nach einem tatsächlichen Sternchen nach Desk.

LIKE in SQLite ignoriert normalerweise die Groß- und Kleinschreibung bei den ASCII-Buchstaben A bis Z, während das gewöhnliche LIKE in PostgreSQL sie beachtet. name LIKE '%desk%' findet daher in SQLite Desk Lamp, Standing Desk und Desk Organizer, in PostgreSQL bei einer Sortierfolge, die Groß- und Kleinschreibung beachtet, dagegen keine Zeilen. PostgreSQL bietet außerdem ILIKE an, das Groß- und Kleinschreibung ignoriert. Das Verhalten von MySQL folgt der Sortierfolge.

Für die hier verwendeten ASCII-Produktnamen liefert LOWER(name) LIKE '%desk%' in SQLite und PostgreSQL dieselben Treffer: LOWER wandelt den Namen vor dem Abgleich in Kleinbuchstaben um. Die Umwandlung der Groß- und Kleinschreibung für andere Schriftsysteme hängt von Datenbank- und Sprachregeln ab. Auch der Gleichheitsvergleich in SQLite unterscheidet sich von seinem LIKE: city = 'chicago' findet Chicago bei der standardmäßigen binären Sortierfolge nicht, obwohl city LIKE 'chicago' es findet.

Nach einem tatsächlichen Platzhalterzeichen suchen

Um nach einem tatsächlichen Unterstrich zu suchen, wähle ein Escape-Zeichen:

WHERE code LIKE 'SPRING!_%' ESCAPE '!'

In einer Tabelle mit Rabattcodes trifft dies auf 'SPRING_10', aber nicht auf 'SPRINGS10' zu. Das !_ steht für einen tatsächlichen Unterstrich; das letzte % steht weiterhin für eine Zeichenfolge. Verwende denselben Ansatz mit !% für ein tatsächliches Prozentzeichen. Ein ausdrücklich geschriebenes ESCAPE vermeidet die Abhängigkeit von den Standardeinstellungen der Datenbank; PostgreSQL verwendet normalerweise einen umgekehrten Schrägstrich und SQLite hat kein standardmäßiges Escape-Zeichen.

Verneinung und Suchumfang

name NOT LIKE '%Lamp%' gibt die anderen fünf Produkte zurück. Fehlender Text erfüllt weder LIKE noch NOT LIKE. Von den Telefonnummern der Beschäftigten passen drei auf '312-%', zwei erfasste Telefonnummern passen nicht und die drei NULL-Telefonnummern erscheinen in keinem der beiden Ergebnisse.

Ein führendes % gibt einem gewöhnlichen Index keinen festen Anfangstext, auf den er die Suche eingrenzen kann, sodass möglicherweise ein großer Teil der Tabelle durchsucht wird. Ein fester Anfang wie 'Desk%' kann einem geeigneten Index helfen. Verwende für Datumswerte Datumsbereiche: LIKE funktioniert bei diesen Textdatumswerten, aber PostgreSQL verlangt eine Umwandlung, bevor LIKE auf eine echte DATE-Spalte angewendet wird.

Wichtige Erkenntnisse

  • LIKE gleicht den ganzen Wert ab; % steht für beliebig viele Zeichen und _ für genau eines.
  • Setze % an den Anfang, ans Ende oder an beide Stellen, um festzulegen, wo ein Textteil vorkommen darf.
  • Die Behandlung der Groß- und Kleinschreibung hängt von Datenbank und Sortierfolge ab; LOWER hilft bei diesen ASCII-Namen.
  • ESCAPE ermöglicht, dass ein Platzhalter für sein tatsächliches Zeichen steht.
  • NULL erfüllt weder LIKE noch NOT LIKE.
  • Führende Platzhalter können dazu führen, dass bei einer Suche mehr Daten durchsucht werden; verwende für Datumswerte Bereiche.
4

Fehlende Werte berücksichtigen

Fehlende Daten verändern, welche Datensätze ein Filter finden kann. Ein Lagerbestand von null, eine leere Zeichenkette für eine Telefonnummer und ein nicht erfasster Wert sagen Unterschiedliches aus, auch wenn ein Abfragewerkzeug manche Zellen gleich aussehen lässt. Du verwendest ausdrückliche Prüfungen auf fehlende Werte und verfolgst den dritten Wahrheitswert, unbekannt. Diese Regeln erklären, warum ein Filter und sein Gegenteil dieselben Zeilen auslassen können und wie du diese Zeilen einbeziehst, wenn die Frage es verlangt.

4.1 NULL, null und leere Zeichenketten

NULL kennzeichnet einen fehlenden Wert: Ein Wert kann unbekannt, nicht erfasst oder nicht anwendbar sein. Er unterscheidet sich von einer bekannten Null oder einem bekannten Text ohne Zeichen.

Verstehen, was ein fehlender Wert bedeutet

Lamp Shade hat stock = 0. Die erfasste Stückzahl ist null, das Produkt ist also nicht vorrätig. Bookshelf hat stock NULL: Die Stückzahl wurde nicht erfasst. Die Datenbank kann dir weder sagen, dass null Stück vorhanden sind, noch eine andere Anzahl nennen.

Der Unterschied verändert, welche Frage du beantworten kannst:

FrageBedingungErgebnis
Welche Produkte sind nicht vorrätig?stock = 0Lamp Shade
Welche Lagerbestände sind unbekannt?stock IS NULLBookshelf
Welche Stückzahlen sind erfasst?stock IS NOT NULLDie anderen sieben Produkte

Eine leer aussehende Zelle in einem Abfragewerkzeug reicht nicht aus, um diese Zustände zu unterscheiden. Manche Werkzeuge zeigen NULL als leere Zelle an, andere schreiben NULL. Prüfe den gespeicherten Wert direkt.

Prüfungen auf fehlende Werte verwenden
SELECT first_name
FROM employees
WHERE phone IS NULL;

Für Ben, Emma und Hugo ist keine Telefonnummer erfasst. IS NULL ergibt für ihre fehlenden Werte wahr. Um die fünf Beschäftigten mit erfasster Telefonnummer zu finden, verwende phone IS NOT NULL: Ana, Chloe, David, Farid und Grace.

Schreibe nicht phone = NULL, um fehlende Telefonnummern zu finden. Ein gewöhnlicher Vergleich mit NULL ergibt unbekannt, selbst wenn beide Seiten NULL sind. WHERE behält nur wahre Zeilen, sodass = NULL keine zurückgibt. <> NULL hat dasselbe Problem. IS NULL prüft auf die Kennzeichnung für einen fehlenden Wert und ergibt für diese Werte einzelner Spalten eindeutig wahr oder falsch.

Die Form NOT phone IS NULL findet in SQLite und PostgreSQL ebenfalls vorhandene Telefonnummern, aber bei phone IS NOT NULL ist die beabsichtigte Prüfung leichter zu lesen.

Drei Arten von Text unterscheiden
SQL-AusdruckWas er darstellt
NULLEinen fehlenden Wert
''Einen bekannten Textwert mit null Zeichen
'NULL'Vier gewöhnliche Buchstaben

SQLite, PostgreSQL, MySQL und SQL Server unterscheiden eine leere Zeichenkette von NULL. phone = '' würde leere Zeichenketten finden, nicht die fehlenden Telefonnummern von Ben, Emma oder Hugo. Kann eine Spalte beides enthalten, verwende phone IS NULL OR phone = '', um beide Zustände zu finden. Oracle behandelt einen leeren Textwert als NULL, sodass sich dieser Unterschied beim Wechsel der Datenbank ändert.

Formulierung und Schema anwenden

„Fehlend“, „nicht erfasst“ und „nicht zugewiesen“ weisen auf IS NULL hin. department IS NULL findet Grace. Ihre fehlende Abteilung bedeutet weder, dass der Abteilungstext das Wort 'NULL' ist, noch lässt sich daraus ermitteln, zu welcher Abteilung sie gehört.

Die Tabellendefinition kann eine Spalte als NOT NULL kennzeichnen. Das bedeutet, dass eine gespeicherte Zeile in dieser Spalte kein NULL enthalten kann. Eine IS-NULL-Abfrage auf einer solchen Spalte gibt keine Zeilen zurück. Prüfe diese Regel beim Lesen eines Schemas: Spalten, die fehlende Daten erlauben, brauchen besondere Aufmerksamkeit, wenn du Ausschlüsse erstellst oder Bedingungen verknüpfst.

Wichtige Erkenntnisse

  • NULL kennzeichnet einen fehlenden Wert; null und eine leere Zeichenkette sind bekannte Werte.
  • IS NULL findet fehlende Werte und IS NOT NULL vorhandene Werte.
  • = NULL und <> NULL können durch gewöhnliche Vergleiche keine Zeilen finden.
  • 'NULL' in Anführungszeichen ist Text, und Oracle behandelt leere Zeichenketten anders als die anderen gezeigten Datenbanken.
  • Eine NOT-NULL-Spalte kann kein NULL speichern.

4.2 Wahr, falsch und unbekannt

Eine Bedingung kann in SQL wahr, falsch oder unbekannt sein. Fehlende Werte machen den dritten Zustand nötig: Ohne eine erfasste Stückzahl kann eine Datenbank nicht feststellen, ob diese über einem Schwellenwert liegt.

Eine Bedingung und ihr Gegenteil

Für Bookshelf ist stock > 10 unbekannt, weil der Lagerbestand NULL ist. Dasselbe gilt für stock <= 10. WHERE behält nur wahre Bedingungen und lässt sowohl falsche als auch unbekannte aus.

In der Produkttabelle gibt stock > 10 vier Zeilen zurück und stock <= 10 drei. Zusammen erfassen sie sieben der acht Produkte. Bookshelf fehlt in beiden Ergebnissen. NOT stellt die Zeile nicht wieder her: NOT unbekannt ist unbekannt, sodass NOT (stock > 10) weiterhin nur die drei bekannten Stückzahlen von höchstens 10 auswählt.

Das unterscheidet sich von einem Wert, der eine Bedingung nicht erfüllt. Die bekannte Null von Lamp Shade macht stock > 10 falsch, sodass NOT den Wahrheitswert in wahr umkehrt. Eine fehlende Stückzahl liefert keinen solchen eindeutigen Vergleich, den man umkehren könnte.

Unbekannt mit einer weiteren Prüfung verknüpfen
VerknüpfungErgebnis
Unbekannt AND falschFalsch
Unbekannt AND wahrUnbekannt
Unbekannt AND unbekanntUnbekannt
Unbekannt OR wahrWahr
Unbekannt OR falschUnbekannt
Unbekannt OR unbekanntUnbekannt

Bookshelf kostet 120,00. In stock > 10 OR price > 100 ist die Preisbedingung wahr. OR braucht nur einen wahren Teil, sodass die Zeile erhalten bleibt, obwohl der Vergleich des Lagerbestands unbekannt ist. In stock > 10 AND price > 100 bleibt die Lagerbedingung ungeklärt, sodass das Ergebnis unbekannt ist und die Zeile ausgelassen wird.

Fehlende Werte bewusst einschließen
SELECT first_name
FROM employees
WHERE department <> 'Sales'
   OR department IS NULL;

Das gibt Ben, David, Farid, Hugo und Grace zurück. Der Vergleich allein würde vier zurückgeben und Grace auslassen. Der IS-NULL-Zweig schließt Beschäftigte ohne zugewiesene Abteilung ausdrücklich ein. Ob solche Beschäftigten zu „außerhalb von Sales“ gehören, ist eine Frage der beabsichtigten Antwort; die Abfrage muss diese Entscheidung ausdrücken.

Ein NULL-Wert in einer NOT-IN-Liste kann das gesamte Ergebnis verhindern. department NOT IN ('Sales', NULL) bedeutet, dass sich die Abteilung von Sales und von NULL unterscheiden muss. Der zweite Vergleich ist für jede Zeile unbekannt, sodass die vollständige Bedingung nie wahr ist. IN behält tatsächliche Übereinstimmungen weiterhin: department IN ('Sales', NULL) wählt die drei Beschäftigten aus Sales aus, findet Grace aber nicht.

Ein fehlender geprüfter Wert ergibt auch bei LIKE und einem gewöhnlichen BETWEEN-Bereich unbekannt. IS NULL und IS NOT NULL liefern für diese einzelnen Spalten eindeutige Antworten. Prüfe fehlende Werte mit diesen Tests gesondert, wenn eine Zeilenanzahl überraschend erscheint.

Wissen, wann NULL-Werte gruppiert werden

NULL = NULL bleibt unbekannt; von zwei fehlenden Telefonnummern weiß man nicht, ob sie dieselbe Nummer sind. DISTINCT behandelt wiederholte fehlende Werte dagegen als Duplikate, und ORDER BY platziert sie zusammen. Für einen Vergleich, der zwei NULL-Werte bewusst als gleich behandelt, bieten SQLite und PostgreSQL auch IS NOT DISTINCT FROM an.

Wichtige Erkenntnisse

  • WHERE behält wahre Zeilen und entfernt falsche und unbekannte Zeilen.
  • NOT lässt unbekannt unverändert; auch verneinte Filter können NULL-Zeilen auslassen.
  • Ein wahrer OR-Zweig kann eine Zeile mit einem anderen unbekannten Zweig erhalten.
  • Ergänze IS NULL ausdrücklich, wenn fehlende Werte zur Antwort gehören sollen.
  • Ein NULL in einer NOT-IN-Liste verhindert, dass eine Zeile diesen Ausschlussfilter passiert.
  • Beim Entfernen von Duplikaten werden NULL-Werte gruppiert, obwohl der gewöhnliche Gleichheitsvergleich von NULL-Werten unbekannt ist.
5

Ergebnisse sortieren und eine Seite auswählen

Eine Zeilenbegrenzung wird erst aussagekräftig, wenn du entscheidest, welche Zeilen zuerst kommen sollen. Die Sortierung kann Zahlen, Texte oder Datumswerte ordnen, und spätere Sortierspalten entscheiden bei gleichen Werten in vorherigen Spalten. Fehlende Werte und Zeilen mit gleichen Sortierwerten brauchen Aufmerksamkeit, wenn eine Auswahlliste oder eine Seite wiederholbar sein muss. Du erstellst eindeutige Sortierreihenfolgen, begrenzt nach dem Filtern und erkennst die unterschiedlichen Schreibweisen für Zeilenbegrenzungen in verbreiteten Datenbanksystemen.

5.1 Aufsteigende und absteigende Reihenfolge

ORDER BY legt die Reihenfolge der Ergebniszeilen fest. Ohne ORDER BY verspricht SQL nicht, welche Zeile zuerst erscheint, selbst wenn eine kleine Tabelle scheinbar jedes Mal dieselbe Reihenfolge zurückgibt.

Die Richtung wählen
RichtungZahlenVollständige DatumswerteText
ASCKleinste zuerstFrüheste zuerstReihenfolge der Sortierfolge
DESCGrößte zuerstNeueste zuerstUmgekehrte Reihenfolge der Sortierfolge

ASC ist die Voreinstellung. ORDER BY salary und ORDER BY salary ASC verlangen dieselbe Richtung. „Höchstes Gehalt zuerst“ verlangt ORDER BY salary DESC.

SELECT first_name, salary
FROM employees
ORDER BY salary DESC;

Lies das Ergebnis vom höchsten zum niedrigsten Wert: Farid 83.000, Ben 71.000, Emma 65.000, David 60.000, Hugo 58.000, Ana 52.000, Chloe 48.000 und Grace 45.000. Die Datenbank ordnet die Ergebniszeilen neu; diese Abfrage ändert die gespeicherte Tabelle nicht.

Vor dem Sortieren filtern
SELECT name, price
FROM products
WHERE category = 'Lighting'
ORDER BY price;

Nur die drei Lighting-Zeilen gelangen in dieses Ergebnis. Ihre aufsteigenden Preise ergeben Lamp Shade 15,50, Desk Lamp 24,99 und dann Floor Lamp 89,00. ORDER BY steht in der Anweisung nach WHERE. Die Umkehrung dieser Klauseln ist ein Syntaxfehler.

Die Sortierspalte muss nicht angezeigt werden. SELECT first_name FROM employees ORDER BY salary DESC; liefert dieselbe Namensreihenfolge, ohne Gehälter anzuzeigen. PostgreSQL schränkt dies bei DISTINCT ein: Eine DISTINCT-Abfrage muss ihre Sortierspalten auswählen.

Den gespeicherten Datentyp lesen

Numerische Spalten werden nach numerischer Größe sortiert. Textspalten werden nach Zeichen entsprechend ihrer Sortierfolge sortiert. Die Textwerte '10', '9' und '100' werden bei gewöhnlicher Zeichenreihenfolge als '10', '100', '9' sortiert. Das ist keine korrekte numerische Rangfolge. Prüfe daher den Spaltentyp, wenn Beträge falsch angeordnet erscheinen.

Die Beispielwerte von hire_date sind vollständige Textdatumswerte fester Länge mit dem Jahr an erster Stelle. ORDER BY hire_date beginnt mit Farid am 2017-09-12 und endet mit Grace am 2024-02-19. DESC kehrt dies um, sodass die neuesten Einstellungen zuerst kommen. Textdatumswerte mit dem Monat an erster Stelle wie MM/DD/YYYY werden zuerst nach Monat und dann nach Jahr verglichen und können über mehrere Jahre hinweg keine zuverlässige Kalenderreihenfolge ergeben.

Die Textreihenfolge hängt von der Sortierfolge ab

Die standardmäßige binäre Sortierfolge von SQLite setzt ASCII-Großbuchstaben vor Kleinbuchstaben. Nach dieser Regel steht 'Zebra' vor 'apple' und 'é' kommt nach 'z'. Viele PostgreSQL-Datenbanken verwenden sprachabhängige Sortierfolgen, die eine andere Reihenfolge ergeben. Einheitliche Groß- und Kleinschreibung hilft, aber die Vergleichsregeln der Datenbank entscheiden weiterhin über die Reihenfolge von Zeichen mit Akzenten und anderen Zeichen.

Verwende Spaltennamen für eine klare Sortierangabe. ORDER BY 2 DESC bezeichnet den zweiten Eintrag in der SELECT-Liste, sodass das Verschieben von Spalten die Sortierung stillschweigend ändern kann. ORDER BY 'salary' bezeichnet eine Textkonstante, nicht die Gehaltsspalte: SQLite liefert damit keine sinnvolle Sortierung und PostgreSQL lehnt es ab. Schreibe ORDER BY salary.

Wichtige Erkenntnisse

  • ORDER BY bestimmt die Zeilenreihenfolge; ASC ist die Voreinstellung und DESC kehrt die Richtung um.
  • WHERE filtert Zeilen, bevor sie sortiert werden.
  • Numerische Größe, Datumsdarstellung und Textsortierfolge bestimmen, was „aufsteigend“ bedeutet.
  • Benenne Sortierspalten ausdrücklich, um Konstanten in Anführungszeichen und sich ändernde Spaltenpositionen zu vermeiden.

5.2 Mehrere Sortierspalten, gleiche und fehlende Werte

Eine zweite Sortierspalte ist nur wichtig, wenn Zeilen in der ersten gleiche Werte haben. Stell dir eine sortierte Personalliste vor: Gruppiere zuerst nach Stadt und ordne dann die Namen innerhalb jeder Stadt.

Den Sortierspalten von links nach rechts folgen
SELECT last_name, city
FROM employees
ORDER BY city, last_name;

Das Ergebnis beginnt mit Kim und Okafor in Boston. Dann folgen Haddad, Lopez, Nguyen und O'Neill in Chicago. Brown und Carter in Denver stehen zuletzt. last_name konkurriert nicht mit city; der Nachname entscheidet nur innerhalb derselben Stadt über die Reihenfolge.

Eine Umkehrung der Spalten ändert die Hauptreihenfolge. ORDER BY last_name, city sortiert hauptsächlich nach Nachnamen und zieht die Stadt nur bei gleichen Nachnamen heran. Verwende eine ORDER-BY-Klausel mit Kommas zwischen den Sortierspalten. Eine zweite ORDER-BY-Klausel ist ungültig.

Jeder Spalte ihre Richtung geben

ORDER BY department, salary DESC bedeutet Abteilung aufsteigend, dann Gehalt innerhalb jeder Abteilung absteigend. DESC gehört nur zu salary. Um beide absteigend zu sortieren, schreibe department DESC, salary DESC.

Bei der standardmäßigen NULL-Sortierung von SQLite setzt die erste Form die fehlende Abteilung von Grace an den Anfang. IT folgt mit Farid und dann Ben; bei Marketing steht David vor Hugo; bei Sales folgen Emma, Ana und dann Chloe. Du liest eine Hierarchie von Vergleichen und sortierst nicht zuerst jede Zeile nach Gehalt, um diese Reihenfolge dann zu ignorieren.

Gleiche Werte mit einem eindeutigen Wert auflösen

Zeilen, die in allen Sortierspalten gleiche Werte haben, können in beliebiger Reihenfolge erscheinen. ORDER BY city legt nicht fest, welche beschäftigte Person in Chicago zuerst kommt. Eine eindeutige Sortierreihenfolge ergänzt als letzte Spalte eine, die jede Zeile eindeutig identifiziert:

SELECT first_name, city
FROM employees
ORDER BY city, employee_id;

Die IDs lösen alle gleichen Stadtwerte auf. Bei unveränderten Daten sorgt das dafür, dass ein späteres LIMIT oder eine Seite einen wiederholbaren Teil der sortierten Liste auswählt. Ein eindeutiges nachrangiges Sortierkriterium legt fest, welche Zeilen an einer Grenze erscheinen; es schließt keine zusätzlichen Zeilen mit gleichen Werten ein.

Fehlende Werte bewusst platzieren

Die Voreinstellungen der Datenbanken unterscheiden sich:

DatenbankNULL bei ASCNULL bei DESC
SQLite, MySQL, SQL ServerZuerstZuletzt
PostgreSQL, OracleZuletztZuerst

Daher setzt die Abteilungsabfrage Grace bei den PostgreSQL-Voreinstellungen ans Ende, obwohl sie in SQLite zuerst steht. Dieser Unterschied ist unabhängig von der Sortierrichtung des Gehalts.

SELECT first_name, department, salary
FROM employees
ORDER BY department NULLS LAST, salary DESC;

SQLite ab Version 3.30, PostgreSQL und Oracle unterstützen NULLS FIRST und NULLS LAST. Hier setzen sie Grace hinter alle erfassten Abteilungen und erhalten dabei die Gehaltsreihenfolge innerhalb jeder Abteilung. MySQL und SQL Server akzeptieren diese Klauseln nicht.

Übersetze eine gewünschte Hierarchie in derselben Reihenfolge, in der sie genannt wird: „nach Abteilung, innerhalb jeder Abteilung das höchste Gehalt zuerst“ ergibt department, salary DESC. „Alphabetisch nach Nachnamen, dann nach Vornamen“ ergibt last_name, first_name. Ergänze eine ID zuletzt, wenn du bei Personen mit identischen Namen eine wiederholbare Reihenfolge brauchst.

Wichtige Erkenntnisse

  • Spätere ORDER-BY-Spalten entscheiden bei gleichen Werten in vorherigen Spalten.
  • ASC oder DESC gilt für die eigene Spalte; bei fehlender Richtungsangabe gilt ASC.
  • Eine letzte Sortierspalte mit eindeutigen Werten macht die Reihenfolge bei unveränderten Daten eindeutig.
  • Die Platzierung von NULL hängt von der Datenbank ab; unterstützte NULLS-FIRST- und NULLS-LAST-Klauseln legen sie ausdrücklich fest.
  • Ein nachrangiges Sortierkriterium legt die Zeilenauswahl fest, ohne ein LIMIT um alle Zeilen mit gleichen Werten zu erweitern.

5.3 Die ersten Ergebnisse und Seiten mit LIMIT

LIMIT behält höchstens eine gewählte Anzahl von Ergebniszeilen. Es entscheidet nicht, welche Zeilen zuerst stehen sollen. Verwende ORDER BY, um einer Auswahlliste eine Bedeutung wie höchstes Gehalt, neueste oder günstigste zu geben.

Sortieren, dann begrenzen
SELECT first_name, salary
FROM employees
ORDER BY salary DESC
LIMIT 3;

Die sortierten Gehälter beginnen mit Farid 83.000, Ben 71.000 und Emma 65.000, sodass diese drei Zeilen erhalten bleiben. Ohne ORDER BY gibt LIMIT 3 irgendwelche drei Zeilen zurück, ohne zu garantieren, dass sie die höchsten Gehälter enthalten.

WHERE wirkt vor der Begrenzung. WHERE city = 'Boston' ORDER BY salary DESC LIMIT 5 gibt nur David und Grace zurück, weil nur zwei Beschäftigte die Bedingung erfüllen. LIMIT ist eine Obergrenze und keine Aufforderung, zusätzliche Zeilen zu erfinden. LIMIT 0 gibt keine zurück.

Zeilen für eine spätere Seite überspringen

OFFSET überspringt Zeilen, bevor LIMIT die zurückzugebenden Zeilen zählt. ORDER BY salary DESC LIMIT 3 OFFSET 3 überspringt Farid, Ben und Emma und gibt dann David, Hugo und Ana zurück: die Positionen vier bis sechs.

Für Seite k mit n Zeilen pro Seite überspringst du (k − 1) × n Zeilen. Seite drei bei drei Zeilen pro Seite verwendet LIMIT 3 OFFSET 6. Nur Chloe und Grace bleiben übrig. Die erste Seite hat den Versatz null, nicht eins.

„Zweite Zeile“ und „zweiter unterschiedlicher Wert“ sind verschiedene Anfragen. ORDER BY salary DESC LIMIT 1 OFFSET 1 gibt hier Ben mit 71.000 zurück. Hätten zwei Beschäftigte dasselbe höchste Gehalt, würde diese Abfrage eine weitere Person mit dem höchsten Gehalt zurückgeben. Um das zweite unterschiedliche Gehalt zu finden, wähle vor dem Sortieren und Überspringen DISTINCT salary aus.

Die Auswahl an der Grenze festlegen

ORDER BY city LIMIT 3 schließt die beiden Beschäftigten aus Boston und eine Person aus Chicago ein, legt aber nicht fest, welche Person aus Chicago. ORDER BY city, employee_id LIMIT 3 wählt David, Grace und Ana aus. Die eindeutige ID legt die Auswahl an der Grenze fest.

Um alle Zeilen mit demselben letzten Sortierwert zu behalten, unterstützen PostgreSQL ab Version 13 und Oracle FETCH FIRST 3 ROWS WITH TIES. Mit ORDER BY city bleiben sechs Zeilen erhalten: beide Boston-Zeilen und alle vier Chicago-Zeilen. Enthält ORDER BY auch eine eindeutige ID, können Zeilen nicht im vollständigen Sortierschlüssel übereinstimmen.

Die Syntax der Datenbank erkennen
DatenbankEine Begrenzung auf drei Zeilen
SQLite, PostgreSQL, MySQLORDER BY salary DESC LIMIT 3
PostgreSQL, Oracle ab 12cORDER BY salary DESC FETCH FIRST 3 ROWS ONLY
SQL ServerSELECT TOP (3) first_name, salary FROM employees ORDER BY salary DESC;

Standard-SQL verwendet OFFSET und FETCH, nicht LIMIT. PostgreSQL und Oracle akzeptieren OFFSET 3 ROWS FETCH FIRST 3 ROWS ONLY. SQL Server verwendet ORDER BY salary DESC OFFSET 3 ROWS FETCH NEXT 3 ROWS ONLY; für diese Form der Seiteneinteilung ist ORDER BY erforderlich.

SQLite und MySQL akzeptieren auch LIMIT 6, 3, mit dem Versatz an erster Stelle. Bevorzuge LIMIT 3 OFFSET 6, damit die Rollen ausdrücklich erkennbar sind. Bei der Seiteneinteilung wird für jede Seite erneut eine Abfrage ausgeführt. Eine eindeutige Sortierreihenfolge hält die Seiten konsistent, solange die Daten unverändert bleiben; Einfügungen oder Löschungen zwischen Anfragen können trotzdem dazu führen, dass Seiten Datensätze wiederholen oder überspringen.

Wichtige Erkenntnisse

  • ORDER BY entscheidet, welche Zeilen zuerst kommen; LIMIT behält höchstens die angeforderte Anzahl.
  • OFFSET überspringt Zeilen, bevor LIMIT zählt; die erste Seite verwendet den Versatz null.
  • Wähle zuerst DISTINCT, wenn du unterschiedliche Werte statt einzelner Zeilen in eine Rangfolge bringst.
  • Ein eindeutiges nachrangiges Sortierkriterium legt die Auswahl an der Grenze fest; WITH TIES kann zusätzliche Zeilen mit gleichem vollständigem Sortierschlüssel einschließen.
  • LIMIT, TOP und OFFSET/FETCH sind datenbankspezifische Formen der Zeilenbegrenzung.
  • Geänderte Daten können Seitengrenzen zwischen Anfragen verschieben.
6

Eine vollständige Abfrage erstellen und prüfen

Eine Frage aus dem Berufsalltag verbindet gewöhnlich mehrere Entscheidungen: welche Datensätze zählen, welche Angaben angezeigt werden und welche Zeilen zuerst kommen. Wenn du diese Entscheidungen getrennt planst, kannst du eine Abfrage schreiben, deren Teile zusammenpassen. Die geschriebene Klauselreihenfolge und die logische Reihenfolge erklären, warum ein Filter eine verborgene Spalte verwenden kann und warum eine Begrenzung für passende Zeilen gilt. Außerdem prüfst du Grenzen, fehlende Daten und gleiche Werte, bevor du einem plausibel aussehenden Ergebnis vertraust.

6.1 Geschriebene Reihenfolge und logische Verarbeitung

SQL-Klauseln haben eine feste Reihenfolge beim Schreiben. Ihre logische Reihenfolge erklärt das Ergebnis als eine Folge von Entscheidungen, selbst wenn die Datenbank einen anderen internen Ausführungsplan verwendet.

Die Anweisung in Klauselreihenfolge schreiben
SELECT DISTINCT city
FROM employees
WHERE department = 'Sales'
ORDER BY city
LIMIT 2 OFFSET 0;

SELECT und FROM bezeichnen die angeforderten Spalten und die Quelltabelle. Die anderen Klauseln sind optional, behalten aber, falls vorhanden, diese Reihenfolge bei: WHERE, ORDER BY, LIMIT und dann OFFSET in dieser LIMIT-Form. DISTINCT steht direkt nach SELECT.

Verwende eine WHERE-Klausel mit mehreren verknüpften Bedingungen. Ein zweites WHERE ist ein Syntaxfehler. Dasselbe gilt für ORDER BY: Setze mehrere Sortierspalten in eine Klausel und trenne sie durch Kommas. WHERE unter ORDER BY zu verschieben, verlangt keine andere Verarbeitungsreihenfolge, sondern erzeugt ungültiges SQL.

Die logischen Entscheidungen verfolgen
Logischer SchrittWas im Beispiel geschieht
FROMZeilen der Beschäftigten lesen.
WHEREAna, Chloe und Emma aus Sales behalten.
SELECTIhre Stadtwerte behalten: Chicago, Chicago, Denver.
DISTINCTDiese Werte auf Chicago und Denver reduzieren.
ORDER BYChicago vor Denver setzen.
OFFSET und LIMITKeine Zeilen überspringen und höchstens zwei zurückgeben.

Das Ergebnis ist Chicago, dann Denver. Die wiederholte Stadt verschwindet, bevor die Begrenzung Ergebniszeilen zählt. Es werden nicht zwei Beschäftigte genommen und dann gefragt, ob sie in unterschiedlichen Städten wohnen.

Der Optimierer kann einen anderen physischen Ausführungsplan verwenden, der dasselbe Ergebnis wie diese logische Folge erzeugt.

Spalten dort verwenden, wo sie verfügbar sind

WHERE prüft die Quellzeilen, bevor SELECT die angezeigten Spalten auswählt:

SELECT first_name
FROM employees
WHERE salary > 60000;

Das funktioniert, ohne dass das Gehalt in der Ausgabe steht. Die passenden Namen sind Ben, Emma und Farid. Bei der Prüfung ist das Gehalt weiterhin eine Spalte jeder Quellzeile.

Ebenso ist das Filtern vor dem Begrenzen für ein Spitzenergebnis innerhalb einer Gruppe entscheidend:

SELECT first_name
FROM employees
WHERE department = 'Sales'
ORDER BY salary DESC
LIMIT 1;

Die Antwort ist Emma. Zuerst werden die Beschäftigten aus Sales ausgewählt; dann werden ihre Gehälter in eine Rangfolge gebracht. Würde man zuerst die Person mit dem höchsten Gehalt im Unternehmen nehmen und diese einzelne Zeile auf Sales prüfen, verfehlte man die beabsichtigte Antwort, weil Farid zu IT gehört.

Die Struktur sichtbar machen

Schreibe eine Klausel pro Zeile und setze längere Bedingungen auf separate eingerückte Zeilen. Für „Produkte aus Furniture unter 200 Dollar, höchster Preis zuerst“ verwende:

SELECT name, price
FROM products
WHERE category = 'Furniture'
  AND price < 200
ORDER BY price DESC;

Office Chair mit 149,00 kommt vor Bookshelf mit 120,00. Die beiden Bedingungen stehen in einem gemeinsamen WHERE, der numerische Schwellenwert hat kein Währungszeichen und ORDER BY sortiert die passenden Zeilen. Wenn du jede Zeile anhand ihrer Aufgabe prüfst, lassen sich sowohl Syntaxfehler als auch falsche Interpretationen leichter finden.

Wichtige Erkenntnisse

  • Schreibe SELECT, FROM, WHERE, ORDER BY und LIMIT in der vorgeschriebenen Klauselreihenfolge.
  • Lies logisch zuerst die Tabelle, filtere, wähle Spalten, entferne Duplikate, sortiere und begrenze dann die Zeilen.
  • WHERE kann Quellspalten prüfen, die SELECT nicht anzeigt.
  • Das Filtern vor der Rangbildung findet das Spitzenergebnis innerhalb der angeforderten Gruppe.

6.2 Von einer Anfrage zur geprüften Antwort

Bevor du SQL schreibst, bestimme die einzelnen Entscheidungen, die in einer alltäglichen Anfrage stecken. Jede Entscheidung gehört zu einer Klausel, und jede Klausel lässt sich anhand der beabsichtigten Antwort prüfen.

Sechs Entscheidungen treffen
  1. Welche Tabelle enthält die Datensätze? Wähle FROM.
  2. Welche Datensätze passen? Erstelle WHERE.
  3. Welche Felder beantworten die Frage? Wähle SELECT.
  4. Sind wiederholte Ergebniswerte nützlich? Entscheide über DISTINCT.
  5. Was soll zuerst kommen? Erstelle ORDER BY.
  6. Gibt es eine Obergrenze oder eine Seite? Ergänze LIMIT und OFFSET.

Bei „mindestens“ schließe Gleichheit ein. „Einer von“ deutet auf IN hin, „enthält“ auf ein LIKE-Muster mit Prozentzeichen an beiden Enden, „fehlend“ auf IS NULL und „unterschiedliche Werte“ auf DISTINCT. Eine Anfrage nach den ersten n Zeilen braucht sowohl eine Sortierrichtung als auch eine Begrenzung.

Eine Personalauswahl erstellen

„Zeige die Namen und Einstellungsdaten der drei zuletzt eingestellten Beschäftigten außerhalb von Sales, für die eine Telefonnummer hinterlegt ist, mit den neuesten zuerst.“ Schließe Beschäftigte ohne zugewiesene Abteilung in die Bedeutung von außerhalb von Sales in dieser Anfrage ein.

Beginne mit employees. Die passende Abteilungsregel lautet department <> 'Sales' OR department IS NULL. Gruppiere diese Auswahl, damit die Telefonregel für beide Zweige gilt. Zeige Namen und Daten an und bringe dann die passenden Zeilen in eine Rangfolge:

SELECT first_name, last_name, hire_date
FROM employees
WHERE (department <> 'Sales' OR department IS NULL)
  AND phone IS NOT NULL
ORDER BY hire_date DESC
LIMIT 3;

Grace Okafor vom 2024-02-19 steht zuerst, David Kim vom 2020-11-23 an zweiter und Farid Haddad vom 2017-09-12 an dritter Stelle. Entfernst du den IS-NULL-Zweig, fällt Grace heraus und nur zwei Ergebnisse bleiben. Kläre bei einer unklaren Anfrage, wie fehlende Abteilungen zählen sollen, und nenne die Entscheidung bei der Antwort.

Kategorie, Preis und Lagerbestand kombinieren

„Welche Produkte aus Lighting oder Storage kosten weniger als 20 Dollar und sind vorrätig, die günstigsten zuerst?“ Verwende IN für die beiden Kategorieoptionen und verlange eine bekannte positive Stückzahl:

SELECT name, price
FROM products
WHERE category IN ('Lighting', 'Storage')
  AND price < 20
  AND stock > 0
ORDER BY price;

Paper Tray mit 9,99 kommt vor Desk Organizer mit 18,75. Lamp Shade ist günstig genug und gehört zu einer ausgewählten Kategorie, sein Lagerbestand ist aber null, sodass es die letzte Prüfung nicht besteht. Auch eine fehlende Lagerstückzahl würde die Prüfung nicht bestehen, weil sie nicht belegen kann, dass der Lagerbestand positiv ist.

Die Zeilen prüfen, die einen Fehler aufdecken könnten

Beginne mit SELECT * FROM products LIMIT 5;, wenn du das Schema und einige Datensätze erkundest. Füge Filter einzeln hinzu, prüfe Änderungen der Ergebnisanzahl und zeige geprüfte Spalten vorübergehend an, wenn es hilfreich ist.

Prüfe genaue Grenzen, fehlende Werte, die Groß- und Kleinschreibung von Text und gleiche Werte an der Grenze. NOT zeigt Zeilen, bei denen eine Bedingung falsch war; es zeigt keine Zeilen, bei denen die Bedingung unbekannt war. Führe IS-NULL-Prüfungen gesondert aus. Prüfe, ob deine Ausgabe die angeforderten Spalten enthält und ob ORDER BY gleiche Werte auflöst, die die Antwort beeinflussen.

Prüfe beim Übertragen der Abfrage in eine andere Datenbank die Syntax für Zeilenbegrenzungen, die Regeln zur Groß- und Kleinschreibung bei Gleichheit und LIKE, Anführungszeichen für Bezeichner, die Behandlung von Datumswerten und die Platzierung von NULL. Die Beispiele verwenden LIMIT in SQLite und PostgreSQL; die Form für Zeilenbegrenzungen in Standard-SQL ist OFFSET mit FETCH FIRST.

Wichtige Erkenntnisse

  • Plane Tabelle, passende Zeilen, Ausgabespalten, Duplikate, Reihenfolge und Zeilenanzahl getrennt.
  • Schreibe die Entscheidung zu fehlenden Werten ausdrücklich auf, wenn ein Ausschluss Datensätze ohne Zuweisung einschließen soll.
  • Prüfe Grenzen und die Auswirkungen einzelner Filter anhand der Frage.
  • Untersuche NULL-Werte gesondert, weil NOT unbekannt nicht in wahr umwandelt.
  • Prüfe beim Wechsel der Datenbank erneut Groß- und Kleinschreibung, Datumswerte, Namen, NULL-Sortierung und Zeilenbegrenzungen.

Abfragen mit SELECT: Beispiele

6 Interaktive Lektionen

1

Von Beschäftigtendaten zu einer Städteliste

11 Schritte
Wähle Ergebnisspalten und entscheide dann, was als Duplikat zählen soll.
  1. 1
    EinführungEine Tabelle, zwei Arten von Antworten

    Eine Personalliste und eine Liste der Städte, in denen Beschäftigte wohnen, verwenden dieselben Beschäftigtendatensätze, brauchen aber unterschiedliche Ergebnisformen. Ein einfaches SELECT wählt die anzuzeigenden Felder aus. DISTINCT kann dann wiederholte ausgewählte Werte reduzieren. Wir erstellen zuerst ein zweispaltiges Ergebnis für Beschäftigte, ändern dann die Frage zu unterschiedlichen Städten und verfolgen, was verschwindet.

  2. 2
    ErklärungDie angezeigten Spalten auswählen

    Beginne mit einer konkreten Anfrage: Zeige für jede beschäftigte Person die Stadt, gefolgt vom Vornamen. Schreibe:

    SELECT city, first_name
    FROM employees;
    

    Die SELECT-Liste legt die Reihenfolge der Ausgabespalten fest, sodass die Stadt zuerst kommt. FROM liefert die Tabelle. Es gibt keinen Filter, daher tragen alle acht Beschäftigten eine Zeile bei; diese einfache Abfrage lässt die gespeicherten Datensätze unverändert.

  3. 3
    BeispielDen Aufbau des Ergebnisses lesen

    Der Datensatz von Ana steuert Chicago und Ana bei; der von Ben Denver und Ben. Alle übrigen Beschäftigten steuern dieselben zwei Felder bei. Das Ergebnis hat daher acht Zeilen und zwei Spalten. Wiederholte Städte bleiben erhalten, weil diese Zeilen weiterhin unterschiedliche Personen beschreiben. Es gibt kein ORDER BY, daher benennen diese Beispiele Zeilen, ohne ihre Anzeigereihenfolge zu garantieren.

  4. 4
    HerausforderungEine geänderte SELECT-Liste prüfen

    Was ändert sich, wenn die Abfrage zu SELECT first_name FROM employees; wird? Gib ihre Zeilen- und Spaltenanzahl an.

    ---reveal---

    Sie gibt weiterhin acht Zeilen zurück, jetzt mit einer Spalte, first_name. Das Entfernen von city aus SELECT entfernt ein angezeigtes Feld, keine Beschäftigtendatensätze. Um die Zeilen zu reduzieren, wäre ein Filter oder eine Zeilenbegrenzung nötig.

  5. 5
    TippSyntaxfehler eingrenzen

    Trenne Spaltennamen durch Kommas, lasse aber ein abschließendes Komma vor FROM weg. Beende die Anweisung mit einem Semikolon; -- beginnt einen Kommentar bis zum Zeilenende. Meldet die Datenbank eine unbekannte Spalte, vergleiche die Schreibweise mit dem Schema. SELECT * ist für einen ersten Blick nützlich, während ausdrückliche Namen ein gespeichertes Ergebnis auf das Nötige beschränken.

  6. 6
    ErklärungNach unterschiedlichen Städten fragen

    Frage nun, in welchen Städten Beschäftigte wohnen. Vornamen gehören nicht mehr zu dieser Antwort:

    SELECT DISTINCT city
    FROM employees;
    

    Die acht Stadteinträge reduzieren sich auf Chicago, Denver und Boston, ohne garantierte Reihenfolge. DISTINCT entfernt Wiederholungen aus dem ausgewählten Ergebnis, nicht aus der gespeicherten Beschäftigtentabelle. Jede Stadt erscheint einmal, auch wenn mehrere Personen dort wohnen.

  7. 7
    BeispielVollständige ausgewählte Zeilen vergleichen

    Füge die Abteilung zur SELECT-Liste hinzu. Ana und Chloe steuern beide das Paar Sales-Chicago bei, das zu einer Zeile zusammengefasst wird. Emma steuert Sales-Denver bei, das erhalten bleibt, weil die Stadt anders ist. Das vollständige Ergebnis von SELECT DISTINCT department, city FROM employees; hat sieben Zeilen. DISTINCT wird einmal nach SELECT geschrieben und vergleicht alle ausgewählten Felder zusammen.

  8. 8
    HerausforderungEine eindeutige ID verändert das Entfernen von Duplikaten

    Wie viele Zeilen würde SELECT DISTINCT employee_id, city FROM employees; zurückgeben und warum?

    ---reveal---

    Alle acht Zeilen bleiben erhalten. Jede employee_id ist eindeutig, sodass sich jedes ID-Stadt-Paar von allen anderen Paaren unterscheidet. Wiederholte Städte allein reichen nicht aus, um vollständige ausgewählte Zeilen zu Duplikaten zu machen.

  9. 9
    KernaussageDeuten, was eine NULL-Zeile aussagt

    Eine DISTINCT-Abteilungsliste enthält Sales, IT, Marketing und eine NULL-Zeile für Grace. Auch wiederholte Kennzeichnungen fehlender Werte würden zu einer zusammengefasst. Diese Zeile sagt, dass eine Abteilung nicht erfasst ist; sie ist keine weitere benannte Abteilung. Bei der Duplikatgruppierung werden NULL-Werte zusammen behandelt, obwohl ein gewöhnlicher Vergleich NULL = NULL unbekannt ist.

  10. 10
    HerausforderungMit einer sortierten Auswahlliste abschließen

    Sage das Ergebnis von SELECT DISTINCT city FROM employees ORDER BY city LIMIT 2; voraus. Gib die Werte in ihrer zurückgegebenen Reihenfolge an und erkläre, was die Begrenzung zählt.

    ---reveal---

    Boston, dann Chicago. DISTINCT reduziert die Stadtwerte zuerst auf drei; ORDER BY sortiert diese Werte und LIMIT behält zwei. Es zählt unterschiedliche Ergebnisstädte nach dem Entfernen der Duplikate, nicht zwei Beschäftigtendatensätze.

  11. 11
    ZusammenfassungDie Ausgabe auf die Frage abstimmen

    Ein Personalergebnis behält identifizierende Felder; eine Städteliste wählt mit DISTINCT nur die Stadt aus. Die ausgewählten Spalten bestimmen die Duplikatvergleiche, während ORDER BY die Zeilenreihenfolge bestimmt. Prüfe beim Ändern einer Abfrage sowohl die Ausgabefelder als auch, was eine Ergebniszeile darstellt.

2

Einen Filter mit der beabsichtigten Bedeutung erstellen

13 Schritte
Übersetze Schwellenwerte, Werte in Anführungszeichen und Bedingungsgruppen in Zeilenprüfungen.

Speichere diese Einheit, um jede Interaktive Lektion Schritt für Schritt durchzugehen.

  1. 1
    EinführungJeder Filter stellt eine genaue Frage
  2. 2
    ErklärungDen Gehaltsschwellenwert übersetzen
  3. 3
    HerausforderungDie Grenze bei Bedarf einschließen
  4. 4
    TippNumerische Literale einfach schreiben
  5. 5
    ErklärungEinen Textwert in Anführungszeichen setzen
  6. 6
    BeispielEinen Apostroph innerhalb des Werts erhalten
  7. 7
    ErklärungEine vollständige Datumsgrenze verwenden
  8. 8
    HerausforderungEin Datum mit Uhrzeit prüfen
  9. 9
    ErklärungDie Bedingungen verknüpfen
  10. 10
    BeispielEine Stadtregel auf Alternativen anwenden
  11. 11
    HerausforderungDie Gruppe umkehren
  12. 12
    HerausforderungEin Datum und eine Abteilungsgruppe kombinieren
  13. 13
    ZusammenfassungEine aufschlussreiche Zeile verfolgen
3

Eine genaue Liste, einen Bereich oder ein Muster wählen

15 Schritte
Verwende die zur Frage passende Abgleichsform und prüfe ihre Grenzen.

Speichere diese Einheit, um jede Interaktive Lektion Schritt für Schritt durchzugehen.

  1. 1
    EinführungDrei Bedeutungen einer Übereinstimmung
  2. 2
    ErklärungMit vollständigen Kategorieoptionen beginnen
  3. 3
    BeispielEine Lagerregel auf die Liste anwenden
  4. 4
    HerausforderungEinen Ausschluss vorhersagen
  5. 5
    ErklärungEinen Preis in einen Bereich einordnen
  6. 6
    HerausforderungDie Bereichsgrenzen bewusst ausschließen
  7. 7
    TippEinen ganzen Monat mit Uhrzeiten abdecken
  8. 8
    ErklärungFestlegen, wo der Textteil stehen darf
  9. 9
    BeispielEin Zeichen mit einem Unterstrich erfassen
  10. 10
    BeispielNach dem tatsächlichen Platzhalterzeichen suchen
  11. 11
    HerausforderungEin Muster an seinen Rändern prüfen
  12. 12
    VerbindungDie Behandlung der Groß- und Kleinschreibung in der Datenbank prüfen
  13. 13
    HerausforderungEine fehlende Telefonnummer berücksichtigen
  14. 14
    HerausforderungAlle drei Arten des Abgleichs kombinieren
  15. 15
    ZusammenfassungDie Form anhand der Bedeutung wählen
4

Fehlende Daten finden und beurteilen

10 Schritte
Unterscheide NULL von bekannten Werten und verfolge unbekannt durch einen Filter.

Speichere diese Einheit, um jede Interaktive Lektion Schritt für Schritt durchzugehen.

  1. 1
    EinführungEine nicht erfasste Stückzahl bleibt ungeklärt
  2. 2
    BeispielNull von fehlenden Werten unterscheiden
  3. 3
    ErklärungDas Vorhandensein direkt prüfen
  4. 4
    HerausforderungLeere Zeichenketten prüfen
  5. 5
    ErklärungEinen Vergleich und sein Gegenteil verfolgen
  6. 6
    BeispielEinen wahren OR-Zweig entscheiden lassen
  7. 7
    HerausforderungEin falscher AND-Zweig kann entscheiden
  8. 8
    KernaussageNULL innerhalb einer Ausschlussliste vermeiden
  9. 9
    HerausforderungFehlende Abteilungen einschließen, Telefonnummern verlangen
  10. 10
    ZusammenfassungFehlende Daten gesondert untersuchen
5

Eine wiederholbare sortierte Seite erstellen

15 Schritte
Bringe passende Zeilen in eine Rangfolge, löse gleiche Werte auf und wende eine Begrenzung und einen Versatz an.

Speichere diese Einheit, um jede Interaktive Lektion Schritt für Schritt durchzugehen.

  1. 1
    EinführungEine Seite ist ein Ausschnitt einer sortierten Antwort
  2. 2
    BeispielDen höchsten Wert zuerst wählen
  3. 3
    HerausforderungNur passende Produkte sortieren
  4. 4
    TippErkennen, ob numerisch sortiert wird
  5. 5
    ErklärungSortierprioritäten von links lesen
  6. 6
    HerausforderungJeder Sortierspalte ihre Richtung geben
  7. 7
    ErklärungDie verbleibenden gleichen Werte auflösen
  8. 8
    VerbindungFehlende Werte ausdrücklich platzieren
  9. 9
    BeispielDie ersten drei Zeilen der Rangfolge behalten
  10. 10
    BeispielÜber die erste Seite hinausgehen
  11. 11
    KernaussageDer Rang einer Zeile ist nicht der Rang eines unterschiedlichen Werts
  12. 12
    HerausforderungGleiche Werte an einer Grenze untersuchen
  13. 13
    TippEine andere Form der Zeilenbegrenzung erkennen
  14. 14
    HerausforderungDie zweite Stadtseite behalten
  15. 15
    ZusammenfassungDie Rangfolge vor dem Ausschnitt festlegen
6

Eine Anfrage aus dem Berufsalltag übersetzen und prüfen

12 Schritte
Erstelle eine vollständige Abfrage über eine einzelne Tabelle und prüfe, wie jede Klausel die Antwort verändert.

Speichere diese Einheit, um jede Interaktive Lektion Schritt für Schritt durchzugehen.

  1. 1
    EinführungDie Entscheidungen einer Anfrage trennen
  2. 2
    ErklärungEine gültige Klauselreihenfolge schreiben
  3. 3
    BeispielDas logische Modell verfolgen
  4. 4
    HerausforderungVor der Auswahl des Spitzenwerts filtern
  5. 5
    ErklärungDie Personalanfrage bestimmen
  6. 6
    BeispielDie Abteilungsregel ausdrücklich formulieren
  7. 7
    BeispielDie Telefonanforderung anwenden
  8. 8
    BeispielDie passenden Datensätze in eine Rangfolge bringen
  9. 9
    HerausforderungDie Entscheidung zu fehlenden Werten prüfen
  10. 10
    HerausforderungDie Klauseln zu einem Ablauf verbinden
  11. 11
    TippPrüfungen wählen, die Fehler aufdecken
  12. 12
    ZusammenfassungDie Antwort mit der Anfrage abgleichen

Abfragen mit SELECT: Übungsaufgaben

50 Übungsfragen in 5 Sets

Set 1: Spalten, Vergleiche und klare Bedingungen10 Übungsfragen

Frage 1 von 10

Eine Tabelle rooms hat 12 Zeilen. Welche Form hat das Ergebnis von SELECT floor, room_name FROM rooms;?
  1. 2 Zeilen und 12 Spalten
  2. 12 Zeilen und 2 Spalten
  3. 12 Zeilen und alle Spalten
  4. 2 Zeilen und alle Spalten
Antwort zeigenAntwort ausblenden
Antwort: B
Jeder Raum trägt eine Zeile bei, weil die Abfrage keinen Filter und keine Begrenzung hat. Die SELECT-Liste nennt zwei Ausgabespalten, floor zuerst und room_name danach. Die Auflistung von zwei Feldern beschränkt das Ergebnis nicht auf zwei Datensätze; SELECT steuert hier die angezeigten Spalten.

Frage 2 von 10

Eine Tabelle parcels speichert weight_kg als Zahl. Welche Bedingung behält Pakete mit einem Gewicht von höchstens 8 Kilogramm?
  1. weight_kg < 8
  2. weight_kg >= 8
  3. weight_kg > 8
  4. weight_kg <= 8
Antwort zeigenAntwort ausblenden
Antwort: D
„Höchstens 8“ schließt 8 und jedes kleinere Gewicht ein, verwende also <=. Die Bedingung < 8 würde ein Paket genau auf der erlaubten Grenze ausschließen. Die Prüfung dieses genauen Gewichts hilft, diese beiden ansonsten ähnlichen Filter zu unterscheiden.

Frage 3 von 10

Welche SQL-Bedingung trifft auf den genauen Textwert D'Arcy in einer Spalte surname zu?
  1. surname = 'D''Arcy'
  2. surname = 'D'Arcy'
  3. surname = "D'Arcy"
  4. surname = D'Arcy
Antwort zeigenAntwort ausblenden
Antwort: A
Ein Textliteral braucht einfache Anführungszeichen um den ganzen Wert; ein Apostroph im Inneren wird durch zwei aufeinanderfolgende einfache Anführungszeichen dargestellt. Der nicht verdoppelte Apostroph würde das Literal zu früh beenden. Die doppelten Anführungszeichen des Standards kennzeichnen einen Namen und sind daher nicht die Form für ein Textliteral.

Frage 4 von 10

Eine Tabelle tickets hat status und eine numerische priority. Welche Bedingung wählt offene oder ausstehende Tickets mit jeweils einer Priorität von mindestens 4 aus?
  1. status = 'open' OR status = 'pending' AND priority >= 4
  2. (status = 'open' AND status = 'pending') OR priority >= 4
  3. (status = 'open' OR status = 'pending') AND priority >= 4
  4. (status = 'open' OR status = 'pending') AND priority > 4
Antwort zeigenAntwort ausblenden
Antwort: C
Die Statusalternativen bilden eine Gruppe und jede Zeile dieser Gruppe muss auch den Prioritätsschwellenwert erfüllen. Ohne die Klammern wendet AND die Prioritätsregel nur auf ausstehende Tickets an und lässt offene Tickets mit niedriger Priorität zu. „Mindestens 4“ schließt die Grenze ein und braucht daher >=.

Frage 5 von 10

Eine Tabelle visits enthält die Paare (site, day) ('East', 'Mon'), ('East', 'Mon'), ('East', 'Tue') und ('West', 'Mon'). Wie viele Zeilen gibt SELECT DISTINCT site, day FROM visits; zurück?
  1. 2 Zeilen
  2. 3 Zeilen
  3. 4 Zeilen
  4. 1 Zeile
Antwort zeigenAntwort ausblenden
Antwort: B
DISTINCT vergleicht den ausgewählten Standort und Tag zusammen. Nur die beiden East-Mon-Zeilen sind Duplikate, sodass East-Mon, East-Tue und West-Mon bleiben: drei Zeilen. Wer nur die beiden Standortnamen zählt, übersieht, dass East mit zwei unterschiedlichen ausgewählten Tagen vorkommt.

Frage 6 von 10

Eine Zeile hat team = 'Blue', city = 'Austin' und score = 62. Erfüllt sie WHERE team = 'Blue' OR city = 'Miami' AND score >= 80 und warum?
  1. Ja; die wahre Teamprüfung reicht für das OR aus.
  2. Nein; die Punkteprüfung gilt für beide Orte.
  3. Ja; OR verlangt, dass beide Textvergleiche wahr sind.
  4. Nein; die Stadtprüfung ist falsch und muss immer erfüllt sein.
Antwort zeigenAntwort ausblenden
Antwort: A
AND wird vor OR ausgewertet, sodass die Bedingung die Prüfungen für Miami und die Punkte zusammenfasst. Der separate Zweig für Team Blue ist wahr und reicht aus, um diese Zeile zu behalten. Um auch für Blue 80 Punkte zu verlangen, wären Klammern um die Textalternativen vor dem AND nötig.

Frage 7 von 10

Eine Textspalte speichert vollständige Datumswerte als YYYY-MM-DD. Welche Bedingung wählt Datumswerte nach dem Kalenderjahr 2025 aus?
  1. event_date > '2025'
  2. event_date > '2025-01-01'
  3. event_date >= '2025-12-31'
  4. event_date >= '2026-01-01'
Antwort zeigenAntwort ausblenden
Antwort: D
Das erste Datum nach dem gesamten Jahr 2025 ist der 1. Januar 2026. Ein einschließender Vergleich an diesem Datum ergibt daher den beabsichtigten Bereich. Die Textgrenze '2025' würde auch Datumswerte innerhalb von 2025 zulassen, weil ein vollständiges Datum nach diesem übereinstimmenden kürzeren Präfix einsortiert wird.

Frage 8 von 10

Welche Bedingung wählt Datensätze aus, deren vollständiger zone-Wert entweder North oder West ist?
  1. zone IN 'North', 'West'
  2. zone IN ('North, West')
  3. zone IN ('North', 'West')
  4. zone = 'North' AND zone = 'West'
Antwort zeigenAntwort ausblenden
Antwort: C
IN erwartet eine geklammerte Liste mit einem Literal in Anführungszeichen pro erlaubtem Wert. Stehen beide Namen innerhalb eines einzigen Paars von Anführungszeichen, entsteht ein gemeinsamer Textwert und nicht zwei Auswahlmöglichkeiten. Ein AND zwischen Gleichheitsvergleichen kann eine Zone nicht gleichzeitig mit zwei unterschiedlichen ganzen Werten abgleichen.

Frage 9 von 10

Eine Tabelle loans hat die numerischen days_late-Werte 0, 2, 5 und NULL. Wie viele Zeilen erfüllen WHERE days_late <> 0?
  1. 4 Zeilen
  2. 2 Zeilen
  3. 3 Zeilen
  4. 1 Zeile
Antwort zeigenAntwort ausblenden
Antwort: B
Die bekannten Werte 2 und 5 unterscheiden sich von null, sodass zwei Zeilen die Bedingung erfüllen. Für die Zeile mit null ist der Vergleich falsch, für NULL unbekannt; WHERE behält keine von beiden. Wer drei zählt, nimmt an, dass sich eine fehlende Zahl bekanntermaßen von null unterscheidet. Das kann ein gewöhnlicher Vergleich nicht feststellen.

Frage 10 von 10

Eine Tabelle stockrooms hat die Zeilen (room_id, building) (1, 'C'), (2, 'A'), (3, 'A'), (4, 'B'), (5, 'C'). Welche sortierten Werte ergeben sich aus SELECT DISTINCT building FROM stockrooms ORDER BY building DESC LIMIT 2;?
  1. C, C
  2. A, B
  3. B, A
  4. C, B
Antwort zeigenAntwort ausblenden
Antwort: D
DISTINCT reduziert die ausgewählten Werte zuerst auf A, B und C. Die absteigende Reihenfolge ergibt C, B, A und die Begrenzung behält C und B. Würde man vor dem Entfernen von Duplikaten zwei gespeicherte Zeilen nehmen, änderte das die Frage; die Begrenzung zählt nach dem Sortieren die unterschiedlichen Gebäudewerte.
Set 2: Listen, Bereiche und Zeichenmuster10 Übungsfragen

Speichere diese Einheit, um jede Antwort zu sehen und jedes Set zu üben.

Frage 1 von 10

Eine numerische Spalte fee hat die Werte 12, 18, 24 und 30. Welche Werte erfüllen WHERE fee BETWEEN 18 AND 30?
  1. Nur 24
  2. 18, 24
  3. 18, 24, 30
  4. 12, 18, 24
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 2 von 10

Welches LIKE-Muster wählt Text aus, der mit report endet?
  1. '%report'
  2. 'report%'
  3. '%report%'
  4. '_report'
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 3 von 10

Eine Tabelle requests hat die Zeilen (request_id, region) (31, 'South'), (32, 'East'), (33, 'South'). Welche Menge von IDs erfüllt WHERE region IN ('South', 'South')?
  1. {31, 31, 33, 33}
  2. {31}
  3. {31, 32, 33}
  4. {31, 33}
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 4 von 10

Welche Menge von Werten in einer Tabelle labels passt zu label LIKE '__7%': 'AB7', 'A7', 'AB70' und 'ABC7'?
  1. {AB7, A7, AB70}
  2. {AB7, AB70}
  3. {AB70, ABC7}
  4. {A7, AB7}
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 5 von 10

Eine numerische Spalte temperature enthält 4, 9, 14, 19 und NULL. Welche Werte erfüllen WHERE temperature NOT BETWEEN 9 AND 14?
  1. 4, 19
  2. 4, 9, 14, 19
  3. 4, 19, NULL
  4. 9, 14
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 6 von 10

Eine Spalte promo_code enthält 'VIP_2', 'VIPA2', 'VIP_' und 'VIP2'. Welche Menge passt zu WHERE promo_code LIKE 'VIP!_%' ESCAPE '!'?
  1. {VIP_2, VIPA2, VIP_}
  2. {VIP_2}
  3. {VIP_2, VIP_}
  4. {VIPA2, VIP2}
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 7 von 10

Eine Tabelle appointments speichert Text mit Uhrzeiten in der Form YYYY-MM-DD HH:MM:SS mit fester Länge. Welche Bedingung wählt jeden Termin im Februar 2028 aus?
  1. starts_at BETWEEN '2028-02-01' AND '2028-02-29'
  2. starts_at >= '2028-02-01' AND starts_at < '2028-03-01'
  3. starts_at > '2028-02-01' AND starts_at > '2028-03-01'
  4. starts_at >= '2028-02-01' AND starts_at <= '2028-03-01'
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 8 von 10

Welche Menge aus 'Maple', 'map', 'roadmap' und 'MAPS' passt beim standardmäßigen LIKE-Verhalten von SQLite zu word LIKE 'map%'?
  1. {map}
  2. {map, roadmap}
  3. {Maple, map}
  4. {Maple, map, MAPS}
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 9 von 10

Eine Tabelle members hat die Zeilen (member_id, tier) (41, 'Gold'), (42, 'Silver'), (43, NULL). Welche Menge von IDs erfüllt WHERE tier IN ('Silver', NULL)?
  1. {}
  2. {42, 43}
  3. {41, 42}
  4. {42}
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 10 von 10

Eine Tabelle shipments erfasst einen port pro Zeile. Welche Bedingung schließt sowohl Oakland als auch Tacoma aus, wenn alle Hafenwerte erfasst sind?
  1. NOT (port = 'Oakland' OR port = 'Tacoma')
  2. NOT port = 'Oakland' OR port = 'Tacoma'
  3. port <> 'Oakland' OR port <> 'Tacoma'
  4. NOT (port <> 'Oakland' AND port <> 'Tacoma')
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Set 3: Fehlende Werte und kombinierte Filter10 Übungsfragen

Speichere diese Einheit, um jede Antwort zu sehen und jedes Set zu üben.

Frage 1 von 10

Eine SQLite-Tabelle contacts speichert die phone-Werte NULL, '', 'NULL' und '555-0188'. Wie viele Zeilen erfüllen WHERE phone IS NULL?
  1. 2 Zeilen
  2. 3 Zeilen
  3. 4 Zeilen
  4. 1 Zeile
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 2 von 10

Eine Zeile in devices hat battery_pct = NULL und status = 'ready'. Was geschieht bei WHERE battery_pct > 50 OR status = 'ready'?
  1. Sie wird ausgelassen, weil jedes NULL das OR unbekannt macht.
  2. Sie wird behalten, weil der Statuszweig wahr ist.
  3. Sie wird ausgelassen, weil beide Zweige wahr sein müssen.
  4. Sie wird behalten, weil OR NULL-Zweige immer ignoriert.
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 3 von 10

Welche Bedingung findet Zeilen mit einem erfassten email-Wert, einschließlich einer leeren Zeichenkette, wenn diese in PostgreSQL als Wert gespeichert ist?
  1. email <> NULL
  2. email <> ''
  3. email IS NOT NULL
  4. email = 'NULL'
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 4 von 10

Eine Tabelle jobs enthält die Zeilen (job_id, hours, urgent) (51, NULL, 'yes'), (52, 6, 'no'), (53, 2, 'yes'), (54, NULL, 'no'). Welche Menge erfüllt WHERE NOT (hours > 4) OR urgent = 'yes'?
  1. {51, 53}
  2. {53}
  3. {51, 53, 54}
  4. {51, 52, 53}
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 5 von 10

Eine Tabelle files hat die folder-Werte 'Archive', 'Active' und NULL. Welche Bedingung schließt Active und den fehlenden Ordner ein, während sie Archive ausschließt?
  1. folder <> 'Archive'
  2. folder <> 'Archive' OR folder IS NULL
  3. folder <> 'Archive' AND folder IS NULL
  4. folder NOT IN ('Archive', NULL)
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 6 von 10

Eine Tabelle routes hat die Zeilen (route_id, depot) (61, 'A'), (62, 'B'), (63, NULL). Welche Menge von IDs erfüllt WHERE depot NOT IN ('A', NULL) OR depot IS NULL?
  1. {62, 63}
  2. {}
  3. {61, 62, 63}
  4. {63}
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 7 von 10

Eine Tabelle hat fünf numerische load-Werte: 0, 3, 7, NULL, NULL. Zwei Abfragen verwenden WHERE load > 3 und WHERE NOT (load > 3). Wie viele Zeilen geben sie in dieser Reihenfolge zurück?
  1. 1 und 2
  2. 3 und 2
  3. 1 und 4
  4. 2 und 3
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 8 von 10

Eine Tabelle deliveries hat die district-Werte 'Hill', NULL, 'Hill', NULL und 'Lake'. Wie viele Zeilen gibt SELECT DISTINCT district FROM deliveries; zurück?
  1. 4 Zeilen
  2. 2 Zeilen
  3. 3 Zeilen
  4. 5 Zeilen
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 9 von 10

Ein Bericht verwendet WHERE rating >= 4 und prüft dann ausgeschlossene Zeilen mit WHERE NOT (rating >= 4). Manche Datensätze erscheinen in keinem der beiden Ergebnisse. Welche zusätzliche Prüfung zeigt Datensätze, deren Bewertung nicht erfasst wurde?
  1. WHERE rating < 4
  2. WHERE rating = NULL
  3. WHERE rating IS NULL
  4. WHERE rating <> 4
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 10 von 10

Eine Tabelle messages hat die Betreffzeilen 'Note A', 'Alert', NULL und 'Note B'. Wie viele Zeilen erfüllen WHERE subject NOT LIKE 'Note%'?
  1. 2 Zeilen
  2. 4 Zeilen
  3. 3 Zeilen
  4. 1 Zeile
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Set 4: Rangfolgen, gleiche Werte und spätere Seiten10 Übungsfragen

Speichere diese Einheit, um jede Antwort zu sehen und jedes Set zu üben.

Frage 1 von 10

Eine numerische Spalte duration_minutes hat die Werte 16, 4 und 23. In welcher Reihenfolge stehen sie bei ORDER BY duration_minutes?
  1. 23, 16, 4
  2. 16, 23, 4
  3. 4, 16, 23
  4. 16, 4, 23
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 2 von 10

Eine Tabelle racers hat die Zeilen (racer_id, group_name, points) (71, 'A', 8), (72, 'B', 12), (73, 'A', 15). Welche ID-Reihenfolge ergibt sich aus ORDER BY group_name, points DESC?
  1. 73, 71, 72
  2. 73, 72, 71
  3. 72, 73, 71
  4. 71, 73, 72
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 3 von 10

Ein festes sortiertes Ergebnis enthält 23 Zeilen. Welche LIMIT- und OFFSET-Angabe gibt Seite 3 mit 6 Zeilen pro Seite zurück?
  1. LIMIT 6 OFFSET 3
  2. LIMIT 6 OFFSET 18
  3. LIMIT 3 OFFSET 6
  4. LIMIT 6 OFFSET 12
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 4 von 10

Eine feste Tabelle orders hat eindeutige order_id-Werte und mehrere Zeilen stimmen sowohl in order_date als auch in total überein. Welches ORDER BY liefert neueste Datumswerte zuerst, höchste Summen innerhalb eines Datums und eine eindeutige Reihenfolge?
  1. ORDER BY order_date DESC, total DESC
  2. ORDER BY order_date DESC, total DESC, order_id
  3. ORDER BY order_id, order_date DESC, total DESC
  4. ORDER BY order_date, total DESC, order_id DESC
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 5 von 10

Eine Tabelle offers hat die Zeilen (offer_id, rate) (81, 40), (82, 40), (83, 35), (84, 30). Welcher Wert ergibt sich aus SELECT DISTINCT rate FROM offers ORDER BY rate DESC LIMIT 1 OFFSET 1;?
  1. 40
  2. 35
  3. 30
  4. Kein Wert
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 6 von 10

Eine Tabelle queues enthält die Namen 'Delta', NULL und 'Alpha'. Wo steht die NULL-Zeile beim standardmäßigen ORDER BY queue_name ASC in SQLite und PostgreSQL?
  1. Zuerst in SQLite; zuerst in PostgreSQL.
  2. Zuletzt in SQLite; zuerst in PostgreSQL.
  3. Zuerst in SQLite; zuletzt in PostgreSQL.
  4. Zuletzt in SQLite; zuletzt in PostgreSQL.
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 7 von 10

Eine Tabelle sales hat die Zeilen (sale_id, amount) (91, 70), (92, 70), (93, 55), (94, 55), (95, 20). Wie viele Zeilen gibt SELECT sale_id, amount FROM sales ORDER BY amount DESC FETCH FIRST 3 ROWS WITH TIES; in PostgreSQL zurück?
  1. 4 Zeilen
  2. 2 Zeilen
  3. 5 Zeilen
  4. 3 Zeilen
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 8 von 10

Eine SQLite-Textspalte speichert bei binärer Sortierfolge die Werte '6', '12' und '100'. Wie lautet ihre aufsteigende Reihenfolge?
  1. 6, 12, 100
  2. 100, 6, 12
  3. 12, 100, 6
  4. 100, 12, 6
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 9 von 10

Eine Seitenabfrage verwendet ORDER BY item_id LIMIT 4 OFFSET 4 auf unveränderten Zeilen mit eindeutigen IDs von 1 bis 12. Vor der nächsten Seitenabfrage wird Zeile 2 gelöscht. Welche IDs gibt LIMIT 4 OFFSET 8 nun bei derselben Sortierung zurück?
  1. 9, 10, 11, 12
  2. 8, 9, 10, 11
  3. 10, 11, 12
  4. 9, 10, 11
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 10 von 10

Eine Tabelle tasks hat die Zeilen (task_id, owner, hours) (101, 'Lee', 9), (102, 'Ari', 8), (103, 'Lee', 5), (104, 'Lee', 3). Welche ID ergibt sich aus SELECT task_id FROM tasks WHERE owner = 'Lee' ORDER BY hours DESC LIMIT 1 OFFSET 1;?
  1. 103
  2. 102
  3. 101
  4. 104
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Set 5: Vollständige Abfragen und Ergebnisprüfungen10 Übungsfragen

Speichere diese Einheit, um jede Antwort zu sehen und jedes Set zu üben.

Frage 1 von 10

Wie lautet die geschriebene Klauselreihenfolge für eine Tabellenabfrage mit Filter, Sortierung und Zeilenbegrenzung?
  1. SELECT, FROM, ORDER BY, WHERE, LIMIT
  2. FROM, SELECT, WHERE, ORDER BY, LIMIT
  3. SELECT, FROM, WHERE, LIMIT, ORDER BY
  4. SELECT, FROM, WHERE, ORDER BY, LIMIT
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 2 von 10

Eine Tabelle courses hat title, einen numerischen Wert fee und einen numerischen Wert places_left. Welche Abfrage zeigt Titel und Gebühren von Kursen unter 75 Dollar mit verfügbaren Plätzen, die günstigsten zuerst?
  1. SELECT title, fee FROM courses WHERE fee < 75 AND places_left > 0 ORDER BY fee;
  2. SELECT title, fee FROM courses WHERE fee <= 75 AND places_left > 0 ORDER BY fee;
  3. SELECT title, fee FROM courses WHERE fee < 75 OR places_left > 0 ORDER BY fee;
  4. SELECT title, fee FROM courses WHERE fee < 75 AND places_left > 0 ORDER BY fee DESC;
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 3 von 10

Eine Tabelle cases hat die Zeilen (case_id, team, opened_on, phone) (111, 'Red', '2026-06-12', 'x'), (112, NULL, '2026-06-20', 'y'), (113, 'Blue', '2026-06-18', NULL), (114, 'Blue', '2026-06-10', 'z'). Welche sortierten IDs ergeben die zwei neuesten Fälle außerhalb von Red mit erfasster Telefonnummer, einschließlich Fällen ohne zugewiesenes Team?
  1. 113, 114
  2. 112, 114
  3. 112, 113
  4. Nur 114
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 4 von 10

Eine Zeile in rentals hat branch = 'East' und returned = 'yes'. Eine Abfrage soll nicht zurückgegebene Ausleihen aus East oder West anzeigen, aber diese Zeile erscheint. Der Filter lautet branch = 'East' OR branch = 'West' AND returned = 'no'. Welche Korrektur wendet die Rückgaberegel auf beide Filialen an?
  1. branch = 'East' AND branch = 'West' AND returned = 'no'
  2. branch = 'East' OR (branch = 'West' AND returned = 'no')
  3. (branch = 'East' OR branch = 'West') AND returned = 'no'
  4. (branch = 'East' OR branch = 'West') OR returned = 'no'
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 5 von 10

Eine Tabelle catalog hat ASCII-Produktnamen. Welche Bedingung findet in SQLite und PostgreSQL Namen, die steel enthalten, ohne Unterschiede in der Groß- und Kleinschreibung von ASCII-Buchstaben zu beachten?
  1. LOWER(name) LIKE '%steel%'
  2. name LIKE 'steel%'
  3. LOWER(name) LIKE 'steel%'
  4. name = '%steel%'
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 6 von 10

Eine SQLite-Textspalte hat bei binärer Sortierfolge die Codes 'G', 'G1', 'H2', 'J' und 'J1'. Welche Menge erfüllt WHERE code BETWEEN 'G' AND 'J' AND code NOT LIKE 'H%'?
  1. {G, H2, J}
  2. {G, G1, J, J1}
  3. {G1, J1}
  4. {G, G1, J}
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 7 von 10

Eine Tabelle logs enthält die Zeilen (region, channel) ('East', 'web'), ('East', 'web'), ('East', 'store'), ('West', 'web'), ('West', 'store'). Welche sortierten Zeilen ergeben sich aus SELECT DISTINCT region, channel FROM logs WHERE channel = 'web' ORDER BY region DESC LIMIT 1;?
  1. West-web, East-web
  2. East-web
  3. West-web
  4. West-store
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 8 von 10

In PostgreSQL hat eine Tabelle bids die Zeilen (bid_id, amount) (121, 90), (122, 90), (123, 80), (124, 80). Wie viele Zeilen gibt SELECT bid_id, amount FROM bids ORDER BY amount DESC, bid_id FETCH FIRST 3 ROWS WITH TIES; zurück?
  1. 4 Zeilen
  2. 3 Zeilen
  3. 2 Zeilen
  4. 1 Zeile
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 9 von 10

Eine Tabelle sensors enthält die Zeilen (sensor_id, reading, enabled) (131, NULL, 'yes'), (132, 8, 'yes'), (133, 2, 'no'), (134, NULL, 'no'). Welche Menge erfüllt WHERE NOT (reading > 5 AND enabled = 'yes')?
  1. {131, 133, 134}
  2. {133}
  3. {131, 133}
  4. {133, 134}
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 10 von 10

Ein Bericht soll Gebühren von mindestens 50 einschließen. Sein Filter lautet fee > 50 und die einzigen verfügbaren Testdatensätze haben Gebühren von 20 und 80. Welche zusätzliche Testgebühr deckt den Fehler am unmittelbarsten auf?
  1. 49
  2. 50
  3. 51
  4. 100
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Hängst du bei deiner eigenen Aufgabe fest? Hausaufgabenhilfe

Schlüsselbegriffe

61 Schlüsselbegriffe, jeweils mit Definition

A

Abfrage
Eine Abfrage ist eine Anfrage nach Daten aus einer Datenbank. Sie wird als Anweisung geschrieben, die festlegt, welche Datensätze oder Werte zurückgegeben werden sollen.
Die Abfrage SELECT first_name FROM employees; fragt bei der Datenbank das Vornamensfeld jeder beschäftigten Person ab.
Abfrageoptimierer
Ein Abfrageoptimierer wählt einen internen Ausführungsplan, der vom logischen Modell abweichen kann und dabei das festgelegte Ergebnis der Abfrage erhält.
Ein Abfrageoptimierer kann Treffer finden, ohne die gesamte Tabelle tatsächlich in der für die Erklärung verwendeten logischen Reihenfolge zu verarbeiten.
AND
AND ist ein logischer Operator, der verlangt, dass beide verbundenen Bedingungen wahr sind, damit die vollständige Bedingung einen WHERE-Filter passiert.
Die Bedingung Sales AND Chicago behält Beschäftigte aus Sales in Chicago, schließt aber eine Person aus Sales mit der erfassten Stadt Denver aus.
ASC
ASC legt für eine Sortierspalte aufsteigende Reihenfolge fest, etwa den kleinsten numerischen Wert oder das früheste Datum zuerst; es ist die Standardrichtung.
Eine Sortierung der Lighting-Produkte nach price ASC setzt das günstigste Beleuchtungsprodukt an die erste und das teuerste an die letzte Stelle.
ausgewählte Wertekombination
Eine ausgewählte Wertekombination ist die Gruppe von Werten, die zusammen in einer Ergebniszeile erscheinen; das Hinzufügen einer Spalte kann ihre Eindeutigkeit verändern.
Das Hinzufügen von employee_id macht jede ausgewählte Wertekombination in einem Stadtergebnis unterschiedlich, weil die IDs eindeutig sind.

B

Bereichsgrenze
Eine Bereichsgrenze ist ein Wert, der den Anfang oder das Ende eines Bereichs festlegt; ob sie eingeschlossen ist, hängt vom gewählten Vergleich ab.
Jeder Preis an einer Bereichsgrenze in BETWEEN 15.50 AND 89.00 ist eingeschlossen, sodass Produkte mit genau 15,50 oder 89,00 beide die Bedingung erfüllen.
BETWEEN
BETWEEN ist eine Bereichsprüfung, die verlangt, dass ein Wert mindestens so groß wie die untere und höchstens so groß wie die obere Bereichsgrenze ist; beide Grenzen sind eingeschlossen.
price BETWEEN 15.50 AND 89.00 schließt Produkte mit einem Preis von genau 15,50 oder 89,00 ein, den beiden genannten Bereichsgrenzen.
Bezeichner
Ein Bezeichner ist der Name eines Datenbankobjekts wie einer Tabelle oder Spalte; seine Schreibweise und die Verwendung von Anführungszeichen müssen den Datenbankregeln folgen.
Der Bezeichner hire_date benennt eine Spalte, während der Text '2024-02-19' in Anführungszeichen einen Wert darstellt.

D

DATE-Typ
Ein DATE-Typ speichert Kalenderdaten als Datumswerte, sodass eine Datenbank sie nach Datum statt nach lokaler Textformatierung vergleichen kann.
Der DATE-Typ von PostgreSQL akzeptiert DATE '2022-01-01'; SQLite verwendet diese Syntax für typisierte Literale nicht.
DESC
DESC legt für seine Sortierspalte absteigende Reihenfolge fest und kehrt die aufsteigende Reihenfolge um, sodass größere Zahlen oder neuere Datumswerte zuerst stehen.
ORDER BY hire_date DESC setzt in der Beschäftigtenliste eine 2024 eingestellte Person vor eine 2023 eingestellte Person.
DISTINCT
DISTINCT ist ein Zusatz zu SELECT, der doppelte vollständige Zeilen aus dem ausgewählten Ergebnis entfernt und gespeicherte Datensätze unverändert lässt.
Wenn acht Beschäftigte in drei Städten arbeiten, listet SELECT DISTINCT city FROM employees; nur diese drei Städte auf.
doppelte Ergebniszeile
Eine doppelte Ergebniszeile ist eine Zeile, deren ausgewählte Werte nach den geltenden Regeln für den Duplikatvergleich vollständig mit denen einer anderen Ergebniszeile übereinstimmen.
Zwei Beschäftigte mit derselben Abteilung und Stadt erzeugen in einer Abteilungs-Stadt-Liste eine doppelte Ergebniszeile, sodass DISTINCT ihr Paar einmal behält.
dreiwertige Logik
Die dreiwertige Logik ist das System von SQL, um wahre, falsche und unbekannte Bedingungen mit Operatoren wie AND, OR und NOT zu verknüpfen.
Nach der dreiwertigen Logik erfüllt ein Produkt mit fehlendem Lagerbestand eine Lager-ODER-Preis-Prüfung, wenn sein Zweig price > 100 wahr ist.

E

eindeutige Sortierreihenfolge
Eine eindeutige Sortierreihenfolge unterscheidet jede Ergebniszeile anhand ihrer Sortierwerte und ergibt wiederholbare Zeilenpositionen, solange die Daten unverändert bleiben.
Die eindeutige Sortierreihenfolge ORDER BY city, employee_id legt die Position jeder beschäftigten Person durch die eindeutige ID fest.
einschließender Schwellenwert
Ein einschließender Schwellenwert lässt einen Wert zu, der genau seiner Grenze entspricht; die Vergleichsoperatoren >= und <= drücken diesen Einschluss aus.
Ein einschließender Schwellenwert von 60.000 behält eine Person mit genau 60.000 Gehalt, wenn der Filter salary >= 60000 verwendet.
Ergebnismenge
Eine Ergebnismenge ist die Tabelle aus Zeilen und Spalten, die eine Abfrage zurückgibt; sie kann weniger Felder oder Datensätze als ihre Quelle enthalten.
Bei einer Tabelle mit acht Beschäftigten hat die Ergebnismenge von SELECT city FROM employees; acht Zeilen, wobei wiederholte Stadtwerte erlaubt sind.
Ergebnisprüfung
Eine Ergebnisprüfung vergleicht Felder, passende Zeilen, Reihenfolge und Zeilenanzahl einer Abfrage mit der Anfrage, um eine plausible, aber falsche Antwort zu erkennen.
Eine Ergebnisprüfung an einem Produkt mit Lagerbestand null erklärt, warum es in einer Liste günstiger, vorrätiger Produkte fehlt.
ESCAPE-Klausel
Eine ESCAPE-Klausel legt ein Zeichen fest, das einen folgenden Platzhalter innerhalb eines LIKE-Musters als tatsächliches Zeichen interpretiert und so die Suche nach einem echten % oder _ ermöglicht.
Die ESCAPE-Klausel in LIKE 'SPRING!_%' ESCAPE '!' macht den Unterstrich nach SPRING zu einem tatsächlichen Zeichen.

F

FROM-Klausel
Die FROM-Klausel bezeichnet die Tabelle, die die Datensätze für eine einfache Abfrage liefert, sodass die ausgewählten Spalten daraus gelesen werden können.
Die FROM-Klausel in SELECT name, price FROM products; bezeichnet products als Quelle beider Felder.

G

Grenzwertprüfung
Eine Grenzwertprüfung prüft Werte genau am, knapp unter und knapp über einem Schwellenwert, um zu kontrollieren, ob die Abfrage den geforderten Einschluss beachtet.
Eine Grenzwertprüfung mit einem Gehalt von genau 60.000 unterscheidet „mindestens 60.000“ von einem strengen Größer-als-Filter.

H

halboffener Datumsbereich
Ein halboffener Datumsbereich schließt seine Anfangsgrenze ein und seine Endgrenze aus, häufig den Beginn des nächsten Tages oder Monats.
Ein halboffener Datumsbereich für März endet vor '2024-04-01' und behält dadurch späte Uhrzeiten am letzten Tag.

I

ILIKE
ILIKE ist der Operator von PostgreSQL zum Musterabgleich ohne Beachtung der Groß- und Kleinschreibung; er bietet eine datenbankspezifische Alternative zum gewöhnlichen LIKE.
Eine PostgreSQL-Suche mit name ILIKE '%desk%' kann Produktnamen finden, die den großgeschriebenen Text Desk enthalten.
IN
IN ist eine Zugehörigkeitsprüfung, die prüft, ob ein ganzer Wert einem Eintrag in einer geklammerten Liste erlaubter Werte entspricht.
department IN ('IT', 'Marketing') wählt alle Beschäftigten aus IT oder Marketing aus, ohne einen Abteilungsvergleich zu wiederholen.
IN-Liste
Eine IN-Liste ist eine durch Kommas getrennte Sammlung möglicher Übereinstimmungen innerhalb von Klammern; die Reihenfolge ihrer Einträge sortiert Abfrageergebnisse nicht.
Eine IN-Liste aus (6, 2, 2, 4) trifft trotz ihrer Reihenfolge und Wiederholung auf dieselben Beschäftigtendatensätze zu wie (2, 4, 6).
IS NOT DISTINCT FROM
IS NOT DISTINCT FROM ist ein Vergleich, der zwei NULL-Werte als gleich behandelt und Eingabewerte, die nicht NULL sind, wie ein gewöhnlicher Gleichheitsvergleich vergleicht.
SQLite und PostgreSQL bieten IS NOT DISTINCT FROM an, wenn ein Vergleich zwei Kennzeichnungen fehlender Werte als gleich behandeln soll.
IS NOT NULL
IS NOT NULL ist eine direkte Prüfung, die wahr ist, wenn eine Spalte einen vorhandenen Einzelwert enthält, einschließlich einer leeren Zeichenkette, wo diese sich von NULL unterscheidet.
Der Filter phone IS NOT NULL behält eine beschäftigte Person mit erfasster Telefonnummer, auch wenn deren Abteilung fehlt.
IS NULL
IS NULL ist eine direkte Prüfung auf einen fehlenden Einzelwert; anders als der Gleichheitsvergleich mit NULL ergibt sie eindeutig wahr oder falsch.
phone IS NULL findet die Beschäftigten, in deren Datensätzen kein Telefonwert erfasst ist.
ISO-Datumsformat
Das ISO-Datumsformat YYYY-MM-DD schreibt das Jahr vor Monat und Tag mit fester Länge, sodass Datumstext chronologisch sortiert werden kann.
Im ISO-Datumsformat schließt hire_date >= '2023-01-01' bei Vergleichen in Kalenderreihenfolge Beschäftigte ein, die an oder nach diesem Datum eingestellt wurden.

K

Klauselreihenfolge
Die Klauselreihenfolge ist die von SQL vorgeschriebene geschriebene Reihenfolge der Anweisungsteile, einschließlich WHERE vor ORDER BY und der anschließenden Zeilenbegrenzung.
Die vorgeschriebene Klauselreihenfolge setzt WHERE vor ORDER BY, sodass ihre Umkehrung einen Syntaxfehler erzeugt.

L

leere Zeichenkette
Eine leere Zeichenkette ist eine bekannte Zeichenkette mit null Zeichen, die als zwei aufeinanderfolgende einfache Anführungszeichen geschrieben wird; die meisten Datenbanken unterscheiden sie von NULL.
In SQLite prüft phone = '' auf eine leere Zeichenkette und findet keine fehlenden Telefonwerte von Beschäftigten.
LIKE
LIKE ist ein Operator zum Textabgleich, der einen ganzen Wert mit einem Muster aus tatsächlichen Zeichen und optionalen Platzhaltern vergleicht.
name LIKE '%Lamp%' findet jeden Produktnamen, der Lamp enthält, unabhängig davon, ob Lamp am Anfang, in der Mitte oder am Ende steht.
LIMIT
LIMIT ist eine Klausel zur Zeilenbegrenzung, die höchstens die angegebene Anzahl von Ergebniszeilen zurückgibt, ohne selbst eine Rangfolge zu wählen.
Ein Filter für Beschäftigte in Boston mit LIMIT 5 gibt nur zwei Zeilen zurück, wenn nur zwei Beschäftigte aus Boston die Bedingung erfüllen.
logische Verarbeitungsreihenfolge
Die logische Verarbeitungsreihenfolge ist das Modell, das ein Abfrageergebnis durch Lesen, Filtern, Auswählen, Entfernen von Duplikaten, Sortieren und Begrenzen erklärt.
Die logische Verarbeitungsreihenfolge entfernt wiederholte Städte, bevor ein LIMIT die Zeilen eines DISTINCT-Stadtergebnisses zählt.

N

nachrangiges Sortierkriterium
Ein nachrangiges Sortierkriterium ist eine spätere Sortierspalte, die bei gleichen früheren Sortierwerten herangezogen wird; ein eindeutiger letzter Wert macht die Reihenfolge eindeutig.
Wird employee_id nach der Stadt als nachrangiges Sortierkriterium ergänzt, entscheidet die ID, welche von mehreren Personen aus Chicago den letzten Platz einer Auswahlliste einnimmt.
NOT
NOT ist ein logischer Operator, der wahr in falsch und falsch in wahr umwandelt; eine unbekannte Bedingung lässt er in SQL unbekannt.
Die Verneinung von stock > 10 schließt ein Produkt mit fehlendem Lagerbestand nicht ein, weil die Bedingung für diese Zeile weiterhin unbekannt ergibt.
NOT BETWEEN
NOT BETWEEN ist die Verneinung einer einschließenden Bereichsprüfung; für einen Wert, der nicht NULL ist, behält sie Werte unterhalb der unteren oder oberhalb der oberen Grenze.
stock NOT BETWEEN 5 AND 40 behält ein Produkt mit Lagerbestand null und eines mit sechzig, schließt aber fehlende Lagerbestände aus.
NOT IN
NOT IN ist eine Ausschlussprüfung, die verlangt, dass sich ein Wert von jedem aufgeführten Eintrag unterscheidet; ein NULL in der Liste verhindert eine Übereinstimmung im WHERE-Filter.
city NOT IN ('Chicago', 'Denver') behält Beschäftigte in Boston, weil sich ihre Städte von beiden Einträgen unterscheiden.
NULL
NULL kennzeichnet einen fehlenden Wert, etwa unbekannte, nicht erfasste oder nicht anwendbare Daten, und unterscheidet sich von einer bekannten Null.
Hat ein Produkt den Lagerbestand NULL, sagt seine Zeile nichts über die aktuelle Anzahl der Stück im Lager aus.
NULLS LAST
NULLS LAST ist ein Zusatz zu ORDER BY, der fehlende Werte für die zugehörige Sortierspalte ausdrücklich nach erfassten Werten platziert.
department NULLS LAST setzt in aktuellen SQLite- und PostgreSQL-Abfragen Beschäftigte ohne erfasste Abteilung hinter die erfassten Abteilungen.
numerisches Literal
Ein numerisches Literal ist eine direkt in SQL geschriebene Zahl aus Ziffern und bei Bedarf einem Dezimalpunkt, ohne Währungsangabe.
Das numerische Literal 20.50 in price < 20.50 hat weder Anführungszeichen noch Tausendertrennzeichen oder Währungszeichen.

O

OFFSET
OFFSET ist eine Klausel zum Überspringen von Zeilen, die eine angegebene Anzahl von Ergebniszeilen verwirft, bevor die Zeilenbegrenzung die zurückzugebenden Zeilen zählt.
Bei absteigenden Gehältern überspringt LIMIT 3 OFFSET 3 die drei Personen mit den höchsten Gehältern und gibt die vierte, fünfte und sechste zurück.
Operatorrangfolge
Die Operatorrangfolge ist die Priorität für die Auswertung gemischter Operatoren ohne Klammern; unter den logischen Operatoren kommt NOT vor AND und danach OR.
Die Operatorrangfolge macht Klammern nötig, wenn eine Stadtanforderung für jede von zwei durch OR verbundenen Abteilungsalternativen gelten muss.
OR
OR ist ein logischer Operator, dessen Bedingung wahr ist, wenn mindestens eine der verbundenen Bedingungen wahr ist, auch wenn beide wahr sind.
Sales OR Chicago lässt Beschäftigte aus Sales in anderen Städten, Beschäftigte in Chicago aus anderen Abteilungen und Beschäftigte zu, die beides erfüllen.
ORDER BY
ORDER BY ist die Klausel, die Ergebniszeilen nach festgelegten Sortierwerten anordnet; ohne sie garantiert SQL keine Zeilenreihenfolge.
ORDER BY salary DESC setzt die Person mit dem höchsten Gehalt an die erste Stelle, ohne einen gespeicherten Beschäftigtendatensatz zu ändern.

P

primäre Sortierspalte
Eine primäre Sortierspalte ist das erste ORDER-BY-Feld und steuert die Hauptreihenfolge, bevor spätere Spalten gleiche Werte auflösen.
Die Stadt ist die primäre Sortierspalte in ORDER BY city, last_name und hält die Namen aus Boston vor denen aus Chicago.
Prozent-Platzhalter
Der Prozent-Platzhalter ist das Zeichen % innerhalb eines LIKE-Musters, wo es für eine beliebige Folge aus null oder mehr Zeichen steht.
Der Prozent-Platzhalter in 'Lamp%' erlaubt ein beliebiges Ende nach Lamp, einschließlich keines Endes beim Wert Lamp.

S

schrittweiser Abfrageaufbau
Beim schrittweisen Abfrageaufbau wird jeweils eine Bedingung hinzugefügt und geprüft. So lässt sich leichter erklären, welche Anforderung eine Zeile entfernt.
Beim schrittweisen Abfrageaufbau wird nach einer Abteilungsprüfung eine Telefonprüfung hinzugefügt, um zu zeigen, welche Beschäftigten die Telefonprüfung entfernt.
Seite
Eine Seite ist ein Ausschnitt eines Abfrageergebnisses; bei n Zeilen pro Seite überspringt Seite k die Zeilen der k − 1 vollständigen Seiten davor.
Bei drei Zeilen pro Seite verwendet die dritte Seite OFFSET 6 und zeigt in einer festen Gehaltsrangfolge die Zeilen nach der sechsten.
SELECT-Klausel
Die SELECT-Klausel benennt die Spalten, die in einem Abfrageergebnis angezeigt werden sollen, und legt die Reihenfolge dieser Ausgabespalten fest.
Die SELECT-Klausel in SELECT city, first_name FROM employees; setzt die Stadt vor den Vornamen der beschäftigten Person.
Sortierfolge
Eine Sortierfolge ist das Regelwerk zum Vergleichen und Anordnen von Text, einschließlich der Behandlung von Groß- und Kleinbuchstaben und Zeichen mit Akzenten.
Eine Sortierfolge, die Groß- und Kleinschreibung beachtet, unterscheidet 'Chicago' von 'chicago', sodass ein Filter für 'chicago' Zeilen mit gespeichertem Chicago nicht findet.
Sortierspalte
Eine Sortierspalte ist ein in ORDER BY genanntes Feld, das die Reihenfolge der Ergebniszeilen bestimmt; in einer gewöhnlichen SELECT-Abfrage muss es nicht angezeigt werden.
Das Gehalt kann die Sortierspalte sein, wenn die Ausgabe nur first_name zeigt und so eine Namensliste in Gehaltsreihenfolge entsteht.
SQL-Dialekt
Ein SQL-Dialekt ist die Variante der SQL-Syntax und des SQL-Verhaltens eines Datenbanksystems, einschließlich Unterschieden bei Zeilenbegrenzung, Textabgleich und Anführungszeichen.
Wechselt der SQL-Dialekt von SQLite zu SQL Server, braucht eine LIMIT-Abfrage stattdessen TOP oder OFFSET/FETCH.
SQL-Kommentar
Ein SQL-Kommentar ist erläuternder Text, der beim Ausführen einer Anweisung ignoriert wird; zwei Bindestriche beginnen einen Kommentar, der bis zum Zeilenende reicht.
Ein SQL-Kommentar nach -- kann erklären, warum ein Filter Beschäftigte ohne Zuweisung einschließt, ohne seine Bedingungen zu ändern.

T

Textliteral
Ein Textliteral ist ein Wert, der in SQL direkt innerhalb einfacher Anführungszeichen geschrieben wird; ein Apostroph innerhalb des Werts wird verdoppelt, um ihn zu erhalten.
Das Textliteral 'O''Neill' passt zum Nachnamen O’Neill, weil seine zwei aufeinanderfolgenden einfachen Anführungszeichen für einen Apostroph stehen.
TOP
TOP ist die SELECT-Syntax zur Zeilenbegrenzung in SQL Server. Sie wird mit ORDER BY verwendet, wenn eine Anfrage eine bestimmte Auswahl der höchsten oder ersten Zeilen verlangt.
SELECT TOP (3) kann eine mit LIMIT auf drei Zeilen begrenzte Auswahlliste ersetzen, wenn die Abfrage für SQL Server geschrieben wird.

U

unbekannter Wahrheitswert
Unbekannt ist der dritte Wahrheitswert von SQL. Er entsteht, wenn fehlende Daten einen eindeutigen Vergleich verhindern; WHERE lässt Zeilen mit diesem Wahrheitswert aus.
Ein fehlender Lagerbestand eines Produkts ergibt für stock > 10 einen unbekannten Wahrheitswert, sodass die Zeile den Filter nicht passiert.
Untergrenze
Eine Untergrenze ist der Wert am unteren Ende eines Bereichs und steht bei gewöhnlichem BETWEEN vor AND; das Umkehren der Grenzen vertauscht sie nicht.
Die Untergrenze 89,00 in price BETWEEN 89.00 AND 15.50 liegt über der Obergrenze, sodass keine Treffer bleiben.
Unterstrich-Platzhalter
Der Unterstrich-Platzhalter ist das Zeichen _ innerhalb eines LIKE-Musters, wo es für genau ein Zeichen an dieser Position steht.
Vier Unterstrich-Platzhalter passen auf Vornamen wie Emma und Hugo, weil jeder vier Zeichen hat.

V

Vergleichsoperator
Ein Vergleichsoperator prüft die Beziehung zwischen zwei Werten, etwa Gleichheit oder welcher größer ist, und ergibt einen Wahrheitswert.
Der Vergleichsoperator >= schließt bei salary >= 60000 eine Person mit genau 60.000 Gehalt ein, weil dieses Gehalt dem Schwellenwert entspricht.

W

WHERE-Klausel
Die WHERE-Klausel filtert Quelldatensätze anhand einer Bedingung und behält nur Zeilen, für die diese Bedingung wahr ergibt.
Die WHERE-Klausel WHERE salary < 50000 behält Beschäftigte mit einem Gehalt unter 50.000, auch wenn die Ausgabe ihre Gehälter nicht anzeigt.
WITH TIES
WITH TIES erweitert eine FETCH-Zeilenbegrenzung, wo unterstützt, um zusätzliche Zeilen, die in jedem ORDER-BY-Wert mit der Zeile an der Grenze übereinstimmen.
Mit ORDER BY city gibt FETCH FIRST 3 ROWS WITH TIES jede Zeile mit derselben Stadt wie die dritte Zeile zurück, nicht nur drei Zeilen.

Über diese Einheit

Von StudeliFehler melden

Erstelle deine eigenen Lernmaterialien

Mach aus deinen Notizen, Folien und Dokumenten Lernleitfäden, Übungsfragen, Karteikarten und 6 weitere Tools.

Jetzt starten