V MariaDB, INTERSECT
operátor protne dva dotazy a vrátí pouze ty řádky, které jsou vráceny v obou dotazech.
Vrátí všechny řádky zleva SELECT
sada výsledků, které jsou také přítomny v pravém SELECT
sada výsledků.
Syntaxe
Oficiální syntaxe vypadá takto:
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}]
Výše uvedené také zahrnuje EXCEPT
a UNION
operátory v syntaxi, protože pro tyto operátory platí stejná syntaxe.
Od MariaDB 10.4.0 lze k určení priority použít závorky.
Příklad
Předpokládejme, že máme následující tabulky:
SELECT * FROM Employees;
SELECT * FROM Customers;
Výsledek:
+------------+--------------+ | 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 | +------------+--------------+
Můžeme použít INTERSECT
operátor vrátit zaměstnance, kteří jsou zároveň zákazníky:
SELECT EmployeeName FROM Employees
INTERSECT
SELECT CustomerName FROM Customers;
Výsledek:
+--------------+ | EmployeeName | +--------------+ | Ava | | Rohit | | Monish | +--------------+
Získáváme tedy pouze hodnoty, které se objevují v Employees
tabulka, která se také objeví v Customers
stůl.
Ve výchozím nastavení vrací odlišné řádky, takže pro Monish je vrácen pouze jeden řádek, přestože existuje více zaměstnanců a více zákazníků s tímto jménem. Můžeme to však změnit.
Zahrnout duplikáty
Ve výchozím nastavení INTERSECT
operátor implicitně aplikuje DISTINCT
úkon. Jinými slovy, ve výchozím nastavení vrací pouze odlišné hodnoty.
Před MariaDB 10.5.0, implicitní DISTINCT
byla naše jediná možnost – nebyli jsme schopni zadat ALL
. MariaDB 10.5.0 však zavedla INTERSECT ALL
a INTERSECT DISTINCT
syntax.
To znamená, že nyní můžeme provádět dotazy jako tento:
SELECT EmployeeName FROM Employees
INTERSECT ALL
SELECT CustomerName FROM Customers;
Výsledek:
+--------------+ | EmployeeName | +--------------+ | Monish | | Ava | | Rohit | | Monish | +--------------+
Tentokrát jsme dostali čtyři řádky místo tří, které jsme dostali v našem prvním příkladu.
Vidíme, že byly vráceny dva řádky obsahující jméno Monish namísto pouze jednoho jako v našem prvním příkladu. Ve skutečnosti existují tři zákazníci jménem Monish, ale pouze dva zaměstnanci s tímto jménem. Operace tedy protíná pouze dva z nich.
A pro úplnost uvádíme příklad, který explicitně používá DISTINCT
operátor:
SELECT EmployeeName FROM Employees
INTERSECT DISTINCT
SELECT CustomerName FROM Customers;
Výsledek:
+--------------+ | EmployeeName | +--------------+ | Ava | | Rohit | | Monish | +--------------+
To je stejný výsledek, jaký bychom dostali, kdybychom odstranili DISTINCT
operátor.
Alternativní dotaz
Stejný výsledek je možné získat i bez použití INTERSECT
operátor. Například bychom mohli přepsat náš první příklad na toto:
SELECT
DISTINCT EmployeeName
FROM Employees e
WHERE EXISTS (SELECT CustomerName FROM Customers c
WHERE e.EmployeeName = c.CustomerName);
Výsledek:
+--------------+ | EmployeeName | +--------------+ | Ava | | Rohit | | Monish | +--------------+
Pozor, INTERSECT
operátor pomáhá zjednodušit kód.