Pyetje të ndërlidhura. Shembuj

  • Përkthimi
  • Tutorial
Keni nevojë për “ZGJEDHJE * WHERE a=b NGA c” ose “SELECT WHERE a=b NGA c ON *”?

Nëse jeni si unë, do të bini dakord: SQL është një nga ato gjëra që duket e lehtë në fillim (lexohet si anglisht!), por në njëfarë mënyre ju duhet të kërkoni në Google çdo pyetje të thjeshtë për të gjetur sintaksën e saktë.


Dhe pastaj bashkohet, grumbullimi, nënpyetjet fillojnë, dhe rezulton të jetë krejtësisht mbeturina. Diçka si kjo:


ZGJIDH anëtarët.emri || "" || anëtarë.mbiemri AS "Emri i Plotë" FROM huazime INNER JOIN anëtarë ON anëtarë.memberid=borrowings.memberid INNER JOIN libra ON books.bookid=borrowings.bookid WHERE borrowings.bookid IN (SELECT bookid FROM books WHERE stock>(SELECT mesatar(stock ) NGA librat)) GRUPI SIPAS anëtarëve.emri, anëtarët.mbiemri;

Bue! Kjo do të trembë çdo fillestar, apo edhe një zhvillues të nivelit të mesëm nëse ai po sheh SQL për herë të parë. Por nuk është edhe aq keq.


Është e lehtë të kujtosh se çfarë është intuitive dhe me këtë udhëzues shpresoj të ulim pengesën e hyrjes në SQL për fillestarët dhe t'u ofroj atyre që tashmë kanë përvojë një mënyrë të re për të parë SQL.


Megjithëse sintaksa SQL është pothuajse e njëjtë midis bazave të të dhënave të ndryshme, ky artikull përdor PostgreSQL për pyetje. Disa shembuj do të funksionojnë në MySQL dhe baza të tjera të të dhënave.

1. Tre fjalë magjike

Ka shumë fjalë kyçe në SQL, por SELECT, FROM dhe WHERE janë të pranishme pothuajse në çdo pyetje. Pak më vonë do të kuptoni se këto tre fjalë përfaqësojnë aspektet më themelore të ndërtimit të pyetjeve të bazës së të dhënave, dhe pyetjet e tjera, më komplekse janë vetëm shtesa në krye të tyre.

2. Baza jonë

Le të hedhim një vështrim në bazën e të dhënave që do të përdorim si shembull në këtë artikull:







Ne kemi një bibliotekë librash dhe njerëz. Ekziston edhe një tabelë e veçantë për regjistrimin e librave të lëshuar.

  • Tabela "libra" ruan informacione për titullin, autorin, datën e botimit dhe disponueshmërinë e librit. Është e thjeshtë.
  • Në tabelën "anëtarët" - emrat dhe mbiemrat e të gjithë njerëzve që u regjistruan në bibliotekë.
  • Tabela e “huazimeve” ruan informacione për librat e marrë nga biblioteka. Kolona bookid i referohet ID-së së librit të marrë në tabelën "libra" dhe kolona anëtare i referohet personit përkatës nga tabela "anëtarët". Ne kemi gjithashtu një datë lëshimi dhe një datë kur libri duhet të kthehet.

3. Kërkesë e thjeshtë

Le të fillojmë me një kërkesë të thjeshtë: ne kemi nevojë emrat Dhe identifikuesit(id) të të gjithë librave të shkruar nga autori "Dan Brown"


Kërkesa do të jetë si kjo:


SELECT bookid AS "id", titulli FROM libras WHERE autor="Dan Brown";

Dhe rezultati është si ky:


id titullin
2 Simboli i humbur
4 Ferr

Mjaft e thjeshtë. Le të shohim kërkesën për të kuptuar se çfarë po ndodh.

3.1 FROM - nga i marrim të dhënat

Kjo mund të duket e qartë tani, por FROM do të jetë shumë e rëndësishme më vonë kur të arrijmë te bashkimet dhe pyetjet e nënshtruara.


FROM pikë drejt tabelës për të kërkuar. Kjo mund të jetë një tabelë ekzistuese (si në shembullin e mësipërm), ose një tabelë e krijuar në fluturim nëpërmjet lidhjeve ose nënpyetjeve.

3.2 KU - cilat të dhëna tregohen

WHERE thjesht sillet si një filtër linjat, të cilën ne duam të nxjerrim. Në rastin tonë, ne duam të shohim vetëm rreshta ku vlera në kolonën e autorit është "Dan Brown".

3.3 SELECT - si të shfaqen të dhënat

Tani që kemi të gjitha kolonat që na duhen nga tabela që na duhen, duhet të vendosim se si t'i shfaqim saktësisht këto të dhëna. Në rastin tonë, na duhen vetëm titujt e librave dhe ID-të, kështu që kjo është ajo që po bëjmë. le të zgjedhim duke përdorur SELECT. Në të njëjtën kohë, mund të riemërtoni kolonën duke përdorur AS.


I gjithë pyetja mund të vizualizohet duke përdorur një diagram të thjeshtë:


4. Lidhjet (bashkimet)

Tani ne duam të shohim titujt (jo domosdoshmërisht unikë) të të gjithë librave të Dan Brown që janë kontrolluar nga biblioteka dhe kur ata libra duhet të kthehen:


SELECT librat.titulli AS "Titulli", huazimet.kthimi AS "Data e Kthimit" NGA huazimet JOIN books ON borrowings.bookid=books.bookid WHERE books.autor="Dan Brown";

Rezultati:


Titulli Data e Kthimit
Simboli i humbur 2016-03-23 00:00:00
Ferr 2016-04-13 00:00:00
Simboli i humbur 2016-04-19 00:00:00

Në pjesën më të madhe, kërkesa është e ngjashme me atë të mëparshme me përjashtim të NGA seksionet. Do të thotë se ne po kërkojmë të dhëna nga një tabelë tjetër. Ne nuk aksesojmë as tabelën “libra” dhe as tabelën “huazime”. Në vend të kësaj, ne i drejtohemi tavoline e re, e cila u krijua duke bashkuar këto dy tabela.


huazimet JOIN books ON borrowings.bookid=books.bookid - konsiderojeni këtë një tabelë të re që u formua duke kombinuar të gjitha të dhënat nga tabelat "libra" dhe "huazime" në të cilat vlerat e rezervuara janë të njëjta. Rezultati i një bashkimi të tillë do të jetë:



Dhe pastaj ne e pyesim këtë tabelë në të njëjtën mënyrë si në shembullin e mësipërm. Kjo do të thotë që kur bashkoni tabelat ju duhet të shqetësoheni vetëm se si të bëni bashkimin. Dhe më pas kërkesa bëhet e qartë si në rastin e “kërkesës së thjeshtë” nga pika 3.


