Si të konfiguroni telefonat inteligjentë dhe PC. Portali informativ
  • në shtëpi
  • Hekuri
  • Funksionet agregate në sql. Grupimi në SQL: GROUP BY, HAVING Klauzola dhe Funksione Agregate

Funksionet agregate në sql. Grupimi në SQL: GROUP BY, HAVING Klauzola dhe Funksione Agregate

Ne do të mësojmë të përmbledhim. Jo, këto nuk janë ende rezultatet e studimit të SQL, por rezultatet e vlerave të kolonave të tabelave të bazës së të dhënave. Funksionet e agregatit SQL veprojnë në vlerat e kolonës për të prodhuar një vlerë të vetme rezultati. Funksionet agregate SQL më të përdorura janë SUM, MIN, MAX, AVG dhe COUNT. Është e nevojshme të bëhet dallimi midis dy rasteve të përdorimit të funksioneve agregate. Së pari, funksionet agregate përdoren vetë dhe kthejnë një vlerë të vetme që rezulton. Së dyti, funksionet agregate përdoren me klauzolën SQL GROUP BY, domethënë me grupimin sipas fushave (kolonave) për të marrë vlerat e rezultateve në secilin grup. Le të shqyrtojmë fillimisht rastet e përdorimit të funksioneve agregate pa grupim.

Funksioni SQL SUM

Funksioni SQL SUM kthen shumën e vlerave të një kolone në një tabelë të bazës së të dhënave. Mund të aplikohet vetëm për kolonat vlerat e të cilave janë numra. Pyetjet SQL për të marrë shumën që rezulton fillojnë kështu:

ZGJIDH SHUMËN (COLUMN_NAME) ...

Kjo shprehje ndiqet nga FROM (TABLE_NAME), dhe më pas një kusht mund të specifikohet duke përdorur klauzolën WHERE. Për më tepër, DISTINCT mund të specifikohet përpara emrit të kolonës, që do të thotë se do të numërohen vetëm vlerat unike. Si parazgjedhje, të gjitha vlerat merren parasysh (për këtë, ju mund të specifikoni në mënyrë specifike jo DISTINCT, por ALL, por fjala ALL është opsionale).

Shembulli 1. Ekziston një bazë të dhënash e kompanisë me të dhëna për divizionet dhe punonjësit e saj. Tabela e Stafit, përveç gjithçkaje, ka një kolonë me të dhënat për pagat e punonjësve. Zgjedhja nga tabela është si më poshtë (për të zmadhuar foton, klikoni mbi të me butonin e majtë të miut):

Për të marrë shumën e të gjitha pagave, ne përdorim pyetjen e mëposhtme:

SELECT SUM (Paga) NGA Stafi

Ky pyetje do të kthejë 287664.63.

Dhe tani . Në ushtrime tashmë po fillojmë të ndërlikojmë detyrat, duke i afruar ato me ato që hasen në praktikë.

Funksioni SQL MIN

Funksioni SQL MIN funksionon gjithashtu në kolona, ​​vlerat e të cilave janë numra dhe kthen minimumin e të gjitha vlerave në kolonë. Ky funksion ka një sintaksë të ngjashme me sintaksën Funksionet SUM.

Shembulli 3. Baza e të dhënave dhe tabela janë të njëjta si në shembullin 1.

Kërkohet të zbulohet paga minimale e punonjësve të departamentit me numrin 42. Për ta bërë këtë, shkruani kërkesën e mëposhtme:

Kërkesa do të kthejë vlerën 10505.90.

Dhe perseri ushtrim për vetëndihmë... Në këtë dhe disa ushtrime të tjera, do t'ju duhet jo vetëm tabela e Stafit, por edhe tabela Org, e cila përmban të dhëna për ndarjet e kompanisë:


Shembulli 4. Tabela Org i shtohet tabelës Staff, e cila përmban të dhëna për ndarjet e firmës. Shfaq numrin minimal të viteve që një punonjës i vetëm ka punuar në një departament të vendosur në Boston.

Funksioni SQL MAX

Funksioni SQL MAX funksionon në mënyrë të ngjashme dhe ka një sintaksë të ngjashme, e cila përdoret kur ju duhet të përcaktoni vlera maksimale ndër të gjitha vlerat e kolonës.

Shembulli 5.

Kërkohet të zbulohet paga maksimale e punonjësve të departamentit numër 42. Për ta bërë këtë, shkruani kërkesën e mëposhtme:

Kërkesa do të kthejë vlerën 18352.80

Eshte koha ushtrime për vetëzgjidhje.

Shembulli 6. Po punojmë sërish me dy tavolina - Stafi dhe Org. Shtypni emrin e departamentit dhe komisionet maksimale të fituara nga një punonjës në një departament që i përket Divizionit Lindor. Përdorni BASHKONI (bashkoni tabelat) .

Funksioni SQL AVG

Sintaksa e mësipërme për funksionet e përshkruara më parë është gjithashtu e vërtetë për funksionin SQL AVG. Ky funksion kthen mesataren e të gjitha vlerave në një kolonë.

Shembulli 7. Baza e të dhënave dhe tabela janë të njëjta si në shembujt e mëparshëm.

Supozoni se dëshironi të zbuloni përvojën mesatare të punës së punonjësve të departamentit numër 42. Për ta bërë këtë, shkruani pyetjen e mëposhtme:

Rezultati do të jetë një vlerë prej 6.33

Shembulli 8. Ne punojmë me një tavolinë - Stafi. Tërhiqet paga mesatare e punonjësve me përvojë nga 4 deri në 6 vjet.

Funksioni SQL COUNT

Funksioni SQL COUNT kthen numrin e regjistrimeve në një tabelë të bazës së të dhënave. Nëse specifikoni SELECT COUNT (COLUMN_NAME) ... në pyetje, rezultati do të jetë numri i regjistrimeve duke përjashtuar ato rekorde në të cilat vlera e kolonës është NULL (e papërcaktuar). Nëse përdorni një yll si argument dhe filloni një pyetje SELECT COUNT (*) ..., rezultati do të jetë numri i të gjitha rekordeve (rreshtave) në tabelë.

Shembulli 9. Baza e të dhënave dhe tabela janë të njëjta si në shembujt e mëparshëm.

Kërkohet të zbulohet numri i të gjithë punonjësve që marrin komisione. Numri i punonjësve, vlerat e kolonës Comm të të cilëve nuk janë NULL do të kthejë pyetjen e mëposhtme:

ZGJIDH NUMRIN (Kom) NGA Stafi

Rezultati është 11.

Shembulli 10. Baza e të dhënave dhe tabela janë të njëjta si në shembujt e mëparshëm.

Nëse duhet të zbuloni numrin total të regjistrimeve në një tabelë, atëherë ne përdorim një pyetje me një yll si argument për funksionin COUNT:

ZGJIDH NUMRIN (*) NGA Stafi

Rezultati është 17.

Në tjetrën ushtrim për vetëndihmë do t'ju duhet të përdorni një nënpyetje.

Shembulli 11. Ne punojmë me një tavolinë - Stafi. Paraqit numrin e punonjësve në departamentin e planifikimit (Rrafshnalta).

Përmbledhja e funksioneve me SQL GROUP BY (Grupim)

Tani le të shohim përdorimin e funksioneve agregate në lidhje me klauzolën SQL GROUP BY. Klauzola SQL GROUP BY përdoret për të grupuar vlerat e rezultateve sipas kolonave të tabelës së bazës së të dhënave.

Shembulli 12. Ekziston një bazë të dhënash e portalit të reklamave. Ai përmban tabelën e reklamave, e cila përmban të dhëna për reklamat e paraqitura për javën. Kolona Kategoria përmban informacione rreth kategori të mëdha reklamat (për shembull, Pasuri të paluajtshme) dhe kolona Pjesë - rreth pjesëve më të vogla të përfshira në kategori (për shembull, pjesët e apartamenteve dhe vilave janë pjesë e kategorisë së pasurive të paluajtshme). Kolona Njësitë përmban të dhëna për numrin e reklamave të dorëzuara, dhe kolona Paratë përmban shumën e parave të marra për paraqitjen e reklamave.

KategoriaPjesëNjësitëParatë
TransportiMjetet motorike110 17600
PronaApartamente89 18690
PronaVilat57 11970
TransportiMotoçikleta131 20960
Materiale ndërtimiDërrasat68 7140
inxhinieri elektriketelevizorë127 8255
inxhinieri elektrikeFrigoriferë137 8905
Materiale ndërtimiRegjistrat112 11760
Koha e lirëlibra96 6240
PronaShtëpitë47 9870
Koha e lirëMuzikë117 7605
Koha e lirëLojëra41 2665

Duke përdorur deklaratën SQL GROUP BY, gjeni shumën e parave të fituara nga shfaqja e reklamave në secilën kategori. Ne shkruajmë kërkesën e mëposhtme.

Mësimi do të mbulojë temën sql riemërimi i një kolone (fushash) duke përdorur fjalën e funksionit AS; trajtoi gjithashtu temën e funksioneve agregate në sql. Do të analizohen shembuj specifikë të kërkesave

Ju mund të riemërtoni emrat e kolonave në pyetje. Kjo i bën rezultatet më të lexueshme.

Në SQL, riemërtimi i fushave shoqërohet me përdorimin e fjalë kyçe AS e cila përdoret për të riemërtuar emrat e fushave në grupet e rezultateve

Sintaksë:

ZGJIDH<имя поля>AS<псевдоним>NGA...

Le të shohim një shembull të riemërtimit në SQL:

Shembull DB "Instituti": Shfaqni emrat e mësuesve dhe pagat e tyre, për ata mësues pagat e të cilëve janë nën 15000, riemërtoni fushën zarplata në "Paga e ulët"


✍ Zgjidhja:

Riemërtimi i kolonave në SQL është shpesh i nevojshëm kur llogaritni vlerat e lidhura me fusha të shumta tabelat. Le të shqyrtojmë një shembull:

Shembull DB "Instituti": Nga tabela e mësuesve, nxirrni fushën e emrit dhe llogaritni shumën e pagës dhe bonusit, duke emërtuar fushën "Shpërblim paga"


✍ Zgjidhja:
1 2 SELECT emrin, (zarplata + premia) AS zarplata_premia FROM mësues;

SELECT emrin, (zarplata + premia) AS zarplata_premia FROM mësues;

Rezultati:

Funksionet Agregate në SQL

Funksionet agregate në sql përdoren për të marrë totale dhe për të llogaritur shprehjet:

Të gjitha funksionet agregate kthejnë një vlerë të vetme.

Funksionet COUNT, MIN dhe MAX zbatohen për çdo lloj të dhënash.

Funksionet SUM dhe AVG përdoren vetëm për fushat numerike.
Ekziston një ndryshim midis funksioneve COUNT (*) dhe COUNT (): i dyti nuk merr parasysh vlerat NULL kur numëron.

E rëndësishme: kur punoni me funksione agregate në SQL, përdoret një fjalë e veçantë AS


Shembull DB "Instituti": Merrni vlerën e pagës më të lartë mes mësuesve, shfaqni rezultatin si "Max_zp"


✍ Zgjidhja:
SELECT MAX (zarplata) AS max_zp NGA mësuesit;

SELECT MAX (zarplata) AS max_zp NGA mësuesit;

Rezultatet:

Le të shqyrtojmë një shembull më kompleks të përdorimit të funksioneve agregate në sql.


✍ Zgjidhja:

Klauzola GROUP BY në SQL

Grupi sipas klauzolës në sql zakonisht përdoret në lidhje me funksionet agregate.

Funksionet e përgjithshme kryhen në të gjitha rreshtat e pyetjeve që rezultojnë. Nëse pyetja përmban një klauzolë GROUP BY, çdo grup rreshtash i specifikuar në klauzolën GROUP BY përbën një grup dhe funksionet agregate ekzekutohen. për secilin grup veç e veç.

Shqyrtoni një shembull me tabelën e mësimeve:

Shembull:

E rëndësishme: Kështu, si rezultat i përdorimit të GROUP BY, të gjitha rreshtat dalëse të pyetjes ndahen në grupe të karakterizuara nga të njëjtat kombinime vlerash në këto kolona (d.m.th., funksionet agregate kryhen për secilin grup veç e veç).

Duhet të kihet parasysh se kur grupohen nga një fushë që përmban vlera NULL, të gjitha regjistrimet e tilla do të bien në një grup.

Për lloje të ndryshme printerësh, përcaktoni ato kosto mesatare dhe sasinë (d.m.th., veçmas për lazerin, bojën dhe matricën). Përdorni funksionet agregate. Rezultati duhet të duket si ky:

Duke pasur deklaratë SQL

Klauzola HAVING në SQL nevojitet për të vërtetuar vlerat, të cilat fitohen duke përdorur funksionin agregat pas grupimit(pas përdorimit GROUP BY). Një kontroll i tillë nuk mund të përfshihet në një klauzolë WHERE.

