In MariaDB der INTERSECT
-Operator schneidet zwei Abfragen und gibt nur die Zeilen zurück, die in beiden Abfragen zurückgegeben werden.
Es gibt alle Zeilen vom linken SELECT
zurück Ergebnismenge, die auch im rechten SELECT
vorhanden sind 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 EXCEPT
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 Employees;
SELECT * FROM Customers;
Ergebnis:
+------------+--------------+ | EmployeeId | EmployeeName | +------------+--------------+ | 1 | Bart | | 2 | Jan | | 3 | Ava | | 4 | Rohit | | 5 | Monish | | 6 | Monish | | 7 | Monish | +------------+--------------+ +------------+--------------+ | CustomerId | CustomerName | +------------+--------------+ | 1 | Mia | | 2 | Rohit | | 3 | Peter | | 4 | Ava | | 5 | Monish | | 6 | Monish | +------------+--------------+
Wir können den INTERSECT
verwenden Betreiber, um Mitarbeiter zurückzugeben, die auch Kunden sind:
SELECT EmployeeName FROM Employees
INTERSECT
SELECT CustomerName FROM Customers;
Ergebnis:
+--------------+ | EmployeeName | +--------------+ | Ava | | Rohit | | Monish | +--------------+
Wir erhalten also nur Werte, die in Employees
vorkommen Tabelle, die auch in Customers
erscheinen Tisch.
Standardmäßig werden unterschiedliche Zeilen zurückgegeben, sodass für Monish nur eine Zeile zurückgegeben wird, obwohl es mehrere Mitarbeiter und mehrere Kunden mit diesem Namen gibt. Das können wir aber ändern.
Duplikate einschließen
Standardmäßig ist das INTERSECT
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 . In MariaDB 10.5.0 wurde jedoch INTERSECT ALL
eingeführt und INTERSECT DISTINCT
Syntax.
Das bedeutet, dass wir jetzt Abfragen wie diese durchführen können:
SELECT EmployeeName FROM Employees
INTERSECT ALL
SELECT CustomerName FROM Customers;
Ergebnis:
+--------------+ | EmployeeName | +--------------+ | Monish | | Ava | | Rohit | | Monish | +--------------+
Dieses Mal haben wir vier Zeilen statt der drei, die wir in unserem ersten Beispiel bekommen haben.
Wir können sehen, dass zwei Zeilen mit dem Namen Monish zurückgegeben wurden, anstatt nur einer wie in unserem ersten Beispiel. Es gibt tatsächlich drei Kunden namens Monish, aber nur zwei Mitarbeiter mit diesem Namen. Daher schneidet die Operation nur zwei davon.
Und der Vollständigkeit halber hier ein Beispiel, das ausdrücklich den DISTINCT
verwendet Betreiber:
SELECT EmployeeName FROM Employees
INTERSECT DISTINCT
SELECT CustomerName FROM Customers;
Ergebnis:
+--------------+ | EmployeeName | +--------------+ | Ava | | Rohit | | Monish | +--------------+
Dies ist dasselbe Ergebnis, das wir erhalten würden, wenn wir DISTINCT
entfernen würden Betreiber.
Eine alternative Abfrage
Es ist möglich, dasselbe Ergebnis ohne Verwendung von INTERSECT
zu erhalten Operator. Zum Beispiel könnten wir unser erstes Beispiel so umschreiben:
SELECT
DISTINCT EmployeeName
FROM Employees e
WHERE EXISTS (SELECT CustomerName FROM Customers c
WHERE e.EmployeeName = c.CustomerName);
Ergebnis:
+--------------+ | EmployeeName | +--------------+ | Ava | | Rohit | | Monish | +--------------+
Wohlgemerkt, der INTERSECT
Operator hilft, den Code zu vereinfachen.