sql >> Databasteknik >  >> RDS >> MariaDB

MariaDB INTERSECT Operatör förklaras

I MariaDB, INTERSECT operatorn skär två frågor och returnerar endast de rader som returneras i båda frågorna.

Den returnerar alla rader från vänster SELECT resultatuppsättning som också finns i den högra SELECT resultatuppsättning.

Syntax

Den officiella syntaxen ser ut så här:

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

Ovanstående inkluderar även EXCEPT och UNION operatorer i syntaxen, eftersom samma syntax gäller för dessa operatorer.

Från MariaDB 10.4.0 kan parenteser användas för att ange prioritet.

Exempel

Anta att vi har följande 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 använda INTERSECT operatör att returnera anställda som också är kunder:

SELECT EmployeeName FROM Employees
INTERSECT
SELECT CustomerName FROM Customers;

Resultat:

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

Så vi får bara värden som visas i Employees tabell som också visas i Customers tabell.

Som standard returnerar den distinkta rader, så endast en rad returneras för Monish, även om det finns flera anställda och flera kunder med det namnet. Vi kan dock ändra på detta.

Inkludera dubbletter

Som standard är INTERSECT operatorn tillämpar implicit en DISTINCT drift. Med andra ord returnerar den endast distinkta värden som standard.

Före MariaDB 10.5.0, den implicita DISTINCT var vårt enda alternativ – vi kunde inte ange ALL . MariaDB 10.5.0 introducerade dock INTERSECT ALL och INTERSECT DISTINCT syntax.

Det betyder att vi nu kan göra frågor som denna:

SELECT EmployeeName FROM Employees
INTERSECT ALL
SELECT CustomerName FROM Customers;

Resultat:

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

Den här gången fick vi fyra rader, istället för de tre som vi fick i vårt första exempel.

Vi kan se att två rader som innehåller namnet Monish returnerades istället för bara en som i vårt första exempel. Det finns faktiskt tre kunder som heter Monish, men bara två anställda med det namnet. Därför skär operationen bara två av dem.

Och för fullständighetens skull, här är ett exempel som uttryckligen använder DISTINCT operatör:

SELECT EmployeeName FROM Employees
INTERSECT DISTINCT
SELECT CustomerName FROM Customers;

Resultat:

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

Detta är samma resultat som vi skulle få om vi skulle ta bort DISTINCT operatör.

En alternativ fråga

Det är möjligt att få samma resultat utan att använda INTERSECT operatör. Till exempel skulle vi kunna skriva om vårt första exempel till detta:

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

Resultat:

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

Kom ihåg, INTERSECT operatören hjälper till att förenkla koden.


  1. Rails Resque-arbetare misslyckas med PGError:servern stängde anslutningen oväntat

  2. Webbseminarium:Spårning av frågeförlopp i SQL Server

  3. Jquery stjärnklassificering handledning med php och mysql

  4. Pivot på Oracle 10g