Sintaksis lama, dengan hanya mencantumkan tabel, dan menggunakan WHERE
klausa untuk menentukan kriteria bergabung, sedang tidak digunakan di sebagian besar database modern.
Ini bukan hanya untuk pertunjukan, sintaks lama memiliki kemungkinan ambigu ketika Anda menggunakan INNER dan OUTER bergabung dalam kueri yang sama.
Biarkan saya memberi Anda sebuah contoh.
Misalkan Anda memiliki 3 tabel di sistem Anda:
Company
Department
Employee
Setiap tabel berisi banyak baris, dihubungkan bersama. Anda memiliki banyak perusahaan, dan setiap perusahaan dapat memiliki banyak departemen, dan setiap departemen dapat memiliki beberapa karyawan.
Oke, jadi sekarang Anda ingin melakukan hal berikut:
Daftar semua perusahaan, dan sertakan semua departemen mereka, dan semua karyawan mereka. Perhatikan bahwa beberapa perusahaan belum memiliki departemen, tetapi pastikan Anda memasukkannya juga. Pastikan Anda hanya mengambil departemen yang memiliki karyawan, tetapi selalu daftarkan semua perusahaan.
Jadi kamu melakukan ini:
SELECT * -- for simplicity
FROM Company, Department, Employee
WHERE Company.ID *= Department.CompanyID
AND Department.ID = Employee.DepartmentID
Perhatikan bahwa yang terakhir ada gabungan dalam, untuk memenuhi kriteria bahwa Anda hanya ingin departemen dengan orang.
Ok, jadi apa yang terjadi sekarang. Masalahnya adalah, itu tergantung pada mesin basis data, pengoptimal kueri, indeks, dan statistik tabel. Biarkan saya jelaskan.
Jika pengoptimal kueri menentukan bahwa cara untuk melakukan ini adalah pertama-tama mengambil sebuah perusahaan, kemudian menemukan departemen, dan kemudian bergabung dengan karyawan, Anda tidak akan mendapatkan perusahaan yang tidak memiliki departemen.
Alasan untuk ini adalah bahwa WHERE
klausa menentukan baris mana berakhir pada hasil akhir, bukan bagian individu dari baris.
Dan dalam hal ini, karena bergabung kiri, kolom Department.ID akan NULL, dan dengan demikian ketika datang ke INNER BERGABUNG ke Karyawan, tidak ada cara untuk memenuhi kendala itu untuk baris Karyawan, dan sehingga tidak akan muncul.
Di sisi lain, jika pengoptimal kueri memutuskan untuk menangani bergabung dengan departemen-karyawan terlebih dahulu, dan kemudian lakukan bergabung dengan kiri dengan perusahaan, Anda akan melihatnya.
Jadi sintaksis lama bersifat ambigu. Tidak ada cara untuk menentukan apa yang Anda inginkan, tanpa berurusan dengan petunjuk kueri, dan beberapa database tidak memiliki cara sama sekali.
Masukkan sintaks baru, dengan ini Anda dapat memilih.
Misalnya, jika Anda ingin semua perusahaan, seperti yang dijelaskan deskripsi masalah, inilah yang akan Anda tulis:
SELECT *
FROM Company
LEFT JOIN (
Department INNER JOIN Employee ON Department.ID = Employee.DepartmentID
) ON Company.ID = Department.CompanyID
Di sini Anda menentukan bahwa Anda ingin bergabung dengan departemen-karyawan dilakukan sebagai satu bergabung, dan kemudian pergi bergabung dengan hasil itu dengan perusahaan.
Selain itu, katakanlah Anda hanya ingin departemen yang berisi huruf X atas namanya. Sekali lagi, dengan gaya lama bergabung, Anda berisiko kehilangan perusahaan juga, jika tidak memiliki departemen dengan X dalam namanya, tetapi dengan sintaks baru, Anda dapat melakukan ini:
SELECT *
FROM Company
LEFT JOIN (
Department INNER JOIN Employee ON Department.ID = Employee.DepartmentID
) ON Company.ID = Department.CompanyID AND Department.Name LIKE '%X%'
Klausa tambahan ini digunakan untuk bergabung, tetapi bukan filter untuk seluruh baris. Jadi baris tersebut mungkin muncul dengan informasi perusahaan, tetapi mungkin memiliki NULL di semua kolom departemen dan karyawan untuk baris itu, karena tidak ada departemen dengan X dalam namanya untuk perusahaan itu. Ini sulit dengan sintaks lama.
Inilah sebabnya mengapa, di antara vendor lain, Microsoft telah mencabut sintaks join luar yang lama, tetapi bukan sintaks join dalam yang lama, sejak SQL Server 2005 dan yang lebih tinggi. Satu-satunya cara untuk berbicara dengan database yang berjalan di Microsoft SQL Server 2005 atau 2008, menggunakan sintaks join gaya lama, adalah dengan mengatur database itu dalam mode kompatibilitas 8.0 (alias SQL Server 2000).
Selain itu, cara lama, dengan melemparkan banyak tabel ke optimizer kueri, dengan sekelompok klausa WHERE, mirip dengan mengatakan "di sini Anda, lakukan yang terbaik yang Anda bisa". Dengan sintaks baru, optimizer kueri memiliki lebih sedikit pekerjaan yang harus dilakukan untuk mengetahui bagian mana yang berjalan bersama.
Jadi begitulah.
LEFT and INNER JOIN adalah gelombang masa depan.