Skær sql eksempler. Operatør for INTERSECT-datasæt

SQL giver to måder at forbinde tabeller på:
  • angivelse af de tabeller, der skal forbindes (inklusive underforespørgsler) i FROM-sætningen i SELECT-sætningen. Først sammenføjes tabellerne, og først derefter anvendes betingelserne specificeret af WHERE-udtrykket på det resulterende sæt, aggregering defineret af GROUP BY-udtrykket, datarækkefølge osv.;
  • definere foreningen af ​​resultatsæt opnået ved at behandle SELECT-sætningen. I dette tilfælde er to SELECT-sætninger forbundet med sætningen UNION, KRYDSE, UNDTAGEN eller TILSVARENDE.

UNION

Udtryk UNION kombinerer resultaterne af to forespørgsler i henhold til følgende regler:

Standarden pålægger ingen begrænsninger for rækkefølgen af ​​rækker i resultatsættet. Nogle DBMS'er viser således først resultatet af den første forespørgsel og derefter resultatet af den anden forespørgsel. Oracle DBMS sorterer automatisk poster efter den første specificerede kolonne, selvom der ikke er oprettet et indeks for det.

Brug ORDER BY-sætningen for eksplicit at angive den påkrævede sorteringsrækkefølge. I dette tilfælde kan du bruge både kolonnenavnet og dets nummer (fig. 4.3).


Ris. 4.3.

Udtryk UNION ALL udfører en forening af to underforespørgsler svarende til en UNION-sætning med følgende undtagelser:

  • matchende rækker fjernes ikke fra det genererede resultatsæt;
  • flettede forespørgsler vises i resultatsættet sekventielt uden bestilling.

Når du slår mere end to forespørgsler sammen, kan du bruge parenteser til at ændre rækkefølgen, som joinoperationen udføres i (Figur 4.4).


Ris. 4.4.

INTERSECT forening

Udtryk KRYDSE giver dig mulighed for kun at vælge de rækker, der er til stede i hvert resultatsæt, der flettes. I fig. 4.5 viser et eksempel på at kombinere forespørgsler som krydsende sæt.


Ris. 4.5.

UNDTAGET deltage

Udtryk UNDTAGEN giver dig mulighed for kun at vælge de rækker, der er til stede i det første resultatsæt, der flettes, men ikke i det andet resultatsæt.

Sætninger KRYDSE Og UNDTAGEN bør kun understøttes i fuld overensstemmelse med SQL-92-standarden. Så nogle DBMS'er i stedet for sætningen

Når du ofte støder på en hvilken som helst teknologi, programmeringssprog eller standard, dannes et vist billede af deres evner og de grænser, som de bruges inden for. Sådan kan det fortsætte i temmelig lang tid, indtil øjet fanger eksempler, der udvider den hærdede videnshorisont. I dag vil jeg gerne tale om sådanne eksempler og demonstrere dem for SQL-sproget. Interessante og sjældne designs, glemte udtryk, mærkelige teknikker venter på dig i denne artikel. Alle interesserede, velkommen til kat.

Nuancer

Jeg bliver ofte spurgt, hvem er denne artikel til? Men tro mig, det er ikke altid let at give et svar: På den ene side er der ninja-udviklere, der er svære at overraske med noget, og på den anden side unge padawans. Men jeg kan sige én ting med sikkerhed - for en læser, der er interesseret i SQL, som er i stand til at supplere sit rige billede med små, men meget interessante detaljer. Denne artikel vil ikke indeholde kilometerlange sider med sql-forespørgsler, maksimalt 1 eller 2 linjer og kun det, der efter min mening er sjældent. Men da jeg vil være helt ærlig, hvis du ikke er fremmed for sql, vil artiklen virke lidt kedelig. Alle eksempler i artiklen, med undtagelse af det første og det fjerde, kan henføres til SQL-92-standarden.

Data

