Download as pdf or txt
Download as pdf or txt
You are on page 1of 30

Sistemet e Bazës së të Dhënave

SQL:Subqueries(nën-Pytsit/ nën-pytësori/ nën-query) Pjesa Dytë II


R a m i z H OX H A
r a m i z . h ox h a @ u b t - u n i . n e t
2020/2021
FA K U LT E T I : S H K E N C AV E KO M PJ U T E R I K E D H E I N X H I N I E R I S

Ramiz HOXHA © 2020 UBT 1


Llojet e nën-query’ive (subquery)
PJ E SA D Y TË

Ramiz HOXHA © 2020 UBT 2


Llojet e nën-query’ive
nën-query/subquery Përshkrimi
kthen në query-in e jashtme vetëm një rresht në rezultatin që
nën-query me vetëm një-rresht
përmban një kolonë
nën-query me shumë rreshta kthehet në query-in e jashtme më shumë se një rresht në rezultateve
nën-query me shumë kolona kthehet në query-in e jashtme më shumë se një kolonë të rezultateve
i’u referuar një kolonë në query-in e jashtme dhe ekzekuton
nën-query e lidhur (correlated) nënquery-in duke u referuar një herë për çdo rresht në queru-in e
jashtme
ekzekuton nën-query fillimisht dhe pastaj ia kalon vlerën ne query-it të
nën-query e palidhur (uncorrelated)
jashtme

Ramiz HOXHA © 2020 UBT 3


http://www.sqltutorial.org/sql-sample-database/

Ramiz HOXHA © 2020 UBT 4


nën-query me vetëm një-rresht
❑ Nën-query mund të kthejë një vlerë të vetme (një kolonë dhe një rresht)në query-in e jashtme
▪ Një nën-query me një rresht përdoret kur rezultatet e query të jashtme bazohen në një vlerë të
vetme, të panjohur
▪ Operatorët që mund të përdoren me nën-pyetjet me një rresht janë: =,>,>=, <, <= dhe <>.
❑ p.sh: Te gjeni cilet punonjës bëjnë të njejten punë me atë të punonjësit me ID ‘110’.
SELECT e1.first_name 'Emri', e1.last_name, j.job_id
'IDPunes', j.job_title'Titulli Punes'
FROM employees e1 JOIN jobs j
ON j.job_id=e1.job_id
WHERE e1.job_id =(
SELECT e.job_id 'ID e LLoji te punes'
FROM employees e
WHERE e.employee_id=110)

Rezultati i nën-query-it, vetëm një rresht (vlerë = 6)

Ramiz HOXHA © 2020 UBT 5


nën-query me shumë rreshta
❑Nën-query që kthehen një listë vlerash (një kolonë dhe shumë rreshta) quhen
nën-query me shumë rreshta.
❑Ky lloj nën-query përdoret kudo ku pritet një listë vlerash, si p.sh. kur përdoret
klauzola IN.
▪ Kërkohet përdorimin e operatorëve IN, ANY, ALL, SOME dhe EXISTS

Operatorët Kuptimi
IN E barabartë me ndonjë anëtar në një listë.
ANY Ktheni rreshta që përputhen me ndonjë vlerë në listë.
ALL Ktheni rreshta që përputhen me të gjitha vlerat në listë.
EXISTS Kthehet i true nëse nën-query kthen një ose më shumë të dhëna.

Ramiz HOXHA © 2020 UBT 6


nën-query me shumë rreshta.
Operatorë ANY, ALL dhe SOME
❑Kombinoje me operatorët aritmetikë

