Mengenoperatoren

Mengenoperatoren ermöglichen das Kombinieren von Abfragen.

Unter diesem Thema:

Allgemeine Syntax

[ ( ] <query> [ ) ] { INTERSECT | { MINUS | EXCEPT } | UNION [ ALL ] } [ ( ] <query> [ ) ]
[ ORDER BY ... ]
[ LIMIT ... ]

Allgemeine Nutzungshinweise

  • Jede Abfrage kann selbst Abfrageoperatoren enthalten, damit sich beliebig viele Abfrageausdrücke mit Mengenoperatoren kombinieren lassen.

  • Die Klauseln ORDER BY und LIMIT / FETCH werden auf das Ergebnis des Mengenoperators angewendet.

  • Bei Verwendung dieser Operatoren:

    • Stellen Sie sicher, dass für jede Abfrage die gleiche Anzahl von Spalten ausgewählt ist.

    • Stellen Sie sicher, dass die Datentypen der einzelnen Spalten in allen Zeilen der verschiedenen Quellen konsistent sind. Eines der Beispiele im Abschnitt Beispiele veranschaulicht das mögliche Problem und die entsprechende Lösung, wenn Datentypen nicht übereinstimmen.

    • Im Allgemeinen sollten die „Bedeutungen“ sowie die Datentypen der Spalten übereinstimmen. Folgendes führt nicht zu den gewünschten Ergebnissen:

      SELECT LastName, FirstName FROM employees
      UNION ALL
      SELECT FirstName, LastName FROM contractors;
      

      Das Fehlerrisiko erhöht sich, wenn mit dem Sternchen alle Spalten einer Tabelle ausgewählt werden. Beispiel:

      SELECT * FROM table1
      UNION ALL
      SELECT * FROM table2;
      

      Wenn die Anzahl der Spalten in den Tabellen gleich ist, die Spalten jedoch nicht in derselben Reihenfolge angeordnet sind, werden die Abfrageergebnisse wahrscheinlich fehlerhaft ausfallen.

    • Die Namen der Ausgabespalten basieren auf den Namen der Spalten der ersten Abfrage. Beispielsweise verhält sich die folgende Abfrage

      SELECT LastName, FirstName FROM employees
      UNION ALL
      SELECT FirstName, LastName FROM contractors;
      

      so, als lautete sie:

      SELECT LastName, FirstName FROM employees
      UNION ALL
      SELECT FirstName AS LastName, LastName AS FirstName FROM contractors;
      

INTERSECT

Gibt Zeilen mit Duplikatlöschung aus dem Resultset einer Abfrage zurück, die auch im Resultset einer anderen Abfrage erscheinen.

Syntax

SELECT ...
INTERSECT
SELECT ...

MINUS , EXCEPT

Entfernt Zeilen aus dem Resultset einer Abfrage, die im Resultset einer anderen Abfrage erscheinen, durch Duplikatlöschung.

Die Schlüsselwörter MINUS und EXCEPT haben dieselbe Bedeutung und können austauschbar verwendet werden.

Syntax

SELECT ...
MINUS
SELECT ...

SELECT ...
EXCEPT
SELECT ...

UNION [ ALL ]

Kombiniert die Resultsets aus zwei Abfragen:

  • UNION kombiniert mit doppelter Löschung.

  • UNION ALL kombiniert ohne doppelte Löschung.

Der Standardwert ist UNION (d. h. Löschen von Duplikaten).

Syntax

SELECT ...
UNION [ ALL ]
SELECT ...

Beispiele

In diesem Beispiel wird die grundlegende Verwendung des Operators UNION veranschaulicht. Es zeigt auch ein mögliches Problem, wenn Datentypen nicht übereinstimmen, und bietet dann die Lösung.

Erstellen Sie zunächst die Tabellen, und fügen Sie einige Daten ein:

CREATE TABLE t1 (v VARCHAR);
CREATE TABLE t2 (i INTEGER);
INSERT INTO t1 (v) VALUES ('Adams, Douglas');
INSERT INTO t2 (i) VALUES (42);

Führen Sie eine UNION-Operation mit verschiedenen Datentypen aus:

SELECT v FROM t1    -- VARCHAR
UNION
SELECT i FROM t2    -- INTEGER
;

Ausgabe:

100038 (22018): Numeric value 'Adams, Douglas' is not recognized

Verwenden Sie jetzt die explizite Umwandlung, um die Eingaben in einen kompatiblen Typ zu konvertieren:

SELECT v::VARCHAR FROM t1
UNION
SELECT i::VARCHAR FROM t2;

Ausgabe:

+----------------+
| V::VARCHAR     |
|----------------|
| Adams, Douglas |
| 42             |
+----------------+