Shembull: Dyqan kompjuterësh DB... Llogaritni çmimin mesatar të kompjuterëve me të njëjtën shpejtësi procesori. Llogaritni vetëm për ato grupe çmimi mesatar i të cilëve është më pak se 30,000.



  • Funksionet agregate përdoren si emrat e fushave në deklaratën SELECT, me një përjashtim: ata marrin emrin e fushës si argument. Me funksione SHUMË dhe AVG mund të përdoret vetëm fusha numerike... Me funksione COUNT, MAX dhe MIN mund të përdoren si fushat numerike ashtu edhe ato të karaktereve. Kur përdoret me fushat e karaktereve MAX dhe MIN do t'i përkthejë ato në ekuivalentin ASCII dhe do t'i përpunojë ato sipas rendit alfabetik... Disa DBMS lejojnë përdorimin e agregateve të mbivendosur, por ky është një devijim nga standardi ANSI me të gjitha pasojat që pasojnë.


Për shembull, mund të llogarisni numrin e studentëve që kanë kaluar provimet në secilën disiplinë. Për ta bërë këtë, duhet të ekzekutoni një pyetje të grupuar sipas fushës "Disiplina" dhe të shfaqni si rezultat emrin e disiplinës dhe numrin e rreshtave në grup për këtë disiplinë. Përdorimi i karakterit * si argument për funksionin COUNT do të thotë që të gjitha rreshtat në grup janë të numëruara.

ZGJIDH R1. Disiplinë, COUNT (*)

GRUP NGA R1 Disiplina;

Rezultati:


SELECT R1 Disiplinë, COUNT (*)

KU R1. NUK ËSHTË rezultati NULL

GRUP NGA R1 Disiplina;

Rezultati:


nuk do të përfshihet në grupin e tupave përpara grupimit, kështu që numri i tupave në grup për disiplinën "Teoria e Informacionit" do të jetë 1 më pak.

Një rezultat i ngjashëm mund të merret nëse e shkruani kërkesën në mënyrën e mëposhtme:

ZGJIDH R1. Disiplinë, COUNT (R1. Vlerësim)

GRUPI NGA R1. Disipline;

Funksioni COUNT (EMRI ATRIBUTE) numëron numrin e vlerave të përcaktuara në një grup, në krahasim me një funksion COUNT (*), i cili numëron numrin e rreshtave në grup. Në të vërtetë, në grupin me disiplinën "Teoria e informacionit" do të ketë 4 rreshta, por vetëm 3 vlera specifike të atributit "Vlerësimi".


Rregullat për trajtimin e vlerave null në funksionet agregate

Nëse ndonjë vlerë në kolonë është e barabartë I PAVLEFSHËM ato përjashtohen gjatë llogaritjes së rezultatit të funksionit.

Nëse të gjitha vlerat në një kolonë janë të barabarta I PAVLEFSHËM, pastaj Shuma maksimale minimale mesatare = NULL, numërim = 0 (zero).

Nëse tabela është bosh, numërimi (*) = 0 .

Funksionet agregate mund të përdoren edhe pa operacionin paraprak të grupimit, në këtë rast e gjithë relacioni konsiderohet si një grup dhe për këtë grup mund të llogaritet një vlerë për grup.

Rregulla për interpretimin e funksioneve agregate

Funksionet agregate mund të përfshihen në listën e daljes dhe më pas ato aplikohen në të gjithë tabelën.

SELECT MAX (Rezultati) nga R1 do të japë vlerësimin maksimal në seancë;

ZGJIDH SHUMEN nga R1 do të japë shumën e të gjitha vlerësimeve për sesion;

ZGJIDHNI AVG (Rezultati) nga R1 do të japë një rezultat mesatar për të gjithë seancën.


2; Rezultati: "width = 640"

Duke iu referuar sërish bazës së të dhënave Session (tabelat R1), do të gjejmë numrin e provimeve të mbartura me sukses:

ZGJIDH NUMRIN (*) Si Me qira _ provimet

KU Klasa 2;

Rezultati:


Argumenti i funksioneve agregate mund të jetë kolona të veçanta tabelash. Për të llogaritur, për shembull, numrin e vlerave të dallueshme të një kolone të caktuar në një grup, është e nevojshme të përdorni fjalën kyçe DISTINCT së bashku me emrin e kolonës. Le të llogarisim numrin e notave të ndryshme të marra për secilën disiplinë:

ZGJIDH Disiplinë R1, COUNT (Vlerësim DISTINCT R1)

KU R1. NUK ËSHTË rezultati NULL

GRUP NGA R1 Disiplina;

Rezultati:


I njëjti rezultat arrihet nëse përjashtoni kushtin eksplicit në pjesën WHERE, në të cilin rast pyetja do të duket kështu:

ZGJIDH R1. Disiplinë, COUNT (DISTINCT R1. Vlerësim)

GRUPI NGA R1. Disipline;

Funksioni COUNT (DISTINCT R1. Vlerësim) konsideron vetëm të sigurt të ndryshme vlerat.

Për të marrë rezultatin e dëshiruar në këtë rast, është e nevojshme të bëhet një transformim paraprak i llojit të të dhënave të kolonës "Score", duke e sjellë atë në një lloj real, atëherë rezultati i llogaritjes së mesatares nuk do të jetë një numër i plotë. Në këtë rast, kërkesa do të duket si kjo:


2 Grupi sipas R2. Grupi, R1. Disipline; Këtu, funksioni CAST () konverton kolonën "Score" në një lloj të vlefshëm të dhënash. "gjerësia = 640"

Zgjidhni R2.Group, R1.Discipline, Numëroni (*) si Total, AVG (cast (Rezultati si dhjetor (3,1))) si Pika_mesatare

Nga R1, R2

ku R1. Emri i plotë = R2. Emri dhe R1. rezultati nuk është nul

dhe R1. Klasa 2

Grupi sipas R2. Grupi, R1. Disipline;

Këtu funksioni CAST () konverton kolonën Score në një lloj të vlefshëm të dhënash.


Ju nuk mund të përdorni funksione agregate në klauzolën WHERE sepse kushtet në këtë seksion vlerësohen në terma të një rreshti të vetëm, dhe funksionet e përgjithshme vlerësohen në terma të grupeve të rreshtave.

Klauzola GROUP BY ju lejon të përcaktoni një nëngrup vlerash në një fushë të caktuar në terma të një fushe tjetër dhe të aplikoni një funksion agregat në nëngrup. Kjo bën të mundur kombinimin e fushave dhe funksioneve të përmbledhura në një klauzolë të vetme SELECT. Funksionet agregate mund të përdoren si në shprehjen për nxjerrjen e rezultateve të rreshtit SELECT, ashtu edhe në shprehjen për përpunimin e grupeve të krijuara HAVING. Në këtë rast, çdo funksion agregat llogaritet për çdo grup të përzgjedhur. Vlerat e marra gjatë llogaritjes së funksioneve agregate mund të përdoren për të shfaqur rezultatet përkatëse ose për gjendjen e përzgjedhjes së grupeve.

Le të ndërtojmë një pyetje që shfaq grupet në të cilat janë marrë më shumë se një deuce në një disiplinë në provime:


një; Rezultati: "width = 640"

ZGJIDH R2. Grupi

NGA R1, R2

KU R1. Emri i plotë = R2. Emri DHE

Rezultati R1 = 2

GRUPI NGA R2.Grupi,R1.Disiplina

Duke numëruar (*) 1;

Rezultati:


Ne kemi një DB "Bankë", e përbërë nga një tabelë F, e cila ruan relacionin F, që përmban informacione për llogaritë në degët e një banke të caktuar:

Gjeni gjendjen totale të llogarisë në degë. Është e mundur të bëhet një pyetje e veçantë për secilën prej tyre duke zgjedhur SUM (Remaining) nga tabela për secilën degë, por operacioni grupimi GRUPI BY do t'i vendosë të gjitha në një komandë:

ZGJIDH Dega , SUM ( Pjesa e mbetur )

GRUPI SIPAS Degës;

GRUP NGA zbaton funksionet agregate në mënyrë të pavarur për çdo grup të identifikuar nga vlera e fushës Degë. Grupi përbëhet nga linja me vlerë të njëjtë të fushës Dega, dhe funksioni SHUMË zbatohet veçmas për secilin grup të tillë, pra gjendja totale e llogarisë llogaritet veçmas për secilën degë. Vlera e fushës në të cilën zbatohet GRUP NGA, ka, sipas përkufizimit, vetëm një vlerë për grupin e daljes, ashtu si rezultati i një funksioni agregat.


5000; Argumentet në klauzolën HAVING ndjekin të njëjtat rregulla si në klauzolën SELECT, e cila përdor GROUP BY. Ata duhet të kenë një vlerë për grupin e daljes. "gjerësia = 640"

Le të supozojmë se ju zgjidhni vetëm ato degë, vlerat totale të gjendjeve të llogarive të të cilave tejkalojnë 5000 dollarë, si dhe gjendjet totale për degët e zgjedhura. Për të shfaqur degët me gjendje totale mbi 5000 dollarë, duhet të përdorni klauzolën HAVING. Klauzola HAVING përcakton kriteret e përdorura për të hequr grupe specifike nga dalja, ashtu siç bën klauzola WHERE për rreshtat individualë.

Komanda e saktë do të ishte si më poshtë:

SELECT Degë, SUM (Balanca)

GRUP NGA Dega

duke pasur shumën ( Pjesa e mbetur ) 5 000;

Argumentet në një fjali DUKE respektoni të njëjtat rregulla si në fjali ZGJIDH ku përdoret GRUP NGA... Ata duhet të kenë një vlerë për grupin e daljes.


Komanda e mëposhtme do të ndalohet:

SELECT Degë, SUM (Balanca)

GRUPI SIPAS Degës

HAVING Data e hapjes = 27/12/2004 ;

Fusha Data e hapjes nuk mund të përdoret në një fjali DUKE sepse mund të ketë më shumë se një vlerë për grupin e shfaqjes. Për të shmangur një situatë të tillë, propozimi DUKE duhet t'i referohet vetëm agregateve dhe fushave të zgjedhura GRUP NGA... Ekziston një mënyrë e saktë për të bërë pyetjen e mësipërme:

SELECT Degë, SUM (Balanca)

WHERE Data e hapjes = '27/12/2004'

GRUPI SIPAS Degës;


Kuptimi i këtij pyetësori është si më poshtë: gjeni shumën e gjendjeve për çdo degë të llogarive të hapura më 27 dhjetor 2004.

Siç u tha më herët, HAVING mund të përdorë vetëm argumente që kanë të njëjtën vlerë për grupin e daljes. Në praktikë, referencat për funksionet agregate janë më të përgjithshmet, por fushat e zgjedhura me GROUP BY janë gjithashtu të vlefshme. Për shembull, ne duam të shohim gjendjen totale të llogarive të degëve në Shën Petersburg, Pskov dhe Uryupinsk:

SELECT Degë, SUM (Balanca)

NGA F, Q

KU F. Dega = Q. Dega

GRUPI SIPAS Degës

KANË Degë NË (‘Shën Petersburg’, ‘Pskov’, ‘Uryupinsk’);

100,000; Nëse bilanci total është më shumë se 100,000 dollarë, atëherë do ta shohim në raportin që rezulton, përndryshe do të marrim një raport bosh. "gjerësia = 640"

Prandaj, në shprehjet aritmetike të kallëzuesve të përfshirë në kushtin e përzgjedhjes së klauzolës HAVING, mund të përdorni drejtpërdrejt vetëm specifikimet e kolonave të specifikuara si kolona grupimi në klauzolën GROUP BY. Pjesa tjetër e kolonave mund të specifikohet vetëm brenda specifikimeve të funksioneve të përgjithshme COUNT, SUM, AVG, MIN dhe MAX, të cilat llogariten në në këtë rast disa vlerë agregate për të gjithë grupin e linjave. Rezultati i ekzekutimit të klauzolës HAVING është një tabelë e grupuar që përmban vetëm ato grupe rreshtash për të cilat rezultati i vlerësimit të kushtit të përzgjedhjes në pjesën HAVING është TRUE. Në veçanti, nëse klauzola HAVING është e pranishme në një pyetje që nuk përmban GROUP BY, atëherë rezultati i ekzekutimit të tij do të jetë ose një tabelë bosh, ose rezultat i ekzekutimit të seksioneve të mëparshme. shprehje tabele konsiderohet si një grup pa kolona grupimi. Le të shohim një shembull. Le të themi se duam të nxjerrim shuma totale bilancet për të gjitha degët, por vetëm nëse është më shumë se 100,000 dollarë. Në këtë rast, kërkesa jonë nuk do të përmbajë operacione grupimi, por do të përmbajë një seksion HAVING dhe do të duket kështu:

ZGJIDH SHUMEN ( Pjesa e mbetur )

duke pasur shumën ( Pjesa e mbetur ) 100 000;

Nëse bilanci total është më shumë se 100,000 dollarë, atëherë do ta shohim në raportin që rezulton, përndryshe do të marrim një raport bosh.


