Kto pod kim dołki kopie, ten się zmęczy.
DML - Łączenie tabel bazy
  |   JOIN  |   UNION  |  

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);
« wstecz   dalej »