itthon / Hozzáférés / Az SQL UNION operátor használata a lekérdezések eredményeinek kombinálására. Operátor halmazokkal való munkavégzéshez UNION Lekérdezések szervezése unióval

Az SQL UNION operátor használata a lekérdezések eredményeinek kombinálására. Operátor halmazokkal való munkavégzéshez UNION Lekérdezések szervezése unióval

A legtöbb SQL lekérdezések egyetlen utasítás egy vagy több tábla adatainak visszaadására szolgál. SQL lehetővé teszi több külön lekérdezés egyidejű futtatását és az eredmény egyetlen adatkészletként történő megjelenítését. Az ilyen kombinált lekérdezéseket általában ún kombinációk vagy összetett kérések.

1. Az UNION operátor használata

Kérések a nyelven SQL kezelővel kombinálva UNIÓ. Ehhez minden kérést meg kell adni KIVÁLASZTÁSés helyezze el közéjük a kulcsszót UNIÓ. A használt operátorok számának korlátozása UNIÓ egy általános kérésben nem. Az előző részben megjegyeztük Hozzáférés nem képes létrehozni teljes külső csatlakozás, most meglátjuk, hogyan érhetjük el ezt az operátoron keresztül UNIÓ.

KIVÁLASZTÁS *
A Sumproduct-ról BALRA CSATLAKOZÁS A Sellers ON oldalához Sumproduct.City = Sellers.City
UNIÓ
KIVÁLASZTÁS *

A Sumproduct-tól JOBBRA CSATLAKOZZON az eladók oldalához Sumproduct.City = Sellers.City

Látjuk, hogy a lekérdezés az első tábla összes oszlopát és a másikat is megjelenítette, függetlenül attól, hogy az összes rekord egyezést tartalmaz-e egy másik táblában.

Azt is meg kell jegyezni, hogy sok esetben ahelyett UNIÓ használhatjuk az ajánlatot AHOL sok feltétellel, és hasonló eredményt kap. Mivel azonban UNIÓ a feljegyzések tömörebbnek és érthetőbbnek tűnnek. A kombinált lekérdezések írásakor bizonyos szabályokat is be kell tartania:

  • kérés UNIÓ két vagy több operátort kell tartalmaznia KIVÁLASZTÁS kulcsszóval elválasztva UNIÓ(azaz ha a lekérdezés négy SELECT utasítást használ, akkor három UNION kulcsszónak kell lennie)
  • minden kérés az operátorban UNIÓ azonos oszlopokkal, kifejezésekkel vagy összesítéssel kell rendelkezniük, és ugyanabban a sorrendben kell szerepelniük
  • oszlop adattípusainak kompatibilisnek kell lenniük. Nem kell azonos típusúnak lenniük, de ahhoz hasonlónak kell lenniük DBMS egyértelműen konvertálhatja őket (például lehetnek különböző numerikus adattípusok vagy különböző dátumtípusok).

2. Engedélyezze vagy tiltsa le az ismétlődő sorokat

Kérelem tőle UNIÓ automatikusan eltávolítja az összes ismétlődő sort a lekérdezés eredménykészletéből (azaz úgy viselkedik, mint AHOL több feltétellel egy nyilatkozatban KIVÁLASZTÁS). Ez az operátor viselkedése UNIÓ alapértelmezés szerint, de ezt módosíthatjuk, ha akarjuk. Ehhez az operátort kell használnunk UNION ALL ahelyett UNIÓ.

3. A kombinált lekérdezések eredményeinek rendezése

Nyilatkozat végrehajtási eredmények KIVÁLASZTÁS mondat szerint rendezve RENDEZÉS. Amikor a lekérdezéseket kombinálja a UNIÓ csak egy ajánlat RENDEZÉS használható, és az utolsó utasításban szerepelnie kell KIVÁLASZTÁS. Valójában a gyakorlatban nincs értelme az eredmények egy részét az egyik, a másik részét egy másik sorrendbe rendezni. Szóval néhány javaslat RENDEZÉS jelentkezése nem engedélyezett.

Az SQL UNION operátort úgy tervezték, hogy egyesítse a SELECT szóval kapott adatbázistáblákat. A kapott táblák összekapcsolásának feltétele az oszlopok számának, sorrendjének és adattípusának egybeesése. Az ORDER BY-t az összekapcsolás eredményére kell alkalmazni, és csak többrészes lekérdezés végére kell helyezni. Az UNION operátor a következő szintaxissal rendelkezik:

