sql >> Database teknologi >  >> RDS >> MariaDB

MariaDB MINUS Operatør forklaret

I MariaDB er MINUS operator returnerer adskilte rækker fra den venstre inputforespørgsel, som ikke udlæses af den højre inputforespørgsel.

MINUS operator blev introduceret i MariaDB 10.6.1 som et synonym for 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 MINUS operatør for at returnere lærere, der ikke også er studerende.

Indstil sql_mode til Oracle

Før vi begynder at bruge MINUS operatør, lad os indstille vores sql_mode til oracle :

SET sql_mode = "oracle";

OK, nu kan vi gå videre og bruge MINUS operatør.

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 MINUS (eller 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 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. Sådan fungerer LN() i MariaDB

  2. SCD Type 3

  3. SQL :MELLEM vs <=og>=

  4. Oracle pivot operatør