Standardi ISO përcakton pesë të mëposhtmet funksionet e grumbullimit:

COUNT- kthen numrin e vlerave në kolonën e specifikuar;

SHUMË- kthen shumën e vlerave në kolonën e specifikuar;

AVG- kthen vlerën mesatare në kolonën e specifikuar;

MIN- kthen vlerën minimale në kolonën e specifikuar;

MAX- kthen vlerën maksimale në kolonën e specifikuar.

Të gjitha këto funksione funksionojnë në vlerat në një kolonë të vetme të tabelës dhe kthejnë një vlerë të vetme. Funksionet COUNT, MIN dhe MAX zbatohen si për fushat numerike ashtu edhe për ato jo numerike, ndërsa funksionet SUM dhe AVG mund të përdoren vetëm në rastin e fushave numerike. Me përjashtim të COUNT (*), kur vlerësohen rezultatet e çdo funksioni, të gjitha vlerat null përjashtohen fillimisht, pas së cilës operacioni i kërkuar zbatohet vetëm për vlerat e mbetura të kolonës jo-nul. Opsioni COUNT (*) është rast i veçantë duke përdorur funksionin COUNT - qëllimi i tij është të numërojë të gjitha rreshtat në tabelë, pavarësisht nëse përmban vlera boshe, dublikate apo ndonjë vlerë tjetër. Nëse dëshironi të eliminoni vlerat e dyfishta përpara se të përdorni funksionin agregat, vendosni fjalën kyçe DISTINCT përpara emrit të kolonës në përkufizimin e funksionit. Standardi ISO lejon përdorimin e fjalës kyçe ALL për të treguar në mënyrë eksplicite se eliminimi i vlerave të kopjuara nuk kërkohet, megjithëse kjo fjalë kyçe supozohet si parazgjedhje nëse nuk specifikohet asnjë kualifikues tjetër. Fjala kyçe DISTINCT është e pakuptimtë për funksionet MIN dhe MAX. Sidoqoftë, përdorimi i tij mund të ndikojë në rezultatet e ekzekutimit të funksioneve SUM dhe AVG, kështu që duhet të konsideroni paraprakisht nëse ai duhet të jetë i pranishëm në secilin rast specifik. Përveç kësaj, fjala kyçe DISTINCT mund të specifikohet maksimumi një herë në çdo kërkesë.

Duhet të theksohet se funksionet e përgjithshme mund të përdoren vetëm në një listë SELECT dhe në një klauzolë HAVING (shih seksionin 5.3.4). Në të gjitha rastet e tjera, përdorimi i këtyre funksioneve është i pavlefshëm. Nëse lista SELECT përmban një funksion grumbullimi dhe teksti i pyetjes nuk përmban një klauzolë GROUP BY që siguron grumbullimin e të dhënave në grupe, atëherë asnjë nga elementët e listës SELECT nuk mund të përfshijë asnjë referencë kolone, përveç nëse kjo kolonë përdoret si parametër i funksioni i grumbullimit. Për shembull, kërkesa e mëposhtme është e pavlefshme:

ZGJIDHstafi Jo,COUNT (paga)

NGAStafi;

Gabimi është se kjo kërkesë nuk përmban konstruksionin GRUP NGA, dhe qasja në kolonën e stafitAsnjë në listën SELECT kryhet pa përdorur funksionin agregat.

Shembulli 13. Përdorimi i funksionit COUNT (*).Përcaktoni se sa prona me qira kanë një normë qiraje mbi 350 £ në muaj,

ZGJIDH NUMRIN(*) numërimi AS

NGAPronë me Qira

KUqiraja> 350;

Klauzola WHERE kufizohet në numërimin e vetëm artikujve me qira që janë më shumë se 350 £ në muaj. Numri total i pronave të marra me qira që plotësohet kushtin e specifikuar, mund të përcaktohet duke përdorur funksionin agregat COUNT. Rezultatet e ekzekutimit të pyetjes janë paraqitur në tabelë. 23.

Tabela 23

numëroj

Shembulli 14. Duke përdorur funksionin COUNT (DISTINCT).Përcaktoni se sa prona të ndryshme me qira janë parë nga klientët në maj 2001.

ZGJIDH NUMRIN (DISINCTNr. pasurie) AS numërim

NGADuke parë

Përsëri, kufizimi i rezultateve të pyetjes në një analizë të vetëm atyre qirave që u panë në maj 2001 arrihet përmes përdorimit të një klauzole WHERE. Numri total i objekteve të ekzaminuara që plotësojnë kushtin e specifikuar mund të përcaktohet duke përdorur funksionin agregat COUNT. Sidoqoftë, duke qenë se i njëjti objekt mund të shihet nga klientë të ndryshëm disa herë, duhet të specifikoni fjalën kyçe DISTINCT në përkufizimin e funksionit për të përjashtuar vlerat e kopjuara nga llogaritja. Rezultatet e ekzekutimit të pyetjes janë paraqitur në tabelë. 24.

Tabela 24

Shembulli 16. Përdorimi i funksioneve MIN, MAXnAVG.Llogaritni vlerën e pagës minimale, maksimale dhe mesatare.

ZGJIDH MIN(paga) AS min, MAX(paga) AS maksimumi, AVG(paga) AS mesatare

NGAStafi;

Në këtë shembull, ju duhet të përpunoni informacione për të gjithë personelin e kompanisë, kështu që nuk keni nevojë të përdorni një klauzolë WHERE. Vlerat e kërkuara mund të llogariten duke përdorur funksionet MIN, MAX dhe AVG të aplikuara në kolonën e pagave të tabelës së Stafit. Rezultatet e ekzekutimit të pyetjes janë paraqitur në tabelë. 26.

Tabela 26.

Rezultati i pyetjes

min maksimumi mesatare
9000.00 30000.00 17000.00

Rezultatet e grupimit (klauzola GROUP BY). Shembujt e të dhënave përmbledhëse të mësipërme janë të ngjashëm me rreshtat përmbledhës që gjenden zakonisht në fund të raporteve. Në total, të gjitha të dhënat e detajuara të raportit janë të ngjeshura në një linjë përmbledhëse. Megjithatë, shumë shpesh kërkohet të formohen nëntotalet në raporte. Për këtë qëllim, një klauzolë GROUP BY mund të specifikohet në deklaratën SELECT. Një pyetje që përmban një klauzolë GROUP BY quhet pyetje grupimi pasi grupon të dhënat e marra si rezultat i operacionit SELECT, pas së cilës një i vetëm linjë përmbledhëse... Kolonat e renditura në klauzolën GROUP BY emërtohen kolona të grupuara. Standardi ISO kërkon që klauzolat SELECT dhe GROUP BY të jenë të lidhura ngushtë. Kur përdorni klauzolën GROUP BY në një deklaratë SELECT, çdo artikull i listës në listën SELECT duhet të ketë kuptimi i vetëm për të gjithë grupin. Për më tepër, një klauzolë SELECT mund të përfshijë vetëm llojet e mëposhtme të elementeve:

emrat e kolonave;

funksionet e grumbullimit;

Konstante;

Shprehje që përfshijnë kombinime të sa më sipër.

Të gjithë emrat e kolonave të listuara në listën SELECT duhet të shfaqen gjithashtu në klauzolën GROUP BY, përveç rastit kur emri i kolonës përdoret vetëm në funksionin agregues. E kundërta nuk është gjithmonë e vërtetë - klauzola GROUP BY mund të përmbajë emra kolonash që nuk janë në listën SELECT. Nëse klauzola WHERE përdoret në lidhje me klauzolën GROUP BY, atëherë ajo përpunohet së pari dhe grupohen vetëm ato rreshta që plotësojnë kushtin e kërkimit. Standardi ISO specifikon që kur kryhet grupimi, të gjitha vlerat që mungojnë trajtohen si të barabarta. Nëse dy rreshtat e tabelës në të njëjtën kolonë grupimi përmbajnë vlera null dhe vlera identike në të gjitha kolonat e tjera të grupuara jo bosh, ato vendosen në të njëjtin grup.

Shembulli 17. Përdorimi i klauzolës GROUP BY.Përcaktoni numrin e personelit që punon në secilin prej departamenteve të kompanisë, si dhe pagat totale të tyre.

ZGJIDHdega nr, COUNT(nr personeli) AS numëro, SHUMË(paga) AS shuma

NGAStafi

GRUP NGAdega Nr

URDHËR NGAdega nr;

Nuk është e nevojshme të përfshihen emrat e kolonave personeliNr dhe paga në klauzolën GROUP BY, pasi ato shfaqen vetëm në listën SELECT me funksione të përmbledhura. Në të njëjtën kohë, kolona e degës Jo në listën e klauzolës SELECT nuk shoqërohet me ndonjë funksion agregues dhe, për këtë arsye, duhet të specifikohet në klauzolën GROUP BY. Rezultatet e ekzekutimit të pyetjes janë paraqitur në tabelë. 27.

Tabela 27

Rezultati i pyetjes

dega Nr Numëroni Shuma
B003 54000.00
B005 39000.00
B007 9000.00

Konceptualisht, gjatë përpunimit të kësaj kërkese, ndërmerren hapat e mëposhtëm.

1. Rreshtat e tabelës së Stafit ndahen në grupe në përputhje me vlerat në numrin e kolonës së departamentit të kompanisë. Brenda secilit prej grupeve, ka të dhëna për të gjithë personelin e një prej departamenteve të kompanisë. Në shembullin tonë, do të krijohen tre grupe, siç tregohet në Fig. një.

2. Për secilin nga grupet, llogaritet numri total i rreshtave, i barabartë me numrin e punonjësve në departament, si dhe shuma e vlerave në kolonën e pagave, që është shuma e pagave të të gjithëve. punonjësit e departamentit që ne jemi të interesuar. Më pas krijohet një rresht i vetëm përmbledhës për të gjithë grupin e rreshtave burimor.

3. Rreshtat që rezultojnë të tabelës rezultuese janë renditur në rend rritës të numrit të degës të treguar në kolonën degaNo.

dega Nr stafi nr Paga
V00Z SG37 12000.00
V00Z SG14 18000.00
V00Z SG5 24000.00
B005 SL21 30000.00
B005 SL41 9000.00
B007 SA9 9000.00
COUNT (nr personeli) SUM (paga)
54000.00
39000.00
9000.00

Oriz. 1. Tre grupe regjistrimesh të krijuara gjatë ekzekutimit të një pyetësori

Standardi SQL lejon që pyetjet e nënshtruara të vendosen në listën SELECT. Prandaj, pyetja e mësipërme mund të përfaqësohet si më poshtë:

ZGJIDHDega Jo, (ZGJEDH COUNT (Nr. i stafit)AS numëroj

NGAStafi s

KUs.branchNo = b.branchNo),

(ZGJIDH SHUMËN (rrogën) AS sum

NGAStafi s

KUs.branchNo = b.branchNo)

NGADega b

URDHËR NGAdega nr;

Por në këtë version të pyetjes, për secilin prej departamenteve të kompanisë të përshkruar në tabelën e Degës, gjenerohen dy rezultate të llogaritjes së funksioneve të grumbullimit, prandaj, në disa raste, mund të shfaqen rreshta që përmbajnë vlera zero.

Kufizimet e grupimit (klauzola HAVING). Klauzola HAVING synohet të përdoret në lidhje me klauzolën GROUP BY për të specifikuar kufizimet e specifikuara për të zgjedhur ato grupe, i cili do të vendoset në tabelën e pyetësorit që rezulton. Megjithëse klauzolat HAVING dhe WHERE kanë sintaksë të ngjashme, qëllimi i tyre është i ndryshëm. Klauzola WHERE është krijuar për të zgjedhur rreshta individualë për të mbushur tabelën e pyetjeve që rezulton, ndërsa klauzola HAVING përdoret për të zgjedhur grupe, vendosur në tabelën e pyetjeve që rezulton. Standardi ISO kërkon që emrat e kolonave të përdorura në klauzolën HAVING të shfaqen në listën e artikujve GROUP BY ose të përdoren në funksionet e përgjithshme. Në praktikë, termat e kërkimit në një klauzolë HAVING përfshijnë gjithmonë të paktën një funksion agregat; përndryshe, këto kushte kërkimi duhet të vendosen në një klauzolë WHERE dhe të aplikohen për të zgjedhur rreshtat individualë. (Mos harroni se funksionet e përgjithshme nuk mund të përdoren në një klauzolë WHERE.) Klauzola HAVING nuk është një pjesë e nevojshme e gjuhës SQL - çdo pyetje e shkruar duke përdorur klauzolën HAVING mund të përfaqësohet ndryshe pa e përdorur atë.

Shembulli 18. Përdorimi i konstruksionit HAVING.Për çdo departament të kompanisë me më shumë se një staf, përcaktoni numrin e punonjësve dhe masën e pagave të tyre.

ZGJIDHdega nr, KONTI T (nr personeli) AS numëro, SHUMË(paga) AS shuma

NGAStafi

GRUP NGAdega Nr