For at gøre vores liv lettere, har jeg sat en simpel dataplade op, hvorpå visse punkter vil blive testet, og for korthedens skyld vil jeg give resultatet af forsøget på dem. Jeg tjekker alle forespørgsler på PostgreSql.

Scripts og datatabel

CREATE TABLE varer(id bigint IKKE NULL, navnetegn varierende(127) NOT NULL, beskrivelseskarakter varierende(255) IKKE NULL, pris numerisk(16,2) IKKE NULL, artikulær karakter varierende(20) NOT NULL, act_time timestamp NOT NULL , tilgængelighed boolean NOT NULL, CONSTRAINT pk_goods PRIMARY KEY (id)); INDSÆT I varer (id, navn, beskrivelse, pris, articul, act_time, tilgængelighed) VÆRDIER (1, "Slippers", "Soft", 100,00, "TR-75", (ts "2017-01-01 01:01: 01.01"), SAND); INDSÆT I varer (id, navn, beskrivelse, pris, artikul, act_time, tilgængelighed) VÆRDIER (2, "Pude", "Hvid", 200.00, "PR-75", (ts "2017-01-02 02:02: 02.02"), SAND); INDSÆT I varer (id, navn, beskrivelse, pris, artikul, act_time, tilgængelighed) VÆRDIER (3, "Tæppe", "Ned", 300.00, "ZR-75", (ts "2017-01-03 03:03: 03.03"), TRUE); INDSÆT I varer (id, navn, beskrivelse, pris, articul, act_time, tilgængelighed) VÆRDIER (4, "Pudebetræk", "Grå", 400.00, "AR-75", (ts "2017-01-04 04:04: 04.04"), FALSK); INDSÆT I varer (id, navn, beskrivelse, pris, articul, act_time, tilgængelighed) VÆRDIER (5, "Sheet", "Silke", 500.00, "BR-75", (ts "2017-01-05 05:05: 05.05"), FALSK);

Forespørgsler

1. Dobbelte anførselstegn

Og det første jeg har er et simpelt spørgsmål: Kan du give et eksempel på en sql-forespørgsel ved hjælp af dobbelt citater? Ja, ikke med singler, doubler?

Eksempel med dobbelte anførselstegn

VÆLG navn "Produktnavn" FRA varer


Jeg blev meget overrasket, da jeg så dette for første gang. Hvis du forsøger at ændre dobbelte anførselstegn til enkelte anførselstegn, bliver resultatet fuldstændigt Andet!

Dette virker måske ikke som et meget nyttigt eksempel på reel udvikling. For mig er dette ikke tilfældet. Nu bruger jeg det aktivt i alle mine SQL-skabeloner. Pointen er enkel: Når du efter et halvt år vender tilbage til en sql-forespørgsel på 40 kolonner, åh hvor redder deres "vores" navn dig. På trods af at jeg ikke nævnte om SQL-92, er der i den seneste udgave en omtale af dobbelte anførselstegn.

2. Pseudo-tabel. SQL-92

Det er lidt unøjagtigt ud fra et terminologisk synspunkt, men essensen er enkel - tabellen, der stammer fra en underforespørgsel i FROM-sektionen. Måske det mest berømte faktum i denne artikel

Pseudo bord

VÆLG mock.kaldenavn "Kælenavn", (CASE NÅR mock.huff SÅ "Ja" ELLES "Nej" SLUT) "Fornærmet?" FRA (VÆLG navn SOM kaldenavn, tilgængelighed SOM huff FRA varer) mock

I vores eksempel er mock en pseudo-tabel (nogle gange kaldet en virtuel tabel). Naturligvis er de slet ikke beregnet til at fordreje den sande betydning. Et eksempel er dette.

3. Datablokkonstruktør. SQL-92

Det lyder skræmmende, simpelthen fordi jeg ikke har fundet en god oversættelse eller fortolkning. Og som altid er det nemmere at forklare med et eksempel:

