Varsayılan MySQL JOIN davranışı, INNER veya OUTER nedir?


95

Son bir saattir internete bakıyordum, okudum ve bu basit sorunun kesin cevabını arıyordum.

MySQL'deki varsayılan JOIN nedir?

SELECT * FROM t1 JOIN t2

Bu aynı mı

SELECT * FROM t1, t2

OR

SELECT * FROM t1 INNER JOIN t2

Ayrıca ilgili bir soru, "WHERE" cümlelerini kullandığınızda, JOIN veya INNER JOIN ile aynı mıdır?

Şu anda, bağımsız bir JOIN'in virgül ve WHERE cümleleri kullanmakla aynı olduğunu düşünüyorum.

Yanıtlar:


128

JOINMySQL'de niteliksiz yazmak ima eder INNER JOIN. Başka bir deyişle, INNERgiriş INNER JOINisteğe bağlıdır. INNERve CROSSMySQL'de eşanlamlıdır. Netlik için yazıyorum JOINveya INNER JOINbir katılma koşulum CROSS JOINvarsa ve bir koşulum yoksa.

Birleşimler için izin verilen sözdizimi belgelerde açıklanmıştır .


Şu anda tek başına bir JOIN'in virgül ve WHERE cümleleri kullanmaktan başka bir şey olmadığını düşünüyorum (aynı).


Etki aynı, ancak arkasındaki geçmiş farklı. Virgül sözdizimi ANSI-89 standardındandır. Bununla birlikte, bu sözdizimiyle ilgili bir dizi sorun vardır, bu nedenle ANSI-92 standardında JOIN anahtar sözcüğü tanıtılmıştır.

Virgül yerine her zaman JOIN sözdizimini kullanmanızı şiddetle tavsiye ederim .

  • T1 JOIN T2 ON ...daha okunabilir T1, T2 WHERE ....
  • Daha sürdürülebilir çünkü tablo ilişkileri ve filtreler karıştırılmak yerine açıkça tanımlanmıştır.
  • JOIN sözdizimini OUTER JOIN'e dönüştürmek, virgül sözdiziminden daha kolaydır.
  • Virgül ve JOIN sözdizimini aynı ifadede karıştırmak, öncelik kuralları nedeniyle ilginç hatalar verebilir.
  • JOIN sözdizimini kullanırken yanlışlıkla bir kartezyen ürün yaratma olasılığı, unutulmuş bir birleştirme yan tümcesi nedeniyle daha az olasıdır çünkü birleşim yan tümceleri birleşimlerin yanına yazılır ve eksik olup olmadığını görmek kolaydır.

Tatlım, bu basit soruyu açıklığa kavuşturduğun için teşekkürler :) Geçmişte her zaman virgül + nerede cümlecikleri kullandım ... ama tavsiyen doğrultusunda JOIN kullanmaya geçeceğim. Teşekkürler
Quang Van

Hey Mark, JOIN ve virgül karışımlarıyla ne demek istiyorsun? Sorguları böyle karıştırın, SELECT * FROM t1 LEFT JOIN (t2, t3, t4) ON (t2.a = t1.a VE t3.b = t1.b VE t4.c = t1.c)?
Quang Van

2
@Quang: Bu, örneğin başarısız olacak:SELECT * FROM t1, t2 JOIN t3 ON t1.x=t3.y WHERE t1.a = t2.b
Mark Byers

0

Bunların hepsi eşdeğerdir ve aynı zamanda eşittir CROSS JOIN,.

Virgül ve [INNER | CROSS] JOINsözdizimi kullanmak arasında bazı farklılıklar vardır , bu daha fazla tablo birleştirirken önemli olabilir. Bilmeniz gereken hemen hemen her şey burada MySQL JOINbelgelerinde açıklanmaktadır .


1
^ --- sorunun cevabı JOIN (bağımsız) temelde INNER ve virgül + where cümleleri için aynı şeydir
Quang Van
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.