Sepertinya untuk menggabungkan dua atau lebih tabel, kita bisa menggunakan join atau where. Apa kelebihan yang satu dibandingkan yang lain?
Sepertinya untuk menggabungkan dua atau lebih tabel, kita bisa menggunakan join atau where. Apa kelebihan yang satu dibandingkan yang lain?
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
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
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:
Ada banyak alasan untuk menggunakan sintaks ANSI-92 JOIN melalui ANSI-89:
Sintaks ANSI-92 JOIN adalah pola, bukan anti-pola:
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.
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.
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
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.
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.