Eksempel på datablokkonstruktør

VÆLG navn "Produktnavn", pris "Pris" FRA (VÆRDI ("Tøfler", 100,00), ("Pude", 200,00)) AS varer (navn, pris)

Produktnavn Pris
Hjemmesko 100.00
Pude 200.00

I afsnittet FRA anvendte søgeord VÆRDIER, efterfulgt af data i parentes, linje for linje. Pointen er, at vi slet ikke udvælger data fra nogen tabel, men blot opretter dem med det samme, "kalder" det en tabel, navngiver kolonnerne og bruger det derefter efter vores skøn. Denne ting viste sig at være yderst nyttig, når du tester forskellige sql-forespørgselssager, når der ikke er data for nogle tabeller (i din lokale database), og at skrive indsætning er for doven eller nogle gange meget vanskelig på grund af tabellernes slægtskab og begrænsninger .

4. Tid, dato og tid-og-dato

Sandsynligvis har alle i forespørgsler stødt på behovet for at specificere tid, dato eller dato-og-klokkeslæt. Mange DBMS'er understøtter henholdsvis bogstaverne t, d og ts til at arbejde med disse typer. Men det er nemmere at forklare med et eksempel: For bogstaverne d og t er alt ens.
Jeg undskylder over for læseren for at have vildledt mig, men alt, hvad der er sagt i afsnit 4, vedrører ikke SQL-sproget, men vedrører mulighederne for at forbehandle forespørgsler i JDBC.

5. Benægtelse. SQL-92

Vi kender alle til operatøren IKKE, men meget ofte glemmer de, at det kan anvendes både på en gruppe prædikater og på en enkelt kolonne:

6. Sammenligning af datablokke. SQL-92

Endnu en gang undskylder jeg for terminologien. Dette er et af mine yndlingseksempler

Eksempel på sammenligning af datablokke

VÆLG * FRA varer WHERE (navn, pris, tilgængelighed) = ("Pudebetræk", 400,00, FALSK) -- eller tilsvarende VÆLG * FRA varer WHERE navn = "Pudebetræk" OG pris = 400,00 OG tilgængelighed = FALSK

Som det kan ses af eksemplet, svarer sammenligning af datablokke til at sammenligne element-for-element betyder_ 1 _blok_1 = værdi_ 1 _blok_2, værdi_ 2 _blok_1 = værdi_ 2 _blok_2, værdi_ 3 _blok_1 = værdi_ 3 _blok_2 ved brug af OG mellem dem.

7. Sammenlign operatorer med modifikatorer ENHVER, NOGET eller ALLE. SQL-92

Det er her, der er behov for en vis afklaring. Men som altid, først et eksempel Hvad betyder det ALLE I dette tilfælde? Og det betyder, at valgbetingelsen kun er opfyldt af de rækker, hvis identifikatorer (i vores tilfælde er disse 4 og 5) er større nogen fra de fundne værdier i underforespørgslen (1, 2 og 3). 4 er større end 1 og end 2 og end 3. 5 er det samme. Hvad sker der, hvis vi udskifter ALLENOGEN?
Hvad betyder det NOGEN I dette tilfælde? Og det betyder, at valgbetingelsen kun er opfyldt af de rækker, hvis identifikatorer (i vores tilfælde er disse 2, 3, 4 og 5) er større mindst en fra de fundne værdier i underforespørgslen (1, 2 og 3). For mig selv associerede jeg ALLE Med OG, A NOGEN Med ELLER. NOGLE Og NOGEN analoger til hinanden.

8. Operatører til at arbejde med/under forespørgsler. SQL-92

Det er velkendt, at man kan kombinere 2 forespørgsler med hinanden ved hjælp af operatorerne UNION eller UNION ALLE. Dette bruges ofte. Men der er 2 operatører mere UNDTAGEN Og KRYDSE.

Eksempel med UNDTAG

