MariaDB
 sql >> Datenbank >  >> RDS >> MariaDB

MariaDB MINUS Operator erklärt

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