UL/FRI/VSP-RI/PB1/Seminarska/2004/05
Iz E-študij, proste zakladnice študentskega znanja
Izpiši vse podatke o trgovcih, ki živijo v mestu Portorož
SELECT * FROM oseba o, trgovec t, mesto m WHERE m.ime = 'Portoroz' AND o.oid = t.oid AND m.mid = o.mid;
+-----+---------+----------+-----+------+-----------+ | oid | priimek | mesto | tid | oid | provizija | +-----+---------+----------+-----+------+-----------+ | O2 | Jazbec | Portoroz | T2 | O2 | 10.0 | | O3 | Bajec | Portoroz | T3 | O3 | 30.0 | +-----+---------+----------+-----+------+-----------+
Izpiši priimke trgovcev, ki prodajajo kupcu s šifro 'K2' artikel s šifro 'A3'
SELECT priimek FROM kupcija, trgovec, oseba WHERE kupcija.kid='K2' AND kupcija.aid='A3' AND kupcija.tid = trgovec.tid AND oseba.oid = trgovec.oid;
+---------+ | priimek | +---------+ | Jazbec | +---------+
Izpiši barve artiklov, ki jih prodaja trgovec s šifro 'T2'
SELECT DISTINCT barva FROM kupcija, artikel WHERE tid='T2' AND kupcija.aid = artikel.aid;
+-------+ | barva | +-------+ | Modra | +-------+
Izpiši šifre trgovcev, ki prodajajo tako kupcu 'K1' kot tudi kupcu 'K2' (torej obema)
SELECT tid FROM kupcija WHERE kid = 'K1' intersect SELECT tid FROM kupcija WHERE kid = 'K2';
+-----+ | tid | +-----+ | T2 | | T3 | +-----+
Razlaga: Intersect naredi presek nad rezultati, ki so vsebovani v obeh poizvedbah.
Izpiši šifre artiklov, ki jih prodajajo trgovci kupcem iz istega mesta
SELECT DISTINCT artikel.aid FROM artikel, kupcija, kupec, oseba WHERE kupcija.aid = artikel.aid AND kupcija.kid = kupec.kid AND kupec.oid = oseba.oid AND artikel.mesto = oseba.mesto;
+-----+ | aid | +-----+ | A3 | | A6 | +-----+
Razlaga: Izpiše šifre brez ponavljanja tistih artiklov, ki imajo kupca in prodajalca v istem mestu.
Izpiši šifre kupcev, ki jim prodaja vsaj en trgovec, ki ni iz istega mesta
SELECT DISTINCT kupcija.kid FROM kupcija, kupec, oseba WHERE kupcija.kid = kupec.kid AND kupec.oid = oseba.oid AND mesto NOT IN ( SELECT mesto FROM trgovec WHERE kupcija.tid = trgovec.tid AND oseba.oid = trgovec.oid );
+------+ | kid | +------+ | K1 | | K4 | | K2 | | K3 | | K5 | | K6 | | K7 | +------+
Razlaga: Izpiše šifre brez ponavljanja tistih kupcev, kateri imajo drugačno mesto kot prodajalec.
Izpiši šifre kupcev, ki jim prodajajo samo trgovci iz istega mesta
SELECT DISTINCT kp.kid FROM kupcija kp, kupec k, trgovec t WHERE (SELECT mesto FROM oseba WHERE kp.kid = k.kid AND k.oid = oseba.oid) = (SELECT mesto FROM oseba WHERE kp.tid = t.tid AND t.oid = oseba.oid) AND kp.kid NOT IN ( SELECT DISTINCT kp2.kid FROM kupcija kp2, kupec k2, trgovec t2 WHERE (SELECT mesto FROM oseba WHERE kp2.kid = k2.kid AND k2.oid = oseba.oid) <> (SELECT mesto FROM oseba WHERE kp2.tid = t2.tid AND t2.oid = oseba.oid) );
+------+ | kid | +------+ +------+ (prazen seznam, ker vsi kupujejo pri najmanj enemu iz drugega mesta)
Razlaga: Izpiše kupce v seznamu kupčij, ki so iz istega mesta kot njihovi trgovci in filtrira vse, ki kupujejo pri kateremkoli trgovcu iz drugega mesta.
Izpiši šifre kupcev, ki ne kupujejo artiklov modre barve od trgovcev iz Ankarana
SELECT DISTINCT kid FROM kupcija WHERE aid NOT IN (SELECT aid FROM artikel WHERE barva = 'Modra') AND tid NOT IN (SELECT tid FROM trgovec,oseba WHERE trgovec.oid = oseba.oid AND oseba.mesto = 'Ankaran');
+------+ | kid | +------+ | K1 | | K4 | | K2 | | K3 | | K7 | | K7 | +------+
Razlaga: Izpiše šifre kupcev brez ponavljanja iz kupčij, ki nimajo artikla modre barve in prodajalca iz ankarana.
Izpiši šifre kupcev, ki kupujejo samo od trgovca 'T2'
SELECT kid FROM kupcija WHERE tid = 'T2' AND kid NOT IN (SELECT kid FROM kupcija WHERE tid <> 'T2');
+------+ | kid | +------+ | K6 | +------+
Razlaga: Izpiše šifre kupcev, ki kupujejo od trgovca T2 in izloči vse, ki kupujejo od kogarkoli drugega.
Izpiši imena in težo artiklov z najmanjšo težo
SELECT ime,teza FROM artikel WHERE teza = (SELECT min(teza) FROM artikel);
+----------+------+ | ime | teza | +----------+------+ | Srajca | 12 | | Nogavice | 12 | +----------+------+
Razlaga: Izpiše podatke artiklov, katerih teža se ujema z minimalno težo artikla.
Izpiši priimke trgovcev urejenih v padajočem vrstnem redu po številu kupčij, ki so jih sklenili
SELECT priimek FROM ( SELECT kp.tid, count(kp.tid) AS stevilo, o.priimek FROM kupcija kp, trgovec t, oseba o WHERE kp.tid = t.tid AND t.oid = o.oid GROUP BY kp.tid ORDER BY stevilo DESC) AS foo;
+---------+ | priimek | +---------+ | Trcek | | Smolar | | Bajec | | Cokan | | Jazbec | | Adamic | +---------+
Razlaga: Izpiše priimke iz subselecta, ki uredi vrstice po padajočem vrstnem redu glede na count števila kupčij vsakega kp.tid posebej. Alias foo je zaradi mysql specifikacij.
Izpiši kolikšno je število kupcev, ki jim prodaja trgovec 'T3'
SELECT count(DISTINCT kid) AS stevilo FROM kupcija WHERE tid = 'T3';
+---------+ | stevilo | +---------+ | 2 | +---------+
Razlaga: Izbere unikatne kupce, katerim prodaja T3 in jih prešteje.
Izračunaj in izpiši število parov nogavic, ki jih je prodal trgovec 'Adamic'
SELECT sum(kosov) AS stevilo FROM kupcija WHERE tid IN (SELECT tid FROM trgovec,oseba WHERE trgovec.oid = oseba.oid AND priimek = 'Adamic') AND aid IN (SELECT aid FROM artikel WHERE ime = 'Nogavice');
+---------+ | stevilo | +---------+ | 1000 | +---------+
Razlaga: Sešteje vse zapise v stolpcu kosov, ki izpolnjujejo dana pogoja.
Izpiši šifre trgovcev, ki so prodali manj kot 2000 kosov kakršnih koli izdelkov
SELECT tid FROM kupcija GROUP BY tid HAVING sum(kosov) < 2000;
+------+ | tid | +------+ | T1 | | T3 | | T4 | | T6 | +------+
Razlaga: Pri grupiranju izbere šifre, katere izpolnjujejo dani pogoj.
Za vsakega kupca izpiši ime njemu najbližje živečega trgovca
SELECT k.kid, t.tid, o1.priimek AS kupec, o2.priimek AS trgovec, razdalja FROM kupec k, trgovec t, oseba o1, oseba o2, razdalja r WHERE k.oid = o1.oid AND t.oid = o2.oid AND r.mesto1 = o1.mesto AND r.mesto2 = o2.mesto AND razdalja = ( SELECT min(razdalja) FROM kupec k1, trgovec t1, oseba o11, oseba o21, razdalja r1 WHERE k1.kid = k.kid AND k1.oid = o11.oid AND t1.oid = o21.oid AND r1.mesto1 = o11.mesto AND r1.mesto2 = o21.mesto GROUP BY k1.kid ) ORDER BY k.kid;
+-----+-----+----------+---------+----------+ | kid | tid | kupec | trgovec | razdalja | +-----+-----+----------+---------+----------+ | K1 | T2 | Stanic | Jazbec | 0 | | K1 | T3 | Stanic | Bajec | 0 | | K2 | T1 | Pintar | Smolar | 90 | | K2 | T6 | Pintar | Trcek | 90 | | K2 | T4 | Pintar | Cokan | 90 | | K3 | T5 | Rovtar | Adamic | 0 | | K4 | T5 | Crnek | Adamic | 0 | | K5 | T1 | Cingolic | Smolar | 0 | | K5 | T6 | Cingolic | Trcek | 0 | | K5 | T4 | Cingolic | Cokan | 0 | | K6 | T4 | Trubar | Cokan | 152 | | K6 | T1 | Trubar | Smolar | 152 | | K6 | T6 | Trubar | Trcek | 152 | | K7 | T4 | Trcek | Cokan | 0 | | K7 | T1 | Trcek | Smolar | 0 | | K7 | T6 | Trcek | Trcek | 0 | +-----+-----+----------+---------+----------+
Razlaga: Iz tabele vseh razdalj med kupci in trgovci s pomočjo subselecta izbere samo zapise, ki vsebujejo najmanjšo razdaljo za določenega kupca. Nekateri kupci imajo na isti razdalji na voljo več trgovcev, zato jih je izpisanih več.
Izpiši imena trgovcev, ki prodajajo najbolj oddaljenim kupcem
SELECT os1.priimek, razdalja FROM kupcija kp, trgovec t, kupec k, oseba AS os1, oseba AS os2, razdalja WHERE kp.tid = t.tid AND t.oid = os1.oid AND kp.kid = k.kid AND k.oid = os2.oid AND os1.mesto = mesto1 AND os2.mesto = mesto2 ORDER BY razdalja DESC;
+---------+----------+ | priimek | razdalja | +---------+----------+ | Jazbec | 271 | | Jazbec | 215 | | Jazbec | 215 | | Bajec | 215 | | Adamic | 199 | | Adamic | 199 | | Smolar | 123 | | Jazbec | 123 | | Jazbec | 123 | | Adamic | 107 | | Smolar | 107 | | Adamic | 107 | | Cokan | 107 | | Jazbec | 22 | | Jazbec | 22 | | Jazbec | 0 | | Adamic | 0 | | Adamic | 0 | | Adamic | 0 | | Adamic | 0 | | Adamic | 0 | | Trcek | 0 | | Bajec | 0 | | Cokan | 0 | | Adamic | 0 | +---------+----------+
Razlaga: Izpiše v padajočem vrstnem redu razdaljo vsake kupčije posebej in pripadajoči priimek trgovca tako, da poišče iz kupčije lokacijo kupca in lokacijo trgovca, ter ti dve lokaciji primerja v tabeli razdalj.
Izpiši imena trgovcev, ki prodajajo v povprečju najbolj oddaljenim kupcem
SELECT os1.priimek, avg(razdalja) AS razdalja FROM kupcija kp, trgovec t, kupec k, oseba AS os1, oseba AS os2, razdalja WHERE kp.tid = t.tid AND t.oid = os1.oid AND kp.kid = k.kid AND k.oid = os2.oid AND os1.mesto = mesto1 AND os2.mesto = mesto2 GROUP BY kp.tid ORDER BY razdalja DESC;
+---------+----------+ | priimek | razdalja | +---------+----------+ | Jazbec | 123.8750 | | Smolar | 115.0000 | | Bajec | 107.5000 | | Adamic | 61.2000 | | Cokan | 53.5000 | | Trcek | 0.0000 | +---------+----------+
Razlaga: Izpiše v padajočem vrstnem redu glede na povprečje vse trgovce tako, da poišče lokacije prodajalcev in kupcev, iz tega potegne podatek o razdalji, kateri se upošteva pri funkciji avg ob grupiranju.
Ugotovi, ali za vsaki dve mesti M1 in M2 velja, da je razdalja med M1 in M2 enaka razdalji med M2 in M1
SELECT max(r1.razdalja-r2.razdalja) FROM razdalja r1, razdalja r2 WHERE r1.mesto1 = r2.mesto2 AND r2.mesto1 = r1.mesto2;
+------------------------------+ | max(r1.razdalja-r2.razdalja) | +------------------------------+ | 0 | +------------------------------+
Razlaga: Maksimalna razlika je nič, torej razlike med obratno napisanimi mesti ni.
Izpiši imena trgovcev, ki so prodali nadpovprečno veliko količino izdelkov
Izpiši imena trgovcev, ki so prodali nadpovprečno veliko količino (število kosov) kakršnih koli izdelkov (nadpovprečno veliko glede na vse trgovce)
SELECT o.priimek FROM kupcija k, oseba o, trgovec t WHERE k.tid = t.tid AND t.oid = o.oid GROUP BY k.tid HAVING sum(kosov) > (SELECT sum(kosov)/count(DISTINCT tid) FROM kupcija);
+---------+ | priimek | +---------+ | Jazbec | | Adamic | +---------+
Razlaga: S subselectom ugotovi povprečje in potem z njim pri grupiranju filtrira ven podpovprečne.
Izpiši imena trgovcev z najvišjim razmerjem med številom prodanih izdelkov in vsoto razdalj do kupcev
SELECT os1.priimek, sum(kosov)/sum(razdalja) razmerje FROM kupcija kp, trgovec t, kupec k, oseba AS os1, oseba AS os2, razdalja WHERE kp.tid = t.tid AND t.oid = os1.oid AND kp.kid = k.kid AND k.oid = os2.oid AND os1.mesto = mesto1 AND os2.mesto = mesto2 GROUP BY kp.tid ORDER BY razmerje DESC;
+---------+----------+ | priimek | razmerje | +---------+----------+ | Adamic | 8.17 | | Cokan | 5.61 | | Smolar | 3.91 | | Bajec | 3.26 | | Jazbec | 3.23 | | Trcek | NULL | +---------+----------+
Razlaga: Izpiše v padajočem vrstnem redu glede na razmerje vse trgovce tako, da poišče lokacije prodajalcev in kupcev, iz tega potegne podatek o razdalji, kateri se upošteva pri funkciji sum ob grupiranju, hkrati upošteva sum vseh kosov v kupčijah trgovcev in s pomočjo teh 2 funkcij izračuna razmerje. Deljenje z nič povzroči NULL.