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.

Podobne dokumenty