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