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

MariaDB INTERSECT-Operator erklärt

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.