sql >> Database >  >> RDS >> MariaDB

MariaDB BEHALVE Operator uitgelegd

In MariaDB, de EXCEPT operator retourneert rijen van de linkerinvoerquery die niet worden uitgevoerd door de rechterinvoerquery.

Een andere manier om het te zeggen is dat het alle rijen van de linkerkant retourneert SELECT resultaatset behalve rijen die rechts staan ​​SELECT resultatenset.

Syntaxis

De officiële syntaxis gaat als volgt:

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

Het bovenstaande omvat ook de INTERSECT en UNION operators in de syntaxis, aangezien dezelfde syntaxis van toepassing is op die operators.

Vanaf MariaDB 10.4.0 kunnen haakjes worden gebruikt om de prioriteit te specificeren.

Voorbeeld

Stel dat we de volgende tabellen hebben:

SELECT * FROM Teachers;
SELECT * FROM Students;

Resultaat:

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

We kunnen de EXCEPT . gebruiken operator om docenten terug te sturen die niet ook studenten zijn:

SELECT TeacherName FROM Teachers
EXCEPT
SELECT StudentName FROM Students;

Resultaat:

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

We krijgen dus alleen waarden die voorkomen in de Teachers tabel die niet ook voorkomt in de Students tafel.

Standaard retourneert het verschillende rijen, dus er wordt slechts één rij geretourneerd voor Cathy , ook al zijn er twee leraren met die naam. We kunnen dit gedrag veranderen - hierover later meer.

We kunnen het ook omdraaien en de Students tabel aan de linkerkant en Teachers aan de rechterkant.

SELECT StudentName FROM Students
EXCEPT
SELECT TeacherName FROM Teachers;

Resultaat:

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

Het is mogelijk om hetzelfde resultaat te krijgen zonder de EXCEPT exploitant. We zouden ons eerste voorbeeld hier bijvoorbeeld naar kunnen herschrijven:

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

Resultaat:

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

Let wel, de EXCEPT operator helpt de code aanzienlijk te vereenvoudigen.

Duplicaten opnemen

Standaard is de EXCEPT operator past impliciet een DISTINCT toe operatie. Met andere woorden, het retourneert standaard alleen afzonderlijke waarden.

Vóór MariaDB 10.5.0 was de impliciete DISTINCT was onze enige optie – we konden ALL niet specificeren . MariaDB 10.5.0 introduceerde echter de EXCEPT ALL en EXCEPT DISTINCT syntaxis.

Dit betekent dat we nu zoekopdrachten als volgt kunnen doen:

SELECT TeacherName FROM Teachers
EXCEPT ALL
SELECT StudentName FROM Students;

Resultaat:

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

Deze keer kregen we vier rijen, in plaats van de twee die we in ons eerste voorbeeld kregen.

We kunnen zien dat beide Cathy's zijn geretourneerd in plaats van slechts één zoals in ons eerste voorbeeld.

Wat betreft Bill? Er zijn twee rekeningen in de Teachers tabel, maar er wordt hier slechts één geretourneerd. Dat komt waarschijnlijk omdat er één rekening is in de Students tabel, die een van de rekeningen van onze resultaten zou uitsluiten.

En hier is een voorbeeld dat expliciet de DISTINCT . gebruikt operator:

SELECT TeacherName FROM Teachers
EXCEPT DISTINCT
SELECT StudentName FROM Students;

Resultaat:

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

Zoals verwacht krijgen we hetzelfde resultaat dat we zouden krijgen als we de DISTINCT zouden verwijderen telefoniste.

In MariaDB 10.6.1, MINUS werd geïntroduceerd als synoniem voor EXCEPT . Daarom kunnen we MINUS . gebruiken in plaats van EXCEPT in MariaDB 10.6.1 en later.


  1. Resultaten krijgen tussen twee datums in PostgreSQL

  2. DATEDIFF() Voorbeelden – MySQL

  3. Microsoft Access Table Tips – Trucs &Richtlijnen Deel 5

  4. Welke impact kunnen verschillende cursoropties hebben?