Hyrje në SQL

12.      TEKNIKA E SUB-QUERIVE

Një nën-kërkesë (subquery) është një kërkesë (query) rezultatet e të cilit shërbejnë si argument për një kërkesë tjetër. Pra, ajo mund të përfytyrohet si një kërkesë brenda një kërkese tjetër e vendosur në klauzolën WHERE. Sintaksa e përgjithshme e saj është si vijon

Siç shihet kërkesa e dytëështë e specifikuar brenda kërkesës së parë. Le të marrim një shembull. E zemë se jepen dy tabela, tabela “Produktet” që përmban fushat: kodi (kodi i produktit), përshkrimi (emri i produktit), çmimi (çmimi për një njësi i produktit); dhe tabela “Shitjet” që përmban fushat: emri (emri i klientit), kodi (kodi i produktit), sasia (sasia e blerë) dhe data (data e blerjes). Supozojmë se kemi zhvilluar kodin e mëposhtëm SQL.

Siç shihet, kjo kërkesë përmban një nën-kërkesë e shprehur në tre rreshtat e fundit, e cila jep si rezultat bashkësinë e vlerave të fushës S.kodi, e cila përfshin ato rekorde nga tabela “produktet” që fushën “përshkrimi” e kanë HDTV. Më tutje, vetë kërkesa nxjerr një tabelë rezultatesh që përmban rekordet me 4 fushat e specifikuara në SELECT të cilat plotësojnë kushtin që kodi i produktit të jetë i njëjtë në të dy tabelat i barabartë me kodin e produktit me përshkrim HDTV.

Funksionet agregate SUM, COUNT, MIN, MAX dhe AVG të gjitha prodhojnë një vlerë të vetme. Për të gjetur vlerën mesatare të një shitje, përdoret kodi

Për të gjetur cilat prej shitjeve janë më të mëdha se mesatarja, shtohet një kërkesë brenda kërkesës ekzistuese e cila merr trajtën

Katër rreshtat e para të kodit përcaktojnëçfarë përfshihet në tabelën e rezultateve. Është përcaktuar që përveç fushave emri dhe data të përfshihet edhe prodhimi i sasisë me çmimin për një njësi të produkteve. Duke qenë se këto dy fusha janë në tabela të ndryshme, kushti përcakton lidhjen midis tabelave nëpërmjet kodit të produktit, pra formula llogarit totalin si prodhim sasia*çmimi vetëm për të njëjtin produkt në të dy tabelat. Pastaj ne e kufizojmë tabelën e rezultateve duke shtuar një nën-kërkesë (5 rreshtat e fundit) në mënyrë që të shfaqen vetëm rekordet që totalin e tyre e kanë më të madh se mesatarja e të gjithë totaleve të shitjeve.

Një rast tjetër i përdorimit të nën-kërkesave është kur ato kanë trajtën e përgjithshme si vijon

Siç shihet, këtu nënkërkesat mund të jenë të përfshira brenda nënkërkesave të tjera me më shumë se një nivel. Le të trajtojmë një shembull. Shqyrtojmë dy tabelat e mësipërme së bashku me një tabelë të quajtur “Konsumatorët” që përmban fushat: emri, adresa dhe shteti. Në rast se shtrohet kërkesa që të nxirren adresat dhe shtetet për klientët që kanë patur shitje më të mëdha se mesatarja, atëherë të dhënat e tabelës “Konsumatorët” duhen kombinuar me një version të modifikuar të kërkesës që përdorëm për gjetjen e shitjeve mbi mesatare.

Kodi përmban tre nivele kërkesash. Kështu, nënkërkesa e nivelit të tretë, llogarit mesataren e produkteve të shitura. Kjo kërkesë e nivelit të dytë gjendet brenda nën-kërkesës e cila identifikon ato shitje produktesh të cilat kanë qenë më të larta se mesatarja. Nën-kërkesa e nivelit të dytë përfshihet në kërkesën e nivelit të parë. Konkretisht, duke qenë se fusha emri lidh të dhënat e tabelave “Konsumatorët” dhe “Shitjet”, kërkesa e nivelit tëparë nxjerr rekordet për fushat emri, adresa dhe shteti, por emri i të cilave është në tabelën e rezultateve të nën-kërkesës së nivelit të dytë.

Ekziston mundësia që një nën-kërkesë të përdorë referenca jashtë saj. Le të shqyrtojmë shembullin e një kodi i cili nxjerr rekordet me fushat e tabelës “Shitjet” për produktin i cili ka përshkrimin ‘TV’. Sintaksa përkatëse SQL është si vijon

Nënkërkesa të këtij lloji mund të përdoren edhe me klauzolat GROUP BY dhe HAVING. Për shembull, për të gjetur shitjet totale mesatare për një produkt të caktuar dhe pastaj të filtrohen shitjet totale të grupuara sipas kodit të produktit, zhvillohet kodi i mëposhtëm

Nën-kërkesat ne mund ti përdorim si argumenta të operatorëve sasiore si EXISTS, ANY, ALL në klauzolën WHERE. Operatori EXISTS vlerëson nënkërkesën si të vërtetë (të rremë) nëse tabela e rezultateve të saj është jo boshe (boshe). Le të marrim shembullin e mëposhtëm ku supozojmë se ka një produkt të shitur me emrin TV

SELECTemri, data
FROMShitjet
WHERE EXISTS
(SELECT * FROM Shitjet WHERE emri =’TV’)

Meqë nën-kërkesa përmban një rekord që i takon një produkti të shitur, atëherë vërtetësia e saj vlerësohet TRUE dhe tabela përfundimtare nxjerr emrin dhe datën për të gjithë produktet e shitura (jo vetëm produktin TV). Në rast se klauzola WHERE tek nën-kërkesa të përmbante emrin e një produkti që nuk është në tabelën e shitjeve, vërtetësia është FALSE dhe tabela e rezultateve boshe.

Ngjashmërisht mund të përdoren dy operatorët e tjerë, por me kuptim të ndryshëm. Kështu, operatori ANY në shembullin e mëposhtëm krahason rekordet e nën-kërkesës me çdo rekord të kërkesës duke prodhuar vërtetësinë TRUE për ato rekorde të kërkesës që ka ndonjë rekord korrespondues nga tabela e rezultateve të nën-kërkesës.

Operatori ALL prodhon vërtetësinë TRUE vetëm në qoftë se të gjithë rekordet nga rezultatet e nën-kërkesës vërtetojnë kushtin e klauzolës WHERE. Në shembullin e mëposhtëm, tabela e rezultateve përmban çdo rekord me përjashtim të rekordeve me emër produkti ‘kot’.

[cite]
Comments
All comments.
Comments