OSZLOPNEVEK (1..N) KIVÁLASZTÁSA A TABLE_NAME TÁBLÁZATBÓL UNION OSZLOPNÉVEK KIVÁLASZTÁSA (1..N) A TABLE_NAME TÁBLÁZATBÓL

Ebben a konstrukcióban az összevont lekérdezéseknek lehetnek feltételei a WHERE záradékban, vagy nincsenek. Az UNION operátor használatával a lekérdezések kombinálásával ugyanabból a táblából és különböző táblákból is lekérhet adatokat.

Ha az UNION operátort az ALL szó nélkül használjuk, az eredmény nem tartalmaz duplikációkat, az ALL szóval viszont duplikációkat tartalmaz.

Összesítések és egyedi értékek egy táblázatban az SQL UNION utasítással

Egy lekérdezéssel megjelenítheti az egyes oszlopértékeket a táblázatból, például a vállalat alkalmazottai által ledolgozott évek számát, béreiket és másokat. Egy másik kérés - használata összesített függvények- megtudhatja például az osztályok vagy bizonyos pozíciókat betöltő alkalmazottak fizetésének összegét, vagy a munkatapasztalat éveinek átlagos számát (ilyen lekérdezéseknél a csoportosítás a GROUP BY operátor segítségével történik).

De mi van akkor, ha egy táblázatban kell összefoglalni az összes egyedi értéket és a teljes értékeket? Itt jön a segítség az SQL UNION operátor, melynek segítségével két lekérdezés kombinálódik. A rendelést az ORDER BY záradékkal kell az összekapcsolás eredményére alkalmazni. Hogy miért van erre szükség, azt a példákból jobban megértjük.

1. példa A cég adatbázisa tartalmaz egy Staff táblát, amely a cég alkalmazottaira vonatkozó adatokat tartalmazza. Ennek oszlopai Fizetés (fizetés), Munkakör (beosztás) és Évek (szolgálati idő). Az első lekérdezés az egyes fizetéseket adja vissza pozíció szerint rendezve:

KIVÁLASZTÁS Nevet, állást, fizetést ALKALMAZOTTÓL RENDELÉS SZERINT Állás szerint

NévmunkaFizetés
Sandersmgr18357.5
Marenghimgr17506.8
PernalÉrtékesítés18171.2
OrvosÉrtékesítés12322.4
tényezőÉrtékesítés16228.7

A második lekérdezés a teljes fizetést adja vissza pozíciónként. Ezt a lekérdezést már előkészítjük az elsővel való összekapcsoláshoz, így emlékezni fogunk arra, hogy az összekapcsolási feltétel egyenlő számú oszlop, ezek nevének, sorrendjének és adattípusainak egybeesése. Ezért a Név oszlopot tetszőleges "Z-TOTAL" értékkel is felvesszük az összegeket tartalmazó táblázatba:

KIVÁLASZTÁSA "Z-TOTAL" AS Név, Munka, ÖSSZEG (Bérezés) AS Fizetés ALKALMAZOTTAI CSOPORTBÓL Munka szerint

A lekérdezés eredménye a következő táblázat lesz:

NévmunkaFizetés
Z-ÖSSZESENmgr35864.3
Z-ÖSSZESENÉrtékesítés46722.3

Most kombináljuk a lekérdezéseket az UNION operátor használatával, és alkalmazzuk az ORDER BY operátort az unió eredményére. Két oszlop szerint érdemes csoportosítani: job (Job) és név (Name) szerint, hogy a teljes (összesített) értékkel rendelkező sorok, amelyekben a névérték "Z-TOTAL", az egyedi értékeket tartalmazó sorok alatt legyenek. A lekérdezés eredményeinek kombinálása a következőképpen alakul:

(VÁLASZTÁSA Név, Munkakör, Fizetés ALKALMAZOTTÓL ) SZAKSZERVEZET (VÁLASZTÁSA "Z-ÖSSZESEN" AS Név, Munkakör, ÖSSZEG (Bér) AS Fizetés ALKALMAZOTTAK CSOPORTJÁTÓL Munka szerint) RENDELÉS SZERINT Munka, név

Az UNION operátorral végzett lekérdezés eredménye a következő táblázat lesz, amelyben minden pozíciócsoportban minden első sor az ezen a pozícióban dolgozó alkalmazottak teljes fizetését tartalmazza:

