Zum Inhalt springen

SQL/Abfragen: Unterschied zwischen den Versionen

Aus Foxwiki
K Textersetzung - „700px“ durch „600px“
 
(5 dazwischenliegende Versionen desselben Benutzers werden nicht angezeigt)
Zeile 7: Zeile 7:
|- style="border-bottom: 1px solid #EEE;"
|- style="border-bottom: 1px solid #EEE;"
![[Entity-Relationship-Modell#ER-Diagramme|ER-Diagramm]]:
![[Entity-Relationship-Modell#ER-Diagramme|ER-Diagramm]]:
| colspan="4" |[[Datei:SQL-Beispiel.svg|700px|SQL-Beispiel]]
| colspan="4" |[[Datei:SQL-Beispiel.svg|600px|SQL-Beispiel]]
|-
|-
!Relationen:
!Relationen:
Zeile 59: Zeile 59:
<syntaxhighlight lang="sql">
<syntaxhighlight lang="sql">
SELECT *
SELECT *
  FROM Student;
FROM Student;
</syntaxhighlight>
</syntaxhighlight>
listet alle Spalten und alle Zeilen der Tabelle <code>Student</code> auf.
listet alle Spalten und alle Zeilen der Tabelle <code>Student</code> auf.
Zeile 75: Zeile 75:
|}
|}


===Abfrage mit Spaltenauswahl (<code>,</code>)===
=== Abfrage mit Spaltenauswahl ===
<code>,</code>
 
<syntaxhighlight lang="sql">
<syntaxhighlight lang="sql">
SELECT VorlNr,
SELECT VorlNr,
      Titel
    Titel
  FROM Vorlesung;
FROM Vorlesung;
</syntaxhighlight>
</syntaxhighlight>
listet die Spalten <code>VorlNr</code> und <code>Titel</code> aller Zeilen der Tabelle <code>Vorlesung</code> auf.
listet die Spalten <code>VorlNr</code> und <code>Titel</code> aller Zeilen der Tabelle <code>Vorlesung</code> auf.
Zeile 98: Zeile 100:
<syntaxhighlight lang="sql">
<syntaxhighlight lang="sql">
SELECT DISTINCT MatrNr
SELECT DISTINCT MatrNr
  FROM hoert;
FROM hoert;
</syntaxhighlight>
</syntaxhighlight>
listet nur unterschiedliche Einträge der Spalte <code>MatrNr</code> aus der Tabelle <code>hoert</code> auf. Dies zeigt die Matrikelnummern aller Studenten, die mindestens eine Vorlesung hören, wobei mehrfach auftretende Matrikelnummern nur einmal ausgegeben werden.
listet nur unterschiedliche Einträge der Spalte <code>MatrNr</code> aus der Tabelle <code>hoert</code> auf. Dies zeigt die Matrikelnummern aller Studenten, die mindestens eine Vorlesung hören, wobei mehrfach auftretende Matrikelnummern nur einmal ausgegeben werden.
Zeile 115: Zeile 117:
<syntaxhighlight lang="sql">
<syntaxhighlight lang="sql">
SELECT MatrNr AS Matrikelnummer,
SELECT MatrNr AS Matrikelnummer,
      Name
    Name
  FROM Student;
FROM Student;
</syntaxhighlight>
</syntaxhighlight>
listet die Spalten <code>MatrNr</code> und Name aller Zeilen der Tabelle <code>Student</code> auf. <code>MatrNr</code> wird beim Anzeigeergebnis als Matrikelnummer aufgeführt.
listet die Spalten <code>MatrNr</code> und Name aller Zeilen der Tabelle <code>Student</code> auf. <code>MatrNr</code> wird beim Anzeigeergebnis als Matrikelnummer aufgeführt.
Zeile 135: Zeile 137:
<syntaxhighlight lang="sql">
<syntaxhighlight lang="sql">
SELECT VorlNr,
SELECT VorlNr,
      Titel
    Titel
  FROM Vorlesung
FROM Vorlesung
  WHERE Titel = 'ET';
  WHERE Titel = 'ET';
</syntaxhighlight>
</syntaxhighlight>
listet <code>VorlNr</code> und <code>Titel</code> aller derjenigen Zeilen der Tabelle <code>Vorlesung</code> auf, deren Titel <code>ET</code> ist.
listet <code>VorlNr</code> und <code>Titel</code> aller derjenigen Zeilen der Tabelle <code>Vorlesung</code> auf, deren Titel <code>ET</code> ist.


Die solchermaßen strukturierte, häufig verwendete Anweisung wird nach den Anfangsbuchstaben auch als „SFW-Block“ bezeichnet.
Die solchermaßen strukturierte, häufig verwendete Anweisung wird nach den Anfangsbuchstaben auch als "SFW-Block" bezeichnet.


Ergebnis:
Ergebnis:
Zeile 154: Zeile 156:
<syntaxhighlight lang="sql">
<syntaxhighlight lang="sql">
SELECT Name
SELECT Name
  FROM Student
FROM Student
  WHERE Name LIKE 'F%';
  WHERE Name LIKE 'F%';
</syntaxhighlight>
</syntaxhighlight>
Zeile 173: Zeile 175:
===Abfrage mit Filter und Sortierung (<code>ORDER BY</code>)===
===Abfrage mit Filter und Sortierung (<code>ORDER BY</code>)===
<syntaxhighlight lang="sql">
<syntaxhighlight lang="sql">
  SELECT Vorname,
SELECT Vorname,
        Name,
    Name,
        StrasseNr,
    StrasseNr,
        Plz,
    Plz,
        Ort
    Ort
    FROM Student
  FROM Student
  WHERE Plz = '20095'
  WHERE Plz = '20095'
ORDER BY Name;
ORDER BY Name;
</syntaxhighlight>
</syntaxhighlight>
Zeile 187: Zeile 189:
<syntaxhighlight lang="sql">
<syntaxhighlight lang="sql">
SELECT Vorlesung.VorlNr,
SELECT Vorlesung.VorlNr,
      Vorlesung.Titel,
    Vorlesung.Titel,
      Professor.PersNr,
    Professor.PersNr,
      Professor.Name
    Professor.Name
  FROM Professor,
FROM Professor,
      Vorlesung
    Vorlesung
  WHERE Professor.PersNr = Vorlesung.PersNr;
  WHERE Professor.PersNr = Vorlesung.PersNr;
</syntaxhighlight>
</syntaxhighlight>
Zeile 197: Zeile 199:
Die Aufzählung hinter [[From (SQL)|<code>FROM</code>]] legt die Datenquellen fest: an dieser Stelle können mithilfe sogenannter [[Join (SQL)|<code>JOIN</code>s]] mehrere Tabellen miteinander verknüpft werden, sodass Daten aus verschiedenen Tabellen zusammengeführt und angezeigt werden.
Die Aufzählung hinter [[From (SQL)|<code>FROM</code>]] legt die Datenquellen fest: an dieser Stelle können mithilfe sogenannter [[Join (SQL)|<code>JOIN</code>s]] mehrere Tabellen miteinander verknüpft werden, sodass Daten aus verschiedenen Tabellen zusammengeführt und angezeigt werden.


In diesem Beispiel wird ein „innerer natürlicher Verbund“ (<code>NATURAL INNER JOIN</code>) verwendet: Alle Datensätze aus den Tabellen <code>Professor</code> und <code>Vorlesung</code>, die den gleichen Wert im Feld <code>PersNr</code> haben. <code>Professor</code>en ohne <code>Vorlesung</code> und <code>Vorlesung</code>en ohne <code>Professor</code> werden damit nicht angezeigt.
In diesem Beispiel wird ein "innerer natürlicher Verbund" (<code>NATURAL INNER JOIN</code>) verwendet: Alle Datensätze aus den Tabellen <code>Professor</code> und <code>Vorlesung</code>, die den gleichen Wert im Feld <code>PersNr</code> haben. <code>Professor</code>en ohne <code>Vorlesung</code> und <code>Vorlesung</code>en ohne <code>Professor</code> werden damit nicht angezeigt.


Dies ist äquivalent zu:
Dies ist äquivalent zu:


<syntaxhighlight lang="sql">
<syntaxhighlight lang="sql">
    SELECT Vorlesung.VorlNr,
  SELECT Vorlesung.VorlNr,
          Vorlesung.Titel,
      Vorlesung.Titel,
          Professor.PersNr,
      Professor.PersNr,
          Professor.Name
      Professor.Name
      FROM Professor
  FROM Professor
INNER JOIN Vorlesung
INNER JOIN Vorlesung
        ON Professor.PersNr = Vorlesung.PersNr;
    ON Professor.PersNr = Vorlesung.PersNr;
</syntaxhighlight>
</syntaxhighlight>


Zeile 217: Zeile 219:
<syntaxhighlight lang="sql">
<syntaxhighlight lang="sql">
SELECT Vorlesung.Titel,
SELECT Vorlesung.Titel,
      Professor.Name
    Professor.Name
  FROM Professor,
FROM Professor,
      Vorlesung
    Vorlesung
  WHERE Professor.Name <> Vorlesung.Titel
  WHERE Professor.Name <> Vorlesung.Titel
</syntaxhighlight>
</syntaxhighlight>


Das Ergebnis erhält die Kombinationen ''aller'' <code>Professor</code>en und ''aller'' <code>Vorlesung</code>en, wo der Name des <code>Professor</code>s vom Titel der <code>Vorlesung</code> ''abweicht''&nbsp;das sind einfach alle (keine <code>Vorlesung</code> heißt wie ein <code>Professor</code>):
Das Ergebnis erhält die Kombinationen ''aller'' <code>Professor</code>en und ''aller'' <code>Vorlesung</code>en, wo der Name des <code>Professor</code>s vom Titel der <code>Vorlesung</code> ''abweicht''&nbsp;- das sind einfach alle (keine <code>Vorlesung</code> heißt wie ein <code>Professor</code>):
{| class="wikitable"
{| class="wikitable"
|-
|-
Zeile 249: Zeile 251:
===Linker äußerer Verbund (<code>LEFT OUTER JOIN</code>)===
===Linker äußerer Verbund (<code>LEFT OUTER JOIN</code>)===
<syntaxhighlight lang="sql">
<syntaxhighlight lang="sql">
        SELECT Professor.PersNr,
    SELECT Professor.PersNr,
                Professor.Name,
        Professor.Name,
                Vorlesung.VorlNr,
        Vorlesung.VorlNr,
                Vorlesung.Titel
        Vorlesung.Titel
          FROM Professor
      FROM Professor
LEFT OUTER JOIN Vorlesung
LEFT OUTER JOIN Vorlesung
            ON Professor.PersNr = Vorlesung.PersNr;
      ON Professor.PersNr = Vorlesung.PersNr;
</syntaxhighlight>
</syntaxhighlight>
ergibt alle Datensätze der Tabelle <code>Professor</code> verbunden mit den Datensätzen der Tabelle <code>Vorlesung</code>, die den jeweils gleichen Wert im Feld <code>PersNr</code> haben. <code>Professor</code>en ohne Vorlesung sind enthalten, die <code>Vorlesung</code>sspalten im Ergebnis haben dann den Wert <code>NULL</code>. <code>Vorlesung</code>en ohne <code>Professor</code> sind nicht enthalten.
ergibt alle Datensätze der Tabelle <code>Professor</code> verbunden mit den Datensätzen der Tabelle <code>Vorlesung</code>, die den jeweils gleichen Wert im Feld <code>PersNr</code> haben. <code>Professor</code>en ohne Vorlesung sind enthalten, die <code>Vorlesung</code>sspalten im Ergebnis haben dann den Wert <code>NULL</code>. <code>Vorlesung</code>en ohne <code>Professor</code> sind nicht enthalten.
Zeile 262: Zeile 264:


<syntaxhighlight lang="sql">
<syntaxhighlight lang="sql">
        SELECT Professor.PersNr,
    SELECT Professor.PersNr,
                Professor.Name
        Professor.Name
          FROM Professor
      FROM Professor
LEFT OUTER JOIN Vorlesung
LEFT OUTER JOIN Vorlesung
            ON Professor.PersNr = Vorlesung.PersNr
      ON Professor.PersNr = Vorlesung.PersNr
          WHERE Vorlesung.PersNr IS NULL;
    WHERE Vorlesung.PersNr IS NULL;
</syntaxhighlight>
</syntaxhighlight>


Zeile 274: Zeile 276:
<syntaxhighlight lang="sql">
<syntaxhighlight lang="sql">
SELECT Professor.PersNr,
SELECT Professor.PersNr,
      Professor.Name
    Professor.Name
  FROM Professor
FROM Professor
  WHERE NOT EXISTS (SELECT *
  WHERE NOT EXISTS (SELECT *
                    FROM Vorlesung
          FROM Vorlesung
                    WHERE PersNr = Professor.PersNr);
          WHERE PersNr = Professor.PersNr);
</syntaxhighlight>
</syntaxhighlight>


===Gruppierung mit Aggregat-Funktionen (<code>GROUP BY</code>)===
===Gruppierung mit Aggregat-Funktionen (<code>GROUP BY</code>)===
<syntaxhighlight lang="sql">
<syntaxhighlight lang="sql">
        SELECT Professor.PersNr,
    SELECT Professor.PersNr,
                Professor.Name,
        Professor.Name,
                COUNT(Vorlesung.PersNr) AS Anzahl
        COUNT(Vorlesung.PersNr) AS Anzahl
          FROM Professor
      FROM Professor
LEFT OUTER JOIN Vorlesung
LEFT OUTER JOIN Vorlesung
            ON Professor.PersNr = Vorlesung.PersNr
      ON Professor.PersNr = Vorlesung.PersNr
      GROUP BY Professor.Name,
    GROUP BY Professor.Name,
                Professor.PersNr;
        Professor.PersNr;
</syntaxhighlight>
</syntaxhighlight>
zählt die Anzahl der <code>Vorlesungen</code> pro <code>Professor</code> mit Hilfe der [[Aggregation (Informatik)|Aggregat]]-Funktion <code>COUNT</code>.
zählt die Anzahl der <code>Vorlesungen</code> pro <code>Professor</code> mit Hilfe der [[Aggregation (Informatik)|Aggregat]]-Funktion <code>COUNT</code>.

Aktuelle Version vom 20. Juni 2026, 18:26 Uhr

SQL/Abfrage

Beschreibung

Die grundlegenden Befehle und Begriffe werden anhand des folgenden Beispiels erklärt:

ER-Diagramm: SQL-Beispiel
Relationen:
Student
MatrNr Name
26120 Fichte
25403 Jonas
27103 Fauler
hoert
MatrNr VorlNr
25403 5001
26120 5001
26120 5045
Vorlesung
VorlNr Titel PersNr
5001 ET 15
5022 IT 12
5045 DB 12
Professor
PersNr Name
12 Wirth
15 Tesla
20 Urlauber

Einfache Abfrage

SELECT *
 FROM Student;

listet alle Spalten und alle Zeilen der Tabelle Student auf.

Ergebnis:

MatrNr Name
26120 Fichte
25403 Jonas
27103 Fauler

Abfrage mit Spaltenauswahl

,

SELECT VorlNr,
    Titel
 FROM Vorlesung;

listet die Spalten VorlNr und Titel aller Zeilen der Tabelle Vorlesung auf.

Ergebnis:

VorlNr Titel
5001 ET
5022 IT
5045 DB

Abfrage mit eindeutigen Werten (DISTINCT)

SELECT DISTINCT MatrNr
 FROM hoert;

listet nur unterschiedliche Einträge der Spalte MatrNr aus der Tabelle hoert auf. Dies zeigt die Matrikelnummern aller Studenten, die mindestens eine Vorlesung hören, wobei mehrfach auftretende Matrikelnummern nur einmal ausgegeben werden.

Ergebnis:

MatrNr
25403
26120

Abfrage mit Umbenennung (AS)

SELECT MatrNr AS Matrikelnummer,
    Name
 FROM Student;

listet die Spalten MatrNr und Name aller Zeilen der Tabelle Student auf. MatrNr wird beim Anzeigeergebnis als Matrikelnummer aufgeführt.

Ergebnis:

Matrikelnummer Name
26120 Fichte
25403 Jonas
27103 Fauler

Abfrage mit Filter (WHERE)

SELECT VorlNr,
    Titel
 FROM Vorlesung
 WHERE Titel = 'ET';

listet VorlNr und Titel aller derjenigen Zeilen der Tabelle Vorlesung auf, deren Titel ET ist.

Die solchermaßen strukturierte, häufig verwendete Anweisung wird nach den Anfangsbuchstaben auch als "SFW-Block" bezeichnet.

Ergebnis:

VorlNr Titel
5001 ET

Abfrage mit Filter nach Inhalt (WHERE ... LIKE ...)

SELECT Name
 FROM Student
 WHERE Name LIKE 'F%';

listet die Namen aller Studenten auf, deren Name mit F beginnt (im Beispiel: Fichte und Fauler).

LIKE kann mit verschiedenen Platzhaltern verwendet werden: _ steht für ein einzelnes beliebiges Zeichen, % steht für eine beliebige Zeichenfolge. Manche Datenbanksysteme bieten weitere solche Wildcard-Zeichen an, etwa für Zeichenmengen.

Ergebnis:

Name
Fichte
Fauler

Abfrage mit Filter und Sortierung (ORDER BY)

 SELECT Vorname,
     Name,
     StrasseNr,
     Plz,
     Ort
  FROM Student
  WHERE Plz = '20095'
ORDER BY Name;

listet Vorname, Name, StrasseNr, Plz und Ort aller Studenten aus dem angegebenen Postleitzahlbereich aufsteigend sortiert nach Name auf.

Abfrage mit verknüpften Tabellen (, und INNER JOIN)

SELECT Vorlesung.VorlNr,
    Vorlesung.Titel,
    Professor.PersNr,
    Professor.Name
 FROM Professor,
    Vorlesung
 WHERE Professor.PersNr = Vorlesung.PersNr;

Die Aufzählung hinter FROM legt die Datenquellen fest: an dieser Stelle können mithilfe sogenannter JOINs mehrere Tabellen miteinander verknüpft werden, sodass Daten aus verschiedenen Tabellen zusammengeführt und angezeigt werden.

In diesem Beispiel wird ein "innerer natürlicher Verbund" (NATURAL INNER JOIN) verwendet: Alle Datensätze aus den Tabellen Professor und Vorlesung, die den gleichen Wert im Feld PersNr haben. Professoren ohne Vorlesung und Vorlesungen ohne Professor werden damit nicht angezeigt.

Dies ist äquivalent zu:

  SELECT Vorlesung.VorlNr,
      Vorlesung.Titel,
      Professor.PersNr,
      Professor.Name
   FROM Professor
INNER JOIN Vorlesung
    ON Professor.PersNr = Vorlesung.PersNr;

Vorsicht: Nicht alle Implementierungen verstehen beide Schreibweisen, die Oracle-Schreibweise FROM Professor, Vorlesung gilt als veraltet und ist weniger verbreitet. Sie entspricht auch nicht dem ANSI-Standard und sollte deshalb vermieden werden. Aus historischen Gründen ist sie jedoch noch häufig anzutreffen.

Tabellen können nicht nur über Schlüsselfelder, sondern über beliebige Felder miteinander verknüpft werden, wie das folgende, fachlich unsinnige Beispiel zeigt:

SELECT Vorlesung.Titel,
    Professor.Name
 FROM Professor,
    Vorlesung
 WHERE Professor.Name <> Vorlesung.Titel

Das Ergebnis erhält die Kombinationen aller Professoren und aller Vorlesungen, wo der Name des Professors vom Titel der Vorlesung abweicht - das sind einfach alle (keine Vorlesung heißt wie ein Professor):

Titel Name
ET Tesla
ET Wirth
ET Urlauber
IT Tesla
IT Wirth
IT Urlauber
DB Tesla
DB Wirth
DB Urlauber

Linker äußerer Verbund (LEFT OUTER JOIN)

     SELECT Professor.PersNr,
        Professor.Name,
        Vorlesung.VorlNr,
        Vorlesung.Titel
      FROM Professor
LEFT OUTER JOIN Vorlesung
       ON Professor.PersNr = Vorlesung.PersNr;

ergibt alle Datensätze der Tabelle Professor verbunden mit den Datensätzen der Tabelle Vorlesung, die den jeweils gleichen Wert im Feld PersNr haben. Professoren ohne Vorlesung sind enthalten, die Vorlesungsspalten im Ergebnis haben dann den Wert NULL. Vorlesungen ohne Professor sind nicht enthalten.

Die folgende Abfrage liefert nur diejenigen Datensätze, zu denen kein passender Datensatz im linken äußeren Verbund existiert (alle Professoren, die keine Vorlesungen halten):

     SELECT Professor.PersNr,
        Professor.Name
      FROM Professor
LEFT OUTER JOIN Vorlesung
       ON Professor.PersNr = Vorlesung.PersNr
     WHERE Vorlesung.PersNr IS NULL;

Das Gleiche kann mittels einer Unterabfrage erreicht werden:

SELECT Professor.PersNr,
    Professor.Name
 FROM Professor
 WHERE NOT EXISTS (SELECT *
           FROM Vorlesung
          WHERE PersNr = Professor.PersNr);

Gruppierung mit Aggregat-Funktionen (GROUP BY)

     SELECT Professor.PersNr,
        Professor.Name,
        COUNT(Vorlesung.PersNr) AS Anzahl
      FROM Professor
LEFT OUTER JOIN Vorlesung
       ON Professor.PersNr = Vorlesung.PersNr
    GROUP BY Professor.Name,
        Professor.PersNr;

zählt die Anzahl der Vorlesungen pro Professor mit Hilfe der Aggregat-Funktion COUNT.

Bemerkung: COUNT(Professor.PersNr) oder COUNT(*) wären falsch (NULL-Werte sollen nicht mitgezählt werden).

Zusammenfassung eines SELECT

Zusammengefasst kann man die wichtigsten Elemente einer SQL-SELECT-Abfrage etwa so beschreiben:

SELECT [DISTINCT] Auswahlliste [AS Spaltenalias]
FROM Quelle [ [AS] Tabellenalias], evtl. mit JOIN-Verknüpfungen
[WHERE Where-Klausel]
[GROUP BY ein oder mehrere Group-by-Attribute]
[HAVING Having-Klausel]
[ORDER BY ein oder mehrere Sortierungsattribute mit [ASC|DESC]];

Erläuterung:

  • DISTINCT: Gibt an, dass aus der Ergebnisrelation gleiche Ergebnistupel entfernt werden sollen. Es wird also jeder Datensatz nur einmal ausgegeben, auch wenn er mehrfach in der Tabelle vorkommt. Sonst liefert SQL eine Multimenge zurück.
  • Auswahlliste: Bestimmt, welche Spalten der Quelle auszugeben sind (* für alle) und ob Aggregatsfunktionen anzuwenden sind. Wie bei allen anderen Aufzählungen werden die einzelnen Elemente mit Komma (,) voneinander getrennt.
  • Quelle: Gibt an, wo die Daten herkommen. Es können Relationen und Sichten angegeben werden und miteinander als kartesisches Produkt oder als Verbund (JOIN, ab SQL-92) verknüpft werden. Mit der zusätzlichen Angabe eines Namens können Relationen für die Abfrage umbenannt werden (vgl. Beispiele).
  • WHERE-Klausel: bestimmt Bedingungen, auch Filter genannt, unter denen die Daten ausgegeben werden sollen. In SQL ist hier auch die Angabe von Unterabfragen möglich, so dass SQL streng relational vollständig wird.
  • GROUP BY-Attribut: Legt fest, ob unterschiedliche Werte als einzelne Zeilen ausgegeben werden sollen (GROUP BY = Gruppierung) oder aber die Feldwerte der Zeilen durch Aggregationen wie Addition (SUM), Durchschnitt (AVG), Minimum (MIN), Maximum (MAX) zu einem Ergebniswert zusammengefasst werden, der sich auf die Gruppierung bezieht.
  • Having-Klausel: Ist wie die WHERE-Klausel, nur dass sich die angegebene Bedingung auf das Ergebnis einer Aggregationsfunktion bezieht, zum Beispiel HAVING SUM (Betrag) > 0.
  • Sortierungsattribut: nach ORDER BY werden Attribute angegeben, nach denen sortiert werden soll. Die Standardvoreinstellung ist ASC, das bedeutet aufsteigende Sortierung, DESC ist absteigende Sortierung.

Mengenoperatoren können auf mehrere SELECT-Abfragen angewandt werden, die gleich viele Attribute haben und bei denen die Datentypen der Attribute übereinstimmen:

  • UNION: Vereinigt die Ergebnismengen. In einigen Implementierungen werden mehrfach vorkommende Ergebnistupel wie bei DISTINCT entfernt, ohne dass UNION DISTINCT geschrieben werden muss beziehungsweise darf.
  • UNION ALL: Vereinigt die Ergebnismengen. Mehrfach vorkommende Ergebnistupel bleiben erhalten. Einige Implementierungen interpretieren aber UNION wie UNION ALL und verstehen das ALL möglicherweise nicht und geben eine Fehlermeldung aus.
  • EXCEPT: Liefert die Tupel, die in einer ersten, jedoch nicht in einer zweiten Ergebnismenge enthalten sind. Mehrfach vorkommende Ergebnistupel werden entfernt.
  • MINUS: Ein analoger Operator wie EXCEPT, der von manchen SQL-Dialekten alternativ benutzt wird.
  • INTERSECT: Liefert die Schnittmenge zweier Ergebnismengen. Mehrfach vorkommende Ergebnistupel werden entfernt.