MySQL - relacje.

Antoni Kwapisz
05.09.2015

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.

#1 Produkt kartezjański


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.

#2 Joins

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

#3 BONUS: Aliasy

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.

Zgłoś swój pomysł na artykuł

Więcej w tym dziale Zobacz wszystkie