Dalam kueri MySQL, mengapa menggunakan join, bukan where?

108

Sepertinya untuk menggabungkan dua atau lebih tabel, kita bisa menggunakan join atau where. Apa kelebihan yang satu dibandingkan yang lain?

extraeee
sumber
2
Bergantung pada penggunaan Anda, ini mungkin memiliki hasil yang sama, tetapi dengan GABUNG Anda dapat melakukan jenis asosiasi lain.
zneak
Apakah ini menjawab pertanyaan Anda? Klausul INNER JOIN ON vs WHERE
philipxy

Jawaban:

160

Setiap query yang melibatkan lebih dari satu tabel membutuhkan beberapa bentuk asosiasi untuk menghubungkan hasil dari tabel "A" ke tabel "B". Cara tradisional (ANSI-89) untuk melakukan ini adalah:

  1. Buat daftar tabel yang terlibat dalam daftar yang dipisahkan koma di klausa FROM
  2. Tulis hubungan antara tabel di klausa WHERE

    SELECT *
      FROM TABLE_A a,
           TABLE_B b
     WHERE a.id = b.id

Berikut kueri yang ditulis ulang menggunakan sintaks ANSI-92 JOIN:

SELECT *
  FROM TABLE_A a
  JOIN TABLE_B b ON b.id = a.id

Dari Perspektif Kinerja:


Jika didukung (Oracle 9i +, PostgreSQL 7.2+, MySQL 3.23+, SQL Server 2000+), tidak ada manfaat kinerja untuk menggunakan sintaks di atas yang lain. Pengoptimal melihatnya sebagai kueri yang sama. Tetapi kueri yang lebih kompleks dapat memanfaatkan sintaks ANSI-92:

  • Kemampuan untuk mengontrol urutan JOIN - urutan tabel yang dipindai
  • Kemampuan untuk menerapkan kriteria filter pada tabel sebelum bergabung

Dari Perspektif Perawatan:


Ada banyak alasan untuk menggunakan sintaks ANSI-92 JOIN melalui ANSI-89:

  • Lebih mudah dibaca, karena kriteria JOIN terpisah dari klausa WHERE
  • Kecil kemungkinan untuk melewatkan kriteria GABUNG
  • Dukungan sintaks yang konsisten untuk tipe JOIN selain INNER, membuat kueri mudah digunakan pada database lain
  • Klausa WHERE hanya berfungsi sebagai filtrasi produk kartesius dari tabel yang digabungkan

Dari Perspektif Desain:


Sintaks ANSI-92 JOIN adalah pola, bukan anti-pola:

  • Tujuan dari pertanyaan ini lebih jelas; kolom yang digunakan oleh aplikasi sudah jelas
  • Ini mengikuti aturan modularitas tentang penggunaan pengetikan ketat bila memungkinkan. Eksplisit hampir secara universal lebih baik.

Kesimpulan


Karena tidak familiar dan / atau nyaman, saya tidak melihat manfaat apa pun untuk terus menggunakan klausa ANSI-89 WHERE alih-alih sintaks ANSI-92 JOIN. Beberapa orang mungkin mengeluh bahwa sintaks ANSI-92 lebih bertele-tele, tetapi itulah yang membuatnya eksplisit. Semakin eksplisit, semakin mudah untuk dipahami dan dipelihara.

OMG Ponies
sumber
14
"... Setiap kueri yang melibatkan lebih dari satu tabel memerlukan beberapa bentuk asosiasi untuk menautkan hasil dari tabel 'A' ke tabel 'B' ... Jika tidak, Anda akan mendapatkan Produk Kartesius, dan Anda mungkin tidak menginginkannya (Para Cartesian itu membuat produk KERAS).
Scott Smith
8

Kebanyakan orang cenderung menemukan sintaks JOIN sedikit lebih jelas tentang apa yang digabungkan dengan apa. Selain itu, ini memiliki keuntungan sebagai standar.

Secara pribadi, saya "tumbuh" di WHEREs, tetapi semakin saya menggunakan sintaks JOIN, semakin saya mulai melihat bagaimana hal itu lebih jelas.