Operatorët Kuptimi
>ANY Query kthen vlerat më të madhe se vlera më e ulët e kthyer nga subquery
<ANY Query kthen vlerat më të vogela se vlera më e lartë e kthyer nga subquery
=ANY E barabartë me donjë vlerë të kthyer nga subquery (njëjtë si IN)
>ALL Query kthen vlerat më të madhe se vlera më e lartë e kthyer nga subquery
<ALL Query kthen vlerat më të voglë se vlera më e ultë e kthyer nga subquery
Operatorët Kuptimi
ANY Ktheni rreshta që përputhen me ndonjë vlerë në listë.
ALL Ktheni rreshta që përputhen me të gjitha vlerat në listë.

Ramiz HOXHA © 2020 UBT 7


nën-query me shumë rreshta
Operatorë >ANY, <ANY, =ANY, >ALL, <ALL
❑Kombinimi i operatorve: >ANY dhe <ANY
▪ P.sh nëse kemi dhe

>ANY Query kthen vlerat më të madhe se vlera më e ulët (30) e kthyer nga subquery
select nr_A [A>B]
from A
where nr_A>ANY (select nr_B
from B)
<ANY Query kthen vlerat më të vogela se vlera më e lartë (100) e kthyer nga subquery
select nr_A [A<B]
from A
where nr_A<ANY (select nr_B
from B)

Ramiz HOXHA © 2020 UBT 8


nën-query me shumë rreshta
Operatorë >ANY, <ANY, =ANY, >ALL, <ALL….
❑Kombinimi i operatorve: >ANY, <ANY, =ANY, >ALL, <ALL
▪ P.sh nëse kemi

>ALL Query kthen vlerat më të madhe se vlera më e lartë (100)e kthyer nga subquery
select nr_A [A>B]
from A
where nr_A>ALl (select nr_B
from B) )
<ALL Query kthen vlerat më të voglë se vlera më e ultë (30) e kthyer nga subquery
select nr_A [A<B]
from A
where nr_A<ALL (select nr_B
from B)

Ramiz HOXHA © 2020 UBT 9


nën-query me shumë rreshta
Operatorë ANY, ALL dhe SOME…
❑ Operatori ANY: kthehet i ‘TRUE’ nëse vlera e krahasimit përputhet me cilëndo nga vlerat në listë e
rezultatit nga nën-query.
*P.sh i nën-query e lidhura: Shaqeni punonjesit që kan pagen më të madhe se paga
mesatare në kompani sipas departamenteve.
Select e1.first_name, e1.last_name, e1.salary
from employees e1
where e1.salary >any --4150
(Select avg(e.salary)'Paga Mesatare'
from employees e
group by e.department_id)
order by e1.salary

'> ANY' do të thotë më e madhe/më shumë se minimumi i vlerës të


kthyera nga vlerat e nën-query’is

Ramiz HOXHA © 2020 UBT 10


nën-query me shumë rreshta
Operatorë ANY, ALL dhe SOME…
❑ Operatori ALL: kthehen ‘TRUE’ nëse të gjitha vlerat e nën-query (Subquery) përmbushin kushtin.
Shembull: Shfaqni detajet e punonjësve me pagë më të vogël se paga e Menagjerve.

Ramiz HOXHA © 2020 UBT 11


nën-query me shumë rreshta
Operatorë ANY, ALL dhe SOME…
❑Menyra tjetër
Shembull: Shfaqni detajet e punonjësve me pagë më të vogël se paga e Menagjerve.

'<ALL' do të thotë më vogel se të gjitha maksimumet e vlerave të kthyera nga nën-query

Ramiz HOXHA © 2020 UBT 12


nën-query me shumë rreshta…
❑ p.sh: Të listoni menagjeret e departamenteve përkatese, duke përfshire të dhenat e tyre,
departamenti, dhe titullin e punes ID e menagjerit.
▪ Te perdorni subquery dhe Operatorin IN. Operatori IN kthehet ‘TRUE’ nëse vlera e krahasimit është e përfshirë në listë.
SELECT e.employee_id, e.first_name, e.last_name, d1.department_name,d1.department_id, e.manager_id, j.job_title
FROM Jobs j JOIN employees e
ON j.job_id=e.job_id
JOIN departments d1
On d1.department_id=e.department_id
WHERE e.employee_id IN (SELECT distinct (m.manager_id)--, e1.first_name, e1.last_name, e1.department_id
FROM employees m join employees e1
on m.manager_id=e1.employee_id
WHERE e1.department_id IN (SELECT d.department_id
FROM departments d))