Faktisk er dataene fra det andet sæt udelukket fra det første sæt værdier.
Faktisk sker skæringspunktet mellem det første sæt værdier og det andet sæt.
Det er alt, tak for din opmærksomhed.

Redaktionel

N1. Tak til streetflush for den konstruktive kritik. Bidraget med en artikel med information om, hvad der er en sprogstandard, og hvad der ikke er.
N2. Punkt 4 er blevet rettet for at tydeliggøre, at ts/d/t ikke er en del af SQL-sproget. Tak for din opmærksomhed Melkij.

Lektionen vil dække emnet brug af operationer af unions-, kryds- og forskelsforespørgsler. Eksempler på hvordan det bruges SQL-forespørgsel Union, Exists og brugen af ​​nøgleordene SOME, ANY og All. Stringfunktioner dækket


Du kan udføre operationerne af union, difference og kartesisk produkt på et sæt. De samme operationer kan bruges i sql-forespørgsler (udfør operationer med forespørgsler).

Et specielt ord bruges til at kombinere flere forespørgsler UNION.
Syntaks:

< запрос 1 >UNION[ALLE]< запрос 2 >

<запрос 1>UNION<запрос 2>

Union SQL-forespørgslen bruges til at kombinere outputrækkerne for hver forespørgsel til et enkelt resultatsæt.

Hvis brugt parameter ALLE, så gemmes alle duplikerede outputlinjer. Hvis parameteren mangler, er der kun unikke rækker tilbage i resultatsættet.

Du kan kombinere et hvilket som helst antal forespørgsler sammen.

Brug af UNION-operatøren kræver, at flere betingelser er opfyldt:

  1. antallet af outputkolonner for hver forespørgsel skal være det samme;
  2. outputkolonnerne for hver forespørgsel skal være sammenlignelige med hinanden efter datatype (i prioriteret rækkefølge);
  3. det resulterende sæt bruger kolonnenavnene angivet i den første forespørgsel;
  4. ORDER BY kan kun bruges i slutningen af ​​en sammensat forespørgsel, fordi den gælder for resultatet af joinforbindelsen.

Eksempel: Vis priser for computere og bærbare computere samt deres numre (dvs. aflæs fra to forskellige tabeller i én forespørgsel)


✍ Løsning:
1 2 3 4 5 6 VÆLG `Number` , `Pris` FRA pc UNION VÆLG `Number` , `Pris` FRA notesbog BESTIL EFTER `Pris`

VÆLG `Number` , `Pris` FRA pc UNION VÆLG `Number` , `Pris` FRA notesbog BESTIL EFTER `Pris`

Resultat:

Lad os se på et mere komplekst eksempel med en indre sammenføjning:

Eksempel: Find produkttype, antal og pris på computere og bærbare computere


✍ Løsning:
1 2 3 4 5 6 7 8 VÆLG produkt. `Type` , stk. `Antal` , `Pris` FRA pc INNER JOIN produkt PÅ pc. 'Nummer' = produkt. `Nummer` UNION SELECT-produkt. `Type` , notesbog. `Nummer` , `Pris` FRA notebook INNER JOIN produkt PÅ notebook. 'Nummer' = produkt. `Nummer` BESTIL EFTER `Pris`

VÆLG produkt.`Type` , stk.`Number` , `Pris` FRA pc INNER JOIN produkt PÅ pc.`Number` = produkt.`Nummer` UNION SELECT produkt.`Type` , notesbog.`Nummer` , `Pris` FRA notebook INNER JOIN produkt PÅ notesbog.`Number` = produkt.`Number` BESTIL EFTER `Pris`

Resultat:

SQL Union 1. Find producent, varenummer og pris på alle bærbare computere og printere

SQL Union 2. Find numre og priser på alle produkter produceret af producenten Rusland

SQL-eksistensprædikat FINDER