Le të provojmë një bashkim pak më kompleks me dy tabela.


Tani duam të marrim emrat dhe mbiemrat e njerëzve që morën libra nga biblioteka nga autori "Dan Brown".


Këtë herë le të shkojmë nga poshtë lart:


Hapi 1- ku i marrim të dhënat? Për të marrë rezultatin që na nevojitet, duhet të bashkojmë tabelat "anëtar" dhe "libra" me tabelën "huazime". Seksioni JOIN do të duket kështu:


huazime JOIN books ON borrowings.bookid=books.bookid JOIN anëtarë ON anëtarë.memberid=borrowings.memberid

Rezultati i lidhjes mund të shihet në lidhje.


Hapi 2- çfarë të dhënash tregojmë? Na interesojnë vetëm të dhënat ku autori i librit është “Dan Brown”


WHERE books.autor="Dan Brown"

Hapi 3- si i tregojmë të dhënat? Tani që të dhënat janë marrë, ju vetëm duhet të shfaqni emrat dhe mbiemrat e atyre që kanë marrë librat:


SELECT anëtarët.emri AS "Emri", anëtarët.mbiemri AS "Mbiemri"

Super! Mbetet vetëm të kombinojmë tre komponentët dhe të bëjmë kërkesën që na nevojitet:


SELECT anëtarë.emri AS "First Name", anëtarë.mbiemri AS "Mbiemri" FROM huazime JOIN books ON borrowings.bookid=books.bookid JOIN anëtarë ON anëtarë.memberid=borrowings.memberid WHERE books.autor="Dan Brown";

Çfarë do të na japë:


Emri Mbiemri
Majk Willis
Ellen Horton
Ellen Horton

E shkëlqyeshme! Por emrat përsëriten (nuk janë unikë). Ne do ta rregullojmë këtë së shpejti.

5. Grumbullimi

E thënë përafërsisht, Grumbullimet janë të nevojshme për të kthyer shumë rreshta në një. Në të njëjtën kohë, gjatë grumbullimit, përdoret logjikë e ndryshme për kolona të ndryshme.


Le të vazhdojmë me shembullin tonë ku shfaqen emra dublikatë. Është e qartë se Ellen Horton mori më shumë se një libër, por kjo nuk është mënyra më e mirë për të treguar këtë informacion. Ju mund të bëni një kërkesë tjetër:


SELECT anëtarë.firstname AS "First Name", anëtarë.mbiemri AS "Last Name", count(*) AS "Number of books huazuar" FROM huazim JOIN books ON borrowings.bookid=books.bookid JOIN anëtarë ON anëtarë.memberid=huazime .anëtar WHERE librat.autor="Dan Brown" GRUPI SIPAS anëtarëve.emri, anëtarët.mbiemri;

Që do të na japë rezultatin e dëshiruar:


Emri Mbiemri Numri i librave të huazuara
Majk Willis 1
Ellen Horton 2

Pothuajse të gjitha grumbullimet vijnë me një klauzolë GROUP BY. Kjo gjë e kthen një tabelë që mund të rikthehet nga një pyetje në grupe tabelash. Çdo grup korrespondon me një vlerë unike (ose grup vlerash) të kolonës që kemi specifikuar në GROUP BY. Në shembullin tonë, ne e kthejmë rezultatin nga ushtrimi i mëparshëm në një grup rreshtash. Ne gjithashtu bëjmë një grumbullim me count , i cili konverton shumë rreshta në një vlerë të plotë (në rastin tonë, numrin e rreshtave). Ky kuptim më pas i caktohet secilit grup.


Çdo rresht në rezultat përfaqëson rezultatin e grumbullimit të secilit grup.



Mund të arrihet në përfundimin logjik se të gjitha fushat në rezultat ose duhet të specifikohen në GROUP BY, ose duhet të bëhet agregimi mbi to. Sepse të gjitha fushat e tjera mund të ndryshojnë nga njëra-tjetra në rreshta të ndryshëm, dhe nëse i zgjidhni ato me SELECT, nuk është e qartë se cila nga vlerat e mundshme duhet të merret.


Në shembullin e mësipërm, funksioni i numërimit përpunoi të gjitha rreshtat (pasi po numëronim numrin e rreshtave). Funksione të tjera si shuma ose max përpunojnë vetëm rreshtat e specifikuar. Për shembull, nëse duam të zbulojmë numrin e librave të shkruar nga secili autor, atëherë na duhet pyetja e mëposhtme:


ZGJIDH autorin, shuma(stoku) NGA librat GRUPI SIPAS autorit;

Rezultati:


autor shuma
Robin Sharma 4
Dan Brown 6
John Green 3
Amish Tripathi 2

Këtu funksioni i shumës përpunon vetëm kolonën e aksioneve dhe llogarit shumën e të gjitha vlerave në secilin grup.

6. Nënpyetje


Nën-pyetjet janë pyetje të rregullta SQL të ngulitura brenda pyetjeve më të mëdha. Ato ndahen në tre lloje bazuar në llojin e rezultatit të kthyer.

6.1 Tabela dydimensionale

Ka pyetje që kthejnë kolona të shumta. Një shembull i mirë është pyetja nga ushtrimi i mëparshëm i grumbullimit. Duke qenë një nënpyetje, ai thjesht do të kthejë një tabelë tjetër kundër së cilës mund të bëhen pyetje të reja. Duke vazhduar nga ushtrimi i mëparshëm, nëse duam të zbulojmë numrin e librave të shkruar nga autori "Robin Sharma", atëherë një mënyrë e mundshme është të përdorim nënpyetje:


SELECT * FROM (ZGJIDH autorin, shuma(stoku) FROM librat GROUP BY by autor) AS rezultatet WHERE autor="Robin Sharma";

Rezultati:



Mund të shkruhet si: ["Robin Sharma", "Dan Brown"]


2. Tani ne përdorim këtë rezultat në një pyetje të re:


ZGJIDH titullin, rezervuar FROM librat WHERE autor IN (ZGJIDH autorin FROM (ZGJEDH autorin, shuma(stoku) FROM librat GROUP BY by autor) SI rezultate WHERE shuma > 3);

Rezultati:


titullin i rezervuar
Simboli i humbur 2
Kush do të qajë kur të vdisni? 3
Ferr 4

Kjo është e njëjtë si:


ZGJIDH titullin, rezervuar NGA librat WHERE autori IN ("Robin Sharma", "Dan Brown");

6.3 Vlerat individuale

Ka pyetje që rezultojnë në vetëm një rresht dhe një kolonë. Ato mund të trajtohen si vlera konstante dhe mund të përdoren kudo ku përdoren vlera, si për shembull në operatorët e krahasimit. Ato mund të përdoren gjithashtu si tabela dydimensionale ose vargje me një element.


