Jak słowo daję na te przywitania pomysły mi się kończą ^^. Dziś postanowiłem nieco napisać o relacjach w bazie danych MySQL, czyli join(t)y i nie join(t)y. Co to jest relacja? Relacją nazywamy współdziałanie dwóch oddzielnych tabel, jednocześnie zależnych od siebie w jakimś stopniu.
Zakładając, że mamy:
#users
id | name | flat
1 | Joe | 3
2 | Harry | 4
#cities
id | location
1 | Kraków
2 | Warszawa
3 | Bydgoszcz
4 | Inowrocław
Widzimy odniesienie pola ‘flat’ z tabeli ‘users’ do id odpowiedniego rekordu z tabeli ‘cities’. Nazywa to się relacją. Korzyścią takiego rozwiązania jest dowolna zmiana nazwy miasta bez potrzeby zmiany w każdym jednym rekordzie z tabeli ‘users’. Poprzez poprawne zapytanie sql jesteśmy w stanie równie dobrze dowiedzieć się w jakim mieście dana osoba mieszka znając tylko numer rekordu z tą osobą. Jest na to parę metod.
SELECT users.name, cities.location FROM users, cities WHERE users.flat=cities.id AND users.id=1
Co zrobiliśmy? W dosłownym tłumaczeniu tego polecenia znaczy ono tyle: “WYBIERZ pole name znajdujace sie w tabeli users, pole location znajdujace sie w tabeli cities Z TABEL users, cities GDZIE pole flat z tabeli users jest rowne polu id z tabeli cities ORAZ pole id z tabelu users jest rowne 1 “. Jest to szybsza metoda niż przedstawione poniżej, co więcej oferuje ona wszystkie możliwe kombinacje wszystkich wierszy łączonych tabel.
FULL JOIN - oferuje taką samą funkcjonalność jak produkt kartezjański.
SELECT users.name, cities.location FROM users FULL JOIN cities ON users.flat=cities.id WHERE users.id=1
CROSS JOIN - j/w
SELECT users.name, cities.location FROM users CROSS JOIN cities ON users.flat=cities.id WHERE users.id=2
INNER JOIN -obie wartości pola w klauzuli WHERE muszą być takie same. Działa jak JOIN, a bez klauzuli WHERE, jak FULL JOIN.
SELECT users.name, cities.location FROM users INNER JOIN cities ON users.flat=cities.id WHERE users.id=2
LEFT JOIN - powoduje wyszukanie wszystkich pasujących do siebie wierszy z odpowiednich tabel oraz wypełnienie wierszy nie pasujących do siebie wartością ‘Null’.
SELECT users.name, cities.location FROM users LEFT JOIN cities ON users.flat=cities.id WHERE users.id=1
RIGHT JOIN - przeciwność LEFT JOIN.
SELECT users.name, cities.location FROM users RIGHT JOIN cities ON users.flat=cities.id WHERE users.id=2
Czasami zdarza nam sie, że w obydwóch tabel pola mają taką samą wartość, np. name i name. By zapobiec duplikacie należy stosować aliasy przez słowo kluczowe AS.
SELECT users.name, <span style="text-decoration: underline;">cities.location AS cityname</span> FROM users JOIN cities ON users.flat=cities.id WHERE users.id=2
Zwróci to nam: name oraz cityname.