In MariaDB ist das MINUS
-Operator gibt unterschiedliche Zeilen aus der linken Eingabeabfrage zurück, die nicht von der rechten Eingabeabfrage ausgegeben werden.
Das MINUS
Operator wurde in MariaDB 10.6.1 als Synonym für EXCEPT
eingeführt Operator zum Zweck der Kompatibilität mit Oracle. Daher können wir MINUS
verwenden und EXCEPT
austauschbar (in MariaDB 10.6.1 und höher).
Allerdings habe ich festgestellt, dass das MINUS
Operator funktioniert nur, wenn mein sql_mode = "oracle"
. Obwohl dies in der Dokumentation von MariaDB nicht explizit erwähnt wird, ist es in der Aufgabe zum Implementieren des MINUS
impliziert Operator in MariaDB.
Beispieldaten
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 das MINUS
verwenden Betreiber, um Lehrer zurückzugeben, die nicht gleichzeitig Schüler sind.
Legen Sie sql_mode
fest zu Oracle
Bevor wir anfangen, den MINUS
zu verwenden Operator, setzen wir unseren sql_mode
zu oracle
:
SET sql_mode = "oracle";
OK, jetzt können wir weitermachen und den MINUS
verwenden Betreiber.
Beispiel für MINUS
SELECT TeacherName FROM Teachers
MINUS
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
MINUS
SELECT TeacherName FROM Teachers;
Ergebnis:
+-------------+ | StudentName | +-------------+ | Faye | | Jet | | Spike | | Ein | +-------------+
Es ist möglich, das gleiche Ergebnis zu erhalten, ohne den MINUS
zu verwenden (oder EXCEPT
) 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 | +-------------+
Duplikate einschließen
Standardmäßig ist das MINUS
Operator wendet implizit ein DISTINCT
an Betrieb. Mit anderen Worten, es gibt standardmäßig nur eindeutige Werte zurück. Aber wir können MINUS ALL
angeben um Duplikate in das Ergebnis aufzunehmen:
SELECT TeacherName FROM Teachers
MINUS 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
MINUS 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.
Nicht im Oracle-Modus?
Folgendes passiert, wenn wir versuchen, MINUS
zu verwenden wenn nicht im Oracle-Modus.
Setzen wir unseren sql_mode
zurück auf die Standardeinstellung:
SET sql_mode = default;
Versuchen wir es jetzt mit dem MINUS
Betreiber wieder:
SELECT TeacherName FROM Teachers
MINUS
SELECT StudentName FROM Students;
Ergebnis:
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'SELECT StudentName FROM Students' at line 3