itthon / Közösségi hálózatok / INTERSECT adatkészletek operátora. Összetett SQL-lekérdezések Karakterlánc-függvények végrehajtása SQL-ben

INTERSECT adatkészletek operátora. Összetett SQL-lekérdezések Karakterlánc-függvények végrehajtása SQL-ben

Az INTERSECT utasítás azonos sorokat kér le egy vagy több lekérdezés eredményhalmazából. Bizonyos szempontból az INTERSECT operátor nagyon hasonlít az INNER JOIN-hoz.

Az INTERSECT az adatkészletekkel való munkavégzéshez szükséges operátorok osztályába tartozik (készlet operátor). Egyéb ilyen szolgáltatók közé tartozik az EXCEPT és az UNION. Az összes adatkészlet-operátor két vagy több lekérdezés eredménykészletének egyidejű manipulálására szolgál, innen ered a nevük is.

Szintaxis SQL2003

Az INTERSECT utasításban a lekérdezések számának nincs technikai korlátja. Az általános szintaxis a következő.

METSZÉS

]KERESÉS

Kulcsszavak

Az összes eredményhalmaz ismétlődő sorait tartalmazza.

KÜLÖNBÖZŐ

A duplikált sorokat a rendszer eltávolítja az összes eredményhalmazból, mielőtt az INTERSECT utasítás elvégzi az összehasonlítást. A NULL értékű oszlopok ismétlődésnek minősülnek. Ha sem ALL, sem DISTINCT nincs megadva, akkor alapértelmezés szerint a KÜLÖNBÖZŐ.

MEGFELELŐ

Megadja, hogy csak a mindkét lekérdezésben azonos nevű oszlopok jelenjenek meg, még akkor is, ha mindkét lekérdezés helyettesítő karaktert (*) használ.

Megadja, hogy csak az elnevezett oszlopok jelenjenek meg, még akkor is, ha a lekérdezések más, egyező nevű oszlopokat találnak. Ezt a záradékot a MEGFELELŐ kulcsszóval együtt kell használni.

Általános szabályok

Csak egy fontos szabályt kell megjegyezni, amikor az INTERSECT operátorral dolgozik.

Az összes lekérdezésben az oszlopok sorrendjének és számának azonosnak kell lennie. A megfelelő oszlopok adattípusainak is kompatibilisnek kell lenniük.

Például a CHAR és a VARCHAR típusok kompatibilisek. Alapértelmezés szerint az egyes oszlopokban lévő eredménykészlet az adott pozícióban lévő legnagyobb típusnak megfelelő méretet fogja használni.

Egyik platform sem támogatja a MEGFELELŐ záradékot.

Az ANSI szabvány szerint az INTERSECT operátor magasabb prioritással rendelkezik, mint a többi halmazoperátor, bár az ilyen operátorok elsőbbségét a különböző platformokon eltérően kezelik. A zárójelek használatával kifejezetten szabályozhatja az operátor elsőbbségét. Ellenkező esetben a DBMS végrehajthatja azokat balról jobbra, vagy az elsőtől az utolsóig sorrendben.

Az ANSI szabvány szerint egy lekérdezésben csak egy ORDER BY záradék használható. Illessze be az utolsó SELECT utasítás legvégére. Az oszlopok és táblázatok megadásával kapcsolatos félreértések elkerülése érdekében ügyeljen arra, hogy ugyanazt az álnevet rendelje hozzá az összes megfelelő táblázatoszlophoz. Például:

Azokon a platformokon, amelyek nem támogatják az INTERSECT operátort, lecserélheti egy FULL JOIN segédlekérdezésre.

SELECT a.au_lname AS "vezetéknév", a.au_fname AS "utónév" FROM szerzőktől AS INTERSECT SELECT e.emp_lname AS "vezetéknév", e.emp_fname AS "keresztnév" FROM alkalmazottaktól AS e ORDER BY vezetéknév, keresztnév;

Mivel a különböző INTERSECT utasításokban lévő oszlopok adattípusai kompatibilisek lehetnek, a különböző RDBMS platformok találkozhatnak különböző változatok különböző hosszúságú oszlopokkal dolgozni. Például, ha az előző példában az első lekérdezés aujname oszlopa jelentősen hosszabb, mint a második lekérdezés empjname oszlopa, akkor a különböző platformokon eltérő szabályok vonatkozhatnak a végeredmény hosszának meghatározására. De általában véve a platformok hosszabb (és kevésbé korlátozó) méretet választanak az eredményhez.

Minden RDBMS érvényesítheti saját szabályait az oszlopnév használatára, ha az oszloplistákban szereplő nevek eltérnek. Általában az első lekérdezés oszlopneveit használják.

DB2

A DB2 platform támogatja az ANSI INTERSECT és INTERSECT ALL kulcsszavakat, valamint egy opcionális VALUES záradékot.

(utasítás._SELECT_7 | ÉRTÉKEK (7 kifejezés [, ...])) INTERSECT

] (utasítás_SCJ_2 | ÉRTÉKEK (2. kifejezés [, ...])) INTERSECT

Bár az INTERSECT DISTINCT utasítás nem támogatott, a funkcionális megfelelője az INTERSECT. A MEGFELELŐ záradék nem támogatott.

Ezenkívül a LONG VARCHAR, LONG VARGRAPHIC, BLOB, CLOB, DBCLOB, DATALINK adattípusok és szerkezettípusok nem használatosak INTERSECT záradékban, de használhatók INTERSECT ALL záradékban.

Ha az eredményhalmazban van egy oszlop, amelynek minden SELECT utasításban ugyanaz a neve, akkor ez a név lesz az utasítás által visszaadott oszlop végső neve. Ha azonban különböző oszlopneveket használnak a lekérdezésekben, a DB2 platform új nevet generál az eredményül kapott oszlop számára. Ezt követően az ORDER BY és FOR UPDATE záradékokban használhatatlanná válik.

Ha több operátort használ egyetlen lekérdezésben az adatkészletekkel való munkavégzéshez, akkor először a zárójelbe tett operátor kerül végrehajtásra. Ezt követően a végrehajtási sorrend balról jobbra halad. Azonban az összes INTERSECT utasítás az UNION és EXCEPT utasítások előtt végrehajtásra kerül, például:

SELECT empno FROM alkalmazott WHERE workdept LIKE "E%" INTERSECT (SELECT empno FROM emp_act WHERE projno IN ("IF1000", "IF2000", "AD3110") UNION VALUES ("AA0001"), ("AB0002"), ("AC0003" "))

A fenti példa lekéri a részleg összes alkalmazottjának azonosítóját, akiknek a neve "E" betűvel kezdődik az alkalmazottak táblájából. Az azonosítók azonban csak akkor kerülnek lekérésre, ha az emp_act nevű alkalmazotti fióktáblában is szerepelnek, és részt vesznek az IF1000, IF200" és AD3110 projektekben.

Abban tanulási útmutató megtanulod használni KIVÉVE utasítás az SQL Serverben(Transact-SQL) szintaxissal és példákkal.

Leírás

SQL Server, KIVÉVE utasítás A (Transact-SQL) az első SELECT utasítás összes olyan sorát adja vissza, amelyet a második SELECT utasítás nem ad vissza. Minden SELECT utasítás meghatároz egy adatkészletet. Az EXCEPT utasítás kivonja az összes rekordot az első adatkészletből, majd eltávolítja a második adatkészlet összes rekordját az eredmények közül.

Kivéve a kérést

Magyarázat: Az EXCEPT lekérdezés a szürke árnyalatú területen lévő bejegyzéseket adja vissza. Ezek olyan rekordok, amelyek a SELECT 1-ben léteznek, és nem a SELECT 2-ben.
Az EXCEPT lekérdezés minden SELECT utasításának ugyanannyi mezőt kell tartalmaznia a hasonló adattípusú eredménykészletekben.

Szintaxis

Az EXCEPT utasítás szintaxisa az SQL Serverben (Transact-SQL) a következő:

Opciók vagy érvek

kifejezések azok az oszlopok vagy számítások, amelyeket össze szeretne hasonlítani a két SELECT utasítás között. Nem kell minden SELECT utasításban azonos mezőknek lenniük, de a megfelelő oszlopoknak hasonló adattípusúaknak kell lenniük.
táblák - táblák, amelyekből rekordokat szeretne kapni. Legalább egy táblázatnak szerepelnie kell a FROM záradékban.
WHERE feltételek – nem kötelező. Feltételek, amelyeknek teljesülniük kell a kiválasztott rekordokhoz.

jegyzet

  • Mindkét SELECT utasításnak ugyanannyi kifejezést kell tartalmaznia.
  • A SELECT utasítások megfelelő oszlopainak hasonló adattípusokkal kell rendelkezniük.
  • Az EXCEPT utasítás az összes rekordot visszaadja az elsőtől SELECT utasítás, amely nem szerepel a második SELECT utasításban.
  • Az EXCEPT utasítás az SQL Serverben megegyezik az Oracle MINUS utasításával.

Példa egyetlen kifejezésre

Nézzünk egy példát egy EXCEPT utasításra az SQL Serverben (Transact-SQL), amely egyetlen mezőt ad vissza ugyanazzal az adattípussal.
Például:

Transact-SQL

SELECT product_id FROM products EXCEPT SELECT product_id FROM készletből;

SELECT product_id

A termékekből

SELECT product_id

készletből ;

Ez az EXCEPT utasításpélda visszaadja az összes olyan product_id értéket, amely a termékek táblájában található, és nem a készlettáblázatban. Ez azt jelenti, hogy ha a product_id érték létezik a termékek táblában, és létezik a készlettáblázatban is, akkor a product_id érték nem jelenik meg a KIVÉTELI lekérdezések eredményeiben.

Példa több kifejezéssel

Ezután nézzünk meg egy példát egy EXCEPT lekérdezésre az SQL Serverben (Transact-SQL), amely egynél több oszlopot ad vissza.
Például:

Transact-SQL

Ebben a példában az EXCEPT lekérdezés a kapcsolattartó táblában a kapcsolati_azonosító , a vezetéknév és a keresztnév rekordokat adja vissza, amelyek nem egyeznek meg az alkalmazottak_azonosítója , vezeték_neve és keresztnév értékével az alkalmazottak táblában.

Az SQL két módot kínál a táblák összekapcsolására:
  • az összekapcsolandó táblák (beleértve az allekérdezéseket) megadásával a SELECT utasítás FROM záradékában. Először a táblákat egyesítjük, majd csak ezután alkalmazzuk a kapott halmazra a WHERE záradék által meghatározott feltételeket, az összesítést, az adatsorrendet stb., a GROUP BY záradék által meghatározott stb.
  • a SELECT utasítás feldolgozása által előállított eredményhalmazok uniójának meghatározása. Ebben az esetben a két SELECT utasítást a kifejezés köti össze UNIÓ, METSZÉS, KIVÉVE vagy MEGFELELŐ .

UNIÓ

Kifejezés UNIÓ két lekérdezés eredményeit egyesíti a következő szabályok szerint:

A szabvány nem ír elő semmilyen korlátozást az eredményhalmazban a sorok sorrendjére vonatkozóan. Így egyes DBMS-ek először az első lekérdezés eredményét jelenítik meg, majd a második lekérdezés eredményét. Az Oracle DBMS automatikusan az első megadott oszlop szerint rendezi a rekordokat, még akkor is, ha nem jött létre index.

A szükséges rendezési sorrend kifejezett megadásához használja az ORDER BY záradékot. Ebben az esetben használhatja az oszlop nevét és számát is (4.3. ábra).


Rizs. 4.3.

Kifejezés UNIÓ Az ALL ugyanúgy hajtja végre a két részlekérdezés egyesítését, mint az UNION záradék, a következő kivételekkel:

  • a megfelelő sorok nem kerülnek eltávolításra a generált eredménykészletből;
  • az egyesített lekérdezések sorrend nélkül, egymás után jelennek meg az eredményhalmazban.

Kettőnél több lekérdezés kombinálásakor a zárójelek segítségével módosítható az összekapcsolási művelet végrehajtásának sorrendje (4.4. ábra).


Rizs. 4.4.

INTERSECT csatlakozás

Kifejezés METSZÉS lehetővé teszi, hogy csak azokat a sorokat jelölje ki, amelyek az egyesítendő eredménykészletekben jelen vannak. ábrán. A 4.5 példát mutat be a lekérdezések metsző halmazokként való kombinálására.


Rizs. 4.5.

KIVÉVE a szakszervezetet

Kifejezés KIVÉVE lehetővé teszi, hogy csak azokat a sorokat jelölje ki, amelyek az első eredményhalmazban szerepelnek egyesítendő, de a második eredményhalmazban nem.

Kifejezések METSZÉSés KIVÉVE csak a teljes SQL-92 megfelelőségi szinten támogatandó. Tehát néhány DBMS a kifejezés helyett

Ha gyakran találkozunk bármilyen technológiával, programozási nyelvvel, szabvánnyal, kialakul egy bizonyos kép a képességeikről, a használatuk határairól. Ez még sokáig eltarthat, amíg nem akadnak olyan példák, amelyek kitágítják a tudás edzett horizontját. Ma ilyen példákról szeretnék beszélni, és bemutatni őket az SQL nyelvhez. Érdekes és ritka tervek, elfeledett kifejezések, furcsa trükkök várnak rád ebben a cikkben. Akit érdekel, várjuk a kat.

Árnyalatok

Gyakran kérdezik tőlem, hogy kinek szól ez a cikk? De hidd el, nem mindig könnyű választ adni: egyrészt vannak nindzsafejlesztők, akiket nehéz bármivel is meglepni, másrészt fiatal padawanok. Egyet azonban biztosan mondhatok - az SQL iránt érdeklődő olvasónak, aki apró, de nagyon érdekes részletekkel tudja kiegészíteni gazdag képét. Ez a cikk nem tartalmaz majd kilométeres oldalakat egy sql lekérdezésből, maximum 1, 2 sort, és csak azt, ami szerintem ritka. De mivel teljesen őszinte akarok lenni, ha sql van rajtad, unalmasnak tűnik a cikk. A cikkben szereplő összes példa, az első és a negyedik kivételével, az SQL-92 szabványnak tulajdonítható.

Adat

Hogy megkönnyítsem az életünket, dobtam egy egyszerű adattáblát, amelyen bizonyos pontokat tesztelnek, és a rövidség kedvéért ezeken közlöm a kísérlet eredményét. Minden kérést ellenőrizek a PostgreSql-en.

Szkriptek és adattábla

CREATE TABLE áruk(id bigint NOT NULL, név karakter változó(127) NOT NULL, leírás karakter változó(255) NOT NULL, ár numeric(16,2) NOT NULL, articul karakter variing(20) NOT NULL, act_time timestamp NOT NULL , elérhetőségi logikai érték NOT NULL, CONSTRAINT pk_goods PRIMARY KEY (id)); INSERT INTO áruk (azonosító, név, leírás, ár, cikk, act_time, elérhetőség) ÉRTÉKEK (1, "Papucsok", "Puha", 100.00, "TR-75", (ts "2017-01-01 01:01: 01.01"), IGAZ); INSERT INTO áruk (azonosító, név, leírás, ár, cikk, act_time, elérhetőség) ÉRTÉKEK (2, "Párna", "Fehér", 200.00, "PR-75", (ts "2017-01-02 02:02: 02,02"), IGAZ); INSERT INTO áruk (azonosító, név, leírás, ár, cikk, act_time, elérhetőség) ÉRTÉKEK (3, "Blanket", "Down", 300.00, "ZR-75", (ts "2017-01-03 03:03: 03,03"), IGAZ); INSERT INTO áruk (azonosító, név, leírás, ár, cikk, act_time, elérhetőség) ÉRTÉKEK (4, "Párnahuzat", "Szürke", 400.00, "AR-75", (ts "2017-01-04 04:04: 04.04"), HAMIS); INSERT INTO áruk (azonosító, név, leírás, ár, cikk, act_time, elérhetőség) ÉRTÉKEK (5, "Sheet", "Silk", 500.00, "BR-75", (ts "2017-01-05 05:05: 05.05"), HAMIS);

Kérések

1. Dupla idézőjelek

És az első dolgom egy egyszerű kérdés: Tudnál példát mondani egy sql lekérdezésre kettős idézetek? Igen, nem egyesekkel, párosokkal?

Példa dupla idézőjelekkel

KIVÁLASZTJA a "Terméknév" nevet az árukból


Nagyon meglepődtem, amikor először láttam. Ha megpróbálja a dupla idézőjeleket szimpla idézőjelekre cserélni, az eredmény teljes lesz különböző!

Úgy tűnhet, hogy ez nem túl hasznos példa a valódi fejlődéshez. Számomra nem az. Most aktívan használom az összes sql-blankomban. A lényeg egyszerű, ha fél év múlva visszatérsz egy 40 oszlopos sql-lekérdezéshez, ó, hogy ment a "mi" nevük. Annak ellenére, hogy nem jeleztem az SQL-92-ről, a legújabb kiadásban dupla idézőjelek szerepelnek.

2. Álasztal. SQL-92

Kicsit nem pontosan, terminológiát tekintve, de a lényeg egyszerű - a FROM szekció részlekérdezéséből származó táblázat. Talán a legtöbbet ismert tény ebben a cikkben

Pszeudo asztal

SELECT mock.nickname "Becenév", (CASE WHEN mock.huff THEN "Yes" ELSE "No" END) "Huffed?" FROM (SELECT név AS becenév, elérhetőség AS huff FROM áruk) gúny

Példánkban a mock egy pszeudotábla (néha úgy hívják virtuális asztal). Természetesen egyáltalán nem célja a valódi jelentés eltorzítása. Egy példa erre.

3. Adatblokk konstruktor. SQL-92

Ijesztően hangzik, csak azért, mert nem találtam jó fordítást vagy tolmácsolást. És mint mindig, egyszerűbb egy példával elmagyarázni:

Példa adatblokk-konstruktorra

SELECT név "Terméknév", ár "Ár" FROM (ÉRTÉKEK ("Papucs", 100.00), ("Párna", 200.00)) AS áru(név, ár)

Termék név Ár
Papucs 100.00
Párna 200.00

Szakaszban TÓL TŐL használt kulcsszó ÉRTÉKEK, utána soronként zárójelben az adatok. A lényeg az, hogy egyáltalán nem jelölünk ki adatokat egyetlen táblából sem, hanem egyszerűen létrehozzuk azokat menet közben, „elnevezzük” táblázatnak, elnevezzük az oszlopokat, majd saját belátásunk szerint használjuk. Ez a dolog rendkívül hasznosnak bizonyult egy sql lekérdezés különböző eseteinek tesztelésekor, amikor néhány táblához nincs adat (a helyi adatbázisban), és a beszúrás túl lusta vagy néha nagyon nehézkes a táblák és a táblák összekapcsolása miatt. korlátozásokat.

4. Idő, dátum és Idő és dátum

Valószínűleg mindenki találkozott már olyan lekérdezések során, hogy meg kellett adni az időt, a dátumot vagy a dátumot és időt. Sok DBMS támogatja a t, d és ts literálokat, hogy működjön ezekkel a típusokkal. De egyszerűbb egy példával elmagyarázni: A d és t literálok esetében minden ugyanaz.
Elnézést kérek az olvasótól a félrevezetésért, de a 4. bekezdésben leírtak nem az SQL nyelvre vonatkoznak, hanem a JDBC lekérdezés-előfeldolgozási képességeire utalnak.

5. Tagadás. SQL-92

Mindannyian ismerjük az üzemeltetőt NEM, de nagyon gyakran elfelejtik, hogy mind predikátumcsoportra, mind egyetlen oszlopra alkalmazható:

6. Adatblokkok összehasonlítása. SQL-92

Még egyszer elnézést kérek a terminológiáért. Ez az egyik kedvenc példám.

Adatblokk-összehasonlítási példa

SELECT * FROM products WHERE (név, ár, elérhetőség) = ("Párnahuzat", 400,00, FALSE) -- vagy ezzel egyenértékű SELECT * FROM áruk WHERE név = "Párnahuzat" AND ár = 400,00 ÉS elérhetőség = FALSE

Amint a példából látható, az adatblokkok összehasonlítása hasonló az elemenkénti összehasonlításhoz. jelentése_ 1 _blokk_1 = érték_ 1 _blokk_2, érték_ 2 _blokk_1 = érték_ 2 _blokk_2, érték_ 3 _blokk_1 = érték_ 3 _block_2 segítségével ÉS közöttük.

7. Hasonlítsa össze az operátorokat ANY, SOME vagy ALL módosítóval. SQL-92

Itt magyarázatra van szükség. De mint mindig, először egy példaMit jelent ÖSSZES ebben az esetben? És ez azt jelenti, hogy a kiválasztási feltételt csak azok a sorok teljesítik, amelyek azonosítói (esetünkben ezek 4 és 5) nagyobbak, mint Bármi az allekérdezésben talált értékekből (1, 2 és 3). 4 nagyobb mint 1 és mint 2 és mint 3. 5 hasonló. Mi történik, ha kicseréljük ÖSSZES a BÁRMI?
Mit jelent BÁRMI ebben az esetben? És ez azt jelenti, hogy a kiválasztási feltételt csak azok a sorok teljesítik, amelyek azonosítói (esetünkben ezek 2, 3, 4 és 5) nagyobbak, mint legalább egy az allekérdezésben talált értékekből (1, 2 és 3). Magamnak asszociáltam ÖSSZES Val vel ÉS, a BÁRMI Val vel VAGY. NÉHÁNYés BÁRMI analógok egymással.

8. Operátorok a kérésekkel / kérések alatti munkához. SQL-92

Ismeretes, hogy az operátorok segítségével 2 lekérdezés kombinálható egymással UNIÓ vagy UNION ALL. Ezt gyakran használják. De van még 2 operátor KIVÉVEés METSZÉS.

Példa a KIVÉTEL

Valójában a második halmaz adatai kimaradnak az első értékkészletből.
Valójában van egy metszéspontja az első értékkészletnek és a második készletnek.
Ennyi, köszönöm a figyelmet.

Szerkesztőségi

N1. Köszönet a streetflush-nek az építő kritikáért. Közreműködött egy cikkben arról, hogy mi számít nyelvi szabványnak és mi nem.
N2. A 4. tétel javítva, annak tisztázásával, hogy a ts/d/t nem része az SQL nyelvnek. Köszönöm a figyelmet Melkij.

Csak egy fontos szabály van az EXCEPT utasítás használatára, hogy megjegyezzük.

Az oszlopok sorrendjének, számának és adattípusának minden lekérdezésben azonos típusúnak kell lennie.

Az ANSI szabvány szerint az operátorok a munkavégzéshez UNION készletekés EXCEPT ugyanaz a prioritás, de az INTERSECT operátor a többi halmaz operátor előtt kerül végrehajtásra. Javasoljuk, hogy az operátor elsőbbségét kifejezetten zárójelek használatával szabályozza. Ez általában nagyon jó gyakorlat.

Az ANSI szabvány szerint egy lekérdezésben csak egy ORDER BY záradék használható. Illessze be az utolsó SELECT utasítás legvégére. Az oszlopok és táblázatok megadásával kapcsolatos félreértések elkerülése érdekében ügyeljen arra, hogy ugyanazt az álnevet rendelje hozzá az összes megfelelő táblázatoszlophoz. Például:

SELECT au_lname AS "vezetéknév", au_fname AS "utónév" A szerzőktől KIVÉVE SELECT emp_lname AS "vezetéknév", emp_fname AS "keresztnév" A munkavállalóktól ORDER BY vezetéknév, keresztnév;

Továbbá, mivel minden oszloplista megadhat oszlopokat a megfelelően kompatibilis adattípusokkal, a különböző RDBMS-platformok eltérő módon kezelhetik a különböző hosszúságú oszlopokat. Például, ha az előző példában az első lekérdezés au_lname oszlopa jelentősen hosszabb, mint a második lekérdezés emp_lname oszlopa, akkor a különböző platformokon eltérő szabályok vonatkozhatnak a végeredmény hosszának meghatározására. De általában véve a platformok hosszabb (és kevésbé korlátozó) méretet választanak az eredményhez.

Minden RDBMS érvényesítheti saját szabályait az oszlopnév használatára, ha az oszloplistákban szereplő nevek eltérnek. Általában az első lekérdezés oszlopneveit használjuk.

Az adattípusoknak nem kell azonosnak lenniük, de kompatibilisnek kell lenniük. Például a CHAR és a VARCHAR típusok kompatibilisek. Alapértelmezés szerint az egyes oszlopokban lévő eredménykészlet az adott pozícióban lévő legnagyobb típusnak megfelelő méretet fogja használni. Például egy olyan lekérdezés, amely a VARCHAR(IO) és VARCHAR(15) típusú értékeket tartalmazó oszlopokból kér adatokat, a VARCHAR(15) típusát és méretét fogja használni.

Egyik platform sem támogatja a MEGFELELŐ )) EXCEPT záradékot

(SELECT Statemenr.2 | ÉRTÉKEK (kifejezésl, kifejezés2 [, ...])) EXCEPT

Lehetővé teszi egy vagy több manuálisan megadott oszlop megadását, amelyek szerepelnek a végeredményben. (Ezt sorkonstruktornak hívják.) Az VALUES záradéknak pontosan annyi oszlopot kell megadnia, amennyit az EXCEPT utasításlekérdezésekben megadtak. Bár az EXCEPT DISTINCT utasítás nem támogatott, az EXCEPT a funkcionális megfelelője. A MEGFELELŐ záradék nem támogatott. Ezenkívül a LONG VARCHAR, LONG VARGRAPHIC, BLOB, CLOB, DBCLOB, DATALINK és szerkezettípusok nem használatosak egy EXCEPT záradékban, de használhatók egy EXCEPT ALL záradékban.

Ha az eredményhalmazban van egy oszlop, amelynek minden SELECT utasításban ugyanaz a neve, akkor ez a név lesz az utasítás által visszaadott oszlop végső neve. Ha egy adott oszlop elnevezése eltérő a különböző SELECT utasításokban, akkor át kell neveznie az oszlopot minden lekérdezésben ugyanazzal az AS alias záradékkal minden lekérdezésben.

Ha több operátort használ egyetlen lekérdezésben az adatkészletekkel való munkavégzéshez, akkor a zárójelben lévő operátor kerül végrehajtásra először. Ezt követően a végrehajtási sorrend balról jobbra halad. Azonban minden INTERSECT utasítás az UNION és EXCEPT utasítások előtt végrehajtásra kerül. Például:

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

A fenti példa lekéri az „E” betűvel kezdődő részlegen dolgozó összes alkalmazott azonosítóját az alkalmazottak táblájából, majd eltávolítja az IF1000, IF200 és AD3110 projektekben dolgozók azonosítóját az alkalmazotti fióktáblából (emp_act) Végül , három további azonosító, AA0001, AB0002 és AC0003 kerül hozzáadásra az UNION set operátor használatával.

MySQL

A MySQL nem támogatja az EXCEPT utasítást. Alternatív megoldásként használhatja a NOT IN vagy NOT EXISTS operátorokat.