What is PL/SQL minus operator?

PL/SQL MINUS: Find Forskelle i Dine Data

05/04/2014

Rating: 4.17 (6102 votes)

I en verden af databaser er det ofte nødvendigt at sammenligne data mellem forskellige tabeller eller datasæt for at finde uoverensstemmelser, unikke poster eller manglende information. Oracle PL/SQL tilbyder et kraftfuldt værktøj til netop dette formål: MINUS-operatoren. Denne operator fungerer som en form for subtraktion mellem to forespørgsler, hvor den returnerer alle de rækker fra den første forespørgsel, som ikke findes i den anden. Dette gør den til et uundværligt redskab for udviklere og dataanalytikere, der arbejder med dataintegritet og -analyse.

What is PL/SQL minus operator?
In this article, We will learn about PL/SQL MINUS Operator in detail. The MINUS operator in PL/SQL (and Oracle SQL) is used to return all rows from the first query that are not present in the second query. It effectively subtracts the result set of the second query from the result set of the first query.

At forstå, hvordan MINUS fungerer, kan markant forbedre din evne til at skrive effektive og præcise SQL-forespørgsler. I denne artikel vil vi dykke ned i alt, hvad du behøver at vide om PL/SQL MINUS-operatoren, fra dens grundlæggende syntaks til praktiske eksempler, sammenligninger med andre operatorer og svar på ofte stillede spørgsmål.

Indholdsfortegnelse

Hvad er PL/SQL MINUS-operatoren?

MINUS-operatoren er en af SQL's sætoperatorer (set operators), ligesom UNION, UNION ALL og INTERSECT. Dens specifikke formål er at tage resultatsættet fra en SELECT-erklæring og fjerne de rækker, der også optræder i resultatsættet fra en anden SELECT-erklæring. Resultatet er et sæt af unikke rækker, som udelukkende findes i det første datasæt.

For at MINUS-operatoren kan fungere korrekt, er der to afgørende regler, der skal overholdes:

  1. Antal kolonner: Begge SELECT-erklæringer skal have det samme antal kolonner i deres resultatliste.
  2. Datatyper: Datatyperne for de tilsvarende kolonner i de to SELECT-erklæringer skal være kompatible. For eksempel skal den første kolonne i den første forespørgsel have en datatype, der er kompatibel med den første kolonne i den anden forespørgsel (f.eks. NUMBER med NUMBER, VARCHAR2 med VARCHAR2).

Hvis disse regler ikke overholdes, vil Oracle returnere en fejl, typisk ORA-01789: query block has incorrect number of result columns eller ORA-01790: expression must have same datatype as corresponding expression.

Grundlæggende Syntaks

Den generelle syntaks for MINUS-operatoren er ligetil og let at forstå:

SELECT kolonne1, kolonne2, ... FROM tabel1 [WHERE betingelser1] MINUS SELECT kolonne1, kolonne2, ... FROM tabel2 [WHERE betingelser2];

Her er en hurtig gennemgang af komponenterne:

  • Første SELECT-erklæring: Definerer det primære datasæt, hvorfra rækker potentielt vil blive returneret.
  • MINUS: Nøgleordet, der instruerer Oracle i at udføre subtraktionsoperationen.
  • Anden SELECT-erklæring: Definerer det datasæt, der skal "trækkes fra" det første. Alle rækker, der findes i dette resultat, vil blive fjernet fra det endelige resultat.

Praktiske Eksempler på MINUS-operatoren

For at illustrere, hvordan MINUS fungerer i praksis, lad os oprette to simple tabeller: studerende og indskrivninger. Den første tabel indeholder en liste over alle studerende, og den anden indeholder oplysninger om, hvilke studerende der er tilmeldt kurser.

Trin 1: Opret Tabeller

CREATE TABLE studerende ( student_id NUMBER PRIMARY KEY, student_navn VARCHAR2(100) ); CREATE TABLE indskrivninger ( enrollment_id NUMBER PRIMARY KEY, student_id NUMBER REFERENCES studerende(student_id), kursus_id NUMBER );

Trin 2: Indsæt Data

INSERT INTO studerende (student_id, student_navn) VALUES (1, 'John'); INSERT INTO studerende (student_id, student_navn) VALUES (2, 'Emma'); INSERT INTO studerende (student_id, student_navn) VALUES (3, 'Liam'); INSERT INTO studerende (student_id, student_navn) VALUES (4, 'Sophia'); INSERT INTO indskrivninger (enrollment_id, student_id, kursus_id) VALUES (101, 1, 501); INSERT INTO indskrivninger (enrollment_id, student_id, kursus_id) VALUES (102, 2, 502); INSERT INTO indskrivninger (enrollment_id, student_id, kursus_id) VALUES (103, 4, 503);

Eksempel 1: Find studerende uden kursusindskrivninger

Vores mål er at finde alle studerende, der er registreret i studerende-tabellen, men som ikke har nogen tilmeldinger i indskrivninger-tabellen. Dette er et klassisk scenarie for MINUS.

How to compare two queries in Oracle minus?
inventories; Code language: SQL (Structured Query Language) (sql) Try it Here is the result: Use the Oracle MINUS operator to compare two queries and return the distinct rows from the first query that are not output by the second query.
SELECT student_id, student_navn FROM studerende MINUS SELECT s.student_id, s.student_navn FROM studerende s JOIN indskrivninger e ON s.student_id = e.student_id;

