I MariaDB er INTERSECT
operatør skærer to forespørgsler og returnerer kun de rækker, der returneres i begge forespørgsler.
Det returnerer alle rækker fra venstre SELECT
resultatsæt, der også findes i den højre SELECT
resultatsæt.
Syntaks
Den officielle syntaks lyder sådan her:
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}]
Ovenstående inkluderer også EXCEPT
og UNION
operatorer i syntaksen, da den samme syntaks gælder for disse operatorer.
Fra MariaDB 10.4.0 kan parenteser bruges til at angive forrang.
Eksempel
Antag, at vi har følgende tabeller:
SELECT * FROM Employees;
SELECT * FROM Customers;
Resultat:
+------------+--------------+ | 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 | +------------+--------------+
Vi kan bruge INTERSECT
operatør til at returnere medarbejdere, der også er kunder:
SELECT EmployeeName FROM Employees
INTERSECT
SELECT CustomerName FROM Customers;
Resultat:
+--------------+ | EmployeeName | +--------------+ | Ava | | Rohit | | Monish | +--------------+
Så vi får kun værdier, der vises i Employees
tabel, der også vises i Customers
bord.
Som standard returnerer den adskilte rækker, så kun én række returneres for Monish, selvom der er flere ansatte og flere kunder med det navn. Vi kan dog ændre dette.
Medtag dubletter
Som standard er INTERSECT
operatør anvender implicit en DISTINCT
operation. Med andre ord returnerer det kun distinkte værdier som standard.
Før MariaDB 10.5.0, den implicitte DISTINCT
var vores eneste mulighed – vi var ikke i stand til at angive ALL
. MariaDB 10.5.0 introducerede imidlertid INTERSECT ALL
og INTERSECT DISTINCT
syntaks.
Det betyder, at vi nu kan lave forespørgsler som denne:
SELECT EmployeeName FROM Employees
INTERSECT ALL
SELECT CustomerName FROM Customers;
Resultat:
+--------------+ | EmployeeName | +--------------+ | Monish | | Ava | | Rohit | | Monish | +--------------+
Denne gang fik vi fire rækker i stedet for de tre, som vi fik i vores første eksempel.
Vi kan se, at to rækker indeholdende navnet Monish blev returneret i stedet for blot én som i vores første eksempel. Der er faktisk tre kunder, der hedder Monish, men kun to medarbejdere med det navn. Derfor skærer operationen kun to af dem.
Og for fuldstændighedens skyld er her et eksempel, der eksplicit bruger DISTINCT
operatør:
SELECT EmployeeName FROM Employees
INTERSECT DISTINCT
SELECT CustomerName FROM Customers;
Resultat:
+--------------+ | EmployeeName | +--------------+ | Ava | | Rohit | | Monish | +--------------+
Dette er det samme resultat, som vi ville få, hvis vi skulle fjerne DISTINCT
operatør.
En alternativ forespørgsel
Det er muligt at få det samme resultat uden at bruge INTERSECT
operatør. For eksempel kunne vi omskrive vores første eksempel til dette:
SELECT
DISTINCT EmployeeName
FROM Employees e
WHERE EXISTS (SELECT CustomerName FROM Customers c
WHERE e.EmployeeName = c.CustomerName);
Resultat:
+--------------+ | EmployeeName | +--------------+ | Ava | | Rohit | | Monish | +--------------+
Husk INTERSECT
operatør hjælper med at forenkle koden.