Le të marrim, për shembull, informacion për të gjithë librat, numri i të cilëve në bibliotekë e kalon mesataren aktuale.


Sasia mesatare mund të merret në këtë mënyrë:


zgjidhni mesataren (stokun) nga librat;

Çfarë na jep:


7. Shkruani veprimet

Shumica e operacioneve të shkrimit të bazës së të dhënave janë mjaft të thjeshta në krahasim me operacionet më komplekse të leximit.

7.1 Përditësimi

Sintaksa e një kërkese UPDATE është semantikisht e njëjtë me një kërkesë leximi. I vetmi ndryshim është se në vend që të zgjedhim kolonat me SELECT, ne vendosim njohuritë me SET.


Nëse të gjithë librat e Dan Brown kanë humbur, atëherë duhet të rivendosni vlerën e sasisë. Pyetja për këtë do të ishte:


Përditëso librat SET stoku=0 WHERE autor="Dan Brown";

WHERE bën të njëjtën gjë si më parë: zgjedh rreshtat. Në vend të SELECT që përdorëm gjatë leximit, tani përdorim SET. Sidoqoftë, tani duhet të specifikoni jo vetëm emrin e kolonës, por edhe një vlerë të re për këtë kolonë në rreshtat e zgjedhur.


7.2 Fshij

Një pyetje DELETE është thjesht një pyetje SELECT ose UPDATE pa emra kolonash. Seriozisht. Ashtu si me SELECT dhe UPDATE, blloku WHERE mbetet i njëjtë: ai zgjedh rreshtat që do të fshihen. Operacioni i fshirjes shkatërron të gjithë rreshtin, kështu që nuk ka kuptim të specifikoni kolona individuale. Pra, nëse vendosim të mos rivendosim numrin e librave të Dan Brown, por të fshijmë të gjitha regjistrimet fare, atëherë mund të bëjmë kërkesën e mëposhtme:


FSHI NGA librat KU autori="Dan Brown";

7.3 Fut

Ndoshta e vetmja gjë që ndryshon nga llojet e tjera të pyetjeve është INSERT. Formati është:


INSERT NË x (a,b,c) VLERAT (x, y, z);

Ku a , b , c janë emrat e kolonave dhe x , y dhe z janë vlerat që duhet të futen në këto kolona, ​​në të njëjtin rend. Kjo është në thelb ajo.


Le të shohim një shembull specifik. Këtu është një pyetje INSERT që plotëson të gjithë tabelën "libra":


INSERT NË libra (libër, titull, autor, botuar, aksione) VLERA (1"Scion of Ikshvaku","Amish Tripathi","06-22-2015",2), (2"Simboli i humbur"," Dan Brown","07-22-2010",3), (3"Kush do të qajë kur të vdesësh?","Robin Sharma","06-15-2006",4), (4"Ferri" "Dan Brown", "05-05-2014",3), (5"Faji në yjet tanë", "John Green","01-03-2015",3);

8. Kontrollo

Kemi ardhur në fund, unë propozoj një test të vogël. Shikojeni këtë kërkesë në fillim të artikullit. A mund ta kuptoni? Provoni ta zbërtheni në seksione SELECT , FROM , WHERE , GROUP BY dhe shikoni përbërësit individualë të nënpyetjeve.


Këtu është në një formë më të lexueshme:


ZGJIDH anëtarët.emri || "" || anëtarë.mbiemri AS "Emri i Plotë" FROM huazime INNER JOIN anëtarë ON anëtarë.memberid=borrowings.memberid INNER JOIN libra ON books.bookid=borrowings.bookid WHERE borrowings.bookid IN (SELECT bookid FROM books WHERE stok> (ZGJIDH mesataren(stock ) NGA librat)) GRUPI SIPAS anëtarëve.emri, anëtarët.mbiemri;

Ky pyetje kthen një listë të njerëzve që kanë kontrolluar një libër nga biblioteka, numri total i të cilëve është mbi mesataren.


Rezultati:


Emri i plotë
Lida Tyler

Shpresoj se keni arritur ta kuptoni pa asnjë problem. Por nëse jo, unë do të mirëpres komentet dhe komentet tuaja në mënyrë që të mund ta përmirësoj këtë postim.

Etiketa: Shtoni etiketa

Leksioni diskuton ndërtimin dhe përdorimin e nënpyetjeve gjatë marrjes dhe ndryshimit të të dhënave.

Nënpyetje

SQL lejon deklaratat e tjera DML të përdorin nënpyetje, të cilat janë pyetje të brendshme të përcaktuara nga deklarata SELECT.

Një subquery është një veçori shumë e fuqishme e gjuhës SQL. Kjo ju lejon të ndërtoni hierarki komplekse të pyetjeve që ekzekutohen në mënyrë të përsëritur gjatë procesit të ndërtimit të një grupi rezultatesh ose ekzekutimit të një prej operatorëve të modifikimit të të dhënave ( FSHIJE, INSERT, PËRDITËSOJE).

Në mënyrë konvencionale, nënpyetjet ndonjëherë ndahen në tre lloje, secila prej të cilave është një ngushtim i atij të mëparshëm:

  • nënpyetje tavoline, duke kthyer një grup rreshtash dhe kolonash;
  • nënpyetje rreshtash, i cili kthen vetëm një rresht, por ndoshta disa kolona (nënpyetje të tilla shpesh përdoren në SQL të integruar);
  • nënpyetje skalare, duke kthyer vlerën e një kolone në një rresht.

Një nënpyetje ju lejon të zgjidhni detyrat e mëposhtme:

  • Përcaktoni grupin e rreshtave të shtuar në tabelë për ekzekutim të deklaratës INSERT;
  • përcaktoni të dhënat e përfshira në pamjen e krijuar nga deklarata CREATE VIEW;
  • përcaktoni vlerat e modifikuara nga operatori PËRDITËSOJE;
  • specifikoni një ose më shumë vlera në klauzolat WHERE dhe HAVING të deklaratës SELECT;
  • definoni tabelën në klauzolën FROM si rezultat i ekzekutimit të një nënpyetjeje;
  • aplikoni nënpyetje të ndërlidhura. Një nënpyetje thuhet se është e ndërlidhur nëse pyetja e përfshirë në kallëzues ka një referencë për një vlerë nga një tabelë (e jashtme ndaj pyetjes) që testohet nga kallëzuesi.

Disa DBMS (për shembull, Oracle DBMS) ju lejojnë të krijoni tabela të reja bazuar në një nënpyetje duke përdorur deklaratën CREATE TABLE.

Një shembull i thjeshtë i përdorimit të një nënpyetjeje është deklarata e mëposhtme:

