Datový model z 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í .
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:
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';
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)
SELECT * FROM zakaznik z WHERE z.idz NOT IN ( SELECT idz FROM vypujcka NATURAL JOIN 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;
SELECT z.jmeno, COUNT(v.idv) FROM zakaznik z LEFT JOIN vypujcka v ON (z.idz = v.idz) GROUP BY z.idz, z.jmeno;
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;