NévmunkaFizetés
Marenghimgr17506.8
Sandersmgr18357.5
Z-ÖSSZESENmgr35864.3
OrvosÉrtékesítés12322.4
tényezőÉrtékesítés16228.7
PernalÉrtékesítés18171.2
Z-ÖSSZESENÉrtékesítés46722.3

Írjon lekérdezéseket maga az UNION segítségével, majd nézze meg a megoldást

2. példa Az adatok ugyanazok, mint az 1. példában, de a feladat egy kicsit bonyolultabb. Egy táblázatban nem csak az egyes munkabéreket és a beosztások szerinti összesített béreket kell egy táblázatban megjeleníteni, hanem az összes munkavállaló összbérét.

3. példa A cég adatbázisa tartalmaz egy Staff táblát, amely a cég alkalmazottaira vonatkozó adatokat tartalmazza. Van benne Név (vezetéknév), Osztály (osztályszám) és Évek (szolgálati idő) oszlopok.

NévOsztályévek
Sanders20 7
Pernal20 8
Marenghi38 5
Orvos20 5
tényező38 8

Jelenítse meg egy táblázatban az átlagos szolgálati időt osztályonként és az alkalmazottak szolgálati idejének időtartamának egyedi értékeit, osztályok szerint csoportosítva.

A lekérdezések ugyanazon a táblán való összekapcsolásának egyéb esetei az SQL UNION operátor használatával

4. példa A cég adatbázisa tartalmaz egy Staff táblát, amely a cég alkalmazottaira vonatkozó adatokat tartalmazza. Ennek oszlopai Fizetés (fizetés), Munkakör (beosztás) és Évek (szolgálati idő). Az első lekérdezés a 21 000 feletti fizetésű alkalmazottak adatainak lekéréséhez szükséges:

A lekérdezés eredménye a következő táblázat lesz:

Most olyan adatokra van szükségünk, amelyek egyesítik a két lekérdezésben alkalmazott kiválasztási kritériumokat. A lekérdezéseket az UNION operátor használatával kombináljuk:

Az UNION operátorral végrehajtott lekérdezés eredménye a következő táblázat lesz:

IDNév
10 Sanders
30 Marenghi
100 Plotz
140 Fraye
160 Molinare
240 Daniels
260 Jones

Az UNION operátorral végzett lekérdezés több oszlopot is visszaadhat, fontos, ismételjük, hogy a kombinált lekérdezésekben az oszlopok száma, sorrendje és adattípusa megegyezzen.

Először nézzünk meg adatokat azokról a kategóriákról és kategóriák részeiről, amelyeknél több mint 100 hirdetés van hetente. A következő lekérdezést írjuk:

A lekérdezés eredménye a következő táblázat lesz:

A lekérdezés eredménye a következő táblázat lesz:

Most olyan adatokat szeretnénk lekérni, amelyek megfelelnek mind az első, mind a második lekérdezés feltételeinek. A lekérdezéseket az UNION operátor használatával kombináljuk:

A lekérdezés eredménye a következő táblázat lesz:

Lekérdezési eredmények kombinálása két táblán az SQL UNION operátor használatával

Eddig olyan UNION-lekérdezéseket vizsgáltunk, amelyek ugyanabból a táblából származó eredményeket kombinálják. Most összevonjuk két táblázat eredményeit.

6. példa Van egy adatbázis az építőanyag raktárról. Van egy táblázat, amely háttérképadatokat tartalmaz. A Vinil táblázat a vinil tapétákról, a Papír táblázat a papírtapétákról tartalmaz adatokat. A tapéták árának adatait az egyik és a másik táblázatból kell megtudni.

A nem ismétlődő vinil tapéta áradatok lekéréséhez létrehozunk egy lekérdezést a DISTINCT szóval:

VÁLASSZON KÜLÖNBÖZŐ ÁRAT VINILTÓL

A lekérdezés eredménye a következő táblázat lesz:

Most készítsünk egy kombinált lekérdezést az UNION operátorral:

KÜLÖNBÖZŐ KIVÁLASZTÁS Ár FROM VINIL UNION SELECT DISTINCT Ár PAPÍRBÓL

Mivel nem az ALL szót használjuk, nem lesznek ismétlődő értékek a 400, 500 és 530 értékekhez. A lekérdezés eredménye a következő táblázat lesz:

ár
300
320
360
400
430
500
530
610
720
800
850

