sql >> Database >  >> RDS >> MariaDB

MariaDB MINUS-operator uitgelegd

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

De MINUS operator werd geïntroduceerd in MariaDB 10.6.1 als synoniem voor de EXCEPT operator met het oog op compatibiliteit met Oracle. Daarom kunnen we MINUS . gebruiken en EXCEPT onderling uitwisselbaar (in MariaDB 10.6.1 en later).

Ik heb echter ontdekt dat de MINUS operator werkt alleen als mijn sql_mode = "oracle" . Hoewel dit niet expliciet wordt vermeld in de documentatie van MariaDB, wordt het geïmpliceerd in de taak voor het implementeren van de MINUS operator in MariaDB.

Voorbeeldgegevens

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 MINUS . gebruiken operator om docenten terug te sturen die niet ook studenten zijn.

Stel sql_mode in naar Oracle

Voordat we de MINUS gaan gebruiken operator, laten we onze sql_mode . instellen naar oracle :

SET sql_mode = "oracle";

OK, nu kunnen we doorgaan en de MINUS . gebruiken telefoniste.

Voorbeeld van MINUS

SELECT TeacherName FROM Teachers
MINUS
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
MINUS
SELECT TeacherName FROM Teachers;

Resultaat:

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

Het is mogelijk om hetzelfde resultaat te krijgen zonder de MINUS (of 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       |
+-------------+

Duplicaten opnemen

Standaard is de MINUS operator past impliciet een DISTINCT toe operatie. Met andere woorden, het retourneert standaard alleen afzonderlijke waarden. Maar we kunnen MINUS ALL specify specificeren om duplicaten in het resultaat op te nemen:

SELECT TeacherName FROM Teachers
MINUS 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
MINUS 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.

Niet in Oracle-modus?

Dit gebeurt er als we proberen MINUS . te gebruiken wanneer niet in Oracle-modus.

Laten we onze sql_mode resetten naar de standaardinstelling:

SET sql_mode = default;

Laten we nu proberen de MINUS . te gebruiken operator opnieuw:

SELECT TeacherName FROM Teachers
MINUS
SELECT StudentName FROM Students;

Resultaat:

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. onvolledige informatie van zoekopdracht op pg_views

  2. PL/SQL Strong-referentiecursor met door de gebruiker gedefinieerd recordgegevenstype

  3. De ANSI_NULLS-instelling van een database vinden in SQL Server (T-SQL)

  4. Snellere innovatie leveren aan de gemeenschap van MariaDB