DUKE NUMËRIM(Nr. Stafi)> 1

URDHËR NGAdega nr;

Ky shembull është i ngjashëm me atë të mëparshëm, por këtu përdoren kufizime shtesë, duke treguar se ne jemi të interesuar vetëm për informacione për ato departamente të kompanisë në të cilat punon më shumë se një person. Një kërkesë e ngjashme vendoset për grupet, kështu që klauzola HAVING duhet të përdoret në pyetje. Rezultatet e ekzekutimit të pyetjes janë paraqitur në tabelë. 28.

Tabela 28

dega Nuk ka shumë numërimi
V00Z 3 54000,00
B005 2 39000,00

Nënpyetje. Në këtë seksion, ne do të diskutojmë përdorimin e deklaratave të plota SELECT të ngulitura në trupin e një tjetri SELECT deklaratë. E jashtme deklarata (e dyta) SELECT përdor rezultatin e ekzekutimit e brendshme(i pari) operatori për të përcaktuar përmbajtjen e rezultatit përfundimtar të të gjithë operacionit. Pyetjet e brendshme mund të gjenden në klauzolat WHERE dhe HAVING të deklaratës së jashtme SELECT - në këtë rast, ato emërtohen nënpyetje, ose pyetjet e mbivendosura. Përveç kësaj, deklaratat e brendshme SELECT mund të përdoren në deklaratat INSERT, UPDATE dhe DELETE . Ekzistojnë tre lloje të nënpyetjeve.

Nënpyetje skalar kthen vlerën e zgjedhur nga kryqëzimi i një kolone me një rresht, d.m.th. kuptimi i vetëm. Në parim, një nënpyetje skalare mund të përdoret kudo ku kërkohet një vlerë e vetme. Shembuj të nënpyetjeve skalare janë paraqitur në Shembujt 13 dhe 14.

Nënpyetje e vargut kthen vlerat e disa kolonave të një tabele, por si një rresht i vetëm. Një nënpyetje e vargut mund të përdoret kudo ku përdoret një konstruktor i vlerës së vargut - zakonisht kallëzues. Një variant i nënpyetjes së vargut është paraqitur në shembullin 15.

Nënpyetje e tabelës kthen vlerat e një ose më shumë kolonave të një tabele të shpërndarë në më shumë se një rresht. Një nënpyetje e tabelës mund të përdoret kudo ku mund të specifikohet një tabelë, për shembull, si një operand i një kallëzuesi IN.

Shembulli 19. Përdorimi i një nënpyetjeje me kontroll për barazi. Make up një listë e personelit që punon në degën e kompanisë që ndodhet në 463 Main St1.

ZGJIDH

NGAStafi

KUNumri i degës = (ZGJIDHni degën nr

NGADega

KUrruga = "163 Main S t");

Një deklaratë e brendshme SELECT (SELECT dega No FROM Branch ...) përdoret për të përcaktuar numrin e degës së kompanisë që ndodhet në 163 Main St. (Ekziston vetëm një departament i tillë në një kompani, kështu që ky shembull është një shembull i një nënpyetjeje skalare.) Pasi të merret numri i dëshiruar i departamentit, ekzekutohet një nënpyetje e jashtme për të marrë detajet e punëtorëve në atë departament. Me fjale te tjera, operator i brendshëm SELECT kthen një tabelë me një vlerë të vetme "BOOV. Ky është numri i degës së kompanisë që ndodhet në 163 Main St1. Si rezultat, deklarata e jashtme SELECT bëhet si më poshtë:

ZGJIDHstafiNr, fEmri, INEmri, pozicioni

NGAStafi

KUdega No = "B0031;

Rezultatet e këtij pyetësori janë paraqitur në tabelë. 29.

Tabela 29

Rezultati i pyetjes

stafi nr fEmri INEmri pozicion
SG37 Ann Ahu Asistent
SG14 Davidi Ford Mbikëqyrësi
SG5 Susan Markë Menaxheri

Një subquery është një mjet për krijimin e një tabele të përkohshme, përmbajtja e së cilës merret dhe përpunohet nga një operator i jashtëm. Një nënpyetje mund të specifikohet menjëherë pas krahasimit të operatorëve (d.m.th. operatorët =,<, >, <=, >=, <>) në një klauzolë WHERE ose HAVING. Teksti i nënpyetjes duhet të vendoset në kllapa.

Shembulli 20. Përdorimi i nënpyetjeve me funksione agregate. Listoni të gjithë punonjësit me paga mbi mesataren, duke treguar se sa është paga e tyre më e lartë se paga mesatare për ndërmarrjen.

ZGJIDHstafiNr, fEmri, IName, pozicioni, paga - ( ZGJIDHNI AVG(paga) NGA Stafi) AS salDiff

NGAStafi

KUpaga> ( ZGJIDHNI AVG(paga) NGA S t a f f);

Duhet të theksohet se nuk mundet drejtpërdrejt përfshijnë në shprehje pyetëse"KU paga> AVG (paga)", që nga përdorimi i agregimit funksionet në klauzolën WHERE janë të ndaluara. Për të arritur rezultatin e dëshiruar, krijoni një nënpyetje që llogarit pagën mesatare vjetore dhe më pas përdorni atë në një deklaratë të jashtme SELECT për të marrë informacion për ata punonjës në kompani, pagat e të cilëve janë më të larta se kjo mesatare. Me fjalë të tjera, nënpyetja kthen vlerën paga mesatare për kompaninë në vit, e barabartë me 17,000 £.

Rezultati i këtij nënpyetje skalare përdoret në një deklaratë të jashtme SELECT për të llogaritur variancën e pagave nga mesatarja dhe për të zgjedhur informacionin e punonjësve. Prandaj, deklarata e jashtme SELECT bëhet:

ZGJIDHpersoneli nr, emri, emri, pozicioni, paga - 17000 Si salDiff

NGAStafi

KUpaga> 17000;

Rezultatet e ekzekutimit të pyetjes janë paraqitur në tabelë. tridhjetë.

Tabela 30.

Rezultati i pyetjes

stafi nr fEmri INEmri pozicion salDiff
SL21 Gjoni E bardha Menaxheri 13000.00
SG14 Davidi Ford Mbikëqyrësi 1000.00
SG5 Susan Markë Menaxheri 7000.00

Aplikoni për nënpyetjet duke ndjekur rregullat dhe kufizimet.

1. Klauzola ORDER BY nuk duhet të përdoret në nënpyetje, megjithëse mund të shfaqet në deklaratën e jashtme SELECT.

2. Lista SELECT e një nënpyetjeje duhet të përbëhet nga emrat e kolonave individuale ose shprehjeve të përbëra prej tyre, përveç rasteve kur fjala kyçe EXISTS përdoret në nënpyetje.

3. Si parazgjedhje, emrat e kolonave në një nënpyetje i referohen tabelës së emërtuar në klauzolën FROM të nënpyetjes. Megjithatë, mund t'i referoheni gjithashtu kolonave të tabelës të specifikuara në klauzolën FROM të pyetjes së jashtme duke përdorur emrat e kolonave të kualifikuara (siç përshkruhet më poshtë).

4. Nëse nënpyetja është një nga dy operandët e përfshirë në operacionin e krahasimit, atëherë nënpyetja duhet të specifikohet në anën e djathtë të këtij operacioni. Për shembull, shembulli i mëposhtëm i shkrimit të një pyetësori nga shembulli i mëparshëm është i pasaktë sepse nënpyetja vendoset në anën e majtë të operacionit të krahasimit me vlerën e kolonës së pagës.

ZGJIDH

NGAStafi

KU(ZGJIDH AVG (paga) NGA Stafi)< salary;

Shembulli 21... Nënpyetjet e mbivendosura dhe përdorimi i kallëzuesit IN. Bëni një listë të pronave me qira për të cilat punonjësit janë përgjegjës në zyrën e degës që ndodhet në 163 Main st1.

ZGJIDHproneNr, rruge, qytet, kod postar, tip, dhoma, qera

NGAPronë me Qira

Kapitulli 5... Gjuha SQL: Manipulimi i të dhënave 189

KUstafi Jo IN (ZGJIDHni personelin nr

NGAStafi

KUbrancliNo = (ZGJIDH degën nr

NGADega

KUrruga = "163 Main S t"));

Pyetja e parë, më e brendshme, synon të përcaktojë numrin e degës së kompanisë që ndodhet në 463 Main St ". Pyetja e dytë, e ndërmjetme merr informacion për personelin që punon në këtë departament. Në këtë rast, më shumë se një rresht i të dhënave është i zgjedhur dhe për këtë arsye në pyetjen e jashtme Nuk mund të përdorni operatorin e krahasimit =. Në vend të kësaj duhet të përdorni fjalën kyçe IN. Kërkesa e jashtme merr informacion në lidhje me qiratë për të cilat janë përgjegjës punonjësit e kompanisë, të dhënat për të cilat janë marrë si rezultat të pyetjes së ndërmjetme. Rezultatet e pyetjes janë paraqitur në tabelën 31.

Tabela 31

Rezultati i pyetjes

pasuria nr rrugë qytet kodin postar lloji dhomat qira
PG16 5 Novar Dr Glasgow G129AX E sheshtë
PG36 2 Manor Rd Glasgow G324QX E sheshtë
PG21 18 Dale Rd Glasgow G12 Shtëpia

Fjalë kyçe ANY dhe ALL. Fjalë kyçe ANY dhe ALL mund të përdoren me nënpyetje që kthejnë një kolonë të vetme numrash. Nëse nënpyetës paraprihet nga fjala kyçe ALL, kushti i krahasimit plotësohet vetëm nëse plotësohet për të gjitha vlerat në kolonën e rezultateve të nënpyetjes. Nëse teksti i nënpyetjes paraprihet nga fjala kyçe ANY, atëherë kushti i krahasimit do të konsiderohet i përmbushur nëse plotësohet për të paktën një (një ose disa) vlera në kolonën rezultuese të nënpyetjes. Nëse nënpyetja rezulton me një vlerë nule, atëherë kushti i krahasimit për fjalën kyçe ALL do të konsiderohet i përmbushur dhe për fjalën kyçe ANY, ai do të konsiderohet i paplotësuar. Sipas standardit ISO, mund të përdorni edhe fjalën kyçe SOME, e cila është sinonim për fjalën kyçe ANY.

Shembulli 22. Përdorimi i fjalëve kyçe ANY dhe SOME. Gjeni të gjithë punonjësit, paga e të cilëve e tejkalon të paktën pagën një punonjës i një dege të shoqërisë me numër “booz”.

ZGJIDHstafiNr, fEmri, INEmri, pozicioni, paga

NGAStafi

KUpaga> DISA (ZGJIDH rrogën

NGAStafi

KUdega No = "B003");

Megjithëse kjo pyetje mund të shkruhet duke përdorur një nënpyetje që përcakton pagën minimale të stafit të departamentit me numrin "BOOZ", pas së cilës pyetësori i jashtëm mund të zgjedhë informacione për të gjithë stafin e kompanisë, pagat e të cilëve e kalojnë këtë vlerë (shih Shembullin 20) , është e mundur një qasje tjetër, e cila konsiston në përdorimin e fjalëve kyçe SOME / ANY. Në këtë rast, nënpyetja e brendshme krijon një grup vlerash (12000, 18000, 24000), dhe pyetja e jashtme zgjedh informacione për ata punonjës, paga e të cilëve është më e madhe se çdo vlerë në këtë.

vendosur (në fakt më shumë se vlera minimale - 12000). Kjo metodë alternative mund të konsiderohet më e natyrshme sesa përcaktimi i pagës minimale në nënpyetje. Por në secilin rast, gjenerohen të njëjtat rezultate të pyetjes, të cilat janë paraqitur në tabelë. 32 .

Tabela 32

Rezultati i pyetjes

stafi nr fEmri INEmri pozicion paga
SL21 Gjoni E bardha Menaxheri 30000.00
SG14 Davidi Ford Mbikëqyrësi 18000.00
SG5 Susan Markë Menaxheri 24000.00

Shembulli 23. Duke përdorur fjalën kyçe ALL. Gjeni të gjithë punonjësit, pagat e të cilëve janë më të mëdha se pagat e çdo punonjësi në degën booz të kompanisë.

ZGJIDHstafiNr, fEmri, INarae, pozicioni, paga

NGAStafi

KUpaga> TE GJITHA(ZGJIDH rrogën

NGAStafi

KUdega No = "BOG3");

Në përgjithësi, kjo kërkesë është e ngjashme me atë të mëparshme. Dhe në këtë rast, mund të përdoret një nënpyetje që përcakton vlerën maksimale të pagës së stafit të departamentit nën numrin "WOOZ", dhe më pas, duke përdorur një pyetje të jashtme, të zgjidhni informacione për të gjithë punonjësit e kompanisë, pagat e të cilëve tejkalojnë këtë vlerë. Megjithatë, në ky shembull u zgjodh një qasje duke përdorur fjalën kyçe ALL. Rezultatet e ekzekutimit të pyetjes janë paraqitur në tabelë. 33 .