Resultat:

STUDENT_ID STUDENT_NAVN ---------- ------------ 3 Liam

Forklaring: Den første forespørgsel returnerer alle fire studerende. Den anden forespørgsel (efter MINUS) returnerer de tre studerende, der har en indskrivning (John, Emma, Sophia). MINUS-operatoren trækker de tre fra de fire, og efterlader kun Liam, som er den eneste studerende uden en indskrivning.

Eksempel 2: Find unikke produkt-ID'er

Forestil dig et andet scenarie med tabellerne produkter og lagerbeholdning. Vi vil finde de produkter, der er oprettet i produkttabellen, men som endnu ikke har en lagerpost.

SELECT produkt_id FROM produkter MINUS SELECT produkt_id FROM lagerbeholdning;

Denne simple forespørgsel vil effektivt returnere en liste over alle produkt_id'er, der findes i produkter men ikke i lagerbeholdning. Dette er yderst nyttigt til dataanalyse og oprydning.

Sammenligning med andre Sætoperatorer

For at forstå MINUS fuldt ud er det nyttigt at sammenligne den med de andre sætoperatorer i SQL.

OperatorBeskrivelseResultat
UNIONKombinerer resultaterne fra to forespørgsler og fjerner dubletter.Returnerer alle unikke rækker fra begge forespørgsler.
UNION ALLKombinerer resultaterne fra to forespørgsler, men beholder alle dubletter.Returnerer alle rækker fra begge forespørgsler, inklusiv dubletter.
INTERSECTReturnerer kun de rækker, der findes i begge forespørgsler.Returnerer det fælles snit af de to datasæt.
MINUSReturnerer rækker fra den første forespørgsel, som ikke findes i den anden.Returnerer forskellen mellem det første og det andet datasæt.

Avancerede Overvejelser

Brug af ORDER BY

Du kan sortere resultatet af en MINUS-operation, men ORDER BY-klausulen skal placeres helt til sidst i den samlede erklæring. Den kan referere til kolonnenavne eller positioner fra den første SELECT-erklæring.

What is a minus query in Oracle/PLSQL?
Each SELECT statement within the MINUS query must have the same number of fields in the result sets with similar data types. The syntax for the MINUS operator in Oracle/PLSQL is: The columns or calculations that you wish to retrieve. The tables that you wish to retrieve records from. There must be at least one table listed in the FROM clause.
SELECT student_id, student_navn FROM studerende MINUS SELECT student_id, student_navn FROM indskrivninger ORDER BY student_navn; -- Sorterer det endelige resultat

Ydelse (Performance)

MINUS-operatoren kan have en betydelig indvirkning på ydelse, især med store datasæt. For at finde forskellen skal Oracle internt behandle, sortere og sammenligne begge resultatsæt. Hvis forespørgslerne, der udgør input til MINUS, er komplekse eller kører mod store tabeller, kan det være en ressourcekrævende operation. Sørg altid for, at de underliggende tabeller er korrekt indekseret for at optimere datahentningen.

Ofte Stillede Spørgsmål (FAQ)

Hvad er forskellen mellem MINUS og `NOT IN`?

Selvom `MINUS` og `NOT IN` kan bruges til at opnå lignende resultater, er der vigtige forskelle, især i håndteringen af `NULL`-værdier. Hvis subquery'en i en `NOT IN`-betingelse returnerer en `NULL`-værdi, vil hele den ydre forespørgsel ikke returnere nogen rækker, hvilket ofte er en uventet adfærd. `MINUS` håndterer `NULL`-værdier mere intuitivt ved at behandle dem som lig med hinanden under sammenligningen. Desuden fjerner `MINUS` automatisk dubletter fra det endelige resultat, hvorimod `NOT IN` ikke gør.

Er MINUS det samme som `EXCEPT`?

Ja, funktionelt er de identiske. `MINUS` er den traditionelle Oracle-syntaks. `EXCEPT` er standard SQL-syntaksen, som bruges i andre databasesystemer som SQL Server og PostgreSQL. Selvom Oracle understøtter `MINUS`, vil `EXCEPT` muligvis ikke fungere i alle Oracle-versioner. Det er bedst at holde sig til `MINUS` i et Oracle-miljø.

Kan jeg bruge MINUS på kolonner med forskellige navne?

Ja, kolonnenavnene behøver ikke at være de samme. Det er positionen og datatypen af kolonnerne i `SELECT`-listerne, der betyder noget. Oracle ser kun på den rækkefølge, du angiver kolonnerne i, ikke deres navne.

Konklusion

PL/SQL MINUS-operatoren er et elegant og kraftfuldt værktøj til at identificere forskelle mellem to datasæt. Ved at trække et resultatsæt fra et andet giver den en enkel metode til datavalidering, fejlsøgning og analyse. Uanset om du skal finde kunder, der ikke har afgivet en ordre, produkter uden lagerbeholdning eller studerende uden kurser, forenkler MINUS opgaven betydeligt. Ved at forstå dens syntaks, regler og hvordan den adskiller sig fra andre operatorer, kan du skrive mere præcise og effektive SQL-forespørgsler og sikre højere datakvalitet i dine applikationer.

Hvis du vil læse andre artikler, der ligner PL/SQL MINUS: Find Forskelle i Dine Data, kan du besøge kategorien Sundhed.

Go up