Tabela SPRZEDAŻ WYCIECZEK SELECT s.numer_id, s.wycieczka_id, s.operator_id, s.klient_id, s.cena_dorosla, s.cena_dzieci, s.ilosc_doroslych, s.ilosc_dzieci, s.ilosc_doroslych * s.cena_dorosla + s.ilosc_dzieci * s.cena_dzieci SUMA FROM SPRZ_WYC s, KLIENCI k UWAGA brak połączenia między tabelami Tabela SPRZEDAŻ WYCIECZEK SELECT s.numer_id, s.wycieczka_id, s.operator_id, s.klient_id, k.nazwa, k.kod_poczt, k.miasto_id, k.adres, k.telefon, s.cena_dorosla, s.cena_dzieci, s.ilosc_doroslych, s.ilosc_dzieci, s.ilosc_doroslych * s.cena_dorosla + s.ilosc_dzieci * s.cena_dzieci SUMA FROM SPRZ_WYC s, KLIENCI k WHERE s.klient_id = k.klient_id 1
Tabela SPRZEDAŻ WYCIECZEK Tabela SPRZEDAŻ WYCIECZEK SELECT s.numer_id, s.wycieczka_id, s.operator_id, s.klient_id, k.nazwa, k.kod_poczt, k.miasto_id, m.miasto, k.adres, k.telefon, s.cena_dorosla, s.cena_dzieci, s.ilosc_doroslych, s.ilosc_dzieci, s.ilosc_doroslych * s.cena_dorosla + s.ilosc_dzieci * s.cena_dzieci SUMA FROM SPRZ_WYC s, KLIENCI k, MIASTA m k.miasto_id = m.miasto_id 2
Tabela SPRZEDAŻ WYCIECZEK Tabela SPRZEDAŻ WYCIECZEK SELECT s.numer_id, s.wycieczka_id, w.termin_od, w.termin_do, w.cena_dor, w.cena_dziec, w.hotel_id, w.kraj_id, w.miasto_id, w.transport_id, w.pansion, s.operator_id, o.kod_pocz KOD_POCZ_OPER, o.nazwa NAZWA_OPERATORA, o.osoba_kont, o.miasto_id MIASTO_OPER, mo.miasto MIASTO_OPER, o.adres ADRES_OPER, s.klient_id, k.nazwa, k.kod_poczt, k.miasto_id, m.miasto, k.adres, k.telefon, s.cena_dorosla, s.cena_dzieci, s.ilosc_doroslych, s.ilosc_dzieci, s.ilosc_doroslych * s.cena_dorosla + s.ilosc_dzieci * s.cena_dzieci SUMA FROM SPRZ_WYC s, KLIENCI k, MIASTA m, OPERATORZY o, MIASTA mo, WYCIECZKI w s.operator_id = w.operator_id 3
Tabela SPRZEDAŻ WYCIECZEK Tabela SPRZEDAŻ WYCIECZEK SELECT s.numer_id, s.wycieczka_id, w.termin_od, w.termin_do, w.kraj_id, kw.kraj, w.hotel_id, h.nazwa, h.kategoria, h.l_pokoi, w.miasto_id, mw.miasto MIASTO_WYC, w.transport_id, t.transport, w.pansion, s.operator_id, o.kod_pocz KOD_POCZ_OPER, o.nazwa NAZWA_OPERATORA, o.osoba_kont, o.miasto_id MIASTO_ID_OPER, mo.miasto MIASTO_OPER, o.adres ADRES_OPER, s.klient_id, k.nazwa, k.kod_poczt, k.miasto_id, m.miasto, k.adres, k.telefon, w.cena_dor CENA_DOR_OF, w.cena_dziec CENA_DZIEC_OF, s.cena_dorosla, s.cena_dzieci, s.ilosc_doroslych, s.ilosc_dzieci, s.ilosc_doroslych * s.cena_dorosla + s.ilosc_dzieci * s.cena_dzieci SUMA FROM SPRZ_WYC s, KLIENCI k, MIASTA m, OPERATORZY o, MIASTA mo, WYCIECZKI w, TRANSPORT t, MIASTA mw, KRAJE kw, HOTELE h s.operator_id = w.operator_id and w.transport_id = t.transport_id and w.miasto_id = mw.miasto_id and w.kraj_id = kw.kraj_id and w.hotel_id = h.hotel_id 4
Tabela SPRZEDAŻ WYCIECZEK SELECT s.numer_id, s.wycieczka_id, w.termin_od, w.termin_do, kw.kraj, h.nazwa, h.kategoria, h.l_pokoi, mw.miasto MIASTO_WYC, t.transport, w.pansion, o.kod_pocz KOD_POCZ_OPER, o.nazwa NAZWA_OPERATORA, o.osoba_kont, mo.miasto MIASTO_OPER, o.adres ADRES_OPER, k.nazwa, k.kod_poczt, m.miasto, k.adres, k.telefon, w.cena_dor CENA_DOR_OF, w.cena_dziec CENA_DZIEC_OF, s.cena_dorosla, s.cena_dzieci, s.ilosc_doroslych, s.ilosc_dzieci, s.ilosc_doroslych * s.cena_dorosla + s.ilosc_dzieci * s.cena_dzieci SUMA FROM SPRZ_WYC s, KLIENCI k, MIASTA m, OPERATORZY o, MIASTA mo, WYCIECZKI w, TRANSPORT t, MIASTA mw, KRAJE kw, HOTELE h s.operator_id = w.operator_id and w.transport_id = t.transport_id and w.miasto_id = mw.miasto_id and w.kraj_id = kw.kraj_id and w.hotel_id = h.hotel_id 5
SELECT DISTINCT Do tej pory stosując polecenia SELECT na pojedynczej tabeli bez klauzuli WHERE uzyskiwaliśmy wszystkie wiersze zawarte w niej. Jeżeli w tabeli istniały dwa identyczne, jednakowe wiersze one były wyświetlane. SELECT * FROM WYKONAWCA; Możemy zauważyć, że niektórzy wykonawcy są umieszczeni w tabeli kilka razy. SELECT DISTINCT W celu ominięcia powtarzających się wierszy możemy zastosować polecenia SELECT DISTINCT * FROM WYKONAWCA; Sytuacja jest ta sama. Przyczyną jest to że WYKONAWCA_ID jest inny, niezależnie od tego czy Imię i Nazwisko wykonawcy się powtarzają dla bazy danych wiersze są różne. 6
SELECT DISTINCT Zmieniamy zapytanie i zamiast wszystkich kolumn wybieramy tylko pole IMIE_NAZWISKO. SELECT DISTINCT IMIE_NAZWISKO FROM WYKONAWCA; Stosując polecenia SELECT DISTINCT mamy możliwość uzyskać tylko jeden raz wiersze z tabeli, które zawierają nie powtarzające się dane. W tym przypadku nas interesuje wyświetlienie tylko jeden raz imię i nazwisko wykonawców, dla nas pole WYKONAWCA_ID nie jest istotne. Grupowanie Teraz chcemy uzyskać informacje ile razy dany wykonawca występuje w naszej tabeli, ile razy się powtarza informacja wprowadzona o nim. Przyjmujemy, że imię i nazwisko wykonawcy jest jednakowo wprowadzone za każdym razem, kiedy są wprowadzone dane o nim. SELECT IMIE_NAZWISKO, COUNT(*) ILE_RAZY FROM WYKONAWCA GROUP BY IMIE_NAZWISKO; lub SELECT IMIE_NAZWISKO, COUNT(IMIE_NAZWISKO) ILE_RAZY FROM WYKONAWCA GROUP BY IMIE_NAZWISKO; 7
Grupowanie 8
Grupowanie W powyższym przykładzie pole IMIE_NAZWISKO jest polem po którym zostało zrobione grupowanie. W zależności od tego, jakie dane chcemy uzyskać w wyniku zapytania, możemy wybierać między SELECT DISTINCT i GRUPOWANIA. Kolumny/ pola po których wykonujemy grupowanie określa, w jakim przekroju chcemy badać dane zjawisko, w jakich podzbiorach chcemy mieć zagregowaną informację Zadania Zaprezentować informację o hotelach, która zawiera identyfikator hotelu, nazwę kraju, nazwę miasta, nazwa hotelu, kategorię obiektu W którym mieście z hoteli przynależnej do sieci IBIS, ACCOR jest najmniej pokoi? W którym mieście z hoteli przynależnej do sieci IBIS, ACCOR jest najwięcej pokoi? Ile pokoi ma najmniejszy z oferowanych hoteli w poszczególnych krajach? Ile pokoi ma największy z oferowanych hoteli w poszczególnych krajach? Ile pokoi ma średnio hotel z grupy IBIS, ACCOR? 9
Zadania Ile pokoi ma średni hotel w poszczególnych krajach Jaka jest struktura hoteli sieci IBIS / Accor, w których państwach możemy skorzystać z ich usług? W ilu hotelach w danym mieście dysponujemy z powyżej... pokoi? W których hotelach nie ma zorganizowanych wycieczek? W których hotelach jest najwięcej zorganizowanych wycieczek? W których hotelach jest więcej zapisanych niż ilość pokoi, przejmując, że pokoje są dwuosobowe? Grupowanie SELECT s.wycieczka_id, MAX(w.TERMIN_OD) TERMIN_OD, MAX(w.TERMIN_DO) TERMIN_DO, MAX(kw.KRAJ) KRAJ, MAX(h.NAZWA) NAZWA, MAX(h.KATEGORIA) KATEGORIA, MAX(h.L_POKOI) L_POKOI, MAX(mw.MIASTO) MIASTO_WYC, MAX(t.TRANSPORT) TRANSPORT, MAX(w.PANSION) PANSION, MAX(o.KOD_POCZ) KOD_POCZ_OPER, MAX(o.NAZWA) NAZWA_OPERATORA, MAX( o.osoba_kont) OSOBA_KONT, MAX(mo.MIASTO) MIASTO_OPER, MAX(o.ADRES) ADRES_OPER, MAX(k.NAZWA) NAZWA, MAX(k.KOD_POCZT) KOD_POCZ_KL, MAX(m.MIASTO) MIASTO_KL, MAX(k.ADRES) ADRES, SUM(s.Ilosc_doroslych) Ilosc_doroslych, SUM(s.Ilosc_dzieci) Ilosc_dzieci, SUM(s.Ilosc_doroslych * s.cena_dorosla + s.ilosc_dzieci * s.cena_dzieci) SUMA FROM SPRZ_WYC s, KLIENCI k, MIASTA m, OPERATORZY o, MIASTA mo, WYCIECZKI w, TRANSPORT t, MIASTA mw, KRAJE kw, HOTELE h s.operator_id = w.operator_id and w.transport_id = t.transport_id and w.miasto_id = mw.miasto_id and w.kraj_id = kw.kraj_id and w.hotel_id = h.hotel_id GROUP BY s.wycieczka_id 10
Grupowanie SELECT s.wycieczka_id, MAX(w.TERMIN_OD) TERMIN_OD, MAX(w.TERMIN_DO) TERMIN_DO, MAX(kw.KRAJ) KRAJ, MAX(h.NAZWA) NAZWA, MAX(h.KATEGORIA) KATEGORIA, MAX(h.L_POKOI) L_POKOI, MAX(mw.MIASTO) MIASTO_WYC, MAX(t.TRANSPORT) TRANSPORT, MAX(w.PANSION) PANSION, MAX(o.KOD_POCZ) KOD_POCZ_OPER, MAX(o.NAZWA) NAZWA_OPERATORA, MAX( o.osoba_kont) OSOBA_KONT, MAX(mo.MIASTO) MIASTO_OPER, MAX(o.ADRES) ADRES_OPER, (k.nazwa) NAZWA_KL, MAX(k.KOD_POCZT) KOD_POCZ_KL, MAX(m.MIASTO) MIASTO_KL, MAX(k.ADRES) ADRES, SUM(s.Ilosc_doroslych) Ilosc_doroslych, SUM(s.Ilosc_dzieci) Ilosc_dzieci, SUM(s.Ilosc_doroslych * s.cena_dorosla + s.ilosc_dzieci * s.cena_dzieci) SUMA FROM SPRZ_WYC s, KLIENCI k, MIASTA m, OPERATORZY o, MIASTA mo, WYCIECZKI w, TRANSPORT t, MIASTA mw, KRAJE kw, HOTELE h s.operator_id = w.operator_id and w.transport_id = t.transport_id and w.miasto_id = mw.miasto_id and w.kraj_id = kw.kraj_id and w.hotel_id = h.hotel_id GROUP BY s.wycieczka_id, k.nazwa Grupowanie SELECT s.wycieczka_id, MAX(w.TERMIN_OD) TERMIN_OD, MAX(w.TERMIN_DO) TERMIN_DO, MAX(kw.KRAJ) KRAJ, MAX(h.NAZWA) NAZWA, MAX(h.KATEGORIA) KATEGORIA, MAX(h.L_POKOI) L_POKOI, MAX(mw.MIASTO) MIASTO_WYC, MAX(t.TRANSPORT) TRANSPORT, MAX(w.PANSION) PANSION, MAX(o.KOD_POCZ) KOD_POCZ_OPER, MAX(o.NAZWA) NAZWA_OPERATORA, MAX( o.osoba_kont) OSOBA_KONT, MAX(mo.MIASTO) MIASTO_OPER, MAX(o.ADRES) ADRES_OPER, (k.nazwa) NAZWA_KL, MAX(k.KOD_POCZT) KOD_POCZ_KL, MAX(m.MIASTO) MIASTO_KL, MAX(k.ADRES) ADRES, SUM(s.Ilosc_doroslych) Ilosc_doroslych, SUM(s.Ilosc_dzieci) Ilosc_dzieci, SUM(s.Ilosc_doroslych * s.cena_dorosla + s.ilosc_dzieci * s.cena_dzieci) SUMA FROM SPRZ_WYC s, KLIENCI k, MIASTA m, OPERATORZY o, MIASTA mo, WYCIECZKI w, TRANSPORT t, MIASTA mw, KRAJE kw, HOTELE h s.operator_id = w.operator_id and w.transport_id = t.transport_id and w.miasto_id = mw.miasto_id and w.kraj_id = kw.kraj_id and w.hotel_id = h.hotel_id GROUP BY CUBE (s.wycieczka_id, k.nazwa) 11