Tabela 33

Rezultati i pyetjes

stafi nr INEmri fEmri pozicion paga
SL21 E bardha Gjoni Menaxheri 30000,00

Pyetje me shumë tabela. Të gjithë shembujt e mësipërm kanë të njëjtin kufizim të rëndësishëm: kolonat e vendosura në tabelën që rezulton zgjidhen gjithmonë nga një tabelë e vetme. Megjithatë, në shumë raste kjo nuk mjafton. Për të kombinuar kolona nga disa tabela burimore në tabelën që rezulton, duhet të kryeni operacionin lidhjet. Në SQL, një operacion bashkimi përdoret për të kombinuar informacionin nga dy tabela duke formuar çifte rreshtash të lidhur të zgjedhur nga secila tabelë. Çiftet e rreshtave të vendosura në tabelën e kombinuar përpilohen sipas barazisë së vlerave të kolonave të specifikuara të përfshira në to.

Nëse keni nevojë të merrni informacion nga disa tabela, mund të aplikoni një nënpyetje ose të kryeni një bashkim midis tabelave. Nëse tabela e pyetjeve që rezulton duhet të përmbajë kolona nga tabela të ndryshme burimore, atëherë këshillohet të përdorni mekanizmin e bashkimit të tabelës. Për të kryer një bashkim, mjafton të specifikoni emrat e dy ose më shumë tabelave në klauzolën FROM, duke i ndarë ato me presje, dhe më pas të përfshini në pyetje klauzolën WHERE që përcakton kolonat që përdoren për bashkimin e tabelave të specifikuara. Përveç kësaj, në vend të emrave të tabelave, mund të përdorni pseudonimet, u caktohet atyre në klauzolën FROM. Në këtë rast, emrat e tabelave dhe pseudonimet që u janë caktuar duhet të ndahen me hapësira. Pseudonimet mund të përdoren për të cilësuar emrat e kolonave sa herë që ka paqartësi se cilës tabelë i përket një kolonë e caktuar. Përveç kësaj, pseudonimet mund të përdoren për të shkurtuar emrat e tabelave. Nëse një pseudonim përcaktohet për një tabelë, ai mund të përdoret kudo që kërkon emrin e asaj tabele.

Shembulli 24. Lidhje e thjeshtë. Rendisni emrat e të gjithë klientëve që kanë parë të paktën një pronë me qira dhe kanë dhënë komente për të.

ZGJIDHc.ClientNo, fEmri, IName, pronaNo, koment

NGAKlienti c, Shikimi v

KUc.No Client = v.KlientNo;

Ky raport kërkon informacion si nga tabela e klientit ashtu edhe nga tabela e shikimit, kështu që ne do të përdorim mekanizmin e bashkimit të tabelës kur ndërtojmë pyetjen. Klauzola SELECT liston të gjitha kolonat që duhet të vendosen në tabelën e pyetjeve që rezulton. Vini re se kolona e numrit të klientit (klientNo) ka nevojë për një përmirësim, pasi një kolonë e tillë mund të jetë gjithashtu e pranishme në një tabelë tjetër që merr pjesë në bashkim. Prandaj, është e nevojshme të tregojmë në mënyrë eksplicite se cilat vlera të tabelës na interesojnë. (Në këtë shembull, po aq mirë mund të kishit zgjedhur vlerat për kolonën klientNo nga tabela e shikimit). Emri specifikohet duke prefiksuar emrin e kolonës me emrin e tabelës përkatëse (ose pseudonimin e saj). Në shembullin tonë, përdoret vlera "c", e specifikuar si një pseudonim për tabelën Klient. Për të formuar rreshtat që rezultojnë, përdoren ato rreshta të tabelave burimore që kanë një vlerë identike në kolonën klientNo. Ky kusht përcaktohet duke vendosur kushtin e kërkimit me.clientNo = v.clientNo. Kolona të ngjashme në tabelat origjinale quhen kolona të përputhshme. Operacioni i përshkruar është i barabartë me operacionin barazia bashkohet algjebër relacionale. Rezultatet e ekzekutimit të pyetjes janë paraqitur në tabelë. 34.

Tabela 34

Rezultati i pyetjes

klienti nr fEmri INEmri pasuria nr koment
CR56 Aline Stewart PG36
CR56 Aline Stewart PA14 shumë e vogël
CR56 Aline Stewart PG4
CR62 Maria Tregear PA14 nuk ka dhomë ngrënie
CR76 Gjoni Kay PG4 shumë i largët

Më shpesh, pyetjet me shumë tabela kryhen në dy tabela të lidhura nga një marrëdhënie një me shumë (1: *) ose prind-fëmijë. Në shembullin e mësipërm, i cili përfshin aksesin në tabelat Klienti dhe Shikimi, këto të fundit janë të lidhura pikërisht nga një marrëdhënie e tillë. Çdo rresht në tabelën Shikim (fëmijë) lidhet vetëm me një rresht në tabelën Klienti (prindi), ndërsa i njëjti rresht në tabelën Klienti (prindi) mund të lidhet.

me shumë rreshta të tabelës Shikim (fëmijë). Çiftet e rreshtave që krijohen kur pyetja ekzekutohet janë rezultat i të gjitha kombinimeve të vlefshme të rreshtave në tabelat fëmijë dhe prind. Seksioni 3.2.5 ka detajuar se si në bazë relacionale të dhënat, çelësat primar dhe të huaj të tabelave krijojnë një marrëdhënie "prind-fëmijë". Tabela që përmban çelësin e huaj është zakonisht një fëmijë, ndërsa tabela që përmban çelësin kryesor do të jetë gjithmonë prindi. Për të përdorur një marrëdhënie prind-fëmijë në një pyetje SQL, duhet të specifikoni një kusht kërkimi në të cilin do të krahasohen çelësat e huaj dhe kryesorë. Shembulli 24 krahason çelësin primar të tabelës Klienti (me. KlientNo) me çelësin e huaj të tabelës Shikuese (v. KlientNo).

Standardi SQL ofron gjithashtu mënyrat e mëposhtme përkufizimet e një përbërjeje të caktuar:

NGAKlient me BASHKOHU Shikimi v AKTIV c.Nr i klientit = v.Nr i klientit

NGAKlienti J OIN Duke parë PËRDORIMI klienti nr

NGAKlienti BASHKIMI NATYROR Duke parë

Në secilin rast, klauzola FROM zëvendëson klauzolat origjinale FROM dhe WHERE. Megjithatë, opsioni i parë krijon një tabelë me dy kolona identike klient No, ndërsa në dy rastet e tjera tabela që rezulton do të përmbajë vetëm një kolonë klientNo.

Shembulli 25. Renditja e rezultateve të bashkimit të tabelave. Për çdo degë të kompanisë, listoni numrat e personelit dhe emrat e punonjësve që janë në krye të çdo objekti të dhënë me qira, si dhe tregoni objektet për

të cilave ata përgjigjen.

ZGJIDHs.degaNo, s.staffNo, fEmri, IName, pasuriaNr

NGAStafi s, PronëPër Qira f

KUs.staffNo = p.staffNo

URDHËR NGAs.DegaNr, s.staffNr, pasuria nr;

Për t'i bërë rezultatet më të lehta për t'u lexuar, rezultati renditet duke përdorur numrin e departamentit si çelës kryesor të renditjes dhe numrin e personelit dhe numrin e pronës si çelësa të vegjël. Rezultatet e ekzekutimit të pyetjes janë paraqitur në tabelë. 35.

Tabela 35

Rezultati i pyetjes

dega Nr Stafi Nr fEmri INEmri pasuria nr
KUSH SG14 Davidi Ford PG16
KUSH SG37 Ann Ahu PG21
KUSH SG37 Ann Ahu PG36
BOO5 SL41 Maria Lee PL94
SBI7 SA9 Julie Howe PA14

Shembulli 26. Një bashkim i tre tabelave. Për çdo degë të shoqërisë, listoni numrat e personelit dhe emrat e punonjësve përgjegjës për çdo objekt të dhënë me qira, duke treguar qytetin në të cilin ndodhet dega dhe numrat e objekteve për të cilat është përgjegjës secili punonjës.

ZGJIDH b.degaNr, b.qytet, s.staffNr, fEmri, IName, nr. pasurie

NGA Dega b, Stafi s, PronaMe Qira fq

KU b.branchNo = s.branchNo DHE s.staffNo = p.staffNo

URDHËR NGA b.Nr. i degës, s.Nr. i personelit, nr.

Kolonat nga tre tabelat burimore - Branch, Staff dhe PropertyForRent - duhet të vendosen në tabelën që rezulton, kështu që ju duhet t'i bashkoni këto tabela në pyetjen tuaj. Tabelat e Degës dhe Stafit mund të lidhen duke përdorur klauzolën b.branchNo = * s .branchNo, e cila do të lidhë degët e kompanisë me personelin që punon në to. Tabelat Staff dhe PropertyFor Rent mund të lidhen duke përdorur kushtin s.staffNo = p.staffNo. Si rezultat, çdo punonjës do të shoqërohet me pronat me qira për të cilat ai është përgjegjës. Rezultatet e ekzekutimit të pyetjes janë paraqitur në tabelë. 36.

Tabela 36

Rezultatet e pyetjes

dega Nr qytet stafiMo fEmri INEmri pasuria nr
B003 Glasgow SG14 Davidi Ford PG16
B003 Glasgow SG37 Ann Ahu PG21
B003 Glasgow SG37 Ann Ahu PG36
B005 Londra SL41 Julie Lee PL94
B007 Aberdeen SA9 Maria Howe PA14

Vini re se standardi SQL ju lejon të përdorni Opsioni alternativ formulimet e klauzolave ​​FROM dhe WHERE:

NGA(Dega b BASHKOHU STAFI SHFRYTËZIM Nr dega) AS bs

BASHKOHUPronaMe Qira f PËRDORIMI stafi nr

Shembulli 27. Grupimi sipas kolonave të shumta. Përcaktoni numrin e pronave me qira për të cilat çdo punonjës është përgjegjës.

ZGJIDHs.dega nr, S.staffNo, COUNT(*) AS numëroj

NGA Stafi s, PronaPër Qira f

KU S.staffNo = p.staffNo

GRUP NGAs.degaJo, s.stafNr

URDHËR NGAs.degaNo, s.staffNo;

Për të hartuar raportin e kërkuar, para së gjithash, duhet të zbuloni se cili nga punonjësit e kompanisë është përgjegjës për objektet e dhëna me qira. Kjo detyrë mund të zgjidhet duke bashkuar tabelat Staff dhe PropertyForrent nga kolona staffNo në klauzolat FROM / WHERE. Pastaj është e nevojshme të formohen grupe të përbëra nga numri i departamentit dhe numri i personelit të punonjësve të tij, për të cilët duhet të zbatohet klauzola GRUPI BY. Së fundi, tabela që rezulton duhet të renditet duke specifikuar një klauzolë ORDER BY. Rezultatet e ekzekutimit të pyetjes janë paraqitur në tabelë. 37.

Tabela 37

Rezultati i pyetjes

dega Nr stafi nr numëroj
V00Z SG14
V00Z SG37
B005 SL41
B007 SA9

Krijimi i lidhjeve. Një bashkim është një nëngrup i një kombinimi më të përgjithshëm të të dhënave nga dy tabela, të quajtura karteziane... Prodhimi kartezian i dy tabelave është një tabelë tjetër, e përbërë nga të gjitha çiftet e mundshme të rreshtave që përbëjnë të dyja tabelat. Seti i kolonave në tabelën që rezulton është të gjitha kolonat në tabelën e parë të ndjekura nga të gjitha kolonat në tabelën e dytë. Nëse futni një pyetje në dy tabela pa specifikuar një klauzolë WHERE, rezultati i ekzekutimit të pyetjes në mjedisin SQL do të jetë produkti kartezian i këtyre tabelave. Përveç kësaj, standardi ISO ofron format të veçantë Deklarata SELECT që llogarit produktin kartezian të dy tabelave:

SELECT (* j lista e kolonave]

NGA tabelaEmri KRYQ JOINCaNeulte2

Konsideroni përsëri një shembull në të cilin tabelat klienti dhe Shikimi janë bashkuar duke përdorur kolonën e përbashkët klient nr. Kur punoni me tabela, përmbajtja e të cilave është dhënë në tabelë. 3.6 dhe 3.8, prodhimi kartezian i këtyre tabelave do të jetë 20 rreshta (4 rreshta në tabelën Klienti x 5 rreshta në tabelën e shikimit = 20 rreshta). Kjo është e barabartë me lëshimin e pyetjes së përdorur në shembullin 5.24, por pa aplikuar klauzolën WHERE. Procedura për gjenerimin e një tabele që përmban rezultatet e bashkimit të dy tabelave duke përdorur deklaratën SELECT është si më poshtë.

1. Formohet një prodhim kartezian i tabelave të specifikuara në klauzolën FROM.