James Cronen
sumber
1
@nawfal Saya mengerti - Saya dibesarkan dengan sintaks gaya lama tetapi setelah saya terbiasa dengan yang baru, manfaatnya menjadi jelas misalnya lebih sulit untuk melakukan persilangan gabung karena kesalahan, lebih eksplisit, lebih mudah untuk melihat apa yang bergabung dan apa filter, dll ... Saya menjadi ketagihan.
Dasar
8

Ini adalah masalah dengan menggunakan sintaks where (bijak lainnya dikenal sebagai gabungan implisit):

Pertama, terlalu mudah untuk mendapatkan gabungan silang yang tidak disengaja karena kondisi penggabungan tidak tepat di sebelah nama tabel. Jika Anda memiliki 6 tabel yang digabungkan, mudah untuk melewatkan satu tabel di klausa where. Anda akan terlalu sering melihat ini diperbaiki dengan menggunakan kata kunci yang berbeda. Ini adalah kinerja yang sangat bagus untuk database. Anda tidak bisa mendapatkan gabungan silang yang tidak disengaja menggunakan sintaks gabungan eksplisit karena akan gagal dalam pemeriksaan sintaks.

Gabungan kanan dan kiri bermasalah (Di server SQl Anda tidak dijamin mendapatkan hasil yang benar) dalam sintaks lama di beberapa database. Lebih lanjut mereka tidak lagi digunakan di SQL Server yang saya tahu.

Jika Anda berniat untuk menggunakan gabungan silang, itu tidak jelas dari sintaks lama. Jelas menggunakan standar ANSII saat ini.

Jauh lebih sulit bagi pengelola untuk melihat dengan tepat bidang mana yang merupakan bagian dari gabungan atau bahkan tabel mana yang bergabung bersama dalam urutan apa menggunakan sintaksis implisit. Artinya, mungkin perlu lebih banyak waktu untuk merevisi kueri. Saya mengenal sangat sedikit orang yang, setelah mereka meluangkan waktu untuk merasa nyaman dengan sintaks gabungan eksplisit, pernah kembali ke cara lama.

Saya juga memperhatikan bahwa beberapa orang yang menggunakan gabungan implisit ini tidak benar-benar memahami cara kerja gabungan dan dengan demikian mendapatkan hasil yang salah dalam kueri mereka.

Sejujurnya, apakah Anda akan menggunakan jenis kode lain yang diganti dengan metode yang lebih baik 18 tahun lalu?

HLGEM
sumber
6

Gabungan eksplisit menyampaikan maksud, membiarkan klausa where untuk melakukan pemfilteran. Lebih bersih dan standar, dan Anda dapat melakukan hal-hal seperti kiri luar atau kanan luar yang lebih sulit dilakukan hanya dengan tempat.

Otávio Décio
sumber
3

Anda tidak dapat menggunakan WHERE untuk menggabungkan dua tabel. Apa yang dapat Anda lakukan adalah menulis:

SELECT * FROM A, B
WHERE ...

Koma di sini sama dengan menulis:

SELECT *
FROM A
CROSS JOIN B
WHERE ...

Maukah Anda menulis itu? Tidak - karena sama sekali bukan itu yang Anda maksud. Anda tidak ingin bergabung silang, Anda menginginkan INNER JOIN. Tetapi ketika Anda menulis koma, Anda mengatakan CROSS JOIN dan itu membingungkan.

Mark Byers
sumber
0

Sebenarnya Anda sering membutuhkan "WHERE" dan "JOIN".

"JOIN" digunakan untuk mengambil data dari dua tabel - berdasarkan nilai kolom umum. Jika Anda kemudian ingin memfilter hasil ini lebih lanjut, gunakan klausa WHERE.

Misalnya, "LEFT JOIN" mengambil SEMUA baris dari tabel kiri, ditambah baris yang cocok dari tabel kanan. Tapi itu tidak memfilter catatan pada nilai tertentu atau di kolom lain yang bukan bagian dari GABUNG. Jadi, jika Anda ingin memfilter hasil ini lebih lanjut, tentukan filter tambahan di klausa WHERE.

Gerhard Liebenberg
sumber