Ramiz HOXHA © 2020 UBT 13


nën-query e lidhura (correlated)
❑Një nën-query e lidhura (correlated) është një query brendshëm (nënë-query) ku
varet nga vlerat e ofruara nga query e jashtme.
▪ Kjo do të thotë që nën-query ekzekutohet në mënyrë të përsëritur, një herë për çdo rresht që
mund të selektohet nga query jashtem.

Sintaksa:
SELECT kolona1, kolona2, ....
FROM tabela1 jashtme
WHERE kolona1 operator
(SELECT kolona1, kolona2
FROM tabela2
WHERE shprehja1 =
jashtme.shprehja2);

Ramiz HOXHA © 2020 UBT 14


nën-query e lidhura (correlated) …
❑P.sh i nën-query e lidhura: Gjeni të gjithë të punonjesit që kan pagen më të madhe
se paga mesatare në departamentin e tyre perkatese.
SELECT first_name, last_name, salary, department_id
FROM employees jasht
WHERE salary > (SELECT AVG(salary)
FROM employees
WHERE department_id =
jasht.department_id
GROUP BY department_id)
ORDER BY department_id

- Paga mesatare sipas departamenteve

SELECT department_id, AVG(salary)'Paga Mesatare'


FROM employees
group by department_id
order by 'Paga Mesatare'

Ramiz HOXHA © 2020 UBT 15


Ramiz HOXHA © 2020 UBT 16
nën-query me shumë kolona
Operatorë ANY, ALL dhe SOME…
❑Kthen më shumë se një kolonë në rezultatet e nën-query’it
▪ Mund të kthehen më shumë se një rresht
▪ Lista e kolonave në anën e majtë të operatorit duhet të jetë në kllapa
▪ Përdorni operatorin IN (për Oracle) dhe operatori për EXISTS (për MS SQL Serve) klauzolat
WHERE dhe HAVING
/*Kjo form vlen në Oracle*/ /*Kjo form vlen në MS SQL Server */

SELECT ord_num, agent_code, ord_date, ord_amount SELECT c.FirstName, c.LastName, o.TotalAmount


FROM orders FROM orders o JOIN Customer c
WHERE (agent_code, ord_amount) IN ON o.CustomerId=c.Id
(SELECT agent_code, MIN(ord_amount) WHERE EXISTS
FROM orders (SELECT CustomerId,sum(TotalAmount)
GROUP BY agent_code); FROM orders
GROUP BY CustomerId)
ORDER BY o.TotalAmount desc

Ramiz HOXHA © 2020 UBT 17


nën-query në klauzolën SELECT:
listë e kolonave
❑nën-query mund të gjenden edhe në klauzolën SELECT.
▪ Zakonisht përdoret për t’i nxjerrur të dhenat në rast kur përdorim funksionin e agregate të tilla si
SUM, COUNT, MIN, ose MAX, dhe
▪ Nëse nuk doni të i implementoni funksionet agregate në query-in kryesore.
▪ p.sh: Listo të gjithë klientët dhe numrin e tyre të përgjithshëm të porosive. Shfaqeni të dhënat
e TOP 10 rekordeve duke filluar nga numri me i madh i porosive

SELECT TOP 10 FirstName, LastName,


numriPorosive =
(SELECT COUNT(O.Id)
FROM Orders O
WHERE O.CustomerId = C.Id)
FROM Customer C
Order by NumriPorosive desc

Ramiz HOXHA © 2020 UBT 18


