Ahmad Yoosofan
Database Course
https://yoosofan.github.io/slide/db.ql2.presentation.html
https://yoosofan.github.io/course/db.html
select distinct sname
from s natural join p;
select sname
from s
where exists (
select *
from p
where p.city = s.city
);
sname |
|---|
Smith |
Jones |
Blake |
Clark |
select distinct T.pname
from p as T join p on
T.pn <> p.pn and
T.weight > p.weight;
select distinct T.pname
from p as T join p on
T.weight > p.weight;
select distinct pname
from p as T
where exists (
select *
from p
where T.weight > p.weight
);
select distinct T.pname
from p as T join p on
T.pn < p.pn and
T.weight > p.weight
; -- incorrect
pname |
|---|
Bolt |
Screw |
select distinct pname
from p as T
where exists (
select *
from p
where city = 'Paris' and
T.weight > p.weight
);
select distinct pname
from p as T
where exists (
select *
from p
where city = 'Paris' and
T.weight > weight
);
pname |
|---|
Bolt |
Screw |
Cog |
Find the names of the parts such that no other part weighs less than them
pname |
|---|
Nut |
Cam |
select pname
from p as T
where not exists (
select *
from p
where T.weight > p.weight
);
pname |
|---|
Nut |
Cam |
Nut |
Bolt |
select pname
from p as T
where not exists (
select *
from p
where T.weight > p.weight
) and T.weight is not null;
pname |
weight |
|---|---|
Nut |
12 |
Cam |
12 |
1select distinct city2from s3where not exists(4select *5from p6where p.city = s.city7);
1select city2from s3except4select city5from p;
1select city2from s3where not exists(4select *5from p6where p.city = s.city7);
1select city2from s3except all4select city5from p;
city |
|---|
Athens |
کاشان |
Find the names of parts that have not been supplied by any supplier located in a different city
1select pname2from p3where not exists(4select *5from s natural join sp6where sp.pn = p.pn and7p.city <> s.city8);
1select pname2from p3where not exists(4select *5from s6where s.city <> p.city and7exists(8select *9from sp10where sp.pn = p.pn and11sp.sn = s.sn12)13);
pname |
|---|
Screw |
Cog |
Nut |
Bolt |
1select pname2from p natural join sp as T3where not exists(4select *5from s natural join sp6where sp.pn = p.pn and7p.city <> s.city8);
pname |
|---|
Screw |
Cog |
Screw |
1select pname2from p natural join sp3where not exists(4select *5from s6where s.city <> p.city and7exists(8select *9from sp10where sp.pn = p.pn and11sp.sn = s.sn12)13);
1select pname2from p3where exists(select * from sp where sp.pn=p.pn)4and not exists( -- Run to see the differnce5select * -- Add distinct to previous SQLs6from s7where s.city <> p.city and8exists(9select *10from sp11where sp.pn = p.pn and12sp.sn = s.sn13)14);
1select distinct pname2from p natural join sp3where not exists(4select *5from sp,s6where sp.sn = s.sn and7sp.pn = p.pn and8p.city <> s.city9);
1select pname -- ریحانه زمانیان2from p natural join sp3except4select pname5from p6where exists(7select *8from s natural join sp9where sp.pn=p.pn and10p.city <> s.city11) ;
1SELECT DISTINCT p1.pname2FROM p p1 --- Gemini AI3WHERE EXISTS (4SELECT 15FROM sp sp_test6WHERE sp_test.pn = p1.pn7) AND NOT EXISTS (8SELECT 19FROM sp sp110JOIN s s1 ON sp1.sn = s1.sn11WHERE sp1.pn = p1.pn12AND s1.city <> p1.city13);
pname |
|---|
Screw |
Cog |
نام قطعههای عرضه شدهای را بیابید که شمارههای متفاوتی داشته باشند هر چند شاید نام یکسانی داشته باشند که فقط عرضه کنندگان درون آن شهرها، آنها را عرضه کرده باشند
1select pname2from p natural join(3select distinct pn4from p natural join sp5where not exists(6select *7from sp,s8where sp.sn = s.sn and9sp.pn = p.pn and10p.city <> s.city11)12);
1select pname2from p3where exists(4select *5from sp6where sp.pn = p.pn and7not exists (8select *9from sp natural join s10where sp.pn = p.pn and11p.city <> s.city12)13);
نام قطعاتی را بیابید که همهٔ عرضه کنندگان آنها را عرضه کرده باشند
نام قطعاتی را بیابید که عرضهکنندهای وجود نداشته باشد که این قطعات را عرضه نکرده باشد.
نام قطعاتی را میخواهیم که وجود نداشته باشد عرضهکنندهای که برایش وجود نداشته باشد عرضهای که آن عرضه از آن عرضه کننده و آن قطعه باشد.
select pname
from p
where not exists(
select *
from s
where not exists(
select *
from sp
where s.sn = sp.sn
and p.pn = sp.pn
)
);
pname |
|---|
نام قطعات متفاوتی را بیابید که همهٔ عرضه کنندگان با وضعیت بالای ۱۰۰ آنها را عرضه کرده باشند
select distinct pname
from p join sp
where not exists(
select *
from s
where status > 100 and
not exists(
select *
from sp
where s.sn = sp.sn and
p.pn = sp.pn
)
) and exists (
select *
from s
where s.status > 100 and
s.sn = sp. sn
);
pname |
|---|
Nut |
Bolt |
Screw |
Cam |
Cog |
جمع همهٔ عرضهها(qty) را بیابید.
select sum(qty) as sqt
from sp;
sqt |
|---|
1600 |
sn |
pn |
qty |
|---|---|---|
S1 |
P1 |
300 |
S1 |
P5 |
100 |
S2 |
P1 |
300 |
S2 |
P2 |
400 |
S4 |
P2 |
200 |
S4 |
P4 |
300 |
جمع عرضههای عرضه کنندهٔ s2 را بیابید.
select sum(qty) as sqt
from sp
where sp.sn = 'S2';
sqt |
|---|
700 |
sn |
pn |
qty |
|---|---|---|
S1 |
P1 |
300 |
S1 |
P5 |
100 |
S2 |
P1 |
300 |
S2 |
P2 |
400 |
S4 |
P2 |
200 |
S4 |
P4 |
300 |
جمع وزن قطعات متفاوتی را بیابید که عرضهکنندهای در شهر پاریس آنها را عرضه کرده باشد(۱).
1select sum(weight) as swg2from p3where exists (4select *5from sp natural join s6where p.pn = sp.pn and s.city = 'Paris'7);
swg |
|---|
29 |
1select sum(weight) as swg2from (p natural join sp)3join s using(sn)4where s.city = 'Paris';
swg |
|---|
46 |
جمع وزن قطعات متفاوتی را بیابید که عرضهکنندهای در شهر پاریس آنها را عرضه کرده باشد(۲).
select sum(weight) as swg
from p
where exists(
select *
from s
where s.city = 'Paris' and exists(
select *
from sp
where sp.sn = s.sn and sp.pn = p.pn
)
);
swg |
|---|
29 |
جمع وزن قطعات متفاوتی را بیابید که عرضهکنندهای در شهر پاریس آنها را عرضه کرده باشد(۳).
select sum(weight) as swg
from p
where exists (
select *
from sp natural join s
where p.pn = sp.pn and s.city = 'Paris'
);
swg |
|---|
29 |
select sum(weight) as swg
from (p natural join sp)
join s using(sn)
where s.city = 'Paris';
swg |
|---|
46 |
select pn, weight, sn, s.city
from (p natural join sp)
join s using(sn)
where s.city = 'Paris';
pn |
weight |
sn |
city |
|---|---|---|---|
P1 |
12 |
S2 |
Paris |
P2 |
17 |
S2 |
Paris |
P2 |
17 |
S3 |
Paris |
جمع وزن قطعات متفاوتی را بیابید که عرضهکنندهای در شهر پاریس آنها را عرضه کرده باشد(۴).
select sum(weight) as swg
from p
where exists (
select *
from sp natural join s
where p.pn = sp.pn and s.city = 'Paris'
);
swg |
|---|
29 |
select sum(distinct weight) as swg
from (p natural join sp)
join s using(sn)
where s.city = 'Paris';
swg |
|---|
29 |
آیا این راه حل آخری با distinct درست است؟
جمع وزن قطعات متفاوتی را بیابید که عرضهکنندهای در شهر پاریس آنها را عرضه کرده باشد(۵).
select swg
from (
select distinct pn, sum(weight) as swg
from (p natural join sp)
join s using(sn)
where s.city = 'Paris'
);
swg |
|---|
46 |
select sum(weight) as swg
from (
select distinct pn, weight
from (p natural join sp)
join s using(sn)
where s.city = 'Paris'
);
swg |
|---|
29 |
جمع وزنی قطعات عرضهشده به تعداد qty را بیابید که عرضهکنندهای در شهر پاریس آنها را عرضه کرده باشد.
select sum(qty * weight) as swg
from (p natural join sp)
join s using(sn)
where s.city = 'Paris';
swg |
|---|
13800 |
select pn, qty, weight
from (p natural join sp)
join s using(sn)
where s.city = 'Paris';
pn |
qty |
weight |
|---|---|---|
p1 |
300 |
12 |
p2 |
400 |
17 |
p2 |
200 |
17 |
میانگین وزن قطعهها را بیابید
select avg(weight) as awg
from p;
میانگین مقدار عرضهها(qty) را بیابید
select avg(qty) as sqt
from sp;
میانگین وزن قطعات را در شهر پاریس بیابید
select avg(weight) as awg
from p
where city='Paris';
awg |
|---|
14.5 |
میانگین مقدار عرضههای(qty) عرضهکنندگان شهر پاریس را بیابید
select avg(qty) as paqt
from s natural join sp
where s.city = 'Paris';
تعداد قطعات را بیابید
select count(pn) as awg
from p;
awg |
|---|
8 |
select count(weight) as awg
from p;
awg |
|---|
6 |
تعداد قطعات را بیابید
select count(*) as awg
from p;
awg |
|---|
8 |
select count(city) as ccy
from p;
ccy |
|---|
8 |
select count(*) as sqt
from sp;
-- همهٔ رکوردها را میشمارد به فیلد خاصی مربوط نیست.
sqt |
|---|
12 |
تعداد شهرهای قطعات را بیابید
select count(distinct city) as ccy
from p;
ccy |
|---|
3 |
select city
from p;
city |
|---|
Oslo |
London |
Paris |
London |
London |
Paris |
تعداد عرضهکنندگانی را بیابید که قطعهای عرضه کرده باشند
select count(distinct sn) as sqt
from sp;
-- شمارههای تکراری را نمیشمارد
sqt |
|---|
4 |
select distinct sn
from sp;
sn |
|---|
S1 |
S2 |
S3 |
S4 |
تعداد عرضهکنندگانی را بیابید که قطعهٔ قرمزی را به تعداد عرضه(qty) بیشتر از ۵ عرضه کرده باشند.
select count(distinct sn) as scc
from sp natural join p
where qty > 5 and
p.color = 'Red';
scc |
|---|
3 |
تعداد عرضهکنندگانی را بیابید که دست کم مقدار یکی از عرضههای آنها بیشتر از ۵ باشد و عرضهای از قطعهای به رنگ قرمز نیز داشته باشند(۱).
select count(*) as csn
from (
select sn
from sp
where qty > 5
intersect
select sn
from sp join p using (pn)
where p.color = 'Red'
);
select count(*) as csn -- May have error
from (
select sname
from s natural join sp
where qty > 5
intersect
select sname
from s natural join sp
join p using (pn)
where p.color = 'Red'
);
تعداد عرضهکنندگانی را بیابید که دست کم مقدار یکی از عرضههای آنها بیشتر از ۵ باشد و عرضهای از قطعهای به رنگ قرمز نیز داشته باشند(۲).
select count(sn) as csn
from s
where exists(
select *
from sp
where sp.sn = s.sn
and sp.qty > 5
) and exists(
select *
from sp natural join p
where s.sn = sp.sn and
p.color = 'Red'
);
csn |
|---|
3 |
کمترین وزن قطعه را بیابید
select min(weight) as wgt
from p;
--- کمترین
بیشترین وزن قطعه را بیابید
select max(weight) as wgt
from p;
--- بیشترین
--- به اینها تابع تجمعی گفته میشود. aggregation function
شماره و مجموع عرضههای عرضهکنندگانی را بیابید که قطعهای عرضه کردهاند.
select sn, sum(qty) as sqt
from sp
group by sn;
بر پایهٔ شمارهٔ عرضه کننده دستهبندی میکند
سپس برای هر دسته
شمارهٔ آن عرضه کننده (که با آن گروهبندی انجام شده است)
sn |
sqt |
|---|---|
s1 |
1300 |
s2 |
700 |
s3 |
200 |
s4 |
900 |
s6 |
350 |
شماره و مجموع عرضههای قطعاتی را بیابید که عرضه شده باشند.
1select pn, sum(qty) as sqt2from sp3group by pn;
pn |
sqt |
|---|---|
p1 |
600 |
p2 |
1350 |
p3 |
400 |
p4 |
500 |
p5 |
500 |
p6 |
100 |
شمارهٔ قطعات با وزن بیشتر از ۱۲ را همراه با جمع عرضههای هر کدام بیابید
select pn, sum(qty) as sqt
from sp join p using(pn)
where weight > 12
group by pn;
نخست شرط where اعمال میشود سپس بر روی رکوردهای باقیمانده دستهبندی انجام میشود.
pn |
sqt |
|---|---|
p2 |
1350 |
p3 |
400 |
p4 |
500 |
p6 |
100 |
شمارهٔ قطعات با وزن بیشتر از ۱۲ را همراه با جمع عرضههای هر کدام بیابید به شرطی که بیشتر از دو عرضه کننده آنها را عرضه کرده باشند
1select pn, sum(qty) as sqt2from sp join p using(pn)3where weight>124group by pn5having count(sn)>2;
مانند پیشین با این تفاوت که گروههایی برگردانده میشوند که شرط having را نیز داشته باشند.
pn |
sqt |
|---|---|
p2 |
1350 |
گام به گام
select pn, qty as sqt
from sp join p using(pn)
where weight>12;
pn |
sn |
qty |
|---|---|---|
p1 |
s1 |
300 |
p1 |
s2 |
300 |
pn |
sn |
qty |
|---|---|---|
p2 |
s1 |
200 |
p2 |
s2 |
400 |
p2 |
s3 |
200 |
p2 |
s4 |
200 |
p2 |
s6 |
350 |
pn |
sn |
qty |
|---|---|---|
p3 |
s1 |
400 |
.
pn |
sn |
qty |
|---|---|---|
p6 |
s1 |
100 |
pn |
sn |
qty |
|---|---|---|
p4 |
s1 |
200 |
p4 |
s4 |
300 |
pn |
sn |
qty |
|---|---|---|
p5 |
s1 |
100 |
p5 |
s4 |
400 |
نام قطعاتی را بیابید که بیشتر از دو عرضه کننده آنها را عرضه کرده باشند
1select distinct pname2from sp join p using(pn)3where exists(4select *5from sp as T6where T.sn <> sp.sn and7T.pn = sp.pn and exists(8select *9from sp as T210where T.sn <> sp.sn and11T2.sn <> sp.sn and12T2.sn <> T.sn and13T2.pn = sp.pn14)15)
1select distinct pname2from p natural join (3select pn4from sp join p using(pn)5group by pn6having count(sn) > 27);89-- Second solution10select distinct pname11from p join sp using(pn) join12sp as T1 using(pn) join13sp as T2 using(pn)14where T1.sn <> sp.sn and15T2.sn <> sp.sn and16T2.sn <> T1.sn;
نام شهرهای قطعاتی را بیابید که عرضهکنندهای با وضعیت بیشتر از ۱۰ نیز آنها را عرضه کرده باشد و جمع عرضههای هر کدام از آن شهرهای قطعهها بیشتر از ۲۰ باشد(۱)
1select city2from p;
1select p.city as pcity2from p join sp using(pn)3join s using(sn)4where status > 10;
1select p.city as pcity --wrong2from p join sp using(pn)3join s using(sn)4where status > 105group by p.city6having sum(qty) > 20;
1select p.city as pcity2from p3where exists(4select *5from sp join s using(sn)6where p.pn = sp.pn and7status > 108);
نام شهرهای قطعاتی را بیابید که عرضهکنندهای با وضعیت بیشتر از ۱۰ نیز آنها را عرضه کرده باشد و جمع عرضههای هر کدام از آن شهرهای قطعهها بیشتر از ۲۰ باشد(۲)
1select p.city as pcity2from p natural join sp3where exists(4select *5from s6where s.sn = sp.sn and7status > 108)9group by p.city10having sum(qty) > 20;
نام شهرهای قطعاتی را بیابید که عرضهکنندهای با وضعیت بیشتر از ۱۰ نیز آنها را عرضه کرده باشد و جمع عرضههای هر کدام از آن شهرهای قطعهها بیشتر از ۲۰ باشد
1select p.city2from p join sp using(pn)3where exists (4select *5from s6where s.sn = sp.sn and status > 107)8group by p.city9having sum(qty) > 20;
city |
|---|
London |
Oslo |
Paris |
1select p.city --- نادرست2from s natural join sp3join p using(pn)4where status > 105group by p.city6having sum(qty) > 20;78select city -- نادرست9from sp natural join p10group by pn11having status >10 and sum(qty) > 20;
1select p.city2from p join sp using(pn)3where exists (4select *5from (s natural join sp) as T6where T.pn = p.pn and status > 107)8group by p.city9having sum(qty) > 20;
نام شهرهای قطعاتی را بیابید که فقط عرضهکنندگان با وضعیت بیشتر از ۱۰ آنها را عرضه کرده باشند و جمع عرضههای هر کدام از آن شهرهای قطعهها بیشتر از ۲۰ باشد
1select p.city2from s natural join sp3join p using(pn)4where status > 105group by p.city6having sum(qty) > 20;
city |
|---|
London |
Oslo |
Paris |
1select p.city2from sp join p using(pn) natural join3(4select sn5from s6where status > 107)8group by p.city9having sum(qty) > 20;
نام پروژههایی را بیابید که عرضهکنندهای با وضعیت بیشتر از ۲۰ نیز آنها را عرضه کرده باشند و جمع وزنی عرضههای هر کدام از آن پروژهها بیشتر از ۱۰۰ باشد(I)
1select jname2from spj join j using(jn)3join p using(pn)4where exists (5select *6from s7where s.sn = spj.sn and8s.status > 209)10group by jn11having(sum(weight*qty)>100);
1select jname2from j natural join (3select jn4from spj join j using(jn)5join p using(pn)6where exists (7select *8from s9where s.sn = spj.sn and10s.status > 2011)12group by jn13having(sum(weight*qty)>100)14);
1select jname2from j natural join (3select jn4from spj join j using(jn)5join p using(pn)6where exists (7select *8from s9where s.sn = spj.sn and10s.status > 2011)12group by jn13having(sum(weight*qty)>100)14);
نام پروژههایی را بیابید که عرضهکنندهای با وضعیت بیشتر از ۲۰ نیز آنها را عرضه کرده باشند و جمع وزنی عرضههای هر کدام از آن پروژهها بیشتر از ۱۰۰ باشد(II)
1select jname2from j natural join (3select jn4from spj join j using(jn)5join p using(pn)6where exists (7select *8from s9where s.sn = spj.sn and10s.status > 2011)12group by jn13having(sum(weight*qty)>100)14);
شمارهٔ قطعات با وزن بیشتر از ۱۲ را همراه با جمع عرضههای هر کدام بیابید که بیشتر از دو عرضه کننده آنها را عرضه کرده باشند
1select pn, sum(qty)2from sp natural join p3where p.weight > 124group by pn5having count(sn)>2;
1select pn, sum(qty) -- same result2from sp natural join p3where p.weight > 124group by pn5having count(distinct sn)>2;
1select pn, sum(qty) -- wrong2from spj natural join p3where p.weight > 124group by pn5having count(sn)>2;
1select pn, sum(qty)2from spj natural join p3where p.weight > 124group by pn5having count(distinct sn)>2;
نام شهرهای قطعاتی را بیابید که عرضهکنندهای با وضعیت بیشتر از ده ، دست کم یکی از قطعات درون آن شهرها را عرضه کرده باشد و مجموع عرضههای قطعههای آن شهرها بیشتر از ۲۰ باشد به شرطی که تعداد قطعات در آن شهر قطعه بیشتر از دو باشد(I).
1select p.city -- wrong answer2from p join sp using(pn)3join s using(sn)4where s.status > 105group by p.city6having sum(qty) > 20 and7count(distinct pn) > 2;
1SELECT p.city -- wrong answer2FROM p NATURAL JOIN sp3WHERE EXISTS(4SELECT * FROM s NATURAL JOIN sp5WHERE s.sn=sp.sn AND p.city=s.city6AND s.status > 107)8GROUP by pn9HAVING count(pn)>2 and sum(qty)>20;
1select p.city -- wrong answer2from p join sp using(pn)3where exists(4select *5from s -- Mohammad Javad Akbari6where status > 10 and7s.sn = sp.sn8)9group by p.city10having sum(qty) > 20 and11count(pn) > 2;
نام شهرهای قطعاتی را بیابید که عرضهکنندهای با وضعیت بیشتر از ده ، دست کم یکی از قطعات درون آن شهرها را عرضه کرده باشد و مجموع عرضههای قطعههای آن شهرها بیشتر از ۲۰ باشد به شرطی که تعداد قطعات در آن شهر قطعه بیشتر از دو باشد(II).
1select p.city2from p join sp using(pn)3where exists(4select *5from s6where status > 10 and7s.sn = sp.sn8) group by p.city9having sum(qty) > 20 and10count(distinct pn) > 2;
1select p.city2from p join sp using(pn)3where exists(4select * from s5where status > 10 and s.sn = sp.sn6) and exists(7select * from p as p28where p.city = p2.city and p.pn <> p2.pn9) group by p.city10having sum(qty) > 20;
نام شهرهای قطعاتی را بیابید که عرضهکنندهای با وضعیت بیشتر از ده ، دست کم یکی از قطعات درون آن شهرها را عرضه کرده باشد و مجموع عرضههای قطعههای آن شهرها بیشتر از ۲۰ باشد به شرطی که تعداد قطعات در آن شهر قطعه بیشتر از دو باشد(III).
1select p.city2from p join sp using(pn)3where exists(4select *5from s6where status > 10 and7s.sn = sp.sn8)9group by p.city10having sum(qty) > 20 and11count(distinct pn) > 2;
1select p.city2from p join sp using(pn)3where exists(4select *5from s6where status > 10 and7s.sn = sp.sn8) and exists(9select *10from p as p2, p as p311where p.city = p2.city and12p.pn <> p2.pn and p.city = p3.city13and p.pn <> p3.pn and p2.pn <> p3.pn14)15group by p.city16having sum(qty) > 20;
نام پروژههایی را بیابید که عرضهکنندهای با وضعیت بیشتر از ۲۰ برای آن پروژهها عرضه کرده باشد و مجموع وزن قطعات عرضه شده برای آن نام پروژه (یا پروژهها) بیشتر از ۱۰۰ باشد
دقت کنید مجموع وزن قطعات باید تعداد در وزن ضرب شود
1select jname2from spj join j on3spj.jn = j.jn join4p using(pn)5where exists(6select *7from s8where s.sn = spj.sn9and s.status > 2010)11group by jname12having(sum(weight*qty)>100);
نام پروژههایی را بیابید که عرضهکنندهای با وضعیت بیشتر از ۲۰ برای آن پروژهها عرضه کرده باشد و مجموع وزن قطعات عرضه شده برای آن پروژه (و نه همراه با همنامهایش) بیشتر از ۱۰۰ باشد
1select jname2from spj join j on3spj.jn = j.jn join4p using(pn)5where exists(6select *7from s8where s.sn = spj.sn9and s.status > 2010)11group by jn12having(sum(weight*qty)>100);
1select jname2from j natural join (3select jn4from spj join j on5spj.jn = j.jn join6p using(pn)7where exists(8select *9from s10where s.sn = spj.sn11and s.status > 2012)13group by jn14having(sum(weight*qty)>100)15);
دستهبندی در یک گروه
1-- Totally wrong2select pn, count(distinct pn)3from p natural join sp4group by pname;5-- having count(distinct pn) > 1;
1select pname, count(sn)2from p natural join sp3group by pn;4-- having count(distinct pn) > 1
جمع وزن قطعههایی را بیابید که دستِکم عرضه کنندهای از پاریس نیز آنها را عرضه کرده باشد.
1select sum(weight) as swg2from (p natural join sp)3join s using(sn)4where s.city = 'Paris';
swg |
|---|
46 |
1select pn, weight, sn, s.city2from (p natural join sp)3join s using(sn)4where s.city = 'Paris';
pn |
weight |
sn |
city |
|---|---|---|---|
P1 |
12 |
S2 |
Paris |
P2 |
17 |
S2 |
Paris |
P2 |
17 |
S3 |
Paris |
1select sum(weight) as swg2from (3select distinct pn, weight4from (p natural join sp)5join s using(sn)6where s.city = 'Paris'7);
swg |
|---|
29 |
جمع وزن قطعههایی را بیابید که دستِکم عرضه کنندهای از پاریس نیز آنها را عرضه کرده باشد.
1select sum(weight) as swg2from p natural join sp3where exists(4select *5from s6where s.sn = sp.sn and7s.city = 'Paris'8);
swg |
|---|
46 |
1select sum(weight) as swg2from (3select distinct pn, weight4from (p natural join sp)5join s using(sn)6where s.city = 'Paris'7);
swg |
|---|
29 |
شماره و وزن قطعاتی را بیابید که وزن آنها از میانگین وزن همهٔ قطعات بیشتر است.
select pn, weight
from p
where weight > (
select avg(weight)
from p
);
pn |
weight |
|---|---|
p2 |
17 |
p3 |
17 |
p6 |
19 |
شماره و وزن قطعاتی را بیابید که کمترین وزن را داشته باشند.
select pn, weight
from p
where weight=(select min(weight) from p);
pn |
weight |
|---|---|
p1 |
12 |
p5 |
12 |
select pn, weight
from p --incorrect
where weight = (
select weight from p
order by weight asc limit 1
);
select pn, weight from p
where weight = (
select weight from p
where weight is not null
order by weight asc limit 1
);
شمارهٔ همهٔ قطعات را همراه با جمع تعداد عرضههای (qty) آن قطعات بیابید(۱).
select pn, sum(qty) as sqty
from sp
group by pn;
-- wrong
pn |
sqty |
|---|---|
p1 |
600 |
p2 |
1350 |
p3 |
400 |
p4 |
500 |
p5 |
500 |
p6 |
100 |
شمارهٔ همهٔ قطعات را همراه با جمع تعداد عرضههای (qty) آن قطعات بیابید(۲).
select pn, (
select sum(qty)
from sp
where p.pn = sp.pn
) as sqty
from p ;
pn |
sqty |
|---|---|
p1 |
600 |
p2 |
1350 |
p3 |
400 |
p4 |
500 |
p5 |
500 |
p6 |
100 |
p7 |
|
p8 |
شمارهٔ همهٔ قطعات را همراه با جمع وضعیت عرضهکنندگان درون شهر آن قطعات به همراه شهر قطعه بیابید که به ترتیب نزولی وزن قطعه نشان داده شده باشند.
1select pn,2(select sum(status)3from s4where s.city = p.city5) as sum_status,6city7from p8order by weight desc ;
1select pn, sum(status) , p.city2from p natural join sp natural join s3order by weight desc; -- wrong
1select pn, sum(status) , p.city2from p join s using(city)3order by weight desc; -- wrong
pn |
sum_status |
city |
|---|---|---|
p6 |
40 |
London |
p2 |
40 |
Paris |
p3 |
Oslo |
|
p4 |
40 |
London |
p1 |
40 |
London |
p5 |
40 |
Paris |
p7 |
40 |
London |
p8 |
40 |
Paris |
شمارهٔ همهٔ قطعات را همراه جمع تعداد عرضههای آنها بیابید.
1select pn, sum(qty) as sqty2from p natural join sp3group by pn; -- wrong
select pn, (
select sum(qty)
from sp
where sp.pn = p.pn
) as sqty
from p;
pn |
sqty |
|---|---|
p1 |
600 |
p2 |
1350 |
p3 |
400 |
p4 |
500 |
p5 |
500 |
p6 |
100 |
pn |
sqty |
|---|---|
p1 |
600 |
p2 |
1350 |
p3 |
400 |
p4 |
500 |
p5 |
500 |
p6 |
100 |
p7 |
|
p8 |
select pn, sum(qty) as sqty
from p natural left outer join sp
group by pn;
select pn, sum(qty) as sqty
from p left outer join sp using(pn)
group by pn;
pn |
sqty |
|---|---|
p1 |
600 |
p2 |
1350 |
p3 |
400 |
p4 |
500 |
p5 |
500 |
p6 |
100 |
p7 |
|
p8 |
select p.pn, sum(qty) as sqty
from p left outer join sp on p.pn = sp.pn
group by p.pn;
1select pn, (2select sum(qty)3from sp4where sp.pn = p.pn5) as sqty6from p;
نام شهرهای همهٔ قطعاتی را بیابید که عرضهکنندهای با وضعیت بیشتر از ده ، دست کم یکی از قطعات درون آن شهرها را عرضه کرده باشد و مجموع عرضههای قطعههای آن شهرها بیشتر از ۲۰ باشد به شرطی که تعداد قطعات در آن شهر قطعه بیشتر از دو باشد.
1select p.city2from p left outer join sp using(pn)3where exists(4select * from s5where status > 10 and s.sn = sp.sn6)7group by p.city8having sum(qty) > 20 and count(distinct pn) > 2;
1select p.city -- incorrect2from p left outer join sp using(pn)3group by p.city4having sum(qty) > 20 and5count(distinct pn) > 2 and6max(status > 10);
1select p.city2from p left outer join sp using(pn)3join s using(sn)4group by p.city5having sum(qty) > 20 and6count(distinct pn) > 2 and7max(status > 10);
نام شهرهای همهٔ قطعاتی را بیابید که عرضهکنندهای با وضعیت بیشتر از ده درون آن شهرها باشد و مجموع عرضههای قطعههای آن شهرها بیشتر از ۲۰ باشد به شرطی که تعداد قطعات در آن شهر قطعه بیشتر از دو باشد.
1select p.city2from p left outer join sp using(pn)3where exists(4select * from s5where status > 10 and s.city = p.city6)7group by p.city8having sum(qty) > 20 and count(distinct pn) > 2;
1select p.city2from s join p using(city)3left outer join sp using(pn)4group by p.city5having sum(qty) > 20 and6count(distinct pn) > 2 and7max(status > 10);
select pn, sum(weight) as sqty
from p natural full outer join s
group by pn;
select pn, sum(weight) as sqty
from p full outer join s using(city)
group by pn;
select p.pn, sum(weight) as sqty
from p full outer join s on p.city = s.city
group by p.pn;
╭──────┬──────╮ │ pn │ pw │ ╞══════╪══════╡ │ NULL │ NULL │ │ p1 │ 24 │ │ p2 │ 34 │ │ p3 │ 17 │ │ p4 │ 28 │ │ p5 │ 24 │ │ p6 │ 38 │ │ p7 │ NULL │ │ p8 │ NULL │ ╰──────┴──────╯
select distinct p.city, s.city
from p natural left outer join s;
╭────────┬────────╮
│ city │ city │
╞════════╪════════╡
│ London │ London │
│ Paris │ Paris │
│ Oslo │ NULL │
│ NULL │ Athens │
│ NULL │ کاشان │
╰────────┴────────╯
select distinct p.city, s.city
from p natural full outer join s;
select distinct p.city, s.city
from p, s; -- very different result
select distinct p.city, s.city
from p, s; -- very different result
where p.city = s.city;
select distinct p.city, s.city
from p natural join s;
نام همهٔ شهرهای عرضه کنندگان را در کنار نام شهر قطعاتی که همشهری آنها هستند بنویسید و اگر قطعهای همشهری آن عرضه کننده نبود نام شهر عرضه کننده همراه با null به جای نام شهر قطعه بیاید(I)
select s.city, p.city
from s left outer join p using(city);
select p.city, s.city -- incorrect
from p full outer join s on p.city = s.city;
select p.city, s.city -- incorrect
from p full outer join s using(city);
select p.city, s.city -- incorrect
from p natural full outer join s;
select p.city, s.city
from p natural right outer join s;
select p.city, s.city -- incorrect
from p natural left outer join s;
نام همهٔ شهرهای عرضه کنندگان را در کنار نام شهر قطعاتی که همشهری آنها هستند بنویسید و اگر قطعهای همشهری آن عرضه کننده نبود نام شهر عرضه کننده همراه با null بیاید(II)
select s.city as scity, p.city as pcity
from s left outer join p using(city);
select s.city as scity, p.city as pcity
from s, p -- wrong
scity |
pcity |
|---|---|
London |
London |
London |
London |
London |
London |
London |
London |
Paris |
Paris |
Paris |
Paris |
Paris |
Paris |
Paris |
Paris |
Paris |
Paris |
Paris |
Paris |
London |
London |
London |
London |
London |
London |
London |
London |
Athens |
|
کاشان |
نام قطعات و شمارهٔ عرضهکنندگان همشهری آن قطعات را بیابید. نیازی نیست آن عرضه کننده آن قطعه را عرضه کرده باشد.
select pname, sn
from p natural join (select city, sn from s);
select pname, sn
from p natural join s;
pname |
sn |
|---|---|
Nut |
s1 |
Nut |
s4 |
Bolt |
s2 |
Bolt |
s3 |
Screw |
s1 |
Screw |
s4 |
Cam |
s2 |
Cam |
s3 |
Cog |
s1 |
Cog |
s4 |
Nut |
s1 |
Nut |
s4 |
Bolt |
s2 |
Bolt |
s3 |
نام پروژههایی را بیابید که عرضهکنندهای با وضعیت بیشتر از ۲۰ برای آن پروژهها عرضه کرده باشد و مجموع وزن قطعات عرضه شده برای آن پروژه بیشتر از ۱۰۰ باشد. دقت کنید مجموع وزن قطعات باید qty در weight ضرب شود.
select jname -- نادرست
from spj join j using(jn) join s
using(sn) join p using(pn)
where s.status > 20
group by jn
having(sum(weight * qty) > 100)
select jname -- نادرست
from j join spj using(jn) join s
using(sn) join P using(pn)
where status > 20
group by pn
having sum(qty * weight) > 100;
select jname -- درست
from p join spj using(pn) join
j using(jn)
where exits(
select *
from s natural join (spj as T)
where T.jn=j.jn and status > 20
)
group by jn
having (weight*qty)>100;
select jname -- درست
from j natural join (
select jn
from p join spj using(pn) join
j using(jn)
where exists(
select *
from s natural join spj as T
where T.jn=j.jn and status > 20
)
group by jn
having (weight*qty)>100)
);
نام شهرهای قطعاتی را بیابید که عرضهکنندهای با وضعیت بیشتر از ده یکی از قطعات درون آن شهرها را عرضه کرده باشد و مجموع عرضههای قطعههای آن شهرها بیشتر از ۲۰ باشد به شرطی که تعداد قطعات در آن شهر قطعه بیشتر از دو باشد.
select p.city -- incorrect
from p join sp using(pn) join s using(sn)
where s.status > 10
group by p.city
having sum(qty) > 20 and count(distinct pn) > 2;
select p.city -- incorrect
from p join sp using(pn)
where exists(
select *
from s
where s.status > 10 and s.sn = sp.sn
)
group by p.city
having sum(qty) > 20 and count(distinct pn) > 2;
select p.city -- correct
from p left outer join sp using(pn)
where exists(
select *
from s
where s.status > 10 and s.sn = sp.sn
)
group by p.city
having sum(qty) > 20 and count(distinct pn) > 2;
select p.city -- correct ?
from p left outer join sp using(pn)
join s using(city)
group by p.city
having sum(qty) > 20 and
count(distinct pn) > 2 and
max(status > 10);
شمارهٔ قطعات با وزن بیشتر از ۱۲ را همراه با جمع عرضههای هر کدام بیابید که بیشتر از دو عرضه کننده آنها را عرضه کرده باشند.
select pn, sum(qty)
from sp natural join p
where p.weight > 12
group by pn
having count(sn)>2;
select pn, sum(qty)
from spj natural join p
where p.weight > 12
group by pn
having count(distinct sn)>2;
شمارهٔ قطعات با وزن بیشتر از ۱۲ را همراه با جمع عرضههای هر کدام بیابید.
select pn, sum(qty)
from sp natural join p
where p.weight > 12
group by pn
END