Vergleichsoperatoren Tutorial

Vergleichsoperatoren

In SQL gibt es, um Abfragen zu vereinfachen, zusätzlich zu den bereits kennen gelernten Operatoren, noch weiter Operatoren, die im WHERE verwendet werden können. Diese Operatoren sind vor allem bei der Verwendung von Unterabfragen oft sinnvoll. Vier wichtige Operatoren sind:

  • IN
  • ANY/SOME
  • ALL
  • EXISTS


Der IN Operator gibt alle Einträge zurück, bei denen das gesuchte Merkmal in einer Menge von Werten vorkommt. Werden zum Beispiel alle Kunden mit dem Nachnamen "Berger", "Evans" oder "Hill" gesucht, würde die Abfrage dazu folgendermaßen aussehen:

SELECT *
FROM Customer
WHERE LastName IN ('Berger', 'Evans', 'Hill');

Die Ausgabe dieser Abfrage:



Der ANY Operator dient dazu, um abzufragen, ob die gewünschte Bedingung auf IRGENDEIN Ergebnis der Unterabfrage zutrifft. Dagegen dient der ALL Operator dazu, abzufragen, ob die gewünschte Bedingung auf ALLE Ergebnisse der Unterabfrage zutrifft. Wichtig ist dabei, zu beachten, dass die Unterabfragen als Ergebnis nur eine Spalte liefern darf.

Sollte man alle Artikel abfragen wollen, deren Gewicht kleiner als 10 ist, und die trotzdem einen höheren Preis als irgendein Artikel, der schwerer als 300 ist, hat, wäre die SQL-Abfrage folgende:

SELECT *
FROM Article
WHERE Weight < 10
AND Price > ANY (SELECT Price
FROM Article
WHERE Weight > 300);

Der Operator SOME ist äquivalent zu ANY, das heißt, statt ANY könnte man auch SOME angeben. Wäre die Aufgabestellung aber, alle Artikel auszugeben, die leichter als 10 sind, und trotzdem teurer als ALLE Artikel, die schwerer als 300 sind, so wäre die Abfrage folgende:

SELECT *
FROM Article
WHERE Weight < 10
AND Price > ALL (SELECT Price
FROM Article
WHERE Weight > 300);

Der EXISTS Operator ist vor allem dann sinnvoll, wenn in der Unterabfrage auf die äußere Abfrage zugegriffen wird. Er überprüft, ob die Unterabfrage überhaupt einen Eintrag liefert oder nur eine leere Tabelle. Ein Beispiel dafür ist folgendes:

SELECT *
FROM Article
WHERE EXISTS (SELECT *
FROM OrderArticle
WHERE ArticleId = Article.Id);

Hier wird in der Unterabfrage auf die Artikel ID der äußeren Abfrage zugegriffen, und so geprüft, ob dieser Artikel schon irgendwann einmal bestellt worden ist. Somit gibt die Abfrage letztendlich alle Artikel aus, die schon irgendwann einmal bestellt worden sind. Diese Operatoren können auch mit NOT verwendet werden, um die Evaluierung zu true oder false umzukehren, um zum Beispiel alle Artikel auszugeben, die noch nie bestellt worden sind:

SELECT *
FROM Article
WHERE NOT EXISTS (SELECT *
FROM OrderArticle
WHERE ArticleId = Article.Id);