Bazy danych: zadania ćwiczebne na tempo i dykcję 1 SQL 1. Baza danych zawiera tabele: Firma(nazwa, adres, telefon) : kluczem jest nazwa, Komputer(model, producent, typ, model, cena) : kluczem jest model, zaś producent kluczem zewnętrznym do Firma. Należy zapisać w SQL następujące zapytania: (a) Podaj nazwy i adresy firm, które sprzedają co najmniej dwa modele komputerów tego samego typu. (b) Podaj nazwę i telefon firmy która produkuje najtańszy komputer. (c) Podaj typy komputerów, produkowane przez wszystkich (znanych) producentów. 2. W tym zadaniu korzystać będziemy z bazy danych o następującym schemacie: CREATE TABLE Ksiazki ( nrk NUMERIC(5) PRIMARY KEY, tytul VARCHAR(20) NOT NULL, autor VARCHAR(25), wydawca VARCHAR(20), rok_wyd NUMERIC(4), data_zakupu DATE, cena NUMERIC(6,2)); CREATE TABLE Czytelnicy ( nrcz NUMERIC(4) PRIMARY KEY, nazwisko VARCHAR(20) NOT NULL, imie VARCHAR(15) NOT NULL, zawod VARCHAR(15)); CREATE TABLE Wypozyczenia ( nrk NUMERIC(5) NOT NULL REFERENCES Ksiazki, nrcz NUMERIC(4) NOT NULL REFERENCES Czytelnicy, data_wyp DATE NOT NULL, data_zwr DATE, PRIMARY KEY(nrk, nrcz, data_wyp)); Zrealizuj w SQL odpowiedzi na następujące pytania (Uwaga: jeśli pytamy o największy (najdroższy itp.) obiekt, a jest kilka obiektów największych, to należy podać wszystkie): 1
(a) Która obecnie wypożyczona książka jest najdłużej trzymana i przez kogo (może być kilka takich książek należy podać wszystkie)? (b) Jaki jest procent przebywania poszczególnych książek poza biblioteką? (c) Podaj numery katalogowe i tytuły pięciu (lub więcej, jeśli jest remis ) książek o największej liczbie wypożyczeń. (d) Kto czytał najdroższą książkę wydaną przed 1989 rokiem (może być kilka takich książek podaj dla wszystkich)? (e) Którzy czytelnicy wypożyczyli w tym roku najwięcej książek? 3. W bazie danych znajdują się tabele: CREATE TABLE Osoby ( id NUMERIC(5) PRIMARY KEY, nazwisko VARCHAR(20) NOT NULL, imie VARCHAR(15) NOT NULL, miasto VARCHAR(20)); CREATE TABLE Agenci ( id NUMERIC(4) PRIMARY KEY, imie VARCHAR(15) NOT NULL, nazwisko VARCHAR(20) NOT NULL); CREATE TABLE Ubezpieczenia ( polisa NUMERIC(5) PRIMARY KEY, data_od DATE NOT NULL, data_do DATE NOT NULL CHECK (data_do > data_od), wariant VARCHAR(1) NOT NULL, skladka NUMERIC(4) NOT NULL, ag_id NUMERIC(4) NOT NULL FOREIGN KEY REFERENCES(Agenci), os_id NUMERIC(5) NOT NULL FOREIGN KEY REFERENCES(Osoby)); CREATE TABLE Skladki ( ub_polisa NUMERIC(5) FOREIGN KEY REFERENCES (Ubezpieczenia), miesiac DATE, termin_platnosci DATE NOT NULL, data_oplacenia DATE, PRIMARY KEY (ub_polisa, miesiac)); Zapisz w SQL następujące polecenia: Jaka jest maksymalna liczba ubezpieczeń jednej osoby? Wypisz nazwy miast wraz z liczbą ubezpieczonych osób w każdym mieście. Wypisz łączną prowizję wszystkich agentów od osób ubezpieczonych w Warszawie. Przyjmij, że od każdej zapłaconej składki każdy agent dostaje 0.8% prowizji. Sprawdź, czy nie naliczono składek za okres nieobjęty umową ubezpieczenia. Który agent zawarł umowę ubezpieczenia o najdłuższym okresie? Który agent nie zawarł żadnego ubezpieczenia? 2
Z jakiego miasta pochodzi najwięcej ubezpieczonych? Czy wśród numerów agentów zawierających umowy ubezpieczenia występuje numer niezarejestrowany w tabeli AGENCI? Czy wszystkie osoby zarejestrowane w tabeli OSOBY są obecnie objęte ochroną w wariancie B? Którzy spośród agentów stracili klienta (następne ubezpieczenie z tą samą osobą zawarł inny agent)? W którym roku zawarto najwięcej ubezpieczeń? Czy są osoby, które były jednocześnie objęte dwoma różnymi ubezpieczeniami w tym samym wariancie? Wypisz numery polis i czas ich trwania w dniach, miesiącach i latach. Ile jest ubezpieczeń? Jaka jest największa składka ubezpieczeniowa? Kiedy była ostatnia wpłata? 4. Baza danych sklepu sportowego zawiera tabele: CREATE TABLE Producenci ( nazwa VARCHAR(30) PRIMARY KEY, adres VARCHAR(50) NOT NULL, telefon VARCHAR(15) ); CREATE TABLE Narty ( model VARCHAR(15) PRIMARY KEY, producent VARCHAR(30) NOT NULL REFERENCES Producenci, typ VARCHAR(15), przeznaczenie VARCHAR(20), cena INTEGER NOT NULL ); Należy zapisać w SQL następujące zapytania: (a) Podaj nazwy i adresy producentów, wytwarzających co najmniej dwa różne typy nart o tym samym przeznaczeniu. (b) Podaj nazwę i telefon producenta wytwarzającego najdroższe narty. (c) Podaj te typy nart, które są wytwarzane przez wszystkich producentów. 5. W alpinistycznej bazie danych znajdują się tabele: CREATE TABLE Szczyt ( nazwa VARCHAR(15) PRIMARY KEY, gory VARCHAR(10) CHECK (gory IN ( Himalaje, Tatry, Alpy, Andy )), szerokosc_geo CHAR(4) NOT NULL, dlugosc_geo CHAR(4) NOT NULL, wysokosc NUMERIC(4) NOT NULL); 3
CREATE TABLE Droga ( nazwa VARCHAR(20) PRIMARY KEY, szczyt VARCHAR(15) REFERENCES Szczyt, trudnosc NUMERIC(2)); CREATE TABLE Zdobywca ( nazwisko VARCHAR(20), droga VARCHAR(15) REFERENCES DROGA, data DATE NOT NULL, PRIMARY KEY (nazwisko, droga)); Zakładamy, że długość i szerokość geograficzna są podane z dokładnością do pięciu stopni w postaci 35N lub 22W, gdzie litera wskazuje półkulę. Zakładamy także, że dla każdego szczytu istnieje w bazie co najmniej jedna droga. Zapisz w SQL następujące polecenia: (a) Wypisz wszystkie szczyty wraz z najtrudniejszymi drogami i ich pierwszymi zdobywcami, o ile istnieją. (b) Wypisz szerokość geograficzną, występującą przy największej liczbie ośmiotysięczników. (c) Sprawdź, czy istnieją i podaj niezdobyte drogi. (d) Wypisz zdobywców, którzy zdobyli najwięcej szczytów w Tatrach. 6. Baza danych zawiera tabele Gatunki(gatunek, kontynent) kluczem jest gatunek (zakłada się, że każdy gatunek pochodzi z dokładnie jednego kontynentu); Zwierzaki(imie, gatunek, waga) kluczem jest imie. Zrealizuj w postaci zapytania SQL następujące polecenia: (a) Dla każdego gatunku podaj wagę najcięższego zwierzaka. (b) Podaj kontynenty, z których mamy co najmniej 7 zwierzaków. (c) Dla każdego kontynentu podaj gatunki, w których występują zwierzaki ważące więcej, niż średnia waga zwierzaków z tego kontynentu. 7. Baza danych zawiera tabele: Gatunki(nazwa, kontynent, chroniony, lubi): kluczem jest nazwa, Zwierzaki(imię, gatunek, płeć, wiek, waga, wybieg): kluczem jest imię, zaś gatunek kluczem zewnętrznym do Gatunki. Należy zapisać w SQL następujące zapytania: (a) Dla każdego gatunku podaj najmłodsze zwierzaki (ich imiona). (b) Ile mamy zwierzaków z tego samego kontynentu co niedźwiedź Kropka? (c) Dla każdego kontynentu podaj trzy najcięższe zwierzaki z tego kontynentu (jego wagę, imię i gatunek). (d) Dla każdego kontynentu podaj cztery najlżejsze zwierzaki z tego kontynentu (jego wagę, imię i gatunek). 4
(e) Podaj średnią liczbę zwierzaków dla gatunków chronionych. (f) Podaj średnią liczbę zwierzaków z kontynentu. 8. Baza danych o sprzęcie komputerowym zawiera następujące tabele Produkt(producent, model) PC(model, szybkość, ram, hd, cd, cena) Laptop(model, szybkość, ram, hd, ekran, cena) Drukarka(model, kolor, typ, cena) gdzie ram podaje rozmiar pamięci w MB, hd pojemność dysku w GB, cd szybkość czytnika CD-ROM, zaś ekran rozmiar ekranu. Zrealizuj w SQL następujące zapytania: (a) Podaj te rozmiary twardego dysku, które występują co najmniej w dwóch pecetach. (b) Kto produkuje komputer (pecet lub laptop) o największej dostępnej szybkości? 9. Spedycyjna kolejowa baza danych zawiera tabele: Pociąg(nazwa, stacja, kierownik) : kluczem jest nazwa, Wagon(numer, pociąg, typ, producent, ładowność) : kluczem jest numer, zaś pociąg kluczem zewnętrznym do Pociąg. Należy zapisać w SQL następujące zapytania: (a) Podaj nazwy pociągów, które zawierają co najmniej dwa różne typy wagonów od tego samego producenta. (b) Podaj kierownika pociągu zawierającego wagon o największej ładowności. (c) Podaj te typy wagonów, które znajdują się we wszystkich pociągach. 10. Tabela Spółki (definicja poniżej) zawiera w każdym wierszu w kolumnie Wkład kwotę wpłaconą przez podanego udziałowca na fundusz podanej spółki. CREATE TABLE Spolki ( Udzialowiec VARCHAR(35), Spolka VARCHAR(20), Wklad NUMERIC(8) NOT NULL CHECK (Wklad > 0), PRIMARY KEY (Udzialowiec, Spolka)); Kapitałem spółki nazywamy sumę wkładów wszystkich jej udziałowców. Na zebraniu wszystkich udziałowców dowolnej spółki każdy udziałowiec ma procent głosów równy stukrotnemu ilorazowi swojego wkładu i kapitału tej spółki. (a) Utwórz perspektywę Udziały zawierającą oprócz wszystkich kolumn tabeli Spółki jeszcze następujące kolumny: ProcentGłosów (danego udziałowca w danej spółce) oraz SpółkaZależna, w której występuje TAK gdy ProcentGłosów jest większy od 50, zaś NIE w przeciwnym przypadku. (b) Utwórz perspektywę Kapitały z kolumnami Spółka, SumaWkładów podającą wartości sum wkładów (kapitały) poszczególnych spółek. 5
Portfelem inwestora (udziałowca) nazywamy sumę jego wkładów we wszystkich spółkach. (a) Utwórz perspektywę Inwestycje zawierającą oprócz wszystkich kolumn tabeli Spółki jeszcze następujące kolumny: ProcentWPortfelu (danego wkładu w całym portfelu udziałowca) oraz SpółkaUlubiona, w której występuje TAK gdy ProcentWPortfelu jest większy od 50, zaś NIE w przeciwnym przypadku. (b) Utwórz perspektywę Portfele z kolumnami Udziałowiec, SumaWkładów podającą wartości sum wkładów (portfele) poszczególnych inwestorów. 2 Normalizacja (a) Dana jest tabela o schemacie z następującymi zależnościami: R(A, B, C, D, E, F ) BC D, BCD E, BE F i. Podaj wszystkie klucze tej tabeli. (b) Dana jest tabela Katalog o schemacie z następującymi zależnościami: Katalog(numer, nazwa, typ, klasa, upust, cena) nazwa typ klasa nazwa klasa upust typ upust cena i. Podaj wszystkie klucze tej tabeli. (c) Dany jest schemat relacji R = {A, B, C, D, E} z następującym zbiorem zależności funkcyjnych: BC D BCD E E D Podaj wszystkie klucze i sprowadź ten schemat do trzeciej postaci normalnej. (d) Dana jest tabela o schemacie z następującymi zależnościami: R(A, B, C, D, E, F ) A B, B C, E F, F E, EC D i. Podaj wszystkie klucze tej tabeli. (e) Dany jest schemat relacji R(A,B,C,D,E) z następującym zbiorem zależności funkcyjnych: 6
AB C DE C B D Podaj wszystkie klucze i sprowadź ten schemat do trzeciej postaci normalnej. (f) Dany jest schemat relacji R(A,B,C,D,E) z następującym zbiorem zależności funkcyjnych: AB C C D D B D E Podaj wszystkie klucze i sprowadź ten schemat do trzeciej postaci normalnej. (g) Dana jest tabela o schemacie z następującymi zależnościami: R(A, B, C, D, E, F ) A B, AB C, E F, F D E i. Podaj wszystkie klucze tej tabeli. (h) Rozważmy tabelę o schemacie R(A, B, C, D, E, F ) z następującymi zależnościami: AB C, AD E oraz CE F. i. Podaj wszystkie klucze tej relacji. (i) Rozważmy tabelę o schemacie R(A, B, C, D, E) z następującymi zależnościami: AB C, C D, C E, D A oraz E B. i. Podaj wszystkie klucze tej relacji. (j) Rozważmy tabelę o schemacie R(A, B, C, D, E, F ) z następującymi zależnościami: AB CE, C D, CD E. i. Podaj wszystkie klucze tej relacji. (k) Dany jest schemat relacji R(A, B, C, D, E) z następującym zbiorem zależności funkcyjnych: AB C DE C B D Podaj wszystkie klucze i sprowadź ten schemat do trzeciej postaci normalnej. (l) Dana jest tabela o schemacie z następującymi zależnościami: R(A, B, C, D, E, F ) BC D, BD E, CE F 7
i. Podaj wszystkie klucze tej tabeli. (m) Dana jest tabela R z atrybutami A,B,C,D,E i zależnościami funkcyjnymi A B C D BD E E C Odpowiedz na następujące pytania. i. Ile kluczy ma tabela R? Podaj je. ii. Które z podanych zależności naruszają postać normalną Boyce a-codda (BCNF)? iii. Które z podanych zależności naruszają trzecią postać normalną (3NF)? (n) Dana jest tabela R z atrybutami A,B,C,D,E,F i zależnościami funkcyjnymi A B B C E F F E i. Podaj wszystkie klucze tej tabeli. ii. Czy któreś z podanych zależności naruszają trzecią postać normalną (3NF)? Jeśli tak, to dokonaj dekompozycji na trzecią postać normalną. (o) W bazie danych znajdują się tabele Sklepy oraz Towary Sklep Miasto Towar-1 Towar-2 Towar-3 Towar-4 Bobas Kraków Smoczek Pieluszka null null.................. Towar Cena Dostawca Adres Smoczek 1 Superpol Warszawa............ Należy ją przekształcić do 3 postaci normalnej (podając skrypt SQL) uwzględniając podane poniżej zależności funkcyjne: Sklep Miasto Towar Cena Dostawca Dostawca Adres Następnie należy napisać zapytanie podające w ilu sklepach sprzedawane są towary dostawców z Krakowa. 8
3 ERD (a) Na podstawie podanego diagramu ERD napisac polecenia SQL tworzące odpowiednią bazę danych. Osoba # id * imię * nazwisko o PESEL o data urodzenia o dowód o płeć ubezpieczony ubezpieczający dla zawarta przez Polisa # numer * typ * data zawarcia * początek ochrony * koniec ochrony * suma Wiadomo, że: Dla każdej osoby musi być znany numer PESEL lub numer dowodu. Istnieją trzy typu ubezpieczeń: wyjazdowe, życiowe, komunikacyjne. W ubezpieczeniu komunikacyjnym może być ubezpieczona tylko jedna osoba. Minimalny okres ochrony to 3 tygodnie. Uwaga: Pamiętaj o więzach integralności im będzie ich więcej i sensowniejsze tym lepiej. Zastosuj swoją wiedzę i doświadczenie w zakresie ubezpieczeń (lub zdrowy rozsądek. Typy kolumn dobierz według własnego uznania (własne uznanie też punktujemy. (b) Rozważmy bazę danych warsztatu samochodowego, zawierającą informacje o wykonywanych naprawach. Warsztat naprawia samochody klientom (klient może posiadać kilka samochodów). Każda naprawa wymaga użycia pewnych części, opisanych w cenniku. W skład kosztu naprawy wchodzi też robocizna. Niektóre naprawy są skutkiem reklamacji dotyczącej poprzednio wykonanej naprawy, więc sa wykonywane bezpłatnie. Zaproponuj bazę danych dla takiej firmy (w postaci diagramu związków-encji) i podaj polecenia SQL tworzące taką bazę. Pamiętaj o warunkach integralności im więcej i sensownych ich będzie tym lepiej. (c) Kolejowa baza danych ma zawierać informacje pociągach i stacjach. Pociągi bywają osobowe albo pośpieszne, każdy z nich ma unikalny numer (lub jak kto woli nazwę), kierownika i trasę. Trasa pociągu to lista stacji, na których pociąg zatrzymuje się. Dla każdej stacji podany jest czas odjazdu/przyjazdu. Stacje dzielą się na lokalne i węzłowe. Pociągi powinny rozpoczynać i kończyć bieg na stacjach węzłowych. Pociągi pośpieszne zatrzymują się wyłącznie na stacjach węzłowych, lokalne na każdej stacji. Polecenia: Wykonaj model danych w postaci diagramu związków-encji oraz dodatkowych założeń, których nie da się wyrazić diagramem. Według stworzonego modelu zaimplementuj bazę danych w SQL, podając ciąg poleceń tworzących ją. 9
Uwagi: Zakładamy na początek, że nie są dostępne informacje geograficzne o położeniu stacji. Potem można dołożyć informacje o bezpośrednim sąsiedztwie i weryfikować trasy. Pamiętaj o kontroli poprawności. Brakującą informację (np. typy kolumn) uzupełnij zgodnie ze zdrowym rozsądkiem (zdrowy rozsądek też punktujemy ;-). (d) W Urzędzie Pracy jest potrzebna baza danych dotycząca dostępnych miejsc pracy oraz bezrobotnych. Dane opisujące miejsca pracy powinny obejmować dane pracodawcy, stanowisko i liczbę wolnych etatów oraz wymagane kwalifikacje (czyli wykształcenie). Dane bezrobotnego powinny obejmować personalia, wykształcenie oraz dotychczas zajmowane stanowiska. Jeden pracodawca może oferować wiele stanowisk i wiele etatów na danym stanowisku. Bezrobotny może być zatrudniony na stanowisku uprzednio przez siebie zajmowanym albo zgodnie z wykształceniem. Polecenia: Wykonaj model danych w postaci diagramu związków-encji oraz spisu dodatkowych założeń, których nie da się wyrazić diagramem. Według stworzonego modelu zaimplementuj bazę danych w SQL, podając ciąg poleceń tworzących ją. Uwagi: Zakładamy, że bezrobotni są obywatelami polskimi. Pamiętaj o kontroli poprawności. Brakującą informację (np. typy kolumn) uzupełnij zgodnie ze zdrowym rozsądkiem (zdrowy rozsądek też punktujemy ;-). 4 Wyzwalacze i PL/SQL (a) W tym zadaniu korzystać będziemy z bazy danych o następującym schemacie : CREATE TABLE Pracownik ( pesel CHAR(11) PRIMARY KEY, imie VARCHAR(20) NOT NULL, nazwisko VARCHAR(20) NOT NULL); CREATE TABLE Kurs ( numer NUMERIC(5) PRIMARY KEY, prowadzacy CHAR(11) REFERENCES Pracownik, nazwa VARCHAR(20) NOT NULL, data DATE NOT NULL); CREATE TABLE Uczestnik ( pesel CHAR(11) REFERENCES Pracownik, numer NUMERIC(5) REFERENCES Kurs, PRIMARY KEY (pesel, numer)); 10
Zrealizuj w PL/SQL następujące warunki poprawności: i. Nikt nie może byc równocześnie prowadzącym i uczestnikiem tego samego kursu. ii. Nikt nie może być uczestnikiem dwóch kursów odbywających się w tym samym dniu. iii. Uczestnikiem kursu o danej nazwie mozna być tylko raz. iv. Nie można być uczestnikiem kursu (o danej nazwie), dla którego było się wcześniej prowadzącym. (b) W tym zadaniu korzystać będziemy z bazy danych o następującym schemacie: CREATE TABLE Samochody ( nrrej CHAR(10) PRIMARY KEY, wlasciciel VARCHAR(30) NOT NULL, typ CHAR(1) CHECK (typ IN ( o, c )), miasto VARCHAR(20)); CREATE TABLE Ubezpieczenia ( polisa NUMERIC(5) PRIMARY KEY, data_od DATE NOT NULL, data_do DATE NOT NULL, limit NUMERIC(8) NOT NULL, auto CHAR(10) NOT NULL REFERENCES Samochody); CREATE TABLE Odszkodowania ( polisa NUMERIC(5) REFERENCES Ubezpieczenia, kwota NUMERIC(8), data DATE, PRIMARY KEY (polisa, data)); Zrealizuj następujące warunki poprawności: i. Daty wypłat odszkodowań powinny zawierać się w okresie obowiązywania ubezpieczenia. ii. Suma wypłat odszkodowań dla danego ubezpieczenia nie może przekroczyć jego limitu. Fakt odmowy wypłaty odszkodowania należy odnotować w dodatkowej tabeli (którą trzeba utworzyć). (c) W tym zadaniu korzystać będziemy z bazy danych o następującym schemacie: CREATE TABLE Lekarze ( numer NUMERIC(5) PRIMARY KEY, nazwisko VARCHAR(20) NOT NULL, imie VARCHAR(15) NOT NULL, miasto VARCHAR(20)); CREATE TABLE Pacjenci ( pesel NUMERIC(11) PRIMARY KEY, nazwisko VARCHAR(20) NOT NULL, imie VARCHAR(15) NOT NULL, limit NUMERIC(8) NOT NULL)); CREATE TABLE Zabiegi ( pacjent NUMERIC(11) REFERENCES Pacjenci, lekarz NUMERIC(5) REFERENCES Lekarze, 11
data DATE, krytyczny CHAR(3) NOT NULL CHECK (krytyczny IN ( tak, nie )); koszt NUMERIC(8) NOT NULL, PRIMARY KEY (pacjent, lekarz, data)); Zrealizuj następujące warunki poprawności: i. Lekarz nie może przeprowadzać więcej niż 6 zabiegów dziennie. ii. Sumaryczny roczny koszt zabiegów dla danego pacjenta nie może przekroczyć jego limitu świadczeń, chyba że zabieg jest krytyczny. Fakt odmowy wykonania zabiegu należy odnotować w dodatkowej tabeli (którą trzeba utworzyć). (d) Baza danych zawiera tabele: Komputer(producent, model, typ), PC(model, szybkość, ram, dysk, cdrom, cena), Laptop(model, szybkość, ram, dysk, ekran, cena). Zdefiniuj następujące ograniczenia: Komputery PC o szybkości mniejszej niż 150 MHz nie mogą być sprzedawane drożej niż za 2500 złotych lub muszą mieć co najmniej 64 MB pamięci RAM. Laptopy o ekranie mniejszym niż 11 cali, które nie mają dysku co najmniej 1GB, są sprzedawane poniżej 36000 złotych. (e) Baza danych zawiera tabele: Komputer(producent, model, typ), PC(model, szybkość, ram, dysk, cdrom, cena), Laptop(model, szybkość, ram, dysk, ekran, cena). Zdefiniuj następujące ograniczenie: Żaden laptop nie może być sprzedawany taniej niż PC o tej samej lub mniejszej szybkości i pamięci RAM. 12