I MariaDB, INTERSECT
operatorn skär två frågor och returnerar endast de rader som returneras i båda frågorna.
Den returnerar alla rader från vänster SELECT
resultatuppsättning som också finns i den högra SELECT
resultatuppsättning.
Syntax
Den officiella syntaxen ser ut så här:
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}]
Ovanstående inkluderar även EXCEPT
och UNION
operatorer i syntaxen, eftersom samma syntax gäller för dessa operatorer.
Från MariaDB 10.4.0 kan parenteser användas för att ange prioritet.
Exempel
Anta att vi har följande 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 använda INTERSECT
operatör att returnera anställda som också är kunder:
SELECT EmployeeName FROM Employees
INTERSECT
SELECT CustomerName FROM Customers;
Resultat:
+--------------+ | EmployeeName | +--------------+ | Ava | | Rohit | | Monish | +--------------+
Så vi får bara värden som visas i Employees
tabell som också visas i Customers
tabell.
Som standard returnerar den distinkta rader, så endast en rad returneras för Monish, även om det finns flera anställda och flera kunder med det namnet. Vi kan dock ändra på detta.
Inkludera dubbletter
Som standard är INTERSECT
operatorn tillämpar implicit en DISTINCT
drift. Med andra ord returnerar den endast distinkta värden som standard.
Före MariaDB 10.5.0, den implicita DISTINCT
var vårt enda alternativ – vi kunde inte ange ALL
. MariaDB 10.5.0 introducerade dock INTERSECT ALL
och INTERSECT DISTINCT
syntax.
Det betyder att vi nu kan göra frågor som denna:
SELECT EmployeeName FROM Employees
INTERSECT ALL
SELECT CustomerName FROM Customers;
Resultat:
+--------------+ | EmployeeName | +--------------+ | Monish | | Ava | | Rohit | | Monish | +--------------+
Den här gången fick vi fyra rader, istället för de tre som vi fick i vårt första exempel.
Vi kan se att två rader som innehåller namnet Monish returnerades istället för bara en som i vårt första exempel. Det finns faktiskt tre kunder som heter Monish, men bara två anställda med det namnet. Därför skär operationen bara två av dem.
Och för fullständighetens skull, här är ett exempel som uttryckligen använder DISTINCT
operatör:
SELECT EmployeeName FROM Employees
INTERSECT DISTINCT
SELECT CustomerName FROM Customers;
Resultat:
+--------------+ | EmployeeName | +--------------+ | Ava | | Rohit | | Monish | +--------------+
Detta är samma resultat som vi skulle få om vi skulle ta bort DISTINCT
operatör.
En alternativ fråga
Det är möjligt att få samma resultat utan att använda INTERSECT
operatör. Till exempel skulle vi kunna skriva om vårt första exempel till detta:
SELECT
DISTINCT EmployeeName
FROM Employees e
WHERE EXISTS (SELECT CustomerName FROM Customers c
WHERE e.EmployeeName = c.CustomerName);
Resultat:
+--------------+ | EmployeeName | +--------------+ | Ava | | Rohit | | Monish | +--------------+
Kom ihåg, INTERSECT
operatören hjälper till att förenkla koden.