Różnica między JOIN a INNER JOIN

997

Oba te sprzężenia dadzą mi takie same wyniki:

SELECT * FROM table JOIN otherTable ON table.ID = otherTable.FK

vs

SELECT * FROM table INNER JOIN otherTable ON table.ID = otherTable.FK

Czy istnieje jakaś różnica między stwierdzeniami w zakresie wydajności lub w inny sposób?

Czy różni się między różnymi implementacjami SQL ?

driis
źródło
2
Zobacz to pytanie: < stackoverflow.com/questions/448023?sort=newest >
Joel Coehoorn
6
Na marginesie: CROSS JOIN jest dobrym typem łączenia (różni się od INNER JOIN).
Serge

Odpowiedzi:

1091

Są funkcjonalnie równoważne, ale INNER JOINmogą być nieco bardziej czytelne, szczególnie jeśli zapytanie zawiera inne typy łączenia (tj. LEFTLub RIGHTlub CROSS).

Blady koń
źródło
11
Czy dotyczy to wszystkich baz danych (np. SQL, postgres?) Czy ktoś zna link do dokumentacji wyjaśniającej to?
Chogg,
4
Jest to standard ANSI SQL. Zobacz więcej: contrib.andrew.cmu.edu/~shadow/sql/sql1992.txt ; en.wikipedia.org/wiki/SQL-92
Indian
14
Zapytanie jest wystarczająco jasne, pisząc DOŁĄCZ, INNER to po prostu hałas.
Ivanzinho
22
Może jestem purystą, ale myślę, że przy pisaniu SQL lepiej jest być jawnym niż niejawnym. INNER JOIN jest bardziej czytelny, szczególnie w złożonych zapytaniach.
bruceskyaus
3
@Ivanzinho: Uderzenia klawiatury nie są miarą złożoności zapytań ani złożoności programu. Rzeczywista złożoność wynika z łatwości konserwacji, gdzie czytelność odgrywa ważną rolę. Fakt, że gdy mówi INNER JOIN, możesz być pewien, co robi i że tak właśnie powinno być, podczas gdy zwykłe JOIN pozostawi ciebie, lub kogoś innego, zastanawiając się, co standard mówi o implementacji i że jest INNER / OUTER / LEFT pominięte przez przypadek lub cel.
Tuukka Haapaniemi
243

Nie, nie ma różnicy, czysty cukier syntaktyczny .

Quassnoi
źródło
21
Nie nazwałbym tego cukrem syntaktycznym. Może „domyślny” typ łączenia, „stenografia” lub „alias”.
mk12
62
W informatyce cukier składniowy jest składnią w języku programowania, który ma na celu ułatwienie czytania lub wyrażania . Uważam, że zdolność do pomijania INNERpodlega tej definicji.
Quassnoi
13
Jeśli zastosujesz definicję bardzo dosłownie, tak, ale zawsze widziałem, że jest zarezerwowana dla bardziej interesujących rodzajów składni, a nie tylko alternatywnych nazw rzeczy.
mk12
9
@Quassnoi sam fakt, że pytanie zostało zadane, pokazuje nieobecność INNER, nie ułatwia odczytania zapytania. Z tego co wiem, JOINmoże to oznaczać LEFT JOIN, że odpowiedzi nie wyjaśnią tego tutaj.
martennis
2
@Quassnoi Cytowany przez Ciebie komentarz wprowadzający wiki jest zgodny z cukrem składniowym, ale z definicji jest nieodpowiedni. Słodzenie syntaktyczne polega na prostszej składni w szczególnych przypadkach składni złożonej. Bardziej właściwe jest stwierdzenie, że INNER jest „słowem szumu”.
philipxy
143

DOŁĄCZ DO WEWNĘTRZNEGO = DOŁĄCZ

DOŁĄCZ WEWNĘTRZNE jest ustawieniem domyślnym, jeśli nie zostanie określone typu podczas używania słowa ŁĄCZENIE.

Możesz także użyć LEWEGO DOŁĄCZENIA ZEWNĘTRZNEGO lub PRAWEGO DOŁĄCZENIA ZEWNĘTRZNEGO, w którym to przypadku słowo ZEWNĘTRZNE jest opcjonalne, lub możesz podać CROSS JOIN.

LUB

W przypadku sprzężenia wewnętrznego składnia jest następująca:

WYBIERZ ...
Z Tabeli A
[WEWNĘTRZNE] DOŁĄCZ do Tabeli B

(innymi słowy słowo kluczowe „INNER” jest opcjonalne - wyniki są takie same z nim lub bez niego)

net_prog
źródło
58

Czy różni się między różnymi implementacjami SQL?

Tak, Microsoft Access nie zezwala tylko join. To wymaga inner join.

Michał Powaga
źródło
54

Podobnie z OUTER JOINs, słowo "OUTER"jest opcjonalne. To słowo kluczowe LEFTlub RIGHTsprawia, że JOINan "OUTER" JOIN.

Jednak z jakiegoś powodu zawsze używam "OUTER"jako LEFT OUTER JOINi nigdy LEFT JOIN, ale nigdy nie używam INNER JOIN, ale raczej używam "JOIN":

SELECT ColA, ColB, ...
FROM MyTable AS T1
     JOIN MyOtherTable AS T2
         ON T2.ID = T1.ID
     LEFT OUTER JOIN MyOptionalTable AS T3
         ON T3.ID = T1.ID
Kristen
źródło
23
Jestem przeciwny: zawsze mówię „DOŁĄCZ DO WEWNĘTRZNEGO”, ale nigdy nie używam ZEWNĘTRZNEGO; więc „LEFT JOIN” i „RIGHT JOIN”. Zgaduję, że po prostu utrzymuję moją postać na stałym poziomie!
Stephen Holt,
10
@ Jonathan.Nie ma koncepcji kierunku połączenia wewnętrznego. Połączenia zewnętrzne mogą dawać niedopasowane zestawy wyników, które mogą się różnić w zależności od kierunku. Wewnętrzne wymagają dopasowania, więc kierunek nie ma znaczenia.
Karl Kieninger
32

Jak już wskazują inne odpowiedzi, w twoim przykładzie nie ma różnicy.

Odpowiednia gramatyka jest tutaj udokumentowana

<join_type> ::= 
    [ { INNER | { { LEFT | RIGHT | FULL } [ OUTER ] } } [ <join_hint> ] ]
    JOIN

Pokazanie, że wszystkie są opcjonalne. Strona dodatkowo to wyjaśnia

INNEROkreśla, że ​​zwracane są wszystkie pasujące pary wierszy. Odrzuca niedopasowane wiersze z obu tabel. Jeśli nie określono żadnego typu łączenia, jest to ustawienie domyślne .

Gramatyka wskazuje również, że jest jeden raz, gdzie INNER jest wymagane. Podczas określania wskazówki dołączenia.

Zobacz przykład poniżej

CREATE TABLE T1(X INT);
CREATE TABLE T2(Y INT);

SELECT *
FROM   T1
       LOOP JOIN T2
         ON X = Y;

SELECT *
FROM   T1
       INNER LOOP JOIN T2
         ON X = Y;

wprowadź opis zdjęcia tutaj

Martin Smith
źródło