2. Nëse pyetja përmban një klauzolë WHERE, zbatoni kushtet e kërkimit për çdo rresht të tabelës së produktit kartezian dhe ruani vetëm ato rreshta në tabelë që plotësojnë kushtet e specifikuara. Në aspektin e algjebrës relacionale, ky operacion quhet kufizim Produkt kartezian.

3. Për çdo rresht të mbetur, përcaktohet vlera e secilit element të specifikuar në listën SELECT, si rezultat i së cilës formohet një rresht i veçantë i tabelës që rezulton.

4. Nëse klauzola SELECT DISTINCT është e pranishme në pyetjen origjinale, të gjitha rreshtat dublikatë hiqen nga tabela që rezulton.

5. Nëse pyetja që po ekzekutohet përmban një klauzolë ORDER BY,


Faqja © 2015-2019
Të gjitha të drejtat u përkasin autorëve të tyre. Kjo faqe nuk pretendon autorësinë, por ofron përdorim falas.
Data e krijimit të faqes: 07-08-2016

Nënseksionet e mëposhtme përshkruajnë klauzola të tjera SELECT që mund të përdoren në pyetje, si dhe funksione të përgjithshme dhe grupe deklaratash. Më lejoni t'ju kujtoj ky moment ne kemi mbuluar përdorimin e klauzolës WHERE dhe në këtë artikull do të shikojmë klauzolat GROUP BY, ORDER BY dhe HAVING dhe do të japim disa shembuj se si këto klauzola mund të përdoren në lidhje me funksionet e përgjithshme që mbështeten në Transact. -SQL.

GRUPI PËR klauzolë

Fjali GRUP NGA grupon grupin e rreshtave të zgjedhur për të marrë një grup rreshtash përmbledhës bazuar në vlerat e një ose më shumë kolonave ose shprehjeve. Një rast i thjeshtë përdorimi për klauzolën GROUP BY tregohet në shembullin e mëposhtëm:

PËRDORIMI SampleDb; ZGJIDH PUNËN NGA Punimet_Në GRUPI SIPAS Punës;

Në këtë shembull, pozicionet e punonjësve janë kampionuar dhe grupuar.

Në shembullin e mësipërm, klauzola GROUP BY krijon një grup të veçantë për të gjithë. vlerat e mundshme(duke përfshirë NULL) të kolonës Job.

Përdorimi i kolonave në klauzolën GROUP BY duhet të plotësojë disa kushte. Në veçanti, çdo kolonë në listën e përzgjedhur të pyetjes duhet të shfaqet gjithashtu në klauzolën GROUP BY. Kjo kërkesë nuk zbatohet për konstantat dhe kolonat që janë pjesë e një funksioni agregat. (Funksionet agregate diskutohen në nënseksionin tjetër.) Kjo ka kuptim sepse vetëm kolonave në klauzolën GROUP BY u garantohet një vlerë për grup.

Një tabelë mund të grupohet sipas çdo kombinimi të kolonave të saj. Shembulli i mëposhtëm tregon grupimin e rreshtave në tabelën Works_on nga dy kolona:

PËRDORIMI SampleDb; SELECT Numri i Projektit, Puna NGA Punimet_Në GRUPI SIPAS Numri i projektit, Punë;

Rezultati i kësaj pyetjeje:

Bazuar në rezultatet e pyetjes, mund të shihni se ka nëntë grupe me kombinime të ndryshme të numrit dhe titullit të projektit. Sekuenca e emrave të kolonave në klauzolën GROUP BY nuk duhet të jetë e njëjtë si në listën e kolonave SELECT.

Funksionet agregate

Funksionet agregate përdoren për të marrë vlerat e shumës. Të gjitha funksionet e përgjithshme mund të ndahen në kategoritë e mëposhtme:

    funksionet e zakonshme të agregatit;

    funksionet e agregatit statistikor;

    funksionet e përgjithshme të përcaktuara nga përdoruesi;

    funksionet e agregatit analitik.

Këtu do të shikojmë tre llojet e para të funksioneve agregate.

Funksionet e rregullta agregate

Transact-SQL mbështet gjashtë funksionet e mëposhtme agregate: MIN, MAX, SHUMË, AVG, COUNT, COUNT_BIG.

Të gjithë funksionet agregate kryejnë llogaritjet në një argument të vetëm, i cili mund të jetë ose një kolonë ose një shprehje. (Përjashtimi i vetëm është forma e dytë e dy funksioneve, COUNT dhe COUNT_BIG, përkatësisht COUNT (*) dhe COUNT_BIG (*), përkatësisht.) Çdo funksion agregat vlerësohet në një vlerë konstante që shfaqet në një kolonë të veçantë rezultati.

Funksionet e përmbledhura janë të specifikuara në listën e kolonave të një deklarate SELECT, e cila mund të përmbajë gjithashtu një klauzolë GROUP BY. Nëse deklarata SELECT nuk përfshin një klauzolë GROUP BY, dhe lista e kolonave të përzgjedhjes përmban të paktën një funksion agregat, atëherë ajo nuk duhet të përmbajë kolona të thjeshta (përveç kolonave të përdorura si argumente për funksionin agregat). Prandaj, kodi në shembullin e mëposhtëm është i pasaktë:

PËRDORIMI SampleDb; SELECT Mbiemri, MIN (Id) FROM Punonjës;

Këtu, kolona LastName e tabelës Employee nuk duhet të jetë në listën e kolonave të përzgjedhura sepse nuk është një argument për funksionin agregat. Nga ana tjetër, një listë e përzgjedhur e kolonave mund të përmbajë emra kolonash që nuk janë argumente për funksionin agregat nëse ato kolona përdoren si argumente për klauzolën GROUP BY.

Një argument i funksionit agregat mund të paraprihet nga një nga dy fjalë kyçe të mundshme:

TE GJITHA

Tregon që llogaritjet kryhen në të gjitha vlerat në kolonë. Ky është standardi.

TË DAKTUAR

Përcakton që vetëm vlerat unike të kolonës përdoren për llogaritjet.

Funksionet agregate MIN dhe MAX

Funksionet agregate MIN dhe MAX llogaritin respektivisht vlerat më të vogla dhe më të mëdha në një kolonë. Nëse pyetja përmban një klauzolë WHERE, funksionet MIN dhe MAX kthejnë vlerat më të vogla dhe më të mëdha të rreshtit që përputhen me kushtet e specifikuara. Shembulli i mëposhtëm tregon përdorimin e funksionit të agregatit MIN:

PËRDORIMI SampleDb; - Kthen 2581 SELECT MIN (Id) AS "Minimum Id value" FROM Employee;

Rezultati i dhënë në shembullin e mësipërm nuk është shumë informues. Për shembull, mbiemri i punonjësit që zotëron këtë numër nuk dihet. Por ju nuk mund ta merrni këtë mbiemër në mënyrën e zakonshme, sepse, siç u përmend më herët, nuk mund të specifikoni në mënyrë eksplicite kolonën Mbiemri. Për të marrë mbiemrin e këtij punonjësi së bashku me numrin më të ulët të personelit të punonjësit, përdoret një nënpyetje. Shembulli i mëposhtëm tregon përdorimin e një nënpyetjeje të tillë, ku nënpyetja përmban deklaratën SELECT nga shembulli i mëparshëm:

Rezultati i ekzekutimit të pyetjes:

Përdorimi i funksionit të agregatit MAX tregohet në shembullin e mëposhtëm:

Funksionet MIN dhe MAX gjithashtu mund të pranojnë vargje dhe data si argumente. Në rastin e një argumenti të vargut, vlerat krahasohen duke përdorur rendin aktual të renditjes. Për të gjitha argumentet e të dhënave të përkohshme të tipit datë, vlera më e vogël e kolonës do të jetë më e madhe datë e hershme, dhe më i fundit është më i madhi.

Fjala kyçe DISTINCT mund të përdoret me funksionet MIN dhe MAX. Të gjitha vlerat NULL hiqen nga kolonat e tyre të argumenteve përpara se të përdorni funksionet e përgjithshme MIN dhe MAX.

Funksioni agregat SUM

Agregat Funksioni SUM llogarit shumën totale të vlerave të kolonës. Argumenti për këtë funksion agregat duhet të jetë gjithmonë i një lloji të të dhënave numerike. Përdorimi i funksionit agregat SUM tregohet në shembullin e mëposhtëm:

PËRDORIMI SampleDb; SELECT SUM (Buxhet) "Buxheti total" NGA Projekti;

Ky shembull llogarit buxhetet totale për të gjitha projektet. Rezultati i ekzekutimit të pyetjes:

Në këtë shembull, funksioni i përgjithshëm grupon të gjitha vlerat e buxhetit të projektit dhe përcakton totalin e tyre. Për këtë arsye, pyetja përmban një funksion grupimi të nënkuptuar (si të gjitha pyetjet e ngjashme). Funksioni i grupimit të nënkuptuar nga shembulli i mësipërm mund të specifikohet në mënyrë eksplicite, siç tregohet në shembullin më poshtë:

PËRDORIMI SampleDb; ZGJIDH SHUMËN (Buxhet) "Buxheti total" NGA GRUP E PROJEKTIT NGA ();

Përdorimi i parametrit DISTINCT heq çdo vlerë të kopjuar në kolonë përpara se të aplikoni funksionin SUM. Po kështu, hiqni të gjitha vlerat NULL përpara se të aplikoni këtë funksion agregat.

Funksioni agregat AVG

Agregat Funksioni AVG kthen mesataren aritmetike të të gjitha vlerave në një kolonë. Argumenti për këtë funksion agregat duhet të jetë gjithmonë i një lloji të të dhënave numerike. Para përdorimit Funksionet AVG të gjitha vlerat NULL hiqen nga argumenti i tij.

Përdorimi i funksionit të agregatit AVG tregohet në shembullin e mëposhtëm:

PËRDORIMI SampleDb; - Kthen 133833 SELECT AVG (Buxhet) "Buxheti mesatar për një projekt" FROM Project;

Këtu llogaritet mesatarja vlera aritmetike buxhet për të gjitha buxhetet.

Përmbledh funksionet COUNT dhe COUNT_BIG

Agregat COUNT funksion ka dy forma të ndryshme:

COUNT (col_name) COUNT (*)

Forma e parë e funksionit numëron numrin e vlerave në kolonën col_name. Nëse pyetja përdor fjalën kyçe DISTINCT, të gjitha vlerat e dyfishta të kolonës hiqen përpara se të përdoret funksioni COUNT. Kjo formë e funksionit COUNT nuk merr parasysh vlerat NULL kur numëron numrin e vlerave të kolonës.

Përdorimi i formës së parë të funksionit agregat COUNT tregohet në shembullin e mëposhtëm:

PËRDORIMI SampleDb; ZGJIDH numrin e projektit, COUNT (Punë e dallueshme) "Punë në projekt" NGA Works_on GROUP BY Project Number;

Këtu llogaritet numri i pozicioneve të ndryshme për çdo projekt. Rezultati i kësaj pyetjeje:

Siç mund ta shihni nga pyetja në shembull, vlerat NULL nuk u morën parasysh nga funksioni COUNT. (Shuma e të gjitha vlerave në kolonën e punës është 7, jo 11 siç duhet të jetë.)

Forma e dytë e funksionit COUNT, d.m.th. funksioni COUNT (*) numëron numrin e rreshtave në një tabelë. Dhe nëse deklarata SELECT e pyetjes me funksionin COUNT (*) përmban një klauzolë WHERE me një kusht, funksioni kthen numrin e rreshtave që plotësojnë kushtin e specifikuar. Ndryshe nga versioni i parë i funksionit COUNT, forma e dytë nuk i injoron vlerat NULL sepse ky funksion funksionon në vargje, jo në kolona. Shembulli i mëposhtëm tregon përdorimin e funksionit COUNT (*):

PËRDORIMI SampleDb; SELECT Job AS "Lloji i punës", COUNT (*) "Nevojitet punëtorë" FROM Works_on GROUP BY Job;

Këtu llogaritet numri i postimeve në të gjitha projektet. Rezultati i ekzekutimit të pyetjes:

COUNT_BIG funksion i njëjti funksion si COUNT. Dallimi i vetëm midis të dyjave është në llojin e rezultatit që ata japin: COUNT_BIG kthen gjithmonë vlera BIGINT, ndërsa COUNT kthen vlera të dhënash INTEGER.

Funksionet e agregatit statistikor

Funksionet e mëposhtme përbëjnë grupin e funksioneve agregate statistikore:

VAR

Llogarit variancën statistikore të të gjitha vlerave në një kolonë ose shprehje.

VARP

Llogarit variancën statistikore të popullatës së të gjitha vlerave në një kolonë ose shprehje.

STDEV

Llogarit devijimin standard (i cili llogaritet si Rrenja katrore nga varianca përkatëse) e të gjitha vlerave të kolonës ose shprehjes.

STDEVP

Llogarit devijimin standard të mbledhjes së të gjitha vlerave në një kolonë ose shprehje.

