sql >> Databáze >  >> RDS >> MariaDB

Vysvětlení operátora MariaDB INTERSECT

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.


  1. Připravené příkazy MySQL

  2. Předání pole dotazu pomocí klauzule WHERE

  3. Připojení vaší základní aplikace ASP.NET k místní instanci SQLServeru

  4. PostgreSQL GROUP BY odlišná od MySQL?