Jakie jest domyślne zachowanie MySQL JOIN, INNER lub OUTER?

95

Szukałem więc w Internecie przez ostatnią godzinę, czytając i szukając ostatecznej odpowiedzi na to proste pytanie.

Jakie jest domyślne JOIN w MySQL?

SELECT * FROM t1 JOIN t2

Czy to to samo co

SELECT * FROM t1, t2

OR

SELECT * FROM t1 INNER JOIN t2

Również powiązane pytanie, kiedy używasz klauzul „WHERE”, czy jest to to samo, co JOIN czy INNER JOIN?

W tej chwili myślę, że samodzielne JOIN jest identyczne z używaniem przecinków i klauzul WHERE.

Quang Van
źródło

Odpowiedzi:

128

W MySQL pisanie JOINimplikacji niekwalifikowanych INNER JOIN. Innymi słowy, INNERw INNER JOINjest opcjonalne. INNERi CROSSsą synonimami w MySQL. Dla jasności napiszę JOINlub INNER JOINjeśli mam dołączyć warunek i CROSS JOINjeśli nie mam warunek.

Dozwolona składnia złączeń została opisana w dokumentacji .


W tej chwili myślę, że samodzielne JOIN to nic innego jak (identyczne) używanie przecinków i klauzul WHERE.


Efekt jest ten sam, ale historia stojąca za nimi jest inna. Składnia przecinka pochodzi ze standardu ANSI-89. Jednakże istnieje wiele problemów z tą składnią, więc w standardzie ANSI-92 zostało wprowadzone słowo kluczowe JOIN.

Zdecydowanie zalecamy, aby zawsze używać składni JOIN zamiast przecinka.

  • T1 JOIN T2 ON ...jest bardziej czytelny niż T1, T2 WHERE ....
  • Jest łatwiejszy w utrzymaniu, ponieważ relacje między tabelami i filtry są wyraźnie zdefiniowane, a nie mieszane.
  • Składnię JOIN można łatwiej przekonwertować na OUTER JOIN niż składnię z przecinkiem.
  • Mieszanie przecinka i składni JOIN w tej samej instrukcji może spowodować dziwne błędy z powodu reguł pierwszeństwa.
  • Jest mniej prawdopodobne, że przypadkowo utworzy się produkt kartezjański, używając składni JOIN ze względu na zapomnianą klauzulę join, ponieważ klauzule join są zapisywane obok złączeń i łatwo jest sprawdzić, czy ich brakuje.
Mark Byers
źródło
Świetnie, dziękuję za wyjaśnienie mi tego prostego pytania :) W przeszłości zawsze używałem przecinków + klauzule gdzie ... ale zgodnie z twoją radą będę konwertować na używanie JOIN. Dzięki
Quang Van,
Hej Mark, co masz na myśli przez połączenie JOIN i przecinków. Zapytania mieszane, takie jak ta, SELECT * FROM t1 LEFT JOIN (t2, t3, t4) ON (t2.a = t1.a AND t3.b = t1.b AND t4.c = t1.c)?
Quang Van
2
@Quang: Na przykład to się nie powiedzie:SELECT * FROM t1, t2 JOIN t3 ON t1.x=t3.y WHERE t1.a = t2.b
Oznacz Byers
0

Wszystkie są równoważne, a także równe CROSS JOIN.

Istnieją pewne różnice między używaniem przecinka i [INNER | CROSS] JOINskładni, co może być ważne podczas dołączania do większej liczby tabel. Prawie wszystko, co musisz wiedzieć, jest opisane tutaj w dokumentacji MySQLJOIN .

Mchl
źródło
1
^ --- odpowiedzią na pytanie jest JOIN (samodzielne) w zasadzie to samo co INNER i przecinek + gdzie klauzule
Quang Van