Në këtë deklaratë, nënpyetja duhet të kthejë gjithmonë një vlerë të vetme që do të testohet në kallëzues. Nëse nënpyetja kthen më shumë se një vlerë, DBMS do të shfaqë një mesazh gabimi në lidhje me ekzekutimin e deklaratës SQL.

Nëse nënpyetja nuk zgjedh asnjë rresht, kallëzuesi do të jetë i barabartë me PANJOHUR, i cili interpretohet nga shumica e DBMS-ve si FALSE.

Standardi përcakton një hyrje të kallëzuesit të formës "nënpyetje të operatorit të vlerës". Megjithatë, disa DBMS ju lejojnë gjithashtu të shkruani kallëzuesin në formën e specifikimit të një nënpyetjeje në të majtë të operatorit të krahasimit.

Për shembull:

Shumë shpesh, funksionet e grumbullimit përdoren me nënpyetje, të cilat ofrojnë aftësinë për të formuluar një kusht si "më i madh se mesatarja e grupit".

Për shembull:

Nëse rezultati i një nënpyetjeje është një grup rreshtash (kjo ndodh gjithmonë kur kushti nuk garanton uniken e vlerës së pyetjes së brendshme që kontrollohet nga kallëzuesi), atëherë duhet të përdorni operatorin IN, i cili zgjedh një vlerë nga grupin e specifikuar.

Për shembull:

Në këtë rast, kallëzuesi vlerësohet në TRUE nëse të paktën një nga vlerat e kthyera nga nënpyetja plotëson kushtin.

Megjithatë, përdorimi i operatorit IN ka edhe disa disavantazhe semantike: pyetja nuk përcakton qartë se sa rreshta duhet të jenë rezultati i pyetjes. Kur ndërtoni marrëdhënie për një model të vërtetë të dhënash, kjo mund të çojë në disa paqartësi dhe varësi nga vetë të dhënat. Përndryshe, nëse modeli i të dhënave supozon praninë e vetëm një rreshti si rezultat konstant i nënpyetjes dhe, në përputhje me rrethanat, përdor operatorin e krahasimit =, dhe struktura e të dhënave lejon futjen e vlerave kur rezultati i nënpyetjes do të jetë më shumë se një rresht, atëherë kur përdorni një operator të tillë SQL në Një gabim mund të shfaqet në një moment në kohë.

Nëse një pyetje përfshin më shumë se dy tabela, atëherë për qartësi më të madhe, emrat e fushave ndonjëherë kualifikohen me emrat e tabelave, duke i treguar ato me një pikë. Standardi lejon që emri i fushës të mos kualifikohet me një emër tabele nëse nuk ka paqartësi (fusha shikohet fillimisht në tabelën e specifikuar nga klauzola FROM e pyetjes aktuale, pastaj pyetja e jashtme, etj.).

Shumë shpesh, në vend që të shkruani një deklaratë SELECT duke përdorur një nënpyetje, mund të përdorni bashkime. Megjithatë, në praktikë, shumica e DBMS-ve kryejnë nënpyetje në mënyrë më efikase. Megjithatë, kur harton një grup programesh me kërkesa kritike të performancës, zhvilluesi duhet të analizojë planin e ekzekutimit të deklaratës SQL për një DBMS specifike.

DBMS-të më të avancuara, si Oracle, ofrojnë një numër deklaratash SQL që ju lejojnë të vlerësoni performancën e një deklarate specifike SQL, si dhe të përcaktoni nivelin e optimizimit të aplikuar për këtë deklaratë.

Një nënpyetje mund të specifikohet ose në një kallëzues të përcaktuar nga një klauzolë WHERE ose në një kallëzues grupi të përcaktuar nga një klauzolë HAVING.

Për shembull:

Nënpyetje të ndërlidhura

Në një deklaratë SELECT, një nënpyetje e brendshme mund të referojë kolonat nga pyetja e jashtme e specifikuar në klauzolën SELECT. Ky nënpyetje ekzekutohet për çdo rresht të tabelës, duke përcaktuar kushtin për përfshirjen e tij në grupin e rezultateve të krijuara.

Për shembull:

Në këtë rast, për çdo rresht të tabelës tbl1, do të kontrollohet kushti që vlera e fushës f2 të përputhet me vlerën e rreshtit të tabelës tbl2, ku vlera e fushës f3 është e barabartë me vlerën e fushës f3 të fushës së jashtme. tabela (tbl1). Ky është shembulli më i thjeshtë nënpyetje e ndërlidhur.

Shumë shpesh dëshironi që një nënpyetje të përdorë të njëjtat të dhëna si një tabelë e jashtme. Në këtë rast, është e nevojshme të përdoren pseudonime.

Për shembull:

Kur nënpyetje e ndërlidhur në klauzolën HAVING, mund të përdorni vetëm funksionet e grumbullimit, pasi çdo herë në kohën e ekzekutimit të një nënpyetjeje, rezultati i grupimit të rreshtave bazuar në funksionet e grumbullimit të pyetjes kryesore vepron si rreshti i kontrolluar, vlerat e të cilit janë subquery ka qasje në.

Për shembull:

Ndërtimi i një kallëzuesi për një nënpyetje që kthen shumë rreshta

Nëse në një kallëzues duhet të krahasoni një vlerë me një grup të caktuar, atëherë, siç tregohet më lart, mund të përdorni operatorin IN.

Për të kontrolluar nëse ka rreshta që plotësojnë një kusht të caktuar të nënpyetjes, përdoret operatori EXISTS.

Për shembull:

Ky pyetje do të gjenerojë një grup rezultati jo bosh vetëm nëse një datë është futur në ndonjë vlerë në kolonën f4 të tabelës, për shembull: "10/11/2003".

Avantazhi i përdorimit të operatorit EXISTS me rezultatet e një nënpyetjeje është se nënpyetja mund të kthejë si rreshta të shumëfishtë ashtu edhe kolona të shumta.

nënpyetje e ndërlidhur Operatori EXISTS do të vlerësohet çdo herë për çdo rresht të pyetjes së jashtme.

Standardi SQL-92 nuk parashikon përdorimin e funksioneve të grumbullimit në nënpyetjet për të cilat aplikohet operatori EXISTS. Megjithatë, disa DBMS e lejojnë këtë lloj nënpyetjeje.

Për të përdorur rezultatin e një nënpyetjeje në një kallëzues, përdoren gjithashtu operatorët ANY dhe ALL, të cilët u diskutuan në detaje në leksionet e mëparshme.

Këtu është një shembull i përdorimit të operatorit ANY:

Kjo deklaratë specifikon se grupi i rezultateve do të përfshijë të gjitha rreshtat vlera e të cilave në kolonën f3 është e pranishme në tabelën tbl2.

Përdorimi i nënpyetjeve në deklaratat e modifikimit të të dhënave