Funksionet e përgjithshme të përcaktuara nga përdoruesi

Motori i bazës së të dhënave gjithashtu mbështet zbatimin e funksioneve të përcaktuara nga përdoruesi. Kjo aftësi i lejon përdoruesit të plotësojnë funksionet e përgjithshme të sistemit me funksione që ata mund t'i zbatojnë dhe instalojnë vetë. Këto funksione përfaqësojnë një klasë të veçantë funksionesh të përcaktuara nga përdoruesi dhe do të diskutohen në detaje më vonë.

Klauzola e PASJES

Në një fjali DUKE përcakton një kusht që zbatohet në një grup rreshtash. Kështu, kjo klauzolë ka të njëjtin kuptim për grupet e rreshtave si fjalia WHERE për përmbajtjen e tabelës përkatëse. Sintaksa për klauzolën HAVING është si më poshtë:

DUKE gjendje

Këtu parametri i kushtit paraqet një kusht dhe përmban funksione ose konstante agregate.

Përdorimi i klauzolës HAVING në lidhje me funksionin agregat COUNT (*) tregohet në shembullin e mëposhtëm:

PËRDORIMI SampleDb; - Kthen "p3" ZGJIDH numrin e projektit NGA Works_on GROUP BY ProjectNumber HAVING COUNT (*)

Në këtë shembull, sistemi përdor klauzolën GROUP BY për të grupuar të gjitha rreshtat sipas vlerave në kolonën Numri i projektit. Më pas numërohet numri i rreshtave në secilin grup dhe zgjidhen grupet që përmbajnë më pak se katër rreshta (tre ose më pak).

Klauzola HAVING mund të përdoret gjithashtu pa funksione agregate, siç tregohet në shembullin më poshtë:

PËRDORIMI SampleDb; - Do të kthejë "Konsulent" ZGJIDH Punë NGA Works_on GRUPI BY Job HAVING Job LIKE "К%";

Ky shembull grupon rreshtat e tabelës Works_on sipas titullit të punës dhe eliminon punët që nuk fillojnë me shkronjën "K".

Klauzola HAVING mund të përdoret gjithashtu pa klauzolën GROUP BY, megjithëse kjo nuk është praktikë e zakonshme. Në këtë rast, të gjitha rreshtat e tabelës kthehen në të njëjtin grup.

RENDI SIPAS klauzolës

Fjali URDHËR NGA përcakton rendin e renditjes së rreshtave në grupin e rezultateve të kthyera nga pyetja. Kjo klauzolë ka sintaksën e mëposhtme:

Rendi i renditjes është specifikuar në parametrin col_name. Col_number është një tregues alternativ i renditjes që identifikon kolonat në rendin në të cilin ato shfaqen në listën e përzgjedhjes së deklaratës SELECT (1 është kolona e parë, 2 është kolona e dytë, e kështu me radhë). Parametri ASC përcakton një rend rritës, dhe Parametri DESC- në rrjedhën e poshtme. Parazgjedhja është ASC.

Emrat e kolonave në klauzolën ORDER BY nuk duhet të jenë në listën e kolonave të zgjedhura. Por kjo nuk vlen për pyetjet si SELECT DISTINCT, pasi në pyetje të tilla, emrat e kolonave të specifikuara në klauzolën ORDER BY duhet të shfaqen gjithashtu në listën e kolonave të zgjedhura. Përveç kësaj, kjo klauzolë nuk mund të përmbajë emra kolonash nga tabelat që nuk janë të specifikuara në klauzolën FROM.

Siç mund ta shihni nga sintaksa e klauzolës ORDER BY, renditja e grupit të rezultateve mund të bëhet në kolona të shumta. Ky renditje tregohet në shembullin e mëposhtëm:

Ky shembull zgjedh numrat e departamenteve dhe mbiemrat dhe emrat e punonjësve për punonjësit, numri i personelit të të cilëve është më pak se 20,000, si dhe renditet sipas mbiemrit dhe emrit. Rezultati i kësaj pyetjeje:

Kolonat në klauzolën ORDER BY mund të specifikohen jo me emrat e tyre, por sipas renditjes në listën e përzgjedhjes. Prandaj, fjalia në shembullin e mësipërm mund të rishkruhet si më poshtë:

Të tillë mënyrë alternative përcaktimi i kolonave sipas pozicionit të tyre në vend të emrave përdoret nëse kriteri i renditjes përmban një funksion agregat. (Një mënyrë tjetër është përdorimi i emrave të kolonave, të cilët shfaqen më pas në klauzolën RENDI SIPAS.) Megjithatë, në klauzolën ORDER BY, rekomandohet që të specifikoni kolonat me emrat e tyre dhe jo me numra, për ta bërë më të lehtë përditësimin e pyetjes. nëse keni nevojë të shtoni ose hiqni kolona në listën e përzgjedhur. Specifikimi i kolonave në klauzolën ORDER BY me numrat e tyre tregohet në shembullin më poshtë:

PËRDORIMI SampleDb; ZGJIDH numrin e projektit, COUNT (*) "Numri i punonjësve" NGA Works_on GRUPI SIPAS Numri i projektit RENDOSJE NGA 2 DESC;

Këtu, për çdo projekt, zgjidhet numri i projektit dhe numri i punonjësve pjesëmarrës në të, duke renditur rezultatin në rend zbritës me numrin e punonjësve.

Transact-SQL vendos vlerat NULL në krye të listës kur renditen në rend rritës dhe vlerat NULL në fund të listës kur renditen në rend zbritës.

Përdorimi ORDER BY Klauzole për të faqezuar rezultatet

Shfaqja e rezultateve të pyetjeve në faqen aktuale mund të zbatohet ose në aplikim me porosi, ose udhëzoni serverin e bazës së të dhënave ta bëjë këtë. Në rastin e parë, të gjitha rreshtat e bazës së të dhënave dërgohen në aplikacion, detyra e të cilit është të zgjedhë rreshtat e kërkuar dhe t'i shfaqë ato. Në rastin e dytë, nga ana e serverit, vetëm rreshtat e kërkuara për Faqja aktuale... Siç mund të prisni, krijimi i faqeve nga ana e serverit zakonisht ofron performancë më të mirë që nga viti klientit i dërgohen vetëm linjat e nevojshme për shfaqje.

Për të mbështetur krijimin e faqeve nga ana e serverit në SQL Server 2012 prezanton dy klauzola të reja SELECT: OFFSET dhe FETCH. Zbatimi i këtyre dy fjalive tregohet në shembullin e mëposhtëm. Këtu, nga baza e të dhënave AdventureWorks2012 (të cilën mund ta gjeni në burim), nxjerr ID-në e biznesit, titullin e punës dhe ditëlindjen e të gjitha punonjëseve femra, të renditura sipas titullit të punës në rend rritës. Grupi i rreshtave që rezulton ndahet në faqe me 10 rreshta dhe shfaqet një faqe e tretë:

Në një fjali OFFSET specifikon numrin e rreshtave të rezultateve që duhet të kapërcehen në rezultatin e shfaqur. Kjo shumë llogaritet pasi rreshtat janë renditur me klauzolën RENDI SIPAS. Në një fjali MERR TJETËR specifikon numrin e WHERE dhe rreshtave të renditura për t'u kthyer. Parametri i kësaj klauzole mund të jetë një konstante, një shprehje ose rezultat i një pyetjeje tjetër. Klauzola FETCH NEXT është e ngjashme me klauzolën MERRNI SË PARË.

Qëllimi kryesor kur krijohen faqe në anën e serverit është që të jemi në gjendje të implementojmë forma të zakonshme të faqeve duke përdorur variabla. Kjo detyrë mund të realizohet përmes paketës SQL Server.

SELECT Deklarata dhe prona IDENTITET

prona IDENTITET ju lejon të përcaktoni vlerat për një kolonë specifike të tabelës në formën e një numëruesi automatik në rritje. Kolonat e një lloji të të dhënave numerike si TINYINT, SMALLINT, INT dhe BIGINT mund ta kenë këtë veti. Për një kolonë të tillë tabele, motori i bazës së të dhënave gjeneron automatikisht vlera sekuenciale duke filluar me vlerën fillestare të specifikuar. Kështu, vetia IDENTITY mund të përdoret për të krijuar të paqarta vlerat numerike për kolonën e zgjedhur.

Një tabelë mund të përmbajë vetëm një kolonë me vetinë IDENTITY. Pronari i tabelës ka aftësinë të specifikojë vlerën fillestare dhe rritjen, siç tregohet në shembullin më poshtë:

PËRDORIMI SampleDb; KRIJO TABELA Produkti (ID INT IDENTITET (10000, 1) JO NULL, Emri NVARCHAR (30) JO NULL, PARA ÇMIMI) INSERT NË PRODHIM (Emri, Çmimi) VLERAT ("Produkti1", 10), ("Produkti2", 15) , ("Produkti3", 8), ("Produkti4", 15), ("Produkti5", 40); - Do të kthejë 10004 SELECT IDENTITYCOL FROM Product WHERE Emri = "Product5"; - Analoge me deklaratën e mëparshme ZGJIDHni identitetin e $ FROM Produkti WHERE Emri = "Produkt5";

Ky shembull fillimisht krijon një tabelë Produkti që përmban një kolonë ID me një veçori IDENTITY. Vlerat në kolonën Id krijohen automatikisht nga sistemi, duke filluar nga 10,000 dhe duke u rritur me një hap për çdo vlerë pasuese: 10,000, 10,001, 10,002, etj.

Disa funksione dhe variabla të sistemit shoqërohen me veçorinë IDENTITY. Për shembull, përdoret shembulli i kodit ndryshorja e sistemit $ identitet... Siç mund ta shihni nga rezultatet e ekzekutimit të këtij kodi, kjo variabël i referohet automatikisht veçorisë IDENTITY. Ju gjithashtu mund të përdorni në vend të tyre funksionin e sistemit IDENTITETI.

Vlera fillestare dhe rritja e kolonës me vetinë IDENTITY mund të gjenden duke përdorur funksionet IDENT_SEED dhe IDENT_INCR përkatësisht. Këto funksione zbatohen si më poshtë:

PËRDORIMI SampleDb; SELECT IDENT_SEED ("Produkt"), IDENT_INCR ("Produkt")

Siç u përmend, vlerat e IDENTITY vendosen automatikisht nga sistemi. Por përdoruesi mund të specifikojë në mënyrë eksplicite vlerat e tyre për vargje të caktuara duke i caktuar parametrit IDENTITY_INSERT vlera ON para futjes së vlerës eksplicite:

SET IDENTITY INSERT emrin e tabelës ON

Për shkak se parametri IDENTITY_INSERT mund të përdoret për të vendosur çdo vlerë, duke përfshirë vlerat e dyfishta, në një kolonë me veçorinë IDENTITY, vetia IDENTITY zakonisht nuk zbaton veçantinë e vlerave të kolonës. Prandaj, kufizimet UNIQUE ose PRIMARY KEY duhet të zbatohen për të zbatuar veçantinë e vlerave të kolonës.

Kur futni vlera në një tabelë pasi vendosni IDENTITY_INSERT në aktiv, sistemi krijon vlerën tjetër në kolonën IDENTITY, duke rritur vlerën më të lartë aktuale në atë kolonë.

Deklarata CREATE SEQUENCE

Përdorimi i vetive IDENTITY ka disa të meta të rëndësishme, më të rëndësishmet prej të cilave janë:

    prona është e kufizuar në tabelën e specifikuar;

    vlera e re e kolonës nuk mund të merret në asnjë mënyrë tjetër, përveçse duke e aplikuar atë;

    vetia IDENTITY mund të specifikohet vetëm kur krijohet një kolonë.

Për këto arsye, SQL Server 2012 prezanton sekuenca që kanë të njëjtën semantikë si vetia IDENTITY, por pa disavantazhet e listuara më parë. Në këtë kontekst, një sekuencë i referohet funksionalitetit të një baze të dhënash që ju lejon të specifikoni vlerat e kundërta për objekte të ndryshme të bazës së të dhënave, të tilla si kolonat dhe variablat.

Sekuencat krijohen duke përdorur udhëzimin KRIJO SEKUENCE... Deklarata CREATE SEQUENCE është përcaktuar në Standardi SQL dhe mbështetet nga sisteme të tjera të bazës së të dhënave relacionale si IBM DB2 dhe Oracle.

Shembulli më poshtë tregon se si të krijoni një sekuencë në SQL Server:

PËRDORIMI SampleDb; KRIJO SEKUENCE dbo.Sekuenca 1 SI NË FILLIM ME 1 RRITJE ME 5 MINVLERË 1 MAXVLERË 256 CIKLE;

Në shembullin e mësipërm, vlerat e Sekuencës 1 gjenerohen automatikisht nga sistemi, duke filluar me një vlerë prej 1 dhe në rritje prej 5 për çdo vlerë të njëpasnjëshme. Kështu, në klauzolën FILLIM tregohet vlera fillestare dhe në Oferta RRITJE- hap. (Hapi mund të jetë pozitiv ose negativ.)