nën-query në klauzolën FROM:
listë e kolonave
❑nën-query gjithashtu mund të gjenden në klauzolën FROM.
▪ Këto quhen views inline.
▪ p.sh, Shfletoni kompanit dhe numri i pakove të produkëteve
SELECT TOP 5 s.CompanyName, subquery1.total_Pack
FROM supplier s,(SELECT P.SupplierId, count(P.Package) AS total_Pack
FROM Product P
GROUP BY P.SupplierId) subquery1
WHERE subquery1.SupplierId = s.Id
Order by total_Pack desc

Ramiz HOXHA © 2020 UBT 19


nën-query në klauzolës WHERE
❑Operatori IN ose NOT IN në Subquery
▪ Subquery me operatorin NOT IN po ashtu kthehen listën e zero ose më shumë vlerash.
▪ p.sh,Listo rastet kur kosumatoret qe nuk kanë shpenzuar me pak se 250 euro dhe me shume
2000 euro.
SELECT c.FirstName, c.LastName, O.TotalAmount
FROM Customer c INNER JOIN Orders O
ON C.Id=O.CustomerId
WHERE c.Id NOT IN
(SELECT O.CustomerId
FROM Orders as O
WHERE O.TotalAmount between '250.00' and '2000.00')
ORDER BY O.TotalAmount;

Ramiz HOXHA © 2020 UBT 20


nën-query në klauzolës HAVING
❑Operatori HAVING në Subquery
▪ HAVING klauzolë kufizon rezultatin sipas grupimit me klauzolën GROUP BY
▪ Aplikon kriteret e kushtëzuar për rreshtat e grupuara.
▪ p.sh: Shfletoni kosumatoret, të cilet kanë shpenzuar më pak se vlerat mesatare e shpenzimeve të
përgjithshme të kosumatore
SELECT C.FirstName, sum(O.TotalAmount) as 'totali shumes'
FROM Customer C, Orders O
WHERE C.Id=O.CustomerId
GROUP BY C.FirstName
HAVING sum(O.TotalAmount)<
(SELECT avg(O.TotalAmount)
FROM Orders O)
ORDER BY 'totali shumes';

Ramiz HOXHA © 2020 UBT 21


nën-query në kaluzolat INSERT, UPDATE, DELETE
PJ E SA TRE TË

Ramiz HOXHA © 2020 UBT 22


