Złączenia tabel – ćw. trochę bardziej zaawansowane
Transkrypt
Złączenia tabel – ćw. trochę bardziej zaawansowane
Bazy danych (3) Złączenia tabel – ćw. trochę bardziej zaawansowane 1. Wypisz identyfikatory i nazwiska opiekunów oraz liczbę zwierząt, którymi każdy z nich się opiekuje. Spróbujmy zbudować to zapytanie krok po kroku. Po pierwsze: należy się zorientować, w których tabelach występują dane, które chcemy zwrócić w zapytaniu. • Potrzebujemy identyfikatory i nazwiska opiekunów i dane o zwierzakach, którymi dany opiekun się opiekuje. • Identyfikatory i nazwiska opiekunów znajdują się w tabeli Opiekunowie. W zapytaniu na pewno będziemy musieli uwzględnić tę tabelę. Niestety, nie ma w niej nic o zwierzakach. • Informacje o zwierzakach znajdziemy w tabeli Zwierzeta. Jest tu również kolumna id_opiekuna, informująca o tym, który opiekun ma pod swoją pieczą dane zwierzątko. • Wiemy już, że konstruując zapytanie musimy wyciągnąć dane z tabel Opiekunowie i Zwierzeta. Po drugie: konstrukcję zapytania rozpocznijmy od fragmentu mówiącego o tym, w jaki sposób połączyć tabele. Wiemy, że łączymy tabele Opiekunowie i Zwierzeta. Wiemy, że w tabeli Zwierzeta znajduje się kolumna id_opiekuna, a w tabeli Opiekunowie jest kolumna id. Musimy ułożyć fragment zapytania mówiący coś takiego: „Połącz tabele Opiekunowie i Zwierzeta w taki sposób, że kolumna id z tabeli Opiekunowie jest równa kolumnie id_opiekuna z tabeli Zwierzeta.” W SQL-u ten fragment wygląda następująco: Opiekunowie JOIN Zwierzeta ON Opiekunowie.id=Zwierzeta.id_opiekuna Jeśli w łączonych tabelach występują kolumny o tej samej nazwie, to należy poprzedzić nazwę tej kolumny nazwą tabeli, z której ta kolumna pochodzi (w przeciwnym przypadku nie wiadomo o która kolumną nam chodzi). Możemy skrócić ten fragment nadając nowe nazwy tabelom, w następujący sposób: Opiekunowie AS o JOIN Zwierzeta AS z ON o.id=z.id_opiekuna W ten sposób tabele Opiekunowie i Zwierzeta nazywamy odpowiednio o i z. W pozostałych fragmentach zapytania możemy odwoływać się do nich właśnie w taki uproszczony sposób. Wskazówka: staraj się zawsze skracać nazwy tabel w ten sposób. To zdecydowanie przyspiesza pisanie zapytań. Po trzecie: wracamy do początku zapytania. Zastanówmy się teraz, które kolumny wyświetlimy z tych dwóch tabel. Na pewno potrzebujemy dane z kolumn id i nazwisko z tabeli Opiekunowie. Zapytanie rozpocznie się więc w następujący sposób: SELECT o.id, nazwisko Potrzebujemy też jeszcze liczbę zwierzaków. Skorzystajmy więc z funkcji COUNT i policzmy na przykład liczbę wszystkich wierszy z następującego zapytania: SELECT o.id, nazwisko, COUNT(*) FROM Opiekunowie AS o JOIN Zwierzeta AS z ON o.id=z.id_opiekuna Zapytanie jest już prawie gotowe. A wiadomo jak to jest z „prawie”… Po czwarte: musimy policzyć liczbę zwierząt dla każdego opiekuna osobno. To, co ułożyliśmy do tej pory, zwróci nam tylko ogólną liczbę zwierząt, a dokładniej liczbę rekordów z połączonych tabel Opiekunowie i Zwierzeta. Musimy rozbić te nasze zwierzątka na pewne zbiory – zwierzaki pierwszego opiekuna trafiają do jednego worka, zwierzaki drugiego do innego worka itd. Robimy to korzystając z funkcji GROUP BY. Pozostaje pytanie po jakich kolumnach grupować. Grupujemy zawsze po wszystkich kolumnach występujących po słowie SELECT, które nie znajdują się wewnątrz żadnej funkcji agregującej (przypomnij sobie uwagę na początku drugiej strony w materiałach z poprzednich zajęć). W naszym przypadku musimy grupować po kolumnach o.id oraz nazwisko. Ostateczna wersja zapytania wygląda następująco: Bazy danych (3) SELECT o.id, nazwisko, COUNT(*) FROM Opiekunowie AS o JOIN Zwierzeta AS z ON o.id=z.id_opiekuna GROUP BY o.id, nazwisko; Staraj się postępować według opisanych kroków, a z konstrukcją skomplikowanych zapytań nie będziesz mieć większych problemów. Łączenie trzech lub więcej tabel Łączenie dwóch tabel jest proste. Łączenie trzech lub więcej tabel jest niemal równie proste, za to znacznie częściej spotykane. 2. Wypisz imiona zwierzaków oraz nazwy ich rodzajów. Po pierwsze: potrzebujemy imiona zwierzaków i nazwy rodzajów. • Te pierwsze znajdziemy w tabeli Zwierzeta (kolumna imie). • Te drugie mamy w tabeli Rodzaje (kolumna nazwa). Niestety, w tabeli Rodzaje nie ma nic o zwierzętach, a z tabeli Zwierzęta nie ma żadnej kolumny mówiącej o rodzajach. Musimy znaleźć jaką dodatkową tabelę, która połączy tabele Zwierzeta i Rodzaje. Spójrzmy na tabelę Zwierzeta. Mamy tu kolumnę id_gatunku, której wartości wskazują na odpowiednie rekordy z tabeli Gatunki. W tabeli Gatunki z kolei mamy kolumnę id_rodzaju, wskazującą na rekordy z tabeli Rodzaje. Bingo! Tabele Zwierzeta i Rodzaje połączymy pośrednio za pomocą tabeli Gatunki. Możemy wyobrazić sobie następujące rozumowanie: „skoro Tuptuś jest żółwiem (na to wskazuje wartość kolumny id_gatunku z tabeli Zwierzeta), a żółwie są gadami (na co wskazuje wartość kolumny id_rodzaju z tabeli Gatunki), to Tuptuś musi być gadem!”. Z tabeli Gatunki nie będziemy wyświetlać żadnej kolumny, ale musimy ją uwzględnić w naszym zapytaniu, żeby połączyć tabele Zwierzeta i Rodzaje. Po drugie: zaczynamy znów od łączenia tabel. Powtórzmy: łączymy tabele Zwierzeta, Gatunki i Rodzaje. Zacznijmy od połączenia dwóch pierwszych tabel (zwróćcie uwagę, że słowo AS można pominąć, dzięki czemu otrzymamy jeszcze krótsze zapytanie): Zwierzeta z JOIN Gatunki g ON z.id_gatunku=g.id Teraz połączmy to jeszcze z tabelą Rodzaje: Zwierzeta z JOIN Gatunki g ON z.id_gatunku=g.id JOIN Rodzaje r ON g.id_rodzaju= r.id W ten sposób połączyliśmy trzy tabele. Po trzecie: tak jak w poprzednim przykładzie, wracamy do początku zapytania. Chcemy wyświetlić imiona zwierząt (czyli kolumna imie z tabeli Zwierzeta) oraz nazwy rodzajów (kolumna nazwa z tabeli Rodzaje). Ponieważ w tabeli Gatunki również znajduje się kolumna nazwa, musimy wyraźnie zaznaczyć w zapytaniu, która kolumna nas interesuje: SELECT imie, r.nazwa FROM Zwierzeta z JOIN Gatunki g ON z.id_gatunku=g.id JOIN Rodzaje r ON g.id_rodzaju= r.id; Po czwarte: nie, tym razem to już koniec. Żadnego grupowania, żadnego warunku WHERE, zapytanie jest gotowe. Uwaga. Projektując bazę danych sami planujemy rozbicie danych na odpowiednie tabele. Dlatego też później zwykle doskonale wiemy, w jaki sposób łączą się one ze sobą, tzn. jakie związki zachodzą między encjami, którą każda z tych tabel reprezentuje. Jeśli rozpoczynamy prace na gotowej bazie danych, zaprojektowanej przez kogoś innego, należy uważnie prześledzić wszystkie klucze obce zdefiniowane w tej bazie lub przestudiować dołączony diagram związków encji (entity relationship diagram – ERD). Bazy danych (3) Do przećwiczenia w domu: 1. Wypisz imiona, nazwiska osób, nazwy piw oraz to, czy dana osoba lubi czy nie lubi tego piwa (połącz tabele Osoby, Preferencje i Piwa). 2. Jw. ale wypisz tylko te piwa, które są lubiane. 3. Jw. ale dla każdej osoby wypisz tylko liczbę piw, które lubi. 4. Jw. ale dla każdej osoby wypisz liczbę piw, które lubi oraz liczbę piw, które nie lubi. 5. Wypisz nazwy piw oraz liczbę osób, które to piwo lubią. Posortuj (malejąco) po liczbie lubiących dane piwo. 6. Wypisz nazwy piw oraz liczbę osób, które to piwo nie lubią. Posortuj (malejąco) po liczbie nie lubiących dane piwo. 7. Wyświetl ilu piwoszy bywa w każdym z barów. 8. Wyświetl cenę piwa Tyskie w każdym z barów (jeśli jest sprzedawane). 9. Wyświetl ceny wszystkich lanych piw sprzedawanych w pubach (wraz z informacją jakie piwo i w którym pubie). 10. Dla każdego pubu wyświetl browary, z których są sprzedawane w tym barze piwa. 11. Zapoznać się z bazą danych mebelek.db umieszczoną na stronie naszego przedmiotu.