В MariaDB, INTERSECT Операторът пресича две заявки и връща само онези редове, които са върнати и в двете заявки.
Връща всички редове отляво SELECT набор от резултати, които също присъстват в десния SELECT набор от резултати.
Синтаксис
Официалният синтаксис е така:
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}]
Горното включва също EXCEPT и UNION оператори в синтаксиса, тъй като същият синтаксис се прилага за тези оператори.
От MariaDB 10.4.0, скоби могат да се използват за определяне на приоритет.
Пример
Да предположим, че имаме следните таблици:
SELECT * FROM Employees;
SELECT * FROM Customers; Резултат:
+------------+--------------+ | 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 | +------------+--------------+
Можем да използваме INTERSECT оператор да върне служители, които също са клиенти:
SELECT EmployeeName FROM Employees
INTERSECT
SELECT CustomerName FROM Customers; Резултат:
+--------------+ | EmployeeName | +--------------+ | Ava | | Rohit | | Monish | +--------------+
Така че получаваме само стойности, които се появяват в Employees таблица, която също се появява в Customers маса.
По подразбиране той връща отделни редове, така че само един ред се връща за Monish, въпреки че има множество служители и множество клиенти с това име. Можем обаче да променим това.
Включване на дубликати
По подразбиране INTERSECT оператор имплицитно прилага DISTINCT операция. С други думи, той връща само различни стойности по подразбиране.
Преди MariaDB 10.5.0 имплицитният DISTINCT беше единствената ни опция – не успяхме да посочим ALL . Въпреки това, MariaDB 10.5.0 въведе INTERSECT ALL и INTERSECT DISTINCT синтаксис.
Това означава, че вече можем да правим заявки като това:
SELECT EmployeeName FROM Employees
INTERSECT ALL
SELECT CustomerName FROM Customers; Резултат:
+--------------+ | EmployeeName | +--------------+ | Monish | | Ava | | Rohit | | Monish | +--------------+
Този път получихме четири реда, вместо трите, които получихме в първия ни пример.
Можем да видим, че два реда, съдържащи името Monish, бяха върнати вместо само един, както в нашия първи пример. Всъщност има трима клиенти, наречени Monish, но само двама служители с това име. Следователно операцията пресича само две от тях.
И за пълнота, ето пример, който изрично използва DISTINCT оператор:
SELECT EmployeeName FROM Employees
INTERSECT DISTINCT
SELECT CustomerName FROM Customers; Резултат:
+--------------+ | EmployeeName | +--------------+ | Ava | | Rohit | | Monish | +--------------+
Това е същият резултат, който бихме получили, ако премахнем DISTINCT оператор.
Алтернативна заявка
Възможно е да получите същия резултат, без да използвате INTERSECT оператор. Например, можем да пренапишем първия си пример на това:
SELECT
DISTINCT EmployeeName
FROM Employees e
WHERE EXISTS (SELECT CustomerName FROM Customers c
WHERE e.EmployeeName = c.CustomerName); Резултат:
+--------------+ | EmployeeName | +--------------+ | Ava | | Rohit | | Monish | +--------------+
Имайте предвид, INTERSECT операторът помага за опростяване на кода.