SQL har faciliteter til at udføre skærings- og differensoperationer på forespørgsler - INTERSECT-udtrykket (skæringspunktet) og EXCEPT-udtrykket (forskel). Disse klausuler fungerer på samme måde som UNION: Resultatsættet inkluderer kun de rækker, der er til stede i begge forespørgsler - INTERSECT, eller kun de rækker i den første forespørgsel, der mangler i den anden - UNDTAGET. Men problemet er, at mange DBMS'er ikke understøtter disse forslag. Men der er en vej ud - ved at bruge prædikatet EXISTS.

EXISTS-prædikatet evalueres til TRUE, hvis underforespørgslen returnerer mindst nogle rækker; ellers evalueres EXISTS til FALSE. Der er også et prædikat IKKE FINDER, som gør det modsatte.

EXISTS bruges typisk i afhængige underforespørgsler (f.eks. IN).

EKSISTERER(tabel underforespørgsel)

Eksempel: Find computerproducenter, der også producerer bærbare computere


✍ Løsning:

VÆLG DISTINCT Producent FRA produkt SOM pc_product WHERE Type = "Computer" OG FINNES (VÆLG producent FRA produkt WHERE Type = "Bærbar" OG Producent = pc_product.Manufacturer)

Resultat:

Find de computerproducenter, der ikke laver printere

SQL NOGLE nøgleord | ALLE og ALT

Nøgleordene SOME og ANY er synonyme, så du kan bruge et af dem i din forespørgsel. Resultatet af en sådan forespørgsel vil være én kolonne med værdier.

Syntaks:

< выражение>< оператор сравнения>NOGLE | NOGEN (< подзапрос> )

<выражение><оператор сравнения>NOGLE | NOGEN (<подзапрос>)

Hvis for en værdi X returneret fra en underforespørgsel, resultatet af " " operationen returnerer TRUE , så evalueres ANY prædikatet også til TRUE .

Eksempel: Find computerleverandører, hvis numre ikke er til salg (dvs. ikke i pc-tabellen)


✍ Løsning:

Tabelkildedata:

Resultat:

I eksemplet vil prædikatet Number = ANY(SELECT Number FROM pc) returnere værdien TRUE, når tallet fra hovedforespørgslen findes på listen over Numbers i tabel pc (returneret af underforespørgslen). Derudover bruges IKKE. Resultatsættet vil bestå af én kolonne - Producent. For at forhindre, at én producent vises flere gange, er serviceordet DISTINCT blevet indført.
Lad os nu se på at bruge søgeordet ALL:

Eksempel: Find tal og priser på bærbare computere, der koster mere end nogen computer


✍ Løsning:

Vigtig: Det er værd at bemærke, at generelt returnerer en forespørgsel med ANY et sæt værdier. Derfor kan brug af en underforespørgsel i en WHERE-sætning uden operatorerne EXISTS , IN , ALL og ANY, som producerer en boolsk værdi, resultere i en forespørgselskørselsfejl


Eksempel: Find numre og priser på computere, hvis omkostninger overstiger minimumsprisen for bærbare computere


✍ Løsning:


Denne forespørgsel er korrekt, fordi det skalære udtryk Pris sammenlignes med en underforespørgsel, der returnerer en enkelt værdi

Funktioner til at arbejde med strenge i SQL

VENSTRE-funktionen skærer antallet af tegn, der er angivet af det andet argument, fra venstre for en streng:

VENSTRE (<строка>,<число>)

Funktionen HØJRE returnerer det angivne antal tegn til højre fra et strengudtryk:

HØJRE(<строка>,<число>)

Eksempel: Udskriv de første bogstaver i navnene på alle producenter


✍ Løsning:

SELECT DISTINCT LEFT(`Producent` , 1) FRA `produkt`

Resultat:

Eksempel: Udskriv producentnavne, der begynder og slutter med det samme bogstav


✍ Løsning:

SQL Replace funktion

Syntaks:

VÆLG `navn` , REPLACE(`navn` , "a", "aa") FRA `lærere`

