В 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
операторът помага за опростяване на кода.