Apa perilaku default MySQL JOIN, INNER atau OUTER?

95

Jadi saya telah melihat-lihat internet satu jam terakhir, membaca dan mencari jawaban pasti untuk pertanyaan sederhana ini.

Apa JOIN default di MySQL?

SELECT * FROM t1 JOIN t2

Apakah itu sama dengan

SELECT * FROM t1, t2

OR

SELECT * FROM t1 INNER JOIN t2

Juga pertanyaan terkait, ketika Anda menggunakan klausa "WHERE", apakah sama dengan JOIN atau INNER JOIN?

Saat ini saya berpikir JOIN yang berdiri sendiri identik dengan menggunakan koma dan klausa WHERE.

Quang Van
sumber

Jawaban:

128

Dalam penulisan MySQL JOINberarti tidak memenuhi syarat INNER JOIN. Dengan kata lain INNERin INNER JOINadalah opsional. INNERdan CROSSsinonim di MySQL. Untuk kejelasan saya menulis JOINatau INNER JOINjika saya memiliki syarat bergabung dan CROSS JOINjika saya tidak memiliki syarat.

Sintaks yang diizinkan untuk gabungan dijelaskan dalam dokumentasi .


Saat ini saya berpikir JOIN yang berdiri sendiri tidak lebih dari (identik dengan) menggunakan koma dan klausa WHERE.


Efeknya sama, tetapi sejarah di baliknya berbeda. Sintaks koma berasal dari standar ANSI-89. Namun ada sejumlah masalah dengan sintaks ini sehingga dalam standar ANSI-92 kata kunci JOIN diperkenalkan.

Saya sangat menyarankan agar Anda selalu menggunakan sintaks JOIN daripada koma.

  • T1 JOIN T2 ON ...lebih mudah dibaca daripada T1, T2 WHERE ....
  • Ini lebih bisa dipelihara karena hubungan tabel dan filter ditentukan dengan jelas daripada dicampur bersama.
  • Sintaks JOIN lebih mudah untuk diubah menjadi OUTER JOIN daripada sintaks koma.
  • Mencampurkan sintaks koma dan GABUNG dalam pernyataan yang sama dapat menghasilkan kesalahan aneh karena aturan prioritas.
  • Kecil kemungkinannya untuk secara tidak sengaja membuat produk kartesius saat menggunakan sintaks JOIN karena klausa join yang terlupakan, karena klausa join ditulis di sebelah join dan mudah untuk melihat apakah ada yang hilang.
Mark Byers
sumber
Manis, terima kasih telah mengklarifikasi pertanyaan sederhana ini untuk saya :) Dulu saya selalu menggunakan koma + di mana klausa ... tetapi akan beralih menggunakan JOIN sesuai saran Anda. Terima kasih
Quang Van
Hai Mark, apa yang Anda maksud dengan campuran JOIN dan koma. Campur kueri seperti ini, 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: Ini misalnya akan gagal:SELECT * FROM t1, t2 JOIN t3 ON t1.x=t3.y WHERE t1.a = t2.b
Mark Byers
0

Ini semua setara, dan juga sama dengan CROSS JOIN,.

Ada beberapa perbedaan antara menggunakan koma dan [INNER | CROSS] JOINsintaks, yang mungkin penting saat menggabungkan lebih banyak tabel. Hampir semua yang perlu Anda ketahui dijelaskan di sini dalam dokumentasi MySQLJOIN .

Mchl
sumber
1
^ --- jawaban pertanyaannya adalah JOIN (standalone) pada dasarnya sama dengan INNER dan comma + where clauses
Quang Van