Der er kun én vigtig regel at huske, når du bruger EXCEPT-sætningen.

Rækkefølgen, antallet og datatyperne for kolonner skal være de samme i alle forespørgsler.

Ifølge ANSI-standarden har UNION- og EXCEPT-sætoperatørerne samme forrang, men INTERSECT-operatøren udføres før andre sætoperatører. Vi anbefaler eksplicit at kontrollere operatørernes forrang ved hjælp af parenteser. Dette er generelt en meget god praksis.

I henhold til ANSI-standarden kan du kun bruge én ORDER BY-klausul i en forespørgsel. Indsæt det helt til sidst i den sidste SELECT-sætning. For at undgå tvetydighed i navngivning af kolonner og tabeller skal du sørge for at tildele det samme alias til alle matchende tabelkolonner. For eksempel:

SELECT au_lname AS "efternavn", au_fname AS "firstname" FRA forfattere UNDTAGET VÆLG emp_lname AS "efternavn", emp_fname AS "firstname" FRA medarbejdere BESTIL EFTER efternavn, fornavn;

Fordi hver kolonneliste kan specificere kolonner med tilsvarende kompatible datatyper, kan forskellige RDBMS-platforme desuden have forskellige muligheder for at håndtere kolonner af forskellig længde. For eksempel, hvis au_lname-kolonnen fra den første forespørgsel i det foregående eksempel er betydeligt længere end kolonnen emp_lname fra den anden forespørgsel, kan forskellige platforme have forskellige regler for at bestemme længden af ​​det endelige resultat. Men generelt vil platforme vælge en længere (og mindre restriktiv) størrelse til resultatet.

Hver RDBMS kan have sine egne regler for brug af et kolonnenavn, hvis navnene i kolonnelisterne er forskellige. Generelt bruges kolonnenavnene på den første forespørgsel.

Datatyperne behøver ikke at være identiske, men de skal være kompatible. For eksempel er typerne CHAR og VARCHAR kompatible. Som standard vil resultatet i hver kolonne være den størrelse, der svarer til den største type på hver bestemt position. For eksempel vil en forespørgsel, der henter data fra kolonner, der indeholder værdier af typen VARCHAR(IO) og VARCHAR(15), bruge typen og størrelsen VARCHAR(15).

Ingen af ​​platformene understøtter CORRESPONDING )) UNDTAGET klausulen

(SELECT statementr.2 | VALUES (expressionl, expression2 [, ...])) UNDTAGET

Giver dig mulighed for at angive en eller flere manuelt angivne kolonner, der er inkluderet i det endelige resultatsæt. (Dette kaldes en rækkekonstruktør.) VALUES-udtrykket skal angive nøjagtigt lige så mange kolonner som EXCEPT-sætningsforespørgslerne. Selvom EXCEPT DISTINCT-sætningen ikke understøttes, er den funktionelle ækvivalent EXCEPT. CORRESPONDING-sætningen understøttes ikke. Derudover bruges datatyperne LONG VARCHAR, LONG VARGRAPHIC, BLOB, CLOB, DBCLOB, DATALINK og strukturtyperne ikke i EXCEPT-udtrykket, men de kan bruges i EXCEPT ALL-udtrykket.

Hvis resultatsættet har en kolonne, der har samme navn i alle SELECT-sætninger, bruges det navn som det endelige navn for kolonnen, der returneres af sætningen. Hvis en given kolonne er navngivet forskelligt i forskellige SELECT-sætninger, skal du omdøbe kolonnen i alle forespørgsler ved at bruge den samme AS-aliassætning i dem alle.

Hvis en enkelt forespørgsel bruger flere operatorer til at arbejde med datasæt, udføres den i parentes først. Herefter vil rækkefølgen af ​​udførelsen være fra venstre mod højre. Alle INTERSECT-sætninger udføres dog før UNION- og EXCEPT-sætningerne. For eksempel:

