sql >> Database >  >> RDS >> MariaDB

MariaDB INTERSECT-operator uitgelegd

In MariaDB, de INTERSECT operator snijdt twee query's en retourneert alleen die rijen die in beide query's worden geretourneerd.

Het retourneert alle rijen van links SELECT resultatenset die ook aanwezig zijn in de rechter SELECT resultatenset.

Syntaxis

De officiële syntaxis gaat als volgt:

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

Het bovenstaande omvat ook de EXCEPT en UNION operators in de syntaxis, aangezien dezelfde syntaxis van toepassing is op die operators.

Vanaf MariaDB 10.4.0 kunnen haakjes worden gebruikt om de prioriteit te specificeren.

Voorbeeld

Stel dat we de volgende tabellen hebben:

SELECT * FROM Employees;
SELECT * FROM Customers;

Resultaat:

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

We kunnen de INTERSECT . gebruiken operator om werknemers terug te sturen die ook klant zijn:

SELECT EmployeeName FROM Employees
INTERSECT
SELECT CustomerName FROM Customers;

Resultaat:

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

We krijgen dus alleen waarden die voorkomen in de Employees tabel die ook verschijnen in de Customers tafel.

Standaard retourneert het verschillende rijen, dus er wordt slechts één rij geretourneerd voor Monish, ook al zijn er meerdere werknemers en meerdere klanten met die naam. We kunnen dit echter veranderen.

Duplicaten opnemen

Standaard is de INTERSECT operator past impliciet een DISTINCT toe operatie. Met andere woorden, het retourneert standaard alleen afzonderlijke waarden.

Vóór MariaDB 10.5.0 was de impliciete DISTINCT was onze enige optie – we konden ALL niet specificeren . MariaDB 10.5.0 introduceerde echter de INTERSECT ALL en INTERSECT DISTINCT syntaxis.

Dit betekent dat we nu zoekopdrachten als volgt kunnen doen:

SELECT EmployeeName FROM Employees
INTERSECT ALL
SELECT CustomerName FROM Customers;

Resultaat:

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

Deze keer kregen we vier rijen, in plaats van de drie die we in ons eerste voorbeeld kregen.

We kunnen zien dat twee rijen met de naam Monish zijn geretourneerd in plaats van slechts één zoals in ons eerste voorbeeld. Er zijn eigenlijk drie klanten die Monish heten, maar slechts twee medewerkers met die naam. Daarom snijdt de bewerking er slechts twee.

En voor de volledigheid is hier een voorbeeld dat expliciet de DISTINCT . gebruikt operator:

SELECT EmployeeName FROM Employees
INTERSECT DISTINCT
SELECT CustomerName FROM Customers;

Resultaat:

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

Dit is hetzelfde resultaat dat we zouden krijgen als we de DISTINCT . zouden verwijderen telefoniste.

Een alternatieve zoekopdracht

Het is mogelijk om hetzelfde resultaat te krijgen zonder de INTERSECT exploitant. We zouden ons eerste voorbeeld hier bijvoorbeeld naar kunnen herschrijven:

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

Resultaat:

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

Let wel, de INTERSECT operator helpt de code te vereenvoudigen.


  1. Wat is het verschil tussen de backtick en de vierkante haak in SQL-statements?

  2. CSV in SQL-ontwikkelaar…

  3. PostgreSQL voor Windows ontwikkelen, deel 3

  4. Fout:Client ondersteunt het door de server gevraagde authenticatieprotocol niet; overweeg om MySQL-client te upgraden