MariaDB
 sql >> база данни >  >> RDS >> MariaDB

Обяснено за оператора на MariaDB INTERSECT

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


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Разлика между SYSDATE() и NOW() в MariaDB

  2. Как работи RAND() в MariaDB

  3. Как работи TIME() в MariaDB

  4. Как да използвате механизма за отказване на MaxScale

  5. Сравняване на времената за отказ за Amazon Aurora, Amazon RDS и ClusterControl