SELECT empno FROM ansat WHERE workdept LIKE "E%" UNDTAGET SELECT empno FROM emp_act WHERE projno IN (TF1000", TF2000", -AD3110")) UNION VALUES ("AA0001"), ("AB0002"), ("AC0003") ;

I eksemplet ovenfor hentes ID'erne for alle medarbejdere, der arbejder i afdelingen, der starter med "E", fra medarbejdertabellen, derefter fjernes ID'erne for dem, der er ansat i projekterne IF1000, IF200 og AD3110 fra medarbejderkontitabellen (emp_act Til sidst tilføjes tre yderligere ID'er - AA0001, AB0002 og AC0003 ved hjælp af UNION-sættet-operatoren.

MySQL

MySQL understøtter ikke EXCEPT-operatøren. Alternativt kan du bruge operatorerne NOT IN eller NOT EXISTS.

I denne tutorial lærer du, hvordan du bruger UNDTAGET operatør i SQL Server(Transact-SQL) med syntaks og eksempler.

Beskrivelse

SQL Server EXCEPT-sætning(Transact-SQL) bruges til at returnere alle rækker i den første SELECT-sætning, som ikke returneres af den anden SELECT-sætning. Hver SELECT-sætning vil definere et datasæt. EXCEPT-operatøren vil hente alle poster fra det første datasæt og derefter fjerne alle poster fra det andet datasæt fra resultaterne.

Undtagen forespørgsel

Forklaring: EXCEPT-forespørgslen returnerer poster i et gråt skraveret område. Dette er poster, der findes i SELECT 1 og ikke i SELECT 2.
Hver SELECT-sætning i en EXCEPT-forespørgsel skal have det samme antal felter i resultatsæt med lignende datatyper.

Syntaks

UNDTAGET sætningssyntaks i SQL Server (Transact-SQL):

Parametre eller argumenter

udtryk er de kolonner eller beregninger, du vil sammenligne mellem to SELECT-sætninger. De behøver ikke at være de samme felter i hver SELECT-sætning, men de tilsvarende kolonner skal være af lignende datatyper.
tabeller - tabeller, som du ønsker at hente poster fra. Der skal være mindst én tabel i FROM-sætningen.
WHERE betingelser - valgfrit. Betingelser, der skal være opfyldt for de valgte poster.

Bemærk

  • Begge SELECT-sætninger skal have det samme antal udtryk.
  • De tilsvarende kolonner i hver SELECT-sætning skal have lignende datatyper.
  • EXCEPT-sætningen returnerer alle poster fra den første SELECT-sætning, som ikke er i den anden SELECT-sætning.
  • EXCEPT-operatoren i SQL Server svarer til MINUS-operatoren i Oracle.

Eksempel på enkelt udtryk

Lad os se på et eksempel på en EXCEPT-sætning i SQL Server (Transact-SQL), der returnerer et enkelt felt med samme datatype.
For eksempel:

Transact-SQL

SELECT product_id FROM products EXCEPT SELECT product_id FROM inventory;

VÆLG produkt-id

FRA produkter

VÆLG produkt-id

FRA inventar ;

Dette EXCEPT-udsagnseksempel returnerer alle product_id-værdier, der er i produkttabellen og ikke i beholdningstabellen. Dette betyder, at hvis der findes en product_id-værdi i produkttabellen og også findes i inventory-tabellen, vises product_id-værdien ikke i resultaterne af EXCEPT-forespørgslen.

Eksempel med flere udtryk

Lad os derefter se på et eksempel UNDTAGET forespørgsel i SQL Server (Transact-SQL), der returnerer mere end én kolonne.
For eksempel:

Transact-SQL

I dette eksempel returnerer EXCEPT-forespørgslen poster i kontakttabellen med navnet kontakt_id, efternavn og fornavn, som ikke matcher værdien medarbejder_id, efternavn og fornavn i medarbejdertabellen.