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