7. példa Az adatbázis és a táblák ugyanazok, mint az előző példában.

Minden áradatot szeretne megkapni, beleértve az ismétlődő adatokat is. Az eredmények UNION operátor használatával történő kombinálására vonatkozó lekérdezés hasonló lesz az előző példában szereplő lekérdezéshez, de az UNION helyett az UNION ALL szót írjuk:

KÜLÖNBÖZŐ KIVÁLASZTÁS Ár PAPÍRBÓL

A lekérdezés eredménye a következő táblázat lesz:

ár
300
320
360
400
400
430
500
500
530
530
610
720
800
850

Az SQL UNION operátor használatával kombinálhatja az egyszerű lekérdezéseket és a segédlekérdezéseket tartalmazó lekérdezések (beágyazott lekérdezések). Nézzünk egy megfelelő példát.

8. példa Van egy "Színház" adatbázis. Játéktáblája a produkciók adatait (címek - a Név oszlopban), a Rendező táblában - a rendezők adatait tartalmazza (az Fname oszlopban a keresztnév, az Lname oszlopban a vezetéknév). A Director tábla elsődleges kulcsa a dir_id - az igazgató azonosító száma. A Dir_id a Play tábla idegen kulcsa is, ez a Director tábla elsődleges kulcsára utal. A John Barton és Trevor Nunn által rendezett előadások megjelenítése kötelező.

Megoldás. Összevonjuk két lekérdezés eredményét – az egyik a rendező John Barton, a másik a rendező Trevor Nunn előadásait adja vissza. A Lejátszás táblára vonatkozó összesített lekérdezések mindegyike egy segédlekérdezéssel történik a Director táblához, amely a dir_id értéket adja vissza a rendező nevével és vezetéknevével. Minden külső lekérdezés átveszi a dir_id kulcs értékét az allekérdezésből, és visszaadja a produkciók nevét (Name):

Relációs adatbázisok és SQL nyelv

Az UNION adatkészlet operátor két vagy több lekérdezés eredménykészletét kombinálja, és az összes lekérdezés összes sorát egy eredménykészletként jeleníti meg.

Az UNION az adatkészletekkel való munkavégzéshez szükséges operátorok osztályába tartozik (készlet operátor). További ilyen operátorok közé tartozik az INTERSECT és az EXCEPT (az EXCERT és a MINUS funkcionális megfelelői, de az EXCEPT az ANSI szabványban található.) Minden adatkészlet-operátor két vagy több lekérdezés eredményhalmazának egyidejű kezelésére szolgál, innen ered a nevük is.

Szintaxis S0L2003

Az UNION operátorban a lekérdezések számának nincs technikai korlátja. Az általános szintaxis a következő.

UNIÓ

UNIÓ

Kulcsszavak

UNIÓ

Azt jelzi, hogy az eredménykészletek egyetlen eredményhalmazba egyesülnek. Az ismétlődő sorok alapértelmezés szerint törlődnek.

ÖSSZES

Az összes eredményhalmaz ismétlődő sorai is egyesülnek.

KÜLÖNBÖZŐ

Az ismétlődő sorok eltávolításra kerülnek az eredménykészletből. A NULL értékeket tartalmazó oszlopok ismétlődésnek minősülnek. (Ha az ALL és DISTINCT kulcsszavakat nem használja, az alapértelmezés a DISTINCT.)

Általános szabályok

Az UNION operátor használatakor egyetlen fontos szabályt kell szem előtt tartani: az oszlopok sorrendjének, számának és adattípusának minden lekérdezésben azonosnak kell lennie.

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 eredményül kapott zabor a kompatibilis típusok közül a legnagyobb méretét használja, és a három CHAR oszlopot – CHAR(5), CHAR(IO) és CHAR(12) kombináló lekérdezésben az eredmények a CHAR( 12) formátumban, és az oszlopokban a kisebb méretek extra szóközöket adnak.

Bár az ANSI szabvány elsőbbséget ad az INTERSECT operátornak a többi halmazoperátorral szemben, sok platform ezeket az operátorokat ugyanolyan prioritásúként kezeli. A zárójelek használatával kifejezetten szabályozhatja az operátor elsőbbségét. Ellenkező esetben a DBMS nagy valószínűséggel balról jobbra haladva hajtja végre őket.

