MariaDB
 sql >> Database >  >> RDS >> MariaDB

Spiegazione dell'operatore di MariaDB INTERSECT

In MariaDB, il INTERSECT interseca due query e restituisce solo le righe restituite in entrambe le query.

Restituisce tutte le righe da sinistra SELECT set di risultati che sono presenti anche nel SELECT a destra set di risultati.

Sintassi

La sintassi ufficiale è questa:

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}]

Quanto sopra include anche il EXCEPT e UNION operatori nella sintassi, poiché la stessa sintassi si applica a tali operatori.

Da MariaDB 10.4.0, le parentesi possono essere utilizzate per specificare la precedenza.

Esempio

Supponiamo di avere le seguenti tabelle:

SELECT * FROM Employees;
SELECT * FROM Customers;

Risultato:

+------------+--------------+
| 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       |
+------------+--------------+

Possiamo usare il INTERSECT operatore per restituire i dipendenti che sono anche clienti:

SELECT EmployeeName FROM Employees
INTERSECT
SELECT CustomerName FROM Customers;

Risultato:

+--------------+
| EmployeeName |
+--------------+
| Ava          |
| Rohit        |
| Monish       |
+--------------+

Quindi otteniamo solo i valori che appaiono in Employees tabella che compare anche in Customers tavolo.

Per impostazione predefinita, restituisce righe distinte, quindi viene restituita solo una riga per Monish, anche se sono presenti più dipendenti e più clienti con quel nome. Possiamo cambiare questo però.

Includi duplicati

Per impostazione predefinita, il INTERSECT l'operatore applica implicitamente un DISTINCT operazione. In altre parole, restituisce solo valori distinti per impostazione predefinita.

Prima di MariaDB 10.5.0, l'implicito DISTINCT era la nostra unica opzione:non siamo stati in grado di specificare ALL . Tuttavia, MariaDB 10.5.0 ha introdotto il INTERSECT ALL e INTERSECT DISTINCT sintassi.

Ciò significa che ora possiamo eseguire query come questa:

SELECT EmployeeName FROM Employees
INTERSECT ALL
SELECT CustomerName FROM Customers;

Risultato:

+--------------+
| EmployeeName |
+--------------+
| Monish       |
| Ava          |
| Rohit        |
| Monish       |
+--------------+

Questa volta abbiamo ottenuto quattro righe, invece delle tre che abbiamo ottenuto nel nostro primo esempio.

Possiamo vedere che sono state restituite due righe contenenti il ​​nome Monish invece di una sola come nel nostro primo esempio. In realtà ci sono tre clienti chiamati Monish, ma solo due dipendenti con quel nome. Pertanto, l'operazione ne interseca solo due.

E per completezza, ecco un esempio che utilizza esplicitamente il DISTINCT operatore:

SELECT EmployeeName FROM Employees
INTERSECT DISTINCT
SELECT CustomerName FROM Customers;

Risultato:

+--------------+
| EmployeeName |
+--------------+
| Ava          |
| Rohit        |
| Monish       |
+--------------+

Questo è lo stesso risultato che otterremmo se dovessimo rimuovere DISTINCT operatore.

Una query alternativa

È possibile ottenere lo stesso risultato senza utilizzare il INTERSECT operatore. Ad esempio, potremmo riscrivere il nostro primo esempio in questo:

SELECT 
    DISTINCT EmployeeName
FROM Employees e 
WHERE EXISTS (SELECT CustomerName FROM Customers c
WHERE e.EmployeeName = c.CustomerName);

Risultato:

+--------------+
| EmployeeName |
+--------------+
| Ava          |
| Rohit        |
| Monish       |
+--------------+

Intendiamoci, il INTERSECT operatore aiuta a semplificare il codice.