Në dy fjalitë e ardhshme fakultative MINVALUES dhe MAXVLERA specifikon vlerën minimale dhe maksimale të objektit të sekuencës. (Vini re se MINVALUE duhet të jetë më e vogël ose e barabartë me vlera fillestare, dhe vlera MAXVALUE nuk mund të jetë më e madhe se kufiri i sipërm i llojit të të dhënave të specifikuar për sekuencën.) Në klauzolë CIKLI tregon se sekuenca përsëritet nga fillimi kur tejkalohet vlera maksimale (ose minimale për një sekuencë me hap negativ). Si parazgjedhje, kjo klauzolë është vendosur në NO CYCLE, që do të thotë se tejkalimi i vlerës maksimale ose minimale të sekuencës krijon një përjashtim.

Tipari kryesor i sekuencave është pavarësia e tyre nga tabelat, d.m.th. ato mund të përdoren me çdo objekt të bazës së të dhënave siç janë kolonat e tabelës ose variablat. (Kjo veti ka një efekt pozitiv në ruajtjen dhe, për rrjedhojë, në performancën. Një sekuencë specifike nuk ka nevojë të ruhet; ruhet vetëm vlera e fundit e saj.)

Vlerat e reja të sekuencës krijohen me VLERA E TJETËR PËR shprehjet, aplikimi i të cilit tregohet në shembullin e mëposhtëm:

PËRDORIMI SampleDb; - Kthen 1 ZGJIDH VLERËN TJETËR PËR dbo.sequence1; - Kthen 6 (hapi tjetër) ZGJIDH VLERËN E TJETËR PËR dbo.sequence1;

Ju mund të përdorni shprehjen NEXT VALUE FOR për të caktuar rezultatin e një sekuence në një variabël ose qelizë kolone. Shembulli i mëposhtëm ilustron përdorimin e kësaj shprehjeje për të caktuar rezultatet në një kolonë:

PËRDORIMI SampleDb; KRIJO TABELA Produkti (Id INT NOT NULL, Emri NVARCHAR (30) JO NULL, PARA Çmimi) FUT NE VLERAT E PRODUKTIT (VLERA TJETËR PËR dbo.sequence1, "Product1", 10); INSERT NË VLERAT E PRODUKTIT (VLERA E TJETËR PËR dbo.sequence1, "Product2", 15); -...

Shembulli i mësipërm fillimisht krijon një tabelë të quajtur Produkt me katër kolona. Më pas, dy deklarata INSERT futin dy rreshta në këtë tabelë. Dy qelizat e para të kolonës së parë do të jenë 11 dhe 16.

Shembulli i mëposhtëm tregon përdorimin e pamjes së katalogut sys.sekuenca për të parë vlerën aktuale të një sekuence pa e përdorur atë:

Në mënyrë tipike, shprehja NEXT VALUE FOR përdoret në një deklaratë INSERT për të udhëzuar sistemin të futë vlerat e krijuara. Kjo shprehje mund të përdoret gjithashtu si pjesë e një pyetjeje me shumë rreshta duke përdorur klauzolën OVER.

Për të ndryshuar një veti të një sekuence ekzistuese, aplikoni Deklarata ALTER SEQUENCE... Një nga përdorimet më të rëndësishme për këtë deklaratë është me opsionin RISTART WITH, i cili rivendos sekuencën e specifikuar. Shembulli i mëposhtëm tregon përdorimin e deklaratës ALTER SEQUENCE për të rivendosur pothuajse të gjitha vetitë e Sekuencës1:

PËRDORIMI SampleDb; SEKUENCA NDRYSHIME dbo.sekuenca1 RIFIKONI ME 100 RRITJE ME 50 MINVLERË 50 MAXVLERË 200 PA CIKLI;

Sekuenca fshihet duke përdorur udhëzimin SEKUENCA E RËZIMIT.

Vendosni operatorët

Përveç operatorëve të diskutuar më parë, Transact-SQL mbështet tre operatorë të tjerë të grupeve: UNION, INTERSECT dhe EXCEPT.

Operatori UNION

Operatori UNION kombinon rezultatet e dy ose më shumë pyetjeve në një grup të vetëm rezultatesh që përfshin të gjitha rreshtat që u përkasin të gjitha pyetjeve në bashkim. Rrjedhimisht, rezultati i bashkimit të dy tabelave është një tabelë e re që përmban të gjitha rreshtat në njërën ose të dyja tabelat origjinale.

Forma e përgjithshme e operatorit UNION duket si kjo:

select_1 UNION zgjidhni_2 (select_3]) ...

Opsionet select_1, select_2, ... janë deklarata SELECT që krijojnë bashkimin. Nëse përdoret parametri ALL, shfaqen të gjitha rreshtat, duke përfshirë dublikatat. Në deklaratën UNION, parametri ALL ka të njëjtin kuptim si në SELECT, por me një ndryshim: ky është parazgjedhja për një SELECT, por duhet të specifikohet në mënyrë eksplicite për UNION.

Në formën e tij origjinale, SampleDb nuk është i përshtatshëm për të demonstruar përdorimin e operatorit UNION. Prandaj në këtë seksion krijohet një tabelë e re EmployeeEnh e cila është identike tabela ekzistuese Punonjës, por ka një kolonë shtesë të qytetit. Kjo kolonë tregon vendbanimin e punonjësve.

Krijimi i tabelës EmployeeEnh na ofron një mundësi për të demonstruar përdorimin e klauzolës. në deklaratën SELECT. Deklarata SELECT INTO kryen dy operacione. Së pari, krijohet një tabelë e re me kolonat e listuara në listën SELECT. Pastaj rreshtat nga tabela origjinale futen në tabelën e re. Emri i tabelës së re është specifikuar në klauzolën INTO, dhe emri i tabelës burimore është specifikuar në klauzolën FROM.

Shembulli më poshtë tregon krijimin e tabelës EmployeeEnh nga tabela Employee:

PËRDORIMI SampleDb; SELECT * INTO EmployeeEnh FROM Employee; ALTER TABLE PunonjësEnh SHTO Qyteti NCHAR (40) NULL;

Në këtë shembull, deklarata SELECT INTO krijon tabelën EmployeeEnh, fut të gjitha rreshtat nga tabela e burimit Employee në të dhe më pas deklarata ALTER TABLE shton kolonën City në tabelën e re. Por kolona e shtuar Qyteti nuk përmban asnjë vlerë. Vlerat mund të futen në këtë kolonë nga Mjedisi i menaxhimit Studio ose me kodin e mëposhtëm:

PËRDORIMI SampleDb; PËRDITËZIM EmployeeEnh SET City = "Kazan" WHERE Id = 2581; PËRDITËSOJE EmployeeEnh SET City = "Moscow" WHERE Id = 9031; PËRDITËSOJE EmployeeEnh SET Qyteti = "Yekaterinburg" WHERE Id = 10102; UPDATE EmployeeEnh SET City = "Shën Petersburg" WHERE Id = 18316; UPDATE EmployeeEnh SET City = "Krasnodar" WHERE Id = 25348; PËRDITËSIM EmployeeEnh SET Qyteti = "Kazan" WHERE Id = 28559; UPDATE EmployeeEnh SET City = "Perm" WHERE Id = 29346;

Tani jemi gati të demonstrojmë përdorimin e deklaratës UNION. Shembulli më poshtë tregon një pyetje për të krijuar një bashkim midis tabelave EmployeeEnh dhe Department duke përdorur këtë deklaratë:

PËRDORIMI SampleDb; ZGJIDH Qyteti AS "Qytet" NGA PunonjësitEnh UNION ZGJEDH vendndodhjen NGA Departamenti;

Rezultati i kësaj pyetjeje:

Vetëm tabelat e përputhshme mund të bashkohen duke përdorur deklaratën UNION. Me tabela të pajtueshme, nënkuptojmë që të dy listat e kolonave në përzgjedhje duhet të përmbajnë të njëjtin numër kolonash dhe kolonat përkatëse duhet të kenë lloje të dhënash të përputhshme. (Për sa i përket përputhshmërisë, llojet e të dhënave INT dhe SMALLINT nuk janë të përputhshme.)

Rezultati i lidhjes mund të renditet vetëm duke përdorur klauzolën ORDER BY në deklaratën e fundit SELECT, siç tregohet në shembullin më poshtë. Klauzolat GROUP BY dhe HAVING mund të përdoren me deklarata individuale SELECT, por jo brenda vetë bashkimit.

Pyetja në këtë shembull zgjedh punonjësit që ose punojnë në departamentin d1 ose që kanë filluar të punojnë në një projekt përpara 1 janarit 2008.

Operatori UNION mbështet opsionin ALL. Ky opsion nuk heq dublikatat nga grupi i rezultateve. Një operator OR mund të përdoret në vend të operatorit UNION nëse të gjitha deklaratat SELECT të bashkuara nga një ose më shumë operatorë UNION i referohen të njëjtës tabelë. Në këtë rast, grupi i deklaratave SELECT zëvendësohet nga një deklaratë e vetme SELECT me një grup deklaratash OR.

Operatorët INTERSECT dhe EXCEPT

Dy operatorë të tjerë për të punuar me grupe, KRYQËZOHET dhe PËRVEÇ, përcaktoni përkatësisht kryqëzimin dhe ndryshimin. Nën kryqëzimin, në këtë kontekst, ka një grup rreshtash që u përkasin të dy tabelave. Dhe ndryshimi midis dy tabelave përcaktohet si të gjitha vlerat që i përkasin tabelës së parë dhe nuk janë të pranishme në të dytën. Shembulli i mëposhtëm tregon përdorimin e operatorit INTERSECT:

Transact-SQL nuk e mbështet përdorimin e parametrit ALL as me operatorët INTERSECT ose EXCEPT. Përdorimi i operatorit EXCEPT tregohet në shembullin e mëposhtëm:

Duhet mbajtur mend se këta tre operatorë grupesh kanë përparësi të ndryshme ekzekutimi: operatori INTERSECT ka përparësinë më të lartë, i ndjekur nga PËRVEÇ deklaratës dhe operatori UNION ka precedencën më të ulët. Moskujdesi ndaj prioritetit të ekzekutimit kur përdoret shumëfish operatorë të ndryshëm puna me grupe mund të ketë rezultate të papritura.

Shprehjet RAST

Në fushën e programimit të aplikacionit të bazës së të dhënave, ndonjëherë është e nevojshme të modifikohet prezantimi i të dhënave. Për shembull, njerëzit mund të ndahen sipas klasës së tyre shoqërore, duke përdorur vlerat 1, 2 dhe 3, që tregojnë përkatësisht burra, gra dhe fëmijë. Kjo teknikë programimi mund të zvogëlojë kohën e nevojshme për zbatimin e programit. Shprehje RASTE Transact-SQL ju lejon të zbatoni me lehtësi këtë lloj kodimi.

Ndryshe nga shumica e gjuhëve programuese, CASE nuk është një deklaratë, por një shprehje. Prandaj, një shprehje CASE mund të përdoret pothuajse kudo ku Transact-SQL lejon përdorimin e shprehjeve. Shprehja CASE ka dy forma:

    shprehje e thjeshtë RAST;

    shprehja e kërkimit RAST.

Sintaksa për një shprehje të thjeshtë CASE është si më poshtë:

Një deklaratë me një shprehje të thjeshtë CASE fillimisht kërkon listën e të gjitha shprehjeve në klauzola KUR shprehja e parë që përputhet me shprehjen_1 dhe më pas ekzekuton atë përkatëse PASTAJ klauzolë... Nëse nuk ka asnjë shprehje që përputhet në listën WHEN, atëherë klauzolë TJETËR.

Sintaksa për një shprehje kërkimi CASE është si më poshtë:

Në këtë rast, ai kërkon kushtin e parë kualifikues dhe më pas ekzekuton klauzolën përkatëse THEN. Nëse asnjë nga kushtet nuk i plotëson kërkesat, klauzola ELSE ekzekutohet. Përdorimi i shprehjes së kërkimit CASE tregohet në shembullin e mëposhtëm:

PËRDORIMI SampleDb; ZGJIDH Emrin e Projektit, RASTIN KUR Buxheti> 0 DHE Buxheti 100000 DHE Buxheti 150000 DHE Buxheti

Rezultati i kësaj pyetjeje:

Ky shembull peshon buxhetet e të gjitha projekteve dhe shfaq peshat e llogaritura së bashku me emrat përkatës të projekteve.

Shembulli më poshtë tregon një mënyrë tjetër për të përdorur një shprehje CASE ku klauzola WHEN përmban nënpyetje që janë pjesë e shprehjes:

PËRDORIMI SampleDb; SELECT Emri i Projektit, RASTI KUR p1.Buxheti (SELECT AVG (p2.Budget) FROM Project p2) PAS "mbi mesataren" FUND "Kategoria e buxhetit" FROM Projekti p1;

Rezultati i kësaj pyetjeje është si më poshtë:

Artikujt kryesorë të lidhur