Korzystanie z więcej niż jednej tabeli
Tabela zwierze
przechowuje informacje o tym, jakie zwierzęta posiadasz. Jeżeli chciałbyś mieć także inne dane
dotyczące swoich zwierząt, takich jak różne wydarzenia w ich życiu (np. wizyta u weterynarza lub urodzenie młodych),
potrzebujesz dodatkowej tabeli. Jak powinna ona wyglądać?
- musi zawierać imię zwierzęcia żebyś wiedział, którego z nich dane zdarzenie dotyczy;
- musi mieć datę, kiedy dane zdarzenie zaszło;
- musi mieć pole do opisu zdarzenia;
- jeżeli chcesz podzielić zdarzenia na jakieś kategorie, użytecznym byłoby posiadanie pola "typ zdarzenia".
Biorąc powyższe pod uwagę, instrukcja CREATE TABLE
tworząca tabelę zdarzenia
mogłaby wyglądać następująco:
mysql> CREATE TABLE zdarzenia (imie VARCHAR(20), data DATE,
-> typ VARCHAR(15), opis VARCHAR(255));
Tak jak w przypadku tabeli zwierze
, najłatwiej jest wczytać rekordy początkowe przez utworzenie pliku tekstowego
zawierającego potrzebne informacje (z wartościami oddzielonymi tabulatorami):
Fluffy | 1995-05-15 | młode | 4: 3 samice, 1 samiec |
Buffy | 1993-06-23 | młode | 5: 2 samice, 3 samce |
Buffy | 1994-06-19 | młode | 3: 3 samice |
Chirpy | 1999-03-21 | weterynarz | złamane skrzydło |
Slim | 1997-08-03 | weterynarz | chora |
Bowser | 1991-10-12 | nowa buda | |
Fang | 1991-10-12 | nowa buda | |
Fang | 1998-08-28 | urodziny | nowa zabawka |
Claws | 1998-03-17 | urodziny | nowa klatka |
Whistler | 1998-12-09 | urodziny | 1-sze urodziny |
Wczytaj rekordy instrukcją:
mysql> LOAD DATA LOCAL INFILE "zdarzenia.txt" INTO TABLE zdarzenia;
Bazując na tym, czego nauczyłeś się tworząc zapytania dla tabeli zwierze
, teraz powinieneś być w stanie otrzymać
żądane informacje z tabeli zdarzenia
, zasady są takie same. A co zrobić, jeżeli sama tabela zdarzenia
jest niewystarczająca do odpowiedzi na jakieś pytanie?
Przypuśćmy, że chcesz poznać wiek każdego zwierzęcia, w jakim miało młode. Tabela zdarzenia
pokazuje kiedy to się stało.
Jednak aby obliczyć wiek matki, potrzebujesz jej daty urodzenia. Ponieważ ta informacja przechowywana jest w tabeli
zwierze
, musisz w swoim zapytaniu odwołać się do obu tabel:
mysql> SELECT zwierze.imie, (TO_DAYS(date) - TO_DAYS(urodzony))/365 AS wiek, opis
-> FROM zwierze, zdarzenia
-> WHERE zwierze.imie = zdarzenia.imie AND type = "młode";
+--------+------+-----------------------+
| imie | age | opis |
+--------+------+-----------------------+
| Fluffy | 2.27 | 4: 3 samice, 1 samiec |
| Buffy | 4.12 | 5: 2 samice, 3 samce |
| Buffy | 5.10 | 3: 3 samice |
+--------+------+-----------------------+
Wyjaśnijmy kilka rzeczy dotyczących powyższego zapytania:
- klauzula
FROM
zawiera dwie tabele, ponieważ nasze zapytanie musi pobrać informacje z obu;
- aby połączyć informacje z wielu tabel musisz podać sposób, w jaki rekordy z jednej tabeli mają być dopasowywane
do rekordów z drugiej; tutaj jest to bardzo proste, ponieważ obie tabele mają kolumnę
imie
, więc to zapytanie
używa klauzuli WHERE
do dopasowania rekordów obu tabelach na podstawie wartości pola imie
;
- ponieważ kolumna
imie
występuje w obu tabelach, musisz określić, która tabelę masz na myśli przy odwoływaniu
do kolumny: robi się to przez poprzedzenie nazwy kolumny nazwą tabeli.
Nie musisz mieć dwóch różnych tabel, aby wykonać łączenie. Czasami potrzebne (lub przynajmniej bardzo wygodne) jest łączenie tabeli
z nią samą, jeżeli chcesz wykonać porównanie rekordów z tabeli z innymi rekordami z tej samej tabeli. Np.: aby znaleźć parę
potencjalnych "rodziców" wśród zwierząt, możesz połączyć tabelę zwierze
z nią samą. W ten sposób znajdziesz
samice i samców tego samego gatunku:
mysql> SELECT p1.imie, p1.plec, p2.imie, p2.plec, p1.gatunek
-> FROM zwierze AS p1, zwierze AS p2
-> WHERE p1.gatunek = p2.gatunek AND p1.plec = "z" AND p2.plec = "m";
+--------+------+--------+------+---------+
| imie | plec | imie | plec | gatunek |
+--------+------+--------+------+---------+
| Fluffy | z | Claws | m | kot |
| Buffy | z | Fang | m | pies |
| Buffy | z | Bowser | m | pies |
+--------+------+--------+------+---------+
W powyższym zapytaniu użyliśmy aliasów do nazw tabel, aby odróżnić pola o identycznych nazwach z - w sumie - tej samej tabeli.