sql >> Database teknologi >  >> RDS >> MariaDB

MariaDB INTERSECT Operator forklaret

I MariaDB er INTERSECT operatør skærer to forespørgsler og returnerer kun de rækker, der returneres i begge forespørgsler.

Det returnerer alle rækker fra venstre SELECT resultatsæt, der også findes i den højre SELECT resultatsæt.

Syntaks

Den officielle syntaks lyder sådan her:

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}]

Ovenstående inkluderer også EXCEPT og UNION operatorer i syntaksen, da den samme syntaks gælder for disse operatorer.

Fra MariaDB 10.4.0 kan parenteser bruges til at angive forrang.

Eksempel

Antag, at vi har følgende tabeller:

SELECT * FROM Employees;
SELECT * FROM Customers;

Resultat:

+------------+--------------+
| 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       |
+------------+--------------+

Vi kan bruge INTERSECT operatør til at returnere medarbejdere, der også er kunder:

SELECT EmployeeName FROM Employees
INTERSECT
SELECT CustomerName FROM Customers;

Resultat:

+--------------+
| EmployeeName |
+--------------+
| Ava          |
| Rohit        |
| Monish       |
+--------------+

Så vi får kun værdier, der vises i Employees tabel, der også vises i Customers bord.

Som standard returnerer den adskilte rækker, så kun én række returneres for Monish, selvom der er flere ansatte og flere kunder med det navn. Vi kan dog ændre dette.

Medtag dubletter

Som standard er INTERSECT operatør anvender implicit en DISTINCT operation. Med andre ord returnerer det kun distinkte værdier som standard.

Før MariaDB 10.5.0, den implicitte DISTINCT var vores eneste mulighed – vi var ikke i stand til at angive ALL . MariaDB 10.5.0 introducerede imidlertid INTERSECT ALL og INTERSECT DISTINCT syntaks.

Det betyder, at vi nu kan lave forespørgsler som denne:

SELECT EmployeeName FROM Employees
INTERSECT ALL
SELECT CustomerName FROM Customers;

Resultat:

+--------------+
| EmployeeName |
+--------------+
| Monish       |
| Ava          |
| Rohit        |
| Monish       |
+--------------+

Denne gang fik vi fire rækker i stedet for de tre, som vi fik i vores første eksempel.

Vi kan se, at to rækker indeholdende navnet Monish blev returneret i stedet for blot én som i vores første eksempel. Der er faktisk tre kunder, der hedder Monish, men kun to medarbejdere med det navn. Derfor skærer operationen kun to af dem.

Og for fuldstændighedens skyld er her et eksempel, der eksplicit bruger DISTINCT operatør:

SELECT EmployeeName FROM Employees
INTERSECT DISTINCT
SELECT CustomerName FROM Customers;

Resultat:

+--------------+
| EmployeeName |
+--------------+
| Ava          |
| Rohit        |
| Monish       |
+--------------+

Dette er det samme resultat, som vi ville få, hvis vi skulle fjerne DISTINCT operatør.

En alternativ forespørgsel

Det er muligt at få det samme resultat uden at bruge INTERSECT operatør. For eksempel kunne vi omskrive vores første eksempel til dette:

SELECT 
    DISTINCT EmployeeName
FROM Employees e 
WHERE EXISTS (SELECT CustomerName FROM Customers c
WHERE e.EmployeeName = c.CustomerName);

Resultat:

+--------------+
| EmployeeName |
+--------------+
| Ava          |
| Rohit        |
| Monish       |
+--------------+

Husk INTERSECT operatør hjælper med at forenkle koden.


  1. gem lang værdi i Android-databasen

  2. 5 interessante fakta om databasestyringssystemer

  3. 5 måder at kontrollere, om der findes en tabel i MySQL

  4. ORACLE - ORA-01843:ikke en gyldig måned