JOIN ve INNER JOIN arasındaki fark


998

Her iki birleşim de bana aynı sonuçları verecek:

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

vs

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

Performanstaki ifadeler arasında veya başka bir şekilde bir fark var mı?

Farklı SQL uygulamaları arasında farklılık gösterir mi?



6
Bir yan not olarak: CROSS JOIN iyi bilinen bir birleştirme tipidir (INNER JOIN'dan farklıdır).
Serge

Yanıtlar:


1092

İşlevsel olarak eşdeğerdirler, ancak INNER JOINözellikle sorguda başka birleştirme türleri (yani LEFTveya RIGHTveya CROSS) varsa, okunması biraz daha açık olabilir.


11
Bu, tüm veri tabanları (örn. SQL, postgres) için geçerli mi? Bunu açıklayan belgelere bir bağlantı bilen var mı?
Chogg

4
ANSI SQL standardıdır. Daha fazlasını görün: antlr.andrew.cmu.edu/~shadow/sql/sql1992.txt ; en.wikipedia.org/wiki/SQL-92
Hint

14
Sadece JOIN yazarak sorgu yeterince açıktır, INNER sadece gürültüdür.
Ivanzinho

22
Belki bir safkanım, ama SQL yazarken örtük olmaktan daha iyi olduğunu düşünüyorum. INNER JOIN, özellikle karmaşık sorgularda daha okunabilir.
bruceskyaus

3
@Ivanzinho: Klavye vuruşları, sorgu veya program karmaşıklığının ölçüsü değildir. Gerçek yaşam karmaşıklığı, okunabilirliğin önemli bir rol oynadığı sürdürülebilirlikten gelir. INNER JOIN dediği zaman, ne yaptığından emin olabilirsiniz ve bunun sadece böyle olması gerekiyordu, oysa sade bir JOIN sizi ya da başka birini, standardın uygulama hakkında ne söylediğini ve İÇERİ olduğunu merak edecek / DIŞ / SOL kazayla veya maksatla bırakılmıştır.
Tuukka Haapaniemi

243

Hayır, hiçbir fark yoktur, saf sözdizimsel şeker .


22
Buna sözdizimsel şeker demezdim. "Varsayılan" birleştirme türü, "steno" veya "takma ad" olabilir.
mk12

62
Bilgisayar biliminde sözdizimsel şeker, bir şeyleri okumayı veya ifade etmeyi kolaylaştıracak şekilde tasarlanmış bir programlama dilinde sözdizimidir . INNERBu tanımın kapsamına girmeme yeteneğinin olduğuna inanıyorum .
Quassnoi

14
Tanımı tam anlamıyla uygularsanız, evet, ancak her zaman sadece şeyler için alternatif isimler için değil, daha ilginç sözdizimi türleri için ayrıldığını gördüm.
mk12

10
Bu soru sorulur açıklanması saf gerçeği @Quassnoi, gösteriler Oid'in INNERyok değil okumak için sorgu kolaylaştırır. Bildiğim kadarıyla, buradaki cevaplar tarafından temizlenmediyse JOINiyi olabilir LEFT JOIN.
Mart

2
@Quassnoi Yorumunuzun alıntılanan giriş wiki ifadesi sözdizimsel şeker için doğrudur, ancak bir tanım olarak yetersizdir. Sözdizimsel şekerleme, özel karmaşık sözdizimi vakaları için daha basit sözdizimiyle ilgilidir. INNER'in "gürültü sözcüğü" olduğunu söylemek daha uygundur.
philipxy

143

INNER JOIN = KATIL

JOIN sözcüğünü kullanırken türü belirtmezseniz , INNER JOIN varsayılan değerdir.

Ayrıca SOL DIŞ BAĞLANTI veya SAĞ DIŞ BAĞLANTI kullanabilirsiniz, bu durumda OUTER sözcüğü isteğe bağlıdır veya ÇAPRAZ BAĞLANTI belirtebilirsiniz.

VEYA

Bir iç birleşim için sözdizimi:

SEÇİN ...
TableA'dan
[INNER] BİRLEŞTİR TabloB

(diğer bir deyişle, "INNER" anahtar kelimesi isteğe bağlıdır - sonuçlar, onsuz veya onsuz aynıdır)



54

Benzer şekilde OUTER JOINs, kelime "OUTER"isteğe bağlıdır. Bu var LEFTya RIGHTyapar kelime JOINAn "OUTER" JOIN.

Ancak nedense hep kullanmak "OUTER"gibi LEFT OUTER JOINve asla LEFT JOINama asla kullanma INNER JOINdeğil, ben sadece kullanmak "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

23
Ben karşınızdayım: Her zaman "INNER JOIN" derim ama asla OUTER kullanmam "SOL BİRLEŞTİR" ve "SAĞ KATIL". Sanırım sadece karakter sayımları sabit tutuyorum!
Stephen Holt

10
Jonathan'ın bir iç birleşiminde yön kavramı yoktur. Dış birleşimler eşsiz sonuç kümeleri üretebilir ve yönlere göre değişebilir. İç eşleşmeyi gerektirir, böylece yön önemli değildir.
Karl Kieninger

32

Diğer cevapların zaten belirttiği gibi, örneğinizde hiçbir fark yoktur.

İlgili gramer biti burada belgelenmiştir

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

Hepsinin isteğe bağlı olduğunu gösterir. Sayfa ayrıca

INNEREşleşen tüm satır çiftlerinin döndürüleceğini belirtir. Her iki tabloda da eşleşmeyen satırları atar. Birleştirme türü belirtilmediğinde, bu varsayılan değerdir .

Gramer da yapar bir kez olduğunu gösterir INNER edilir olsa gerektiriyordu. Birleştirme ipucu belirtirken.

Aşağıdaki örneğe bakın

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;

resim açıklamasını buraya girin

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.