====== DBS - 3. individuální úkol - lichý týden ====== ~~NOTOC~~ {{ :dbs:ukol1_reseni.png?400|}} Datový model z [[09_ukol1_lichy|1. úkolu]] lze převést do relačního modelu následovně. Plavidlo (__IDP__, Kapacita, Nosnost, Barva)\\ Balon (__IDP__, Nadrz, Pisek)\\ Vzducholod (__IDP__, Baterie)\\ Zakaznik (__IDZ__, Jmeno, Adresa, Telefon)\\ Zamestnanec (__IDZAM__, Jmeno)\\ Kontrola (__IDP, Datum__, Opravy)\\ Vypujcka (__IDV__, Pujceno, Vraceno, IDP, IDZ, Vydal, Prevzal)\\ **IO:** Balon [IDP] ⊆ Plavidlo [IDP]\\ Vzducholod [IDP] ⊆ Plavidlo [IDP]\\ Kontrola [IDP] ⊆ Plavidlo [IDP]\\ Vypujcka [IDP] ⊆ Plavidlo [IDP]\\ Vypujcka [IDZ] ⊆ Zakaznik [IDZ]\\ Vypujcka [vydal] ⊆ Zamestnanec [IDZAM]\\ Vypujcka [prevzal] ⊆ Zamestnanec [IDZAM]\\ Pozor na názvy atributů při přirozeném spojení :!:. ===== Zadání ===== Navrhněte dotazy v **SQL**. Rozhodně nechci, abyste všechny dotazy odladili na nějakých datech, překlepy mě nezajímají, jde o myšlenky: - Vypište seznam výpůjček zákazníka **jménem** Jan Novák, položka seznamu bude obsahovat datum výpůjčky, inventární číslo plavidla a **barvu**.SELECT v.pujceno, p.IDP, p.barva FROM zakaznik z JOIN vypujcka v ON (z.IDZ = v.IDZ) JOIN plavidlo p ON (v.IDP = p.IDP) WHERE z.jmeno = 'Jan Novak'; - Vypište seznam všech výpůjček. V každém řádku bude datum výpůjčky, ID plavidla, jméno zaměstnance, který předával, a jméno zaměstnance, který přebíral.SELECT v.pujceno, v.idp, z1.jmeno, z2.jmeno FROM vypujcka v JOIN zamestnanec z1 ON (v.vydal = z.idz) JOIN zamestnanec z2 ON (v.prevzal = z.idz) - Vypište zákazníky, kteří si **ještě nepůjčili** vzducholoď.SELECT * FROM zakaznik z WHERE z.idz NOT IN ( SELECT idz FROM vypujcka NATURAL JOIN vzducholod ); - Vypište zákazníky, kteří si půjčili **pouze** (a jenom) vzducholodě.SELECT idz, jmeno FROM zakaznik NATURAL JOIN vypujcka NATURAL JOIN vzducholod MINUS -- nebo EXCEPT SELECT idz, jmeno FROM zakaznik NATURAL JOIN vypujcka NATURAL JOIN balon; - Vypište seznam zákazníků a u nich počet jejich výpůjček. Chceme i zákazníky, kteří si ještě nic nepůjčili (tedy budou mít v daném sloupci 0).SELECT z.jmeno, count(v.idv) FROM zakaznik z LEFT JOIN vypujcka v ON (z.idz = v.idz) GROUP BY z.idz, z.jmeno; - Vypište seznam zaměstnanců, kteří již předali (půjčili) aspoň 10 výpůjček.SELECT z.jmeno, count(v.idv) FROM zamestnanec z LEFT JOIN vypujcka v ON (z.idzam = v.vydal) GROUP BY z.idzam, z.jmeno HAVING count(v.idv) > 10;