Prawo Evansa i Bjorna - jeżeli coś poszło źle, to na pewno był ktoś, kto mówił, że tak będzie.
Kurs MySQL - korzystanie z kilku tabel

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):

Fluffy1995-05-15 młode4: 3 samice, 1 samiec
Buffy1993-06-23 młode5: 2 samice, 3 samce
Buffy1994-06-19 młode3: 3 samice
Chirpy1999-03-21 weterynarzzłamane skrzydło
Slim1997-08-03 weterynarzchora
Bowser1991-10-12 nowa buda 
Fang1991-10-12 nowa buda 
Fang1998-08-28 urodzinynowa zabawka
Claws1998-03-17 urodzinynowa klatka
Whistler1998-12-09 urodziny1-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.

« wstecz   dalej »