In MariaDB ist das EXCEPT
-Operator gibt Zeilen aus der linken Eingabeabfrage zurück, die nicht von der rechten Eingabeabfrage ausgegeben werden.
Anders ausgedrückt gibt es alle Zeilen aus dem linken SELECT
zurück Ergebnismenge außer Zeilen, die sich im rechten SELECT
befinden Ergebnismenge.
Syntax
Die offizielle Syntax lautet wie folgt:
SELECT ...
(INTERSECT [ALL | DISTINCT] | EXCEPT [ALL | DISTINCT] | UNION [ALL | DISTINCT]) SELECT ...
[(INTERSECT [ALL | DISTINCT] | EXCEPT [ALL | DISTINCT] | UNION [ALL | DISTINCT]) SELECT ...]
[ORDER BY [column [, column ...]]]
[LIMIT {[offset,] row_count | row_count OFFSET offset}]
Das Obige schließt auch den INTERSECT
ein und UNION
Operatoren in der Syntax, da für diese Operatoren dieselbe Syntax gilt.
Ab MariaDB 10.4.0 können Klammern verwendet werden, um die Priorität anzugeben.
Beispiel
Angenommen, wir haben die folgenden Tabellen:
SELECT * FROM Teachers;
SELECT * FROM Students;
Ergebnis:
+-----------+-------------+ | TeacherId | TeacherName | +-----------+-------------+ | 1 | Warren | | 2 | Ben | | 3 | Cathy | | 4 | Cathy | | 5 | Bill | | 6 | Bill | +-----------+-------------+ +-----------+-------------+ | StudentId | StudentName | +-----------+-------------+ | 1 | Faye | | 2 | Jet | | 3 | Spike | | 4 | Ein | | 5 | Warren | | 6 | Bill | +-----------+-------------+
Wir können den EXCEPT
verwenden Operator, um Lehrer zurückzugeben, die nicht gleichzeitig Schüler sind:
SELECT TeacherName FROM Teachers
EXCEPT
SELECT StudentName FROM Students;
Ergebnis:
+-------------+ | TeacherName | +-------------+ | Ben | | Cathy | +-------------+
Wir erhalten also nur Werte, die in Teachers
vorkommen Tabelle, die nicht auch in den Students
erscheinen Tisch.
Standardmäßig werden unterschiedliche Zeilen zurückgegeben, sodass für Cathy
nur eine Zeile zurückgegeben wird , obwohl es zwei Lehrer mit diesem Namen gibt. Dieses Verhalten können wir ändern – dazu später mehr.
Wir können es auch umstellen und die Students
einfügen Tisch links und Teachers
rechts.
SELECT StudentName FROM Students
EXCEPT
SELECT TeacherName FROM Teachers;
Ergebnis:
+-------------+ | StudentName | +-------------+ | Faye | | Jet | | Spike | | Ein | +-------------+
Es ist möglich, das gleiche Ergebnis zu erhalten, ohne EXCEPT
zu verwenden Operator. Zum Beispiel könnten wir unser erstes Beispiel so umschreiben:
SELECT
DISTINCT TeacherName
FROM Teachers t
WHERE NOT EXISTS (SELECT StudentName FROM Students s
WHERE t.TeacherName = s.StudentName);
Ergebnis:
+-------------+ | TeacherName | +-------------+ | Ben | | Cathy | +-------------+
Wohlgemerkt, die EXCEPT
Operator hilft, den Code ganz erheblich zu vereinfachen.
Duplikate einschließen
Standardmäßig ist die EXCEPT
Operator wendet implizit ein DISTINCT
an Betrieb. Mit anderen Worten, es gibt standardmäßig nur eindeutige Werte zurück.
Vor MariaDB 10.5.0 war der implizite DISTINCT
war unsere einzige Option – wir konnten ALL
nicht angeben . MariaDB 10.5.0 hat jedoch den EXCEPT ALL
eingeführt und EXCEPT DISTINCT
Syntax.
Das bedeutet, dass wir jetzt Abfragen wie diese durchführen können:
SELECT TeacherName FROM Teachers
EXCEPT ALL
SELECT StudentName FROM Students;
Ergebnis:
+-------------+ | TeacherName | +-------------+ | Cathy | | Ben | | Cathy | | Bill | +-------------+
Dieses Mal haben wir vier Zeilen statt der zwei, die wir in unserem ersten Beispiel bekommen haben.
Wir können sehen, dass beide Cathys zurückgegeben wurden und nicht nur eine wie in unserem ersten Beispiel.
Was Bill angeht? Es gibt zwei Rechnungen in den Teachers
Tabelle, aber hier wird nur eine zurückgegeben. Das liegt wahrscheinlich daran, dass es eine Rechnung in den Students
gibt Tabelle, die eine der Rechnungen aus unseren Ergebnissen ausschließen würde.
Und hier ist ein Beispiel, das ausdrücklich den DISTINCT
verwendet Betreiber:
SELECT TeacherName FROM Teachers
EXCEPT DISTINCT
SELECT StudentName FROM Students;
Ergebnis:
+-------------+ | TeacherName | +-------------+ | Ben | | Cathy | +-------------+
Wie erwartet erhalten wir das gleiche Ergebnis, das wir erhalten würden, wenn wir DISTINCT
entfernen würden Betreiber.
In MariaDB 10.6.1 MINUS
wurde als Synonym für EXCEPT
eingeführt . Daher können wir MINUS
verwenden statt EXCEPT
in MariaDB 10.6.1 und höher.