Klauzula JOIN
W poleceniu SELECT możesz użyć jednej z poniższych składni klauzuli JOIN:
przy czym tabela zdefiniowane jest następująco:
nazwa_tabeli [[AS] alias]
[USE INDEX (lista_kluczy)]
[IGNORE INDEX (lista_kluczy)]
natomiast warunek_złączenia jako
Druga z pokazanych wyżej składni LEFT OUTER JOIN istnieje tylko ze względu na zgodność ze standardem ODBC.
- Odwołaniu do tabeli można nadać inną nazwę (alias) za pomocą składni
nazwa_tabeli AS alias_nazwy
lub nazwa_tabeli alias_nazwy:
SELECT t1.name, t2.salary FROM employee AS t1,
info AS t2
WHERE t1.name = t2.name;
INNER JOIN i , (przecinek) są równoważne. Oba dokonują pełnego złączenia wymienionych tabel.
Zazwyczaj sposób łączenia podaje się w wyrażeniach warunkowych klauzuli WHERE.
- Warunek
ON jest dowolnym wyrażeniem warunkowym, które może być użyte w klauzuli WHERE.
- Jeżeli nie ma pasujących wierszy dla tabeli o nazwie stojącej po prawej stronie części
ON lub USING
klauzuli LEFT JOIN, stosowany jest wiersz z wartościami wszystkich kolumn ustawionymi na NULL.
Można to wykorzystać do znalezienia wszystkich rekordów w tabeli, które nie mają swoich odpowiedników w innej tabeli:
SELECT tabela1.* FROM tabela1
LEFT JOIN table2 ON tabela1.id = tabela2.id
WHERE tabela2.id IS NULL; Przykład ten znajduje wszystkie wiersze w tabeli1 z takimi wartościami pola id, które nie występują
w tabeli2 (tzn. wszystkie wiersze w tabeli1 bez odpowiedników w tabeli2).
Oczywiście przyjmujemy, że pole table2.id jest zadeklarowane jako NOT NULL.
- Klauzula
USING (lista_kolumn) wymienia kolumny, które muszą znaleźć się w obu tabelach.
Klauzula USING zdefiniowana:
A LEFT JOIN B USING (C1, C2, C3,...)
jest semantycznie identyczna z następującym wyrażeniem ON:
A.C1 = B.C1 AND A.C2 = B.C2 AND A.C3 = B.C3, ...
- Wyrażenie złączenia dwóch tabel za pomocą
NATURAL [LEFT] JOIN jest semantycznym ekwiwalentem wyrażenia
INNER JOIN lub LEFT JOIN z klauzulą USING wskazującą wszystkie kolumny istniejące
w obu tabelach.
RIGHT JOIN działa przeciwnie do LEFT JOIN. Aby zachować przenośność kodu pomiędzy różnymi bazami
danych zaleca się stosowanie LEFT JOIN zamiast RIGHT JOIN.
STRAIGHT_JOIN jest identyczne z JOIN z wyjątkiem tego, że lewa tabela jest zawsze wczytywana
przed tabelą prawą. Może to być wykorzystane w tych przypadkach, kiedy optymalizator join umieszcza tabele w niewłaściwym
porządku.
- Można wskazać, których indeksów należy używać przy pobieraniu danych z tabeli. Jest to użyteczne, jeżeli polecenie
EXPLAIN pokazuje, iż program stosuje nie te indeksy, co trzeba. Przez podanie klauzuli
USE INDEX (lista_kluczy) można nakazać użycia tylko wyznaczonych indeksów. Przeciwieństwem jest klauzula
IGNORE INDEX (lista_kluczy) zakazująca stosowania określonych indeksów.
Kilka przykładów:
SELECT * FROM tabela1,tabela2 WHERE tabela1.id=tabela2.id;
SELECT * FROM tabela1 LEFT JOIN tabela2 ON tabela1.id=tabela2.id;
SELECT * FROM tabela1 LEFT JOIN tabela2 USING (id);
SELECT * FROM tabela1 LEFT JOIN tabela2 ON tabela1.id=tabela2.id
LEFT JOIN tabela3 ON tabela2.id=tabela3.id;
SELECT * FROM tabela1 USE INDEX (key1,key2)
WHERE key1=1 AND key2=2 AND key3=3;
SELECT * FROM tabela1 IGNORE INDEX (key3)
WHERE key1=1 AND key2=2 AND key3=3;
Klauzula UNION
SELECT ...
UNION [ALL | DISTINCT]
SELECT ...
[UNION [ALL | DISTINCT]
SELECT ...]UNION jest używane do połączenia wielu instrukcji SELECT w jednym zestawieniu wynikowym.
Odpowiadające sobie kolumny we wszystkich instrukcjach SELECT muszą być tego samego typu.
Jako nazwy kolumn używane są nazwy użyte w pierwszej instrukcji SELECT.
Klauzula INTO OUTFILE może wystąpić tylko przy ostatniej instrukcji SELECT.
Jeżeli nie użyjesz słowa kluczowego ALL, to domyślnie przyjmowane jest DISTINCT co oznacza,
że w wyniku nie pojawią się zdublowane wiersze. Jeżeli użyjesz słowa kluczowego ALL choćby dla jednej klauzuli
UNION, to będzie ona użyta dla wszystkich pozostałych.
Klauzule ORDER BY i LIMIT - o ile muszą być użyte - powinny wystąpić tylko przy ostatniej
instrukcji SELECT, a każda z instrukcji powinna byc zamknięta nawiasami, np.:
(SELECT a FROM tabela WHERE a=10 AND b=1)
UNION
(SELECT a FROM tabela WHERE a=11 AND b=2)
ORDER BY a LIMIT 10;
Klauzula ORDER BY nie może zawierać pół z nazwami tabel. Jeżeli jest to konieczne, to należy używać aliasów
kolumn lub ich pozycji na liście. Nazwy użyte w klauzuli ORDER BY muszą pochodzić z pierwszej instrukcji
SELECT.
Możesz również użyć klauzul ORDER BY i/lub LIMIT dla każdej instrukcji SELECT:
(SELECT a FROM tabela WHERE a=10 AND b=1 ORDER BY a LIMIT 10)
UNION
(SELECT a FROM tabela WHERE a=11 AND b=2 ORDER BY a LIMIT 10);