Deklaratat DML, përveç deklaratës SELECT, përfshijnë deklarata që ju lejojnë të ndryshoni të dhënat në tabela. Ky është operatori INSERT, i cili kryen shtimin e një ose më shumë rreshtave në një tabelë, operator FSHIJE, i cili heq një ose më shumë rreshta nga një tabelë dhe operatorin PËRDITËSOJE, i cili ndryshon vlerat e kolonave të tabelës.

INSERT deklaratë

Operatori INSERT

INSERT INTO në emrin e tabelës [ (fusha .,:) ] ( VLERA (vlera .,:) ) | nënpyetje | (VLERAT E PARAKTUARA);

Operatori INSERT mund të shtojë një ose disa rreshta në tabelë. Lista e fushave (fusha .,:) specifikon emrat e fushave dhe rendin në të cilin vlerat futen në to nga lista e vlerave të përcaktuara nga fraza VALUES, ose si rezultat i ekzekutimit të një nënpyetjeje.

Lista e përcaktuar nga klauzola VALUES quhet konstruktor i vlerës së tabelës dhe specifikohet në kllapa, të ndara me presje.

Nëse lista e fushave (fusha .,:) hiqet, atëherë rendi i futjes së vlerave do të korrespondojë me rendin e kolonave të specifikuara në deklaratën CREATE TABLE kur krijoni këtë tabelë.

Nëse kolonat që i nënshtrohen një kufizimi NOT NULL nuk kanë të dhëna për t'u shtuar, DBMS gjeneron një gabim të ekzekutimit të deklaratës SQL.

Operatori i ardhshëm INSERT demonstron kopjimin e rreshtave nga tabela tbl2 bazuar në një nënpyetje:

INSERT INTO tbl1(f1,f2,f3) (ZGJEDH f1,f2,f3 FROM tbl2);

Natyrisht, numri i fushave të treguara nga lista e fushave dhe llojet e të dhënave të këtyre fushave duhet të përputhen me numrin e fushave dhe llojet e tyre të të dhënave në konstruktorin e vlerës së tabelës ose në grupin e rezultateve të gjeneruar nga nënpyetja.

FSHI deklaratën

Operatori FSHIJE në standardin SQL-92 ka përshkrimin zyrtar të mëposhtëm:

Operatori FSHIJE përdoret për të fshirë rreshtat nga një tabelë e specifikuar nga një kusht në një klauzolë WHERE (fshirje e kërkuar) ose WHERE CURRENT OF (fshirje e pozicionuar).

Fshirja e pozicionit, e përcaktuar me klauzolën WHERE CURRENT OF, duke fshirë rreshtat nga kursori, përkatësisht i fshin ato nga tabela e bazës së të dhënave në të cilën është ndërtuar ky kursor.

Nëse operatori FSHIJE aplikuar në çdo pamje, të dhënat fshihen gjithashtu nga tabela e bazës së të dhënave të krijuar në bazë të asaj të fundit.

Nuk duhet të harrojmë kurrë se nëse nuk ka asnjë klauzolë WHERE ose kallëzuesi në klauzolën WHERE vlerësohet gjithmonë në TRUE, atëherë operatori FSHIJE do të heqë të gjitha rreshtat nga tabela.

Përditëso deklaratën

Operatori PËRDITËSOJE në standardin SQL-92 ka përshkrimin zyrtar të mëposhtëm:

Operatori PËRDITËSOJE përdoret për të bërë ndryshime në të dhënat e tabelës.

Shprehja expr e përdorur për të llogaritur vlerën e një kolone mund të jetë ose një shprehje e thjeshtë ose një nënpyetje që kthen një vlerë të vetme. Një shprehje mund t'i referohet vlerës së vjetër të kolonës që modifikohet dhe kolonave të tjera të regjistrimit aktual.

Ju mund të përdorni një shprehje të kushtëzuar kur llogaritni vlerat e kolonës RAST dhe një shprehje CAST për hedhjen e tipit.

Për shembull:

Shprehje kushtore RAST

Shprehje e kushtëzuar RAST ju lejon të zgjidhni një nga disa vlera bazuar në një kusht të caktuar.

Shprehje e kushtëzuar RAST ka përshkrimin zyrtar të mëposhtëm:

( RAST ( expr WHEN expr THEN ( expr | NULL )) | ( WHEN expr THEN ( expr | NULL )) [ TJETER (expr | NULL ) ] FUND) | ( NULLIF (expr1,expr2) ) | (Bashkimi (shp.,:) )

Shprehje e kushtëzuar RAST mund të shkruhet, përkatësisht, në katër forma:

  • RAST me shprehje. Për shembull:

    ZGJIDH f1, RASTIN f3 KUR "abc" PASTAJ "1_abc" FUND FROM tbl1;

  • RAST me kallëzues. Për shembull:

    ZGJIDH f1, RASTE KUR f3= "abc" PASTAJ "1_abc" TJETER f3 FUND FROM tbl1;

  • NULLIF - nëse shprehjet e specifikuara në kllapa nuk përputhen, atëherë zgjidhet e para nga këto vlera, përndryshe vlera vendoset në NULL. Për shembull:
  • COALESCE - zgjedh vlerën e parë jo NULL në listë. Për shembull:

    INSERT INTO tbl1(f1,f2) VALUES (1+ BASHKIMI (ZGJEDH MAX(f1) FROM tbl1, 0), 100);

Për të ekzekutuar me sukses deklaratën PËRDITËSOJE kërkohen një sërë kushtesh, duke përfshirë sa vijon:

  • disponueshmëria e privilegjeve të duhura;
  • një pamje kërkon që ajo të përkufizohet si e ndryshueshme;
  • Kur ndryshoni pamjet, zbatohen kufizimet WITH CHECK OPTION ose WITH CASCADED CHECK OPTION që u vendosën kur u krijua pamja;
  • në transaksionet vetëm për lexim, ndryshimet janë të disponueshme vetëm për tabelat e përkohshme;
  • shprehjet e përdorura për të përcaktuar vlerat nuk mund të përmbajnë nënpyetje me funksione grumbullimi;
  • Për një kursor të përditësueshëm të specifikuar nga një klauzolë PËR PËRDITËSIM, secila kolonë që do të përditësohet duhet gjithashtu të specifikohet si PËR PËRDITËSIM ;
  • Në një kursor me një klauzolë ORDER BY, nuk mund të modifikoni kolonat e specifikuara në atë klauzolë.

Një nënpyetje është një pyetje e përfshirë brenda shprehjes së fjalës kyçe WHERE të një pyetjeje tjetër për të kufizuar më tej daljen. Nënpyetjet quhen gjithashtu pyetje të mbivendosura. Ato përdoren për të vendosur kushte në të dhënat dalëse. Nënpyetjet mund të përdoren me deklaratat SELECT, INSERT, UPDATE ose DELETE.

