sql >> Databasteknik >  >> RDS >> MariaDB

MariaDB MINUS Operatör förklaras

I MariaDB, MINUS operatorn returnerar distinkta rader från den vänstra inmatningsfrågan som inte matas ut av den högra inmatningsfrågan.

MINUS operatorn introducerades i MariaDB 10.6.1 som en synonym för EXCEPT operatör för kompatibilitet med Oracle. Därför kan vi använda MINUS och UTOM utbytbart (i MariaDB 10.6.1 och senare).

Jag har dock upptäckt att MINUS operatorn fungerar bara när min sql_mode ="oracle" . Även om detta inte uttryckligen nämns i MariaDB:s dokumentation, är det underförstått i uppgiften att implementera MINUS operatör i MariaDB.

Exempeldata

Anta att vi har följande tabeller:

SELECT * FROM Teachers;
SELECT * FROM Students;

Resultat:

+-----------+-------------+
| TeacherId | TeacherName |
+-----------+-------------+
|         1 | Warren      |
|         2 | Ben         |
|         3 | Cathy       |
|         4 | Cathy       |
|         5 | Bill        |
|         6 | Bill        |
+-----------+-------------+

+-----------+-------------+
| StudentId | StudentName |
+-----------+-------------+
|         1 | Faye        |
|         2 | Jet         |
|         3 | Spike       |
|         4 | Ein         |
|         5 | Warren      |
|         6 | Bill        |
+-----------+-------------+

Vi kan använda MINUS operatör för att lämna tillbaka lärare som inte också är elever.

Ställ in sql_mode till Oracle

Innan vi börjar använda MINUS operatör, låt oss ställa in vårt sql_mode till oracle :

SET sql_mode = "oracle";

OK, nu kan vi gå vidare och använda MINUS operatör.

Exempel på MINUS

SELECT TeacherName FROM Teachers
MINUS
SELECT StudentName FROM Students;

Resultat:

+-------------+
| TeacherName |
+-------------+
| Ben         |
| Cathy       |
+-------------+

Så vi får bara värden som visas i Teachers tabell som inte också visas i Elever tabell.

Som standard returnerar den distinkta rader, så endast en rad returneras för Cathy , även om det finns två lärare med det namnet. Vi kan ändra detta beteende – mer om detta senare.

Vi kan också byta det och sätta Studenter tabellen till vänster och Lärare till höger.

SELECT StudentName FROM Students
MINUS
SELECT TeacherName FROM Teachers;

Resultat:

+-------------+
| StudentName |
+-------------+
| Faye        |
| Jet         |
| Spike       |
| Ein         |
+-------------+

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

SELECT 
    DISTINCT TeacherName
FROM Teachers t 
WHERE NOT EXISTS (SELECT StudentName FROM Students s
WHERE t.TeacherName = s.StudentName);

Resultat:

+-------------+
| TeacherName |
+-------------+
| Ben         |
| Cathy       |
+-------------+

Inkludera dubbletter

Som standard är MINUS operatorn tillämpar implicit en DISTINCT drift. Med andra ord returnerar den endast distinkta värden som standard. Men vi kan ange MINUS ALLA för att inkludera dubbletter i resultatet:

SELECT TeacherName FROM Teachers
MINUS ALL
SELECT StudentName FROM Students;

Resultat:

+-------------+
| TeacherName |
+-------------+
| Cathy       |
| Ben         |
| Cathy       |
| Bill        |
+-------------+

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

Vi kan se att båda Cathys returnerades istället för bara en som i vårt första exempel.

Vad gäller Bill? Det finns två räkningar i Teachers tabell, men bara en returneras här. Det beror förmodligen på att det finns en faktura i Students tabell, vilket skulle utesluta en av räkningarna från våra resultat.

Och här är ett exempel som uttryckligen använder DISTINCT operatör:

SELECT TeacherName FROM Teachers
MINUS DISTINCT
SELECT StudentName FROM Students;

Resultat:

+-------------+
| TeacherName |
+-------------+
| Ben         |
| Cathy       |
+-------------+

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

Inte i Oracle Mode?

Här är vad som händer när vi försöker använda MINUS när den inte är i Oracle-läge.

Låt oss återställa vårt sql_mode till standardinställningen:

SET sql_mode = default;

Låt oss nu försöka använda MINUS operatör igen:

SELECT TeacherName FROM Teachers
MINUS
SELECT StudentName FROM Students;

Resultat:

ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'SELECT StudentName FROM Students' at line 3

  1. Gruppera DateTime i 5,15,30 och 60 minuters intervall

  2. INFOGA en SELECT GROUP BY :fler målkolumner än uttrycksfel

  3. Returnera primärnycklar från en länkad server i SQL Server (T-SQL-exempel)

  4. Undvik sortering med Merge Join-konkatenering