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

MariaDB AUSSER Operator erklärt

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.