Në disa raste, një nënpyetje mund të përdoret në vend të lidhjes së tabelave, duke lidhur kështu të dhënat e tabelës në mënyrë implicite. Kur përdorni një nën-pyetje në një pyetës, së pari ekzekutohet nënpyetja dhe vetëm atëherë ekzekutohet pyetja që e përmban atë, duke marrë parasysh kushtet për ekzekutimin e nënpyetjes. Një nënpyetje mund të përdoret ose në shprehjen e fjalës kyçe WHERE ose në shprehjen e fjalës kyçe HAVING të pyetjes kryesore. Operacionet logjike dhe krahasimore si =, >,<, о, IN, NOT IN, AND, OR и т п. можно использовать в подзапросе. Все, что применимо к обычному запросу, применимо и к подзапросу.

Kur hartoni pyetjet e nënshtruara, duhet t'i përmbaheni rregullave të mëposhtme.

Nënpyetja duhet të vendoset në kllapa.

Një nënpyetje mund t'i referohet vetëm një kolone në shprehjen e fjalës kyçe SELECT, përveç nëse pyetja kryesore përdor një krahasim me kolona të shumta nga nënpyetja.

Fjala kyçe ORDER BY nuk mund të përdoret në një nënpyetje, megjithëse RENDOSJA BY mund të përdoret në pyetjen kryesore. Në vend të ORDER BY, mund të përdorni GROUP BY në një nënpyetje.

Një nënpyetje që kthen shumë rreshta të dhënash mund të përdoret vetëm në operatorët që lejojnë vlera të shumta, si p.sh. IN.

Operatori BETWEEN nuk mund të përdoret në një nënpyetje, por mund të përdoret brenda vetë nënpyetjes. Sintaksa bazë për një deklaratë nën-pyetje është si më poshtë.

SELECT emri i kolonës NGA tabela WHERE emri i kolonës = (ZGJEDH emrin e_kolonës FROM Tabela WHERE kushtet);

Ashtu si një nënpyetje mund të vendoset brenda një pyetjeje kryesore, një nënpyetje gjithashtu mund të vendoset brenda një nënpyetjeje. Në pyetjen kryesore, nënpyetja ekzekutohet përpara se të ekzekutohet ajo kryesore, dhe në të njëjtën mënyrë, në një nënpyetje, nënpyetja e vendosur në të do të ekzekutohet së pari.

Shembull. Le të jetë e nevojshme të përcaktohet numri i lëndëve me notë që tejkalon notën mesatare të një studenti me identifikuesin 301:

SELECT COUNT (DISTINCT subj_id), shëno NGA provimet_shenjat GROUP BY markën HAVING > (SELECT AVG(shenja) FROM provimet_shenjat WHERE stud_id=301);

Kur përdorni nënpyetje të shumta në një deklaratë, koha e nevojshme për të përpunuar kërkesën rritet dhe gjasat e gabimeve rriten për shkak të kompleksitetit të deklaratës.

Nënpyetjet e lidhura lejohen në shumë implementime SQL. Kur përdorni nënpyetje në një pyetje të brendshme, mund t'i referoheni tabelës, emri i së cilës është specifikuar në klauzolën FROM të pyetjes së jashtme. Nënpyetje të tilla quhen të lidhura. Nënpyetja e lidhur ekzekutohet një herë për çdo rresht të tabelës kryesore të pyetjeve, si më poshtë:



Përzgjidhet një rresht nga tabela, emri i të cilit është specifikuar në pyetjen e jashtme;

Nënpyetja ekzekutohet dhe vlera që rezulton përdoret për të analizuar atë rresht në klauzolën WHERE të pyetjes së jashtme;

Bazuar në rezultatin e vlerësimit të kësaj gjendjeje, merret vendimi për përfshirjen/mos përfshirjen e linjës në të dhënat dalëse;

Procedura përsëritet për rreshtin tjetër të tabelës së jashtme të pyetjeve.

Klauzola GROUP BY ju lejon të gruponi regjistrimet e kthyera nga një pyetje SELECT sipas vlerës së një fushe të caktuar. Përdorimi i klauzolës HAVING ju lejon të filtroni grupe të tilla gjatë daljes. Kallëzuesi i klauzolës HAVING vlerësohet jo për çdo rresht të rezultatit, por për secilin grup rekordesh dalëse të formuara nga klauzola GROUP BY e pyetjes së jashtme.

SELECT_data_provimit, SUM(shenja) FROM_provim_shënon një GROUP BY_Data_provimi

duke pasur 10< (SELECT COUNT(mark) FROM exam_marks b

KU a.data_provimit=b.data_provimit);

Është e nevojshme, bazuar në të dhënat në tabelën e notave të provimeve, të përcaktohet shuma e notave të marra nga studentët (shënoni vlerat e fushës), duke grupuar vlerat e notave sipas datave të provimeve dhe duke përjashtuar ato ditë kur numri i studentëve që marrin provime gjatë dita ishte më pak se dhjetë.

Përmbledhje: Një nënpyetje është një pyetje e ekzekutuar brenda një pyetjeje tjetër për të vendosur kushte shtesë në të dhënat dalëse. Një nënpyetje mund të përdoret në shprehjet e fjalëve kyçe WHERE dhe HAVING. Sintaksa e nënpyetjeve praktikisht nuk është e ndryshme nga sintaksa e një pyetjeje të rregullt, ka vetëm kufizime të vogla; Një nga këto kufizime është ndalimi i përdorimit të fjalës kyçe ORDER BY në nënpyetje, megjithatë, ju mund të përdorni GROUP BY, gjë që arrin pothuajse të njëjtin efekt. Nënpyetjet përdoren për të vendosur kushte në pyetje për të cilat nuk dihen të dhënat e sakta, duke rritur kështu fuqinë dhe fleksibilitetin e SQL.

SQL ju lejon të futni pyetjet brenda njëri-tjetrit. Në mënyrë tipike, një nënpyetje kthen një vlerë të vetme, e cila kontrollohet për të parë nëse kallëzuesi është i vërtetë.

Llojet e termave të kërkimit:
. Krahasimi me rezultatin e një nënpyetje (=, >=)
. Kontrollimi për përkatësinë në rezultatet e një nënpyetjeje (IN)
. Kontrolli i ekzistencës (EKSISTON)
. Krahasimi i shumëfishtë (sasior) (ÇDO, TË GJITHA)

