I MariaDB er MINUS
operator returnerer adskilte rækker fra den venstre inputforespørgsel, som ikke udlæses af den højre inputforespørgsel.
EXCEPT
operatør med henblik på kompatibilitet med Oracle. Derfor kan vi bruge MINUS
og EXCEPT
i flæng (i MariaDB 10.6.1 og nyere).
Jeg har dog fundet ud af, at MINUS
operator virker kun når min sql_mode ="oracle"
. Selvom dette ikke er eksplicit nævnt i MariaDB's dokumentation, er det underforstået i opgaven til implementering af MINUS
operatør i MariaDB.
Eksempeldata
Antag, at vi har følgende 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 bruge
Indstil sql_mode
til Oracle
Før vi begynder at bruge sql_mode
til oracle
:
SET sql_mode = "oracle";
OK, nu kan vi gå videre og bruge
Eksempel på MINUS
SELECT TeacherName FROM Teachers
MINUS
SELECT StudentName FROM Students;
Resultat:
+-------------+ | TeacherName | +-------------+ | Ben | | Cathy | +-------------+
Så vi får kun værdier, der vises i Teachers
tabel, der ikke også vises i Studenter
bord.
Som standard returnerer den distinkte rækker, så kun én række returneres for Cathy
, selvom der er to lærere med det navn. Vi kan ændre denne adfærd - mere om dette senere.
Vi kan også skifte det rundt og sætte Studenter
tabel til venstre og Lærere
til højre.
SELECT StudentName FROM Students
MINUS
SELECT TeacherName FROM Teachers;
Resultat:
+-------------+ | StudentName | +-------------+ | Faye | | Jet | | Spike | | Ein | +-------------+
Det er muligt at få det samme resultat uden at bruge EXCEPT
) operatør. For eksempel kunne vi omskrive vores første eksempel til dette:
SELECT
DISTINCT TeacherName
FROM Teachers t
WHERE NOT EXISTS (SELECT StudentName FROM Students s
WHERE t.TeacherName = s.StudentName);
Resultat:
+-------------+ | TeacherName | +-------------+ | Ben | | Cathy | +-------------+
Medtag dubletter
Som standard er MINUS
operatør anvender implicit en DISTINCT
operation. Med andre ord returnerer det kun distinkte værdier som standard. Men vi kan angive MINUS ALLE
for at inkludere dubletter i resultatet:
SELECT TeacherName FROM Teachers
MINUS ALL
SELECT StudentName FROM Students;
Resultat:
+-------------+ | TeacherName | +-------------+ | Cathy | | Ben | | Cathy | | Bill | +-------------+
Denne gang fik vi fire rækker i stedet for de to, som vi fik i vores første eksempel.
Vi kan se, at begge Cathys blev returneret i stedet for blot én som i vores første eksempel.
Hvad angår Bill? Der er to regninger i Teachers
bord, men kun én returneres her. Det er sandsynligvis, fordi der er én regning i Students
tabel, hvilket ville udelukke et af lovforslagene fra vores resultater.
Og her er et eksempel, der eksplicit bruger DISTINCT
operatør:
SELECT TeacherName FROM Teachers
MINUS DISTINCT
SELECT StudentName FROM Students;
Resultat:
+-------------+ | TeacherName | +-------------+ | Ben | | Cathy | +-------------+
Som forventet får vi det samme resultat, som vi ville få, hvis vi skulle fjerne DISTINCT
operatør.
Ikke i Oracle-tilstand?
Her er, hvad der sker, når vi forsøger at bruge MINUS
når den ikke er i Oracle-tilstand.
Lad os nulstille vores sql_mode
til standardindstillingen:
SET sql_mode = default;
Lad os nu prøve at bruge
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