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:
Buat daftar tabel yang terlibat dalam daftar yang dipisahkan koma di klausa FROM
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.
"... 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.
@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?
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.
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
CROSSJOIN 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.
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.
Jawaban:
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:
Tulis hubungan antara tabel di klausa WHERE
Berikut kueri yang ditulis ulang menggunakan sintaks ANSI-92 JOIN:
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:
Dari Perspektif Perawatan:
Ada banyak alasan untuk menggunakan sintaks ANSI-92 JOIN melalui ANSI-89:
Dari Perspektif Desain:
Sintaks ANSI-92 JOIN adalah pola, bukan anti-pola:
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.
sumber
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.
sumber
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?
sumber
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.
sumber
Anda tidak dapat menggunakan WHERE untuk menggabungkan dua tabel. Apa yang dapat Anda lakukan adalah menulis:
Koma di sini sama dengan menulis:
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.
sumber
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.
sumber