Shënime mbi pyetjet e ndërlidhura:
. Një nënpyetje duhet të zgjedhë vetëm një kolonë (me përjashtim të një nënpyetjeje me një kallëzues EXISTS) dhe lloji i të dhënave të rezultatit të tij duhet të përputhet me llojin e të dhënave të vlerës së specifikuar në kallëzues.
. Në disa raste, mund të përdorni fjalën kyçe DISTINCT për të siguruar që të kthehet një vlerë e vetme.
. Ju nuk mund të përfshini një klauzolë ORDER BY ose UNION në një nënpyetje.
. Nënpyetja mund të vendoset ose në të majtë ose në të djathtë të kushtit të kërkimit.
. Nënpyetjet mund të përdorin funksione grumbullimi pa një klauzolë GROUP BY, të cilat automatikisht kthejnë një vlerë të veçantë për çdo numër rreshtash, një kallëzues të veçantë IN dhe shprehje të bazuara në kolonë.
. Kurdoherë që është e mundur, duhet të përdorni bashkimet e tabelave JOIN në vend të pyetjeve të nënshtruara.

Shembuj për pyetjet e mbivendosura:

SELECT * FROM Orders WHERE SNum=(SELECT Num FROM SalesPeople WHERE SName='Motika')
ZGJIDH * NGA Porositë WHERE SNum IN (ZGJEDH NJERËN NGA SalesPeople WHERE City='London')
ZGJIDH * NGA Porositë WHERE SNum=(SELECT DISTINCT SNum FROM Orders WHERE CNum=2001)
SELECT * FROM Orders WHERE Amt>(SELECT AVG(Amt) FROM Orders WHERE Odate=10/04/1990)
ZGJIDH * NGA Klienti WHERE CNum=(SELECT SNum+1000 FROM SalesPeople WHERE SName='Serres')

2) Nënpyetje të lidhura

Në SQL, ju mund të krijoni nënpyetje që referojnë një tabelë nga një pyetje e jashtme. Në këtë rast, nënpyetja ekzekutohet shumë herë, një herë për çdo rresht tabele nga pyetja e jashtme. Prandaj, është e rëndësishme që nënpyetja të përdorë indeksin. Një nënpyetje mund të hyjë në të njëjtën tabelë si një e jashtme. Nëse pyetja e jashtme kthen një numër relativisht të vogël rreshtash, atëherë nënpyetja e lidhur do të jetë më e shpejtë se ajo e palidhur. Nëse një nënpyetje kthen një numër të vogël rreshtash, pyetja e lidhur do të jetë më e ngadaltë se pyetja e palidhur.

Shembuj për nënpyetje të lidhura:

SELECT * FROM SalesPeople Kryesor WHERE 1(SELECT AVG(Amt) FROM Orders O2 WHERE O2.CNum=O1.CNum) //kthehet të gjitha porositë vlera e të cilave tejkalon vlerën mesatare të porosisë për një klient të caktuar

3) Kallëzuesi EKZISTON

Forma sintaksore: EKZISTON ()

Kallëzuesi merr një nënpyetje si argument dhe vlerëson të vërtetë nëse nënpyetja ka dalje dhe false përndryshe. Nënpyetja ekzekutohet një herë dhe mund të përmbajë disa kolona, ​​pasi vlerat e tyre nuk kontrollohen, por rezultati i pranisë së rreshtave thjesht regjistrohet.

Shënime mbi kallëzuesin EXISTS:
. EXISTS është një kallëzues që kthen TRUE ose FALSE dhe mund të përdoret vetëm ose me shprehje të tjera Boolean.
. EXISTS nuk mund të përdorë funksionet e grumbullimit në nënpyetësin e tij.
. Në nënpyetjet e ndërlidhura, kallëzuesi EXISTS ekzekutohet për çdo rresht të tabelës së jashtme.
. Ju mund të kombinoni kallëzuesin EXISTS me bashkimet e tabelave.

Shembuj për kallëzuesin EXISTS:

SELECT * FROM Customer WHERE EXISTS (SELECT * FROM Customer WHERE City='San Jose') – kthen të gjithë klientët nëse ndonjëri prej tyre jeton në San Jose.
ZGJIDHNI SNum TË NDARSHËM NGA Klienti i pari WHERE NOT EXISTS (ZGJEDH * NGA Klienti Dërgo WHERE Send.SNum=First.SNum AND Send.CNumFirst.CNum) – kthen numrat e shitësve që i kanë shërbyer vetëm një klienti.
SELECT DISTINCT F.SNum, SName, F.City FROM SalesPeople F, Customer S WHERE EXISTS (ZGJEDH * NGA Klienti T WHERE S.SNum=T.SNum AND S.CNumT.CNum DHE F.SNum=S.SNum) – kthen numrat, emrat dhe qytetet e vendbanimit të të gjithë shitësve që u shërbenin disa klientëve.
SELECT * FROM SalesPeople Frst WHERE EXISTS (SELECT * FROM Customer Send WHERE Frst.SNum=Send.SNum AND 1

4) Kallëzues të krahasimit sasior

Forma sintaksore: (=|>|=|) NDONJË|TË GJITHA ()

Këta kallëzues përdorin një nënpyetje si argument, megjithatë, në krahasim me kallëzuesin EXISTS, ato përdoren në lidhje me kallëzuesin relacional (=,>=). Në këtë kuptim, ato janë të ngjashme me kallëzuesin IN, por përdoren vetëm me nënpyetje. Standardi lejon që fjala kyçe SOME të përdoret në vend të ANY, por jo të gjitha DBMS-të e mbështesin atë.

Shënime për kallëzuesit krahasues:
. Kallëzuesi ALL vlerësohet në TRUE nëse secila vlerë e zgjedhur gjatë ekzekutimit të nënpyetjes plotëson kushtin e specifikuar në kallëzuesin e jashtëm të pyetjes. Më shpesh përdoret me pabarazi.
. Kallëzuesi ANY vlerësohet në TRUE nëse të paktën një vlerë e zgjedhur gjatë ekzekutimit të nënpyetjes plotëson kushtin e specifikuar në kallëzuesin e jashtëm të pyetjes. Më shpesh përdoret me pabarazi.
. Nëse nënpyetësja nuk kthen asnjë rresht, atëherë ALL automatikisht merr vlerën TRUE (konsiderohet se kushti i krahasimit është i plotësuar), dhe për ANY merr vlerën FALSE.
. Nëse krahasimi është E VËRTETË për asnjë rresht dhe ka një ose më shumë rreshta me vlerë NULL, atëherë ANY kthen UNKNOWN.
. Nëse krahasimi është FALSE për asnjë rresht dhe ka një ose më shumë rreshta me një vlerë NULL, atëherë ALL kthen UNNOWN.

Shembuj për kallëzuesin e krahasimit sasior:

ZGJIDH * NGA SalesPeople WHERE City=NDONJË (ZGJEDH Qyteti NGA Klienti)
SELECT * FROM Orders WHERE Amt ALL (ZGJEDH Vlerësimin FROM Customer WHERE City='Rome')

