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.