nën-query me deklaratën INSERT
❑Deklarata INSERT mund të përdoret me subquery.
Të dhënat pas
▪ Sintaksa bazë është si më poshtë: shtimit të info
INSERT INTO table_name [ (column1 [, column2 ]) ]
SELECT [ *|column1 [, column2 ]
FROM table1 [, table2 ]
[ WHERE VALUE OPERATOR ]

INSERT INTO Orders (CustomerId,OrderDate)


SELECT id, GETDATE() FROM Customer
WHERE FirstName = 'Maria'

select * from Orders


WHERE CustomerId = 1

select * from Customer


WHERE FirstName = 'Maria'

Ramiz HOXHA © 2020 UBT 23


nën-query me deklaratën UPDATE
❑Deklarata UPDATE mund të përdoret me subquery.
▪ Sintaksa bazë është si më poshtë:
UPDATE table_name
SET column_name = new_value
[ WHERE OPERATOR [ VALUE ]
(SELECT column_name
FROM table_name)
[ WHERE) ]
Çmimi pas (50% zbritje)
përditsimit
p.sh: Të bëhet zbritja për 50% produketeve të furnizuar nga UK.
UPDATE Product
SET UnitPrice = UnitPrice - UnitPrice * .5
WHERE Product.SupplierId IN
(SELECT S.Id
FROM Supplier S
WHERE S.Country = 'UK');

Ramiz HOXHA © 2020 UBT 24


nën-query me deklaratën DELETE
❑Deklarata DELETE mund të përdoret me subquery. Select S.Student_ID, S.Emri, S.Mbiemri,
V.Lenda, V.Nota
▪ Sintaksa bazë është si më poshtë: From Studenti S, Vlersimi V
DELETE FROM TABLE_NAME where S.Student_ID=V.Studenti and
[ WHERE OPERATOR [ VALUE ] S.Student_ID='S100'
(SELECT COLUMN_NAME FROM TABLE_NAME)[ WHERE)] Order by V.Nota desc

Të dhënat para
fshirjës
▪ p.sh: Të fshijeni Notat e studentes Liberta Buja.
begin transaction
Të dhënat pas
DELETE FROM Vlersimi fshirjës.
WHERE Vlersimi.Studenti IN 0 - rekords
(SELECT V.Studenti
FROM Studenti s JOIN Vlersimi V
ON S.Student_ID=V.Studenti
and S.Emri='Liberta' and s.Mbiemri='Buja');
rollback transaction

Ramiz HOXHA © 2020 UBT 25


nën-query me CREATE TABLE
❑Ky përdorim i CREATE TABLE krijon një tabelë SQL dhe e mbush atë me rreshta të të
dhënave, ndryshe nga përdorimi normal i CREATE TABLE i cili krijon vetëm një tabelë.
Shembull:
CREATE TABLE Manager
AS
SELECT Emp_No, Emp_Name, Salary
FROM Emp JOIN Dept
ON (Emp_No = Manager_No);
▪ Kufizimet e integritetit mund të duhet të shtohen në tabelen e krijuar kështu
▪ Vini re se qëllimi i një tryeze është ruajtja e përhershme e të dhënave të saj në DB.
▪ Pra, duhet të jetë i kujdesshëm në lidhje me një tabelë të dhënat e të cilave rrjedhin nga
tabelat ekzistuese DB, për të siguruar që të mos kopjohen në mënyrë të panevojshme të
dhënave në DB

Ramiz HOXHA © 2020 UBT 26


SQL Nested subqueries
❑Një Subquery mund të nested (vendoset) brenda subquery-it tjetër
▪ p.sh Listoni lëndët që kan kalushmeri më të mirë së gjithë lëndët në listen e vlersimit

Select L.Emertimi
From Lenda L
Where L.Kodi_L IN
(select V.Lenda
From Studenti S, Vlersimi V
where S.Student_ID=V.Studenti
Group by V.Lenda
Having count (*) >= ALL
(Select Count (*)
From Studenti S1, Vlersimi V1
where S1.Student_ID=V1.Studenti
Group by V1.Lenda))

Ramiz HOXHA © 2020 UBT 27


udhëzimet: Subquery
❑Po ashtu të konsideroni edhe disa udhëzimet shtesë gjatë përdorimit të
subqueries:
▪ Subquery nuk mund të manipulojë me rezultatet e saj të brendshëm, pra në
klauzolën ORDER BY nuk mund të shtohen në një Subquery.
o Ju mund të përdorni klauzolë ORDER BY në deklaratën kryesore SELECT (query e jashtëm) e
cila do të jetë edhe klauzola fundit.
▪ Përdorni operatorët e një rreshti të vetem, me subquery të një rreshti të vetëm.
▪ Nëse një Subquery (query i brendshëm) kthen një vlerë null për query e jashtëm,
në këtë rastë query i jashtme nuk do të kthehej ndonjë rresht në rastë të
përdorimit të operatorit të caktuara të krahasimit në klauzolë WHERE.

Ramiz HOXHA © 2020 UBT 28


Pyetje

Ramiz HOXHA © 2020 UBT 29


Referenca
Kapitulli 7 & Kapitulli 8: Database Systems: Design, Implementation, and
Management, 13th Edition Carlos Coronel and Steven Morris.

Kapitulli 3: Database System Concepts, 7thED – Abraham Silberschatz, Henry F.


Korth, S. Sudarshan

Ramiz HOXHA © 2020 UBT 30

You might also like