5) Kallëzues unike

UNIK|TË DAKTUAR ()

Kallëzuesi përdoret për të kontrolluar veçantinë (mungesën e dublikatave) në të dhënat dalëse të nënpyetjes. Për më tepër, në kallëzuesin UNIQUT, vargjet me vlera NULL konsiderohen unike, dhe në kallëzuesin DISTINCT, dy vlera të papërcaktuara konsiderohen të barabarta me njëra-tjetrën.

6) Përputhja e kallëzuesit

NDESHJE ()

Kallëzuesi MATCH teston nëse vlera e një vargu pyetësor do të përputhet me vlerën e çdo vargu që rezulton nga nënpyetja. Ky nënpyetje ndryshon nga kallëzuesit IN AND ANY në atë që lejon përpunimin e përputhjeve "të pjesshme" (PARCIAL) që mund të ndodhin midis rreshtave që kanë disa vlera NULL.

7) Pyetjet në seksionin FROM

Në fakt, është e ligjshme të përdoret një nënpyetje kudo që lejohet një referencë tabele.

SELECT CName, Tot_Amt FROM Customer, (SELECT Num, SUM(Amt) AS Total_Amt FROM Porosit GROUP BY CNum) WHERE City='London' AND Customer.CNum=Orders.CNum
//nënquery kthen shumën totale të porosive të bëra nga secili klient nga Londra.

8) Pyetje rekursive

ME REKURSIVE
Q1 SI ZGJIDH … NGA … KU …
Q2 SI ZGJEDHJE … NGA … KU …

Nënpyetje i referohet objekteve speciale në programin 1C. Funksionaliteti i tij përdoret nëse është e nevojshme të gjenerohen dhe ekzekutohen lloje të veçanta të pyetjeve në tabelat e bazës së të dhënave në program. Për të marrë një rezultat nga një kërkesë, së pari duhet të hartoni saktë tekstin e kërkesës, i cili do të grumbullojë informacione të përditësuara në lidhje me burimet për marrjen e të dhënave. Këto mund të jenë tabela, fusha të veçanta, grupime unike.

Gjuha moderne e pyetjeve për programin 1C

Pyetjet e mbivendosura shkruhen duke përdorur një gjuhë që ka karakteristikat e veta dhe në të njëjtën kohë është e ngjashme me gjuhët e tjera të veçanta SQL, për shembull, në sintaksën e saj. Karakteristikat kryesore dalluese gjuha e pyetjes në 1C ato janë:

  • Çreferencimi i fushave të referencës;
  • Mundësia e kërkesave atipike;
  • Renditja sipas llojeve primitive;
  • Duke përdorur konstruktin "View";
  • Kampionimi i të dhënave sipas një shablloni;
  • Ndarja e grupimeve dhe totaleve;
  • Ndërtim me kushtin “Ku”.

Ekzistojnë veçori të tjera dalluese të gjuhës së pyetjeve 1C që e lejojnë atë të jetë efektive.

Çfarë duhet të dini për pyetjet e ndërlidhura dhe gjuhën e pyetjeve?

Studimi profesional i dizajnit të gjuhës së pyetjes ju lejon jo vetëm të kuptoni se për çfarë synohet gjuha e pyetjes, por gjithashtu mësoni të përfaqësoni një grup objektesh të bazës së të dhënave në formatin e tabelave 2-dimensionale, përpunoni konsolën e pyetjeve, krijoni skedarë për ruajtjen e listave të pyetjeve dhe njihuni me fushat specifike të tabelave që kanë një lloj referimi. Dhe e gjithë kjo do të jetë vetëm njohuri bazë për sistemin pyetjet e mbivendosura në 1C. Është e rëndësishme të zotëroni operacionet e grupit që lidhen me gjuhën e pyetjes dhe të mësoni se si të bëni zgjedhje të sakta nga burime të shumta të të dhënave.

Shembull i një pyetjeje të mbivendosur

Le të shqyrtojmë një nga opsionet për një pyetje të mbivendosur bazuar në kombinimin e pyetjeve. Supozoni se ka dokumente për faturat dhe shpenzimet, me të njëjtin person juridik që vepron si shitës dhe blerës. Ne duhet të zbulojmë borxhin total të palës tjetër. Për ta bërë këtë, ne përdorim konstruksionin efektiv "UNITE EVERYTHING".

Tabela "ARRIAGE"

Tabela "KONSUMI"

Së pari, ne përcaktojmë të gjitha shpenzimet, pastaj të ardhurat nga personat juridikë. Ne vendosëm kërkesën e dytë me një shenjë "-", kjo do t'ju lejojë të kolapsoni saktë të dhënat.

Rezultati i veprimit:

Por ne duhet të marrim një rezultat të shembur;

Pastaj rezultati i raportit do të jetë:

Kur bëhet fjalë për tabelat e shpenzimeve dhe të ardhurave, për shembull, sipas drejtorisë së Nomenklaturës, është e nevojshme të eliminohen dyfishimet. Por ju nuk do të jeni në gjendje të bashkoni secilën kërkesë veç e veç. Prandaj ju duhet ta bëni këtë:

Në këtë rast, pyetja vendoset midis kllapave, quhet pyetës i mbivendosur. Kjo na lejon jo vetëm të grupojmë të dhënat që janë të rëndësishme për ne, por edhe të përjashtojmë elementë të ngjashëm nga dy nënpyetjet e përdorura.

Ekzistojnë disa kërkesa që duhet të ndiqen kur bashkohen dy pyetje. Para së gjithash, kjo ka të bëjë me numrin e fushave. Është e nevojshme që numri i tyre të jetë identik. Për shembull, nëse një Zbritje tregohej në tabelën e të dhënave "Shpenzimet", por nuk kishte një element të tillë në të dhënat e Faturës, atëherë duhet të drejtoheni në ndërtimin e mëposhtëm:

Në të ardhmen, do t'ju duhet të rregulloni shumën e zbritjes dhe të kryeni grupimin e nevojshëm.

Kushti i dytë i domosdoshëm është rregulli. Fakti është se procedura për kombinimin e fushave ndodh në përputhje të rreptë me rendin e tyre, domethënë se si ato përcaktohen në çdo seksion vijues. Për të ndryshuar rendin, ne përdorim ndërtimin e mëposhtëm:

Nga rruga, kur përdorni konstruktin Union, ai duhet të dallohet nga koncepti i kombinimit të disa pyetjeve. Bashkimi bën të mundur lidhjen vertikale të rezultateve të mostrës, të cilat merren një nga një nga e para, dhe më pas kalohet në të dytën. Kështu merren të dhënat si rezultat i dizajnit të kombinimit të informacionit nga dy tabela.




Top