A DISTINCT záradék (platformtól függően) jelentős teljesítményköltséggel járhat, mivel gyakran többletlépést igényel az eredménykészleten az ismétlődő rekordok eltávolításához. Az ALL záradék használható a teljesítmény javítására minden olyan esetben, amikor nem várható ismétlődés (vagy ha az ismétlődés megengedett).

Az ANSI szabvány szerint egy lekérdezésben csak egy ORDER BY záradék használható. Tedd az utolsó SELECT utasítás végére. Az oszlopok és táblázatok megadásakor felmerülő kétértelműségek elkerülése érdekében ügyeljen arra, hogy minden táblázatban minden oszlophoz megfelelő álneveket rendeljen. Ha azonban oszlopneveket ad meg egy SELECT ... UNION lekérdezésben, akkor csak az első lekérdezés álneve kerül felhasználásra. Például:

SELECT au_lname AS vezetéknév, au_fname AS keresztnév FROM szerzők UNION SELECT emp_lname AS vezetéknév, emp_fname AS keresztnév FROM alkalmazottak ORDER BY vezetéknév, keresztnév;

Továbbá, mivel az UNION operátorlekérdezések tartalmazhatnak kompatibilis adattípusú oszlopokat, a kód viselkedése platformonként változhat, különösen az oszlop adattípusának hosszát illetően. Például, ha az első lekérdezés au_fname oszlopa észrevehetően hosszabb, mint a második lekérdezés emplname oszlopa, akkor a különböző platformokon eltérő szabályok vonatkozhatnak a használandó hossz meghatározására. Általában azonban a platformok hosszabb (és kevésbé korlátozó) adattípust választanak az eredménykészlethez.

Minden RDBMS alkalmazhatja a saját szabályait egy oszlop nevének meghatározására, ha a különböző táblákban lévő oszlopoknak eltérő neveik vannak. Általában az első lekérdezés nevei kerülnek felhasználásra.

DB2

A DB2 platform támogatja az ANSI UNION és UNION ALL kulcsszavakat, valamint a VALUES záradékot.

[, (kifejezés-!, kifejezés2, …)] […] […]

Lehetővé teszi egy vagy több manuálisan meghatározott értékkészlet megadását a kombinált eredménykészlet rekordjaihoz. Ezen értékek mindegyikének pontosan ugyanannyi oszlopot kell tartalmaznia, mint az UNION operátor lekérdezésében. Az eredményhalmazban szereplő értékláncok vesszővel vannak elválasztva.

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

Az olyan adattípusok, mint a VARCHAR, LONG VARGRAPHIC, BLOB, CLOB, DBCLOB, DATALINK és a struktúratípusok nem használhatók az UNION kulcsszóval (az UNION ALL záradékkal viszont használhatók).

Ha minden tábla ugyanazt az oszlopnevet használja, az eredménykészlet ezt a nevet használja. Ha az oszlopnevek eltérőek, akkor a DB2 új oszlopnevet generál. Ezt követően ez az oszlop nem használható ORDER BY vagy FOR UPDATE záradékban.

Ha több adatkészlet-operátort használ egyetlen lekérdezésben, akkor először a zárójelbe tett operátorok kerülnek végrehajtásra. Ezt követően az utasításokat balról jobbra sorrendben hajtják végre. Azonban minden INTERSECT műveletet az UNION vagy EXCERT műveletek előtt hajtanak végre. Például:

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

Ebben a példában az alkalmazotti táblából megkapjuk az összes olyan alkalmazott azonosítóját, amely bármely részlegben található "E" betűvel kezdődő névvel, valamint az emp_act elszámolási táblából az összes alkalmazott azonosítóját, akik az IF1000", "IF2000" projektekben dolgoznak. , és „AD3110”. Ezenkívül az „AA000T”, „AB0002” és „AC00031” alkalmazotti azonosítók.

MySQL

Nem támogatott.

Jóslat

Az Oracle platform támogatja az ANSI SQL szabvány UNION és UNION ALL kulcsszavait. A szintaxis a következő.

Az Oracle nem támogatja a MEGFELELŐ záradékot. Az UNION DISTINCT záradék nem. támogatott, de a funkcionális megfelelője az UNION záradék. Az Oracle platform nem támogatja az UNION ALL és UNION záradékok használatát a következő helyzetekben.

Ha az utasítás első lekérdezése tartalmaz kifejezéseket az elemlistában, akkor álnevesítse az oszlopot az AS záradékkal. Ezenkívül az utasításban csak az utolsó lekérdezés tartalmazhat ORDER BY záradékot. Például a következő lekérdezéssel lekérheti az összes egyedi üzletazonosítót (store_id) ismétlődések nélkül.

SELECT stor_id FROM üzletek UNION SELECT stor_id FROM értékesítés;

PostgreSQL

A PostgreSQL platform támogatja az UNION és UNION ALL kulcsszavakat szabványos ANSI szintaxisban.

SELECT 2 UNION nyilatkozat

A PostgreSQL platform nem támogatja az UNION és UNION ALL záradékok használatát a FOR UPDATE záradékkal rendelkező lekérdezésekben. A PostgreSQL nem támogatja a CORRESPONTING záradékot. Az UNION DISTINCT záradék nem támogatott; a funkcionális megfelelője az UNION záradék.

Az utasítás első lekérdezése nem tartalmazhat ORDER BY vagy LIMIT záradékot. A későbbi UNION és UNION ALL záradékkal végzett lekérdezések tartalmazhatják ezeket a záradékokat, de az ilyen lekérdezéseket zárójelek közé kell tenni. Ellenkező esetben a jobb oldali ORDER BY vagy LIMIT záradék a teljes műveletre vonatkozik.

SELECT a.au_lname FROM authors AS a WHERE a.au_lnanie LIKE "P%" UNI0N SELECT e.lname FROM alkalmazott AS e WHERE e.lname LIKE "P%";

SQL szerver

Az SQL Server platform szabványos ANSI szintaxisban támogatja az UNION és UNION ALL kulcsszavakat.

SELECT 1 UNION nyilatkozat

SELECT 2 UNION nyilatkozat

Az SQL Server nem támogatja a CORRESPONTING záradékot. Az UNION DISTINCT záradék nem támogatott, de az UNION záradék a funkcionális megfelelője.

Az UNION és UNION ALL záradékkal használhatja a SELECT…INTO utasítást, de az INTO kulcsszónak szerepelnie kell az union operátor első lekérdezésében. Speciális kulcsszavak, mint például a SELECT TOP és a GROUP BY…WITH CUBE, minden csatlakozási lekérdezésben használhatók. Ügyeljen azonban arra, hogy ezeket a záradékokat minden egyesítési kérelemben szerepeltesse. Ha ugyanabban a lekérdezésben a SELECT TOP vagy GROUP BY... WITH CUBE záradékot használja, a művelet sikertelen lesz.

Az összekapcsolásban szereplő összes lekérdezésnek ugyanannyi oszlopot kell tartalmaznia. Az oszlopok adattípusainak nem kell azonosnak lenniük, de implicit módon egymáshoz önthetőnek kell lenniük. Például a CHAR és a VARCHAR oszlopok is megengedettek. Adatok kiadásakor az SQL Server a legnagyobb oszlop méretét használja az eredménykészlet oszlopának adattípus-méretének meghatározásakor. Így, ha a CHAR(5) és a CHAR(IO) oszlopokat is használjuk egy SELECT... UNION utasításban, mindkét oszlop megjelenik a CHAR(IO) oszlopban. A numerikus adattípusok a legnagyobb pontosságú típusként jelennek meg és jelennek meg.

Például a következő lekérdezés két független lekérdezés eredményeit egyesíti, amelyek a GROUP BY…WITH CUBE záradékot használják.

már írtam róla. És ott az egyik tábla kimenete egy másik tábla tartalmától függött. De ez akkor történik, amikor az egyik tábla kimenetének teljes függetlenségére van szükség a másiktól. Csak annyit akarsz rekordok lekérése több táblából egy lekérdezésben, nem több. És erre az SQL UNION kulcsszóban használatos.

Találjuk ki veled SQL lekérdezés UNION használatával:

SELECT `bejelentkezés`, `összeg` FROM `munkaadók` UNION SELECT `bejelentkezés`, `összeg` FROM `személyzetből';

Ez a lekérdezés visszaadja egy bizonyos webhely összes munkáltatójának és munkavállalójának bejelentkezési adatait és összegeit. Vagyis az adatok különböző táblákban voltak, de hasonlóságuk lehetővé teszi, hogy azonnal megjelenjenek. Innentől származik egyébként a használat szabálya UNION kéri: A mezők számának és sorrendjének meg kell egyeznie a lekérdezés minden részében.

Ilyen UNION-alkatrészek sok lehet, de a legfontosabb az utolsó UNION után pontosvesszőt kell tennie.

Egy másik jó tulajdonság UNIÓ az ismétlés hiánya. Például ha ugyanaz a személy van a munkavállalók és a munkaadók között, természetesen azonos összeggel a számlán, akkor a mintában ő lesz nem 2x hanem csak 1 amire általában szükség van. És ha még mindig kell ismétlés, akkor van UNION ALL:

SELECT `bejelentkezés`, `összeg` FROM `munkaadók` UNION ALL SELECT `bejelentkezés`, `összeg` FROM `személyzetből;

Mint ez egy meglehetősen egyszerű UNION operátort használnak egy SQL lekérdezésben, ami leegyszerűsíti az azonos típusú adatok egyszerre több táblából történő megjelenítését, ami viszont nagyon jó hatással lesz a teljesítményre.

A leckében az unió, metszéspont és lekérdezési különbség műveletek használatának témája lesz. Példák a használatára SQL lekérdezés Union, Exists, valamint a SOME, ANY és All kulcsszavak használata. Figyelembe vett karakterlánc-függvények


Egy halmazon egyesítési, különbségi és derékszögű szorzatműveleteket hajthat végre. Ugyanezek a műveletek használhatók sql lekérdezésekben (műveletek végrehajtása lekérdezésekkel).

Egy függvényszó több lekérdezés kombinálására szolgál UNIÓ.
Szintaxis:

< запрос 1 >UNIÓ [MINDEN]< запрос 2 >

<запрос 1>UNIÓ<запрос 2>

Az SQL Union lekérdezés az egyes lekérdezések kimeneti sorainak egy eredményhalmazba való egyesítésére szolgál.

Ha használt paraméter ALL, akkor az összes duplikált kimeneti sor megmarad. Ha a paraméter hiányzik, akkor csak egyedi sorok maradnak az eredményhalmazban.

Tetszőleges számú lekérdezés kombinálható.

Az UNION operátor használatához több feltételnek kell teljesülnie:

  1. az egyes lekérdezések kimeneti oszlopainak számának azonosnak kell lennie;
  2. az egyes lekérdezések kimeneti oszlopainak adattípusok tekintetében (prioritásuk sorrendjében) összehasonlíthatónak kell lenniük egymással;
  3. az eredményül kapott halmaz az első lekérdezésben megadott oszlopneveket használja;
  4. Az ORDER BY csak többrészes lekérdezés végén használható, mivel az összekapcsolás eredményére vonatkozik.

Példa: Számítógépek és laptopok árainak megjelenítése, valamint számuk (vagyis két különböző táblázatból történő kitöltés egy lekérdezéssel)


✍ Megoldás:
1 2 3 4 5 6 SELECT `Szám` , `Ár` FROM pc UNION SELECT `Szám` , `Ár` notebookból RENDELÉS `Ár' SZERINT

SELECT `Szám` , `Ár` FROM pc UNION SELECT `Szám` , `Ár` notebookból RENDELÉS `Ár' SZERINT

Eredmény:

Vegyünk egy bonyolultabb példát belső csatlakozással:

Példa: Keresse meg a terméktípust, a számítógépek és laptopok számát és árát


✍ Megoldás:
1 2 3 4 5 6 7 8 VÁLASSZA terméket. `Típus` , pc. `Szám` , `Ár` DB-RŐL BELSŐ CSATLAKOZÁS termék pc-n. "Szám" = termék. "Szám" UNION SELECT termék. `Típus` , notebook. `Szám` , `Ár` notebook BELSŐ CSATLAKOZÁSA termék ON notebookra. "Szám" = termék. "Szám" RENDELÉS "Ár" SZERINT

SELECT termék.`Típus` , pc.`Szám` , `Ár` DB-RŐL BELSŐ CSATLAKOZÁS termék pc-n.`Szám` = termék.`Szám UNION SELECT termék.`Típus` , notebook.`Szám`, `Ár` FROM notebook BELSŐ CSATLAKOZTATÁSA termék a notebookon.`Number` = termék.`Szám` ORDER BY `Price`

Eredmény:

SQL Union 1. Keresse meg az összes laptop és nyomtató gyártóját, cikkszámát és árát

SQL Union 2. Keresse meg az oroszországi gyártó által gyártott összes termék számát és árát

SQL létezési predikátum LÉTEZIK

Az SQL nyelv rendelkezik lehetőségekkel metszésponti és lekérdezési különbségi műveletek végrehajtására - az INTERSECT záradékkal (metszéspont) és az EXCEPT záradékkal (különbség). Ezek a záradékok az UNION működéséhez hasonlóan működnek: csak azok a sorok kerülnek be az eredményhalmazba, amelyek mindkét lekérdezésben jelen vannak - INTERSECT , vagy az első lekérdezésnek csak azok a sorai, amelyek hiányoznak a másodikban - EXCEPT. De az a baj, hogy sok DBMS nem támogatja ezeket a javaslatokat. De van kiút - az EXISTS predikátum használata.

Az EXISTS predikátum TRUE, ha az allekérdezés tetszőleges számú sort ad vissza, ellenkező esetben az EXISTS HAMIS. Van egy NOT EXISTS állítmány is, amely ennek az ellenkezőjét teszi.

Az EXISTS jellemzően a függő segédlekérdezésekben használatos (például IN).

LÉTEZ (táblázati segédlekérdezés)

Példa: Keresse meg azokat a számítógépgyártókat, amelyek laptopokat is gyártanak


✍ Megoldás:

SELECT DISTINCT Manufacturer FROM product AS pc_product WHERE Típus = "Számítógép" ÉS LÉTEZIK (VÁLASZTÁSA Gyártó FROM termékből WHERE Típus = "Notebook" ÉS Gyártó = pc_termék.Gyártó)

Eredmény:

Keresse meg azokat a számítógépgyártókat, amelyek nem gyártanak nyomtatókat

Kulcsszavak SQL SOME | BÁRMI és MINDEN

A SOME és ANY kulcsszavak szinonimák, így bármelyik használható a lekérdezésben. Egy ilyen lekérdezés eredménye egy értékoszlop lesz.

Szintaxis:

< выражение>< оператор сравнения>NÉHÁNY | BÁRMI(< подзапрос> )

<выражение><оператор сравнения>NÉHÁNY | BÁRMI(<подзапрос>)

Ha az allekérdezésből kapott X bármely értékére a " " művelet eredménye IGAZ értéket ad vissza, akkor az ANY predikátum is IGAZ értékkel egyenlő.

Példa: Keressen olyan számítógép-szállítókat, amelyeknek nincs akciós cikkszáma (azaz nem szerepel a számítógép táblázatában)


✍ Megoldás:

A táblázatok kezdeti adatai:

Eredmény:

A példában a Number = ANY(SELECT Number FROM pc) predikátum IGAZ értéket ad vissza, ha a fő lekérdezésből származó szám megtalálható a pc tábla Számok listájában (az allekérdezés visszaadja). Továbbá NEM használatos. Az eredménykészlet egy oszlopból fog állni - Gyártó. Annak elkerülésére, hogy ugyanaz a gyártó többször is megjelenjen, bevezették a DISTINCT kulcsszót.
Most fontolja meg az ALL kulcsszó használatát:

Példa: Keresse meg azon laptopok számát és árait, amelyek többe kerülnek, mint bármely számítógép


✍ Megoldás:

Fontos:Érdemes megjegyezni, hogy általában az ANY-t tartalmazó lekérdezés egy értékkészletet ad vissza. Ezért a WHERE záradékban a logikai (logikai) értéket adó EXISTS , IN , ALL és ANY operátorok nélküli segédlekérdezés lekérdezési futásidejű hibát eredményezhet.


Példa: Keresse meg azoknak a számítógépeknek a számát és árait, amelyek többe kerülnek, mint a laptopok minimális ára


✍ Megoldás:


Ez a lekérdezés helyes, mert az Price skaláris kifejezést a rendszer összehasonlítja egy olyan segédlekérdezéssel, amely egyetlen értéket ad vissza

SQL karakterlánc-függvények

A LEFT függvény levágja a karakterlánc bal oldalán lévő második argumentum által megadott karakterek számát:

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

A RIGHT függvény a megadott számú karaktert adja vissza a karakterlánc-kifejezés jobb oldalán:

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

Példa: Bontsa ki az összes gyártó nevének kezdőbetűit


✍ Megoldás:

SELECT DISTINCT LEFT(`Gyártó` , 1) A `termékből`

Eredmény:

Példa: Nyomtassa ki a gyártók neveit, amelyek ugyanazzal a betűvel kezdődnek és végződnek


✍ Megoldás:

SQL csere függvény

Szintaxis:

SELECT `név` , REPLACE(`név` , "a", "aa") FROM "tanárok"