Dalam Pelajari SQL dengan Cara Keras (latihan enam) , penulis menyajikan kueri berikut:
SELECT pet.id, pet.name, pet.age, pet.dead
FROM pet, person_pet, person
WHERE
pet.id = person_pet.pet_id AND
person_pet.person_id = person.id AND
person.first_name = "Zed";
dan kemudian mengatakan bahwa:
Sebenarnya ada cara lain untuk mendapatkan pertanyaan seperti ini untuk bekerja yang disebut "bergabung". Saya menghindari konsep-konsep itu untuk saat ini karena mereka sangat membingungkan. Tetap berpegang pada cara ini bergabung dengan tabel untuk saat ini dan abaikan orang yang mencoba memberi tahu [Anda] bahwa ini entah bagaimana lebih lambat atau "kelas rendah".
Benarkah? Mengapa atau mengapa tidak?
Jawaban:
Dengan pendekatan penulis, mengajar GABUNGAN LUAR akan jauh lebih sulit. Klausa ON di INNER JOIN tidak pernah mengejutkan saya seperti banyak hal lainnya. Mungkin karena saya tidak pernah belajar dengan cara lama. Saya ingin berpikir ada alasan kami menyingkirkannya dan itu bukan untuk menjadi sombong dan menyebut metode ini kelas rendah.
Memang benar dalam skenario yang sangat sempit yang telah dibuat penulis:
Sebagai bagian dari perkembangan pengajaran, saya pikir lebih mudah untuk memecahnya dan memiliki perkembangan alami:
Konsep bergabung dan memfilter tabel tidak benar-benar sama. Belajar sintaks yang benar sekarang akan memiliki lebih carry-over ketika Anda belajar Outer BERGABUNG kecuali penulis bermaksud pada pengajaran usang / hal-hal usang seperti:
*= or =*
.sumber
*=
atau=*
menunjukkan gabungan luar kiri atau kanan, yang lain yang saya gunakan hanya mendukung sambungan luar kiri menggunakan|=
operator.+=
atau mungkin itu=+
. Saya percaya*=
adalah Transact-SQL (Sybase dan kemudian MS-SQL). Tetap saja, poin bagus.WHERE
klausa. (Saya pernah mendengar ini disebut sebagai theta bergabung , tetapi saya tidak yakin apakah itu benar.)Apakah lebih lambat tergantung pada Pengoptimal Kueri dan bagaimana merampingkan kueri (apa yang Anda tulis sebenarnya bukan apa yang dieksekusi). Namun, masalah besar dari kutipan ini adalah ia sepenuhnya mengabaikan fakta bahwa ada berbagai jenis sambungan yang beroperasi sepenuhnya berbeda. Sebagai contoh, apa yang dikatakan adalah (secara teoritis) benar untuk
inner joins
, tetapi tidak berlaku untukouter joins
(left joins
danright joins
).sumber
INNER JOIN
atauLEFT OUTER JOIN
. Mereka tidak "sangat membingungkan." SQL bisa membingungkan, tetapi ini bukan contohnya.Penulis menyajikan kasus sederhana di mana sintaks lama atau baru dapat digunakan. Saya tidak setuju dengan pernyataannya bahwa bergabung sangat membingungkan, karena bergabung dengan tabel adalah konsep query SQL mendasar. Jadi, mungkin penulis harus meluangkan waktu sebelumnya dalam menjelaskan bagaimana GABUNGAN bekerja sebelum mengucapkan pernyataan pendapat serta melakukan beberapa contoh kueri tabel.
Orang harus menggunakan sintaks yang lebih baru. Argumen utama untuk ini adalah bahwa kueri Anda akan memiliki:
Menggunakan gaya lama, kriteria join dan filter digabungkan yang dalam kasus yang lebih kompleks dapat menyebabkan kebingungan.
Selain itu, orang bisa mendapatkan produk Cartesian dengan melupakan kriteria bergabung dalam klausa filter:
menggunakan sintaks yang lebih lama.
Menggunakan sintaks yang lebih baru juga menentukan bagaimana join seharusnya terjadi yang penting pada apakah Anda menginginkan INNER, LEFT OUTER, dll. Sehingga lebih eksplisit dalam hal JOIN syntax yang IMHO meningkatkan keterbacaan bagi mereka yang tidak terbiasa dengan bergabung dengan tabel.
sumber
Seharusnya tidak ada, parser kueri harus menghasilkan representasi internal yang setara untuk kueri yang setara terlepas dari bagaimana mereka ditulis. Penulis hanya menggunakan sintaks pra-SQL-92, itulah sebabnya ia menyebutkannya mungkin dipandang sebagai "kuno" atau "kelas rendah". Secara internal, pengurai dan pengoptimal harus menghasilkan rencana kueri yang sama.
sumber
Saya belajar SQL dengan cara ini, termasuk
*=
sintaks untuk gabungan luar. Bagi saya, itu sangat intuitif karena semua hubungan diberi prioritas yang sama dan melakukan pekerjaan yang lebih baik untuk mengatur pertanyaan sebagai serangkaian pertanyaan: Apa yang Anda inginkan? Anda ingin dari mana? Yang mana yang kamu inginkan?Dengan melakukan
join
sintaksis, itu mengganggu proses berpikir menuju hubungan yang lebih kuat. Dan secara pribadi, saya menemukan kode yang jauh lebih mudah dibaca dengan tabel dan hubungan yang saling terkait.Setidaknya dalam MSSQL, tidak ada perbedaan yang berarti dalam kinerja kueri, dengan asumsi Anda menggunakan pemesanan gabungan yang sama. Yang mengatakan, ada satu masalah , yang jelas besar dengan belajar (dan menggunakan) SQL dengan cara ini. Jika Anda lupa salah satu relasi Anda, Anda akan mendapatkan produk silang yang tidak terduga. Yang mana pada basis data ukuran apa pun yang tidak sepele sangat mahal (dan berbahaya bagi yang tidak memilih!). Jauh lebih sulit untuk melupakan hubungan ketika menggunakan
join
sintaks style.sumber
Ada dua aspek yang berbeda untuk dipertimbangkan: Kinerja dan Maintainability / Keterbacaan .
Kemampu-rawatan / Keterbacaan
Saya memilih kueri yang berbeda, karena ini adalah sesuatu yang menurut saya merupakan contoh yang lebih baik / lebih buruk daripada kueri asli yang Anda posting.
Apa yang terlihat lebih baik untuk Anda dan lebih mudah dibaca?
Atau...
Bagi saya pribadi, yang pertama cukup mudah dibaca. Anda melihat bahwa kami bergabung dengan tabel
INNER JOIN
, yang berarti bahwa kami menarik baris yang cocok dengan klausa bergabung berikutnya (yaitu "bergabung dengan Karyawan dengan Riwayat Karyawan di Sejarah BisnisEntityID dan sertakan baris itu").Yang terakhir, koma tidak ada artinya bagi saya. Itu membuat saya bertanya-tanya apa yang Anda lakukan dengan semua
WHERE
predikat klausa itu.Yang pertama lebih banyak membaca seperti yang dipikirkan otak saya. Saya melihat SQL sepanjang hari setiap hari dan koma untuk bergabung. Yang membawa saya ke poin saya berikutnya ...
Mereka semua bergabung. Bahkan koma adalah bergabung. Fakta bahwa penulis tidak menyebut mereka bahwa memang kejatuhan mereka .... tidak jelas. Itu harus jelas. Anda bergabung dengan data relasional, apakah Anda menentukan
JOIN
atau,
.Performa
Ini pasti akan tergantung pada RDBMS. Saya hanya dapat berbicara atas nama Microsoft SQL Server. Dari segi kinerja, ini setara. Bagaimana Anda tahu? Tangkap rencana pasca-eksekusi dan lihat apa yang sebenarnya dilakukan SQL Server untuk masing-masing pernyataan ini:
Pada gambar di atas, saya menyoroti bahwa saya menggunakan kedua kueri seperti di atas, hanya berbeda dalam karakter eksplisit untuk bergabung (
JOIN
vs,
). SQL Server melakukan hal yang persis sama.Ringkasan
Jangan gunakan koma. Gunakan
JOIN
pernyataan eksplisit .sumber
Tidak, itu tidak benar sama sekali. Penulis sedang mengatur pembacanya untuk kebingungan, dan mendorong pemrograman kargo-kultus yang menghindari perbedaan struktural yang sangat kuat antara sintaks standar dan varian yang lebih tua ini ia lebih suka. Secara khusus, klausa WHERE yang berantakan membuatnya lebih sulit untuk mencari tahu apa yang membuat kueri khusus.
Teladannya membimbing pembaca untuk menghasilkan peta mental dari maknanya yang memiliki banyak kekacauan.
Secara kasar, di atas adalah:
Dengan peta mental seperti itu, pembaca (yang menulis SQL dengan tangan karena alasan tertentu) dapat dengan mudah membuat kesalahan, mungkin dengan menghilangkan satu atau lebih tabel. Dan pembaca kode yang ditulis sedemikian rupa harus bekerja lebih keras, untuk mencari tahu apa yang coba dilakukan oleh penulis SQL. ("Harder" berada pada level membaca SQL dengan atau tanpa penyorotan sintaks, tetapi masih lebih besar dari perbedaan nol.)
Ada alasan mengapa BERGABUNG adalah umum, dan itu adalah canard klasik "pemisahan masalah". Secara khusus, untuk permintaan SQL ada alasan bagus untuk memisahkan bagaimana data disusun vs bagaimana data disaring.
Jika permintaan dituliskan pembersih, seperti
Kemudian pembaca memiliki perbedaan yang lebih jelas antara komponen-komponen dari apa yang diminta. Filter khusus dari kueri ini dipisahkan dari bagaimana komponen-komponennya saling berhubungan satu sama lain, dan komponen-komponen yang diperlukan dari setiap relasi berada tepat di sebelah tempat mereka diperlukan.
Tentu saja, sistem basis data modern mana pun tidak akan melihat perbedaan yang berarti antara kedua gaya tersebut. Tetapi jika kinerja database adalah satu-satunya pertimbangan, query SQL tidak akan memiliki ruang putih atau kapitalisasi.
sumber
Guy membuat kesalahan klasik. Dia berusaha mengajarkan konsep abstrak dengan implementasi spesifik. Segera setelah Anda melakukannya, Anda masuk ke dalam kekacauan semacam ini.
Seharusnya mengajarkan konsep dasar database terlebih dahulu, kemudian menunjukkan SQL sebagai salah satu cara menggambarkannya.
Gabung kiri dan kanan, bisa dibilang tidak terlalu penting. Outer Join, yah Anda bisa menggunakan sintaks yang lama
*=
dan=*
.Sekarang Anda bisa berpendapat bahwa sintaks lebih sederhana, tetapi hanya untuk pertanyaan sederhana. Segera setelah Anda mulai mencoba melakukan kueri yang kompleks dengan versi ini, Anda bisa mendapatkan kekacauan yang mengerikan. Sintaks "baru" tidak diperkenalkan sehingga Anda bisa melakukan kueri yang rumit, melainkan Anda melakukan kueri kompleks dengan cara yang dapat dibaca dan karenanya dapat dipertahankan.
sumber
Contohnya setara dengan reformulasi sederhana dengan GABUNGAN batiniah. Perbedaannya hanya terletak pada kemungkinan tambahan yang memungkinkan sintaks GABUNG. Misalnya, Anda dapat menentukan urutan kolom kedua tabel yang terlibat diproses; lihat misalnya https://stackoverflow.com/a/1018825/259310 .
Kebijaksanaan yang diterima adalah, ketika ragu-ragu, untuk menulis pertanyaan Anda dengan cara yang membuatnya lebih mudah dibaca. Tetapi apakah formulasi GABUNG atau DIMANA lebih mudah dibaca tampaknya merupakan masalah preferensi pribadi, itulah sebabnya mengapa kedua bentuk ini begitu tersebar luas.
sumber
WHERE
atau memasukkan klausa dalamJOIN
pernyataan itu sebenarnya dapat memiliki dampak kinerja tergantung pada Pengoptimal Permintaan Saya telah melihatnya terjadi lebih dari sekali.Ketika saya belajar SQL, INNER JOIN, LEFT JOIN, dll. Bentuk tidak ada. Seperti jawaban lain telah menyatakan, dialek-dialek SQL yang berbeda masing-masing telah menerapkan gabungan luar menggunakan sintaksis istimewa. Ini merusak portabilitas kode SQL. Menyatukan bahasa kembali membutuhkan beberapa perubahan, dan KIRI BERGABUNG, dll. Adalah apa yang mereka pilih.
Memang benar bahwa untuk setiap INNER JOIN, koma yang sama dengan kondisi join di klausa WHERE dapat ditulis. Butuh beberapa saat untuk bermigrasi dari menyukai bentuk lama ke lebih suka bentuk baru. Rupanya, penulis Learning SQL the Hard Way masih menganggap cara lama lebih mudah.
Apakah ada perbedaan? Ya ada. Yang pertama adalah bahwa INNER GABUNG dengan klausa ON mengungkapkan maksud penulis lebih jelas daripada gaya lama bergabung. Fakta bahwa klausa ON sebenarnya adalah kondisi gabungan dan bukan semacam pembatasan lainnya lebih jelas. Ini membuat kode yang menggunakan INNER JOIN lebih mudah dipelajari saat membaca daripada gaya lama. Ini penting ketika mempertahankan kode orang lain.
Perbedaan kedua adalah bahwa gaya baru membuatnya sedikit lebih mudah bagi pengoptimal permintaan untuk menemukan strategi yang menang. Ini adalah efek yang sangat kecil, tetapi ini nyata.
Perbedaan ketiga adalah ketika Anda belajar menggunakan INNER JOIN (atau sekadar JOIN), itu membuatnya lebih mudah untuk belajar LEFT JOIN, dll.
Selain itu tidak ada perbedaan materi sama sekali.
sumber
Itu tergantung jika Anda berpikir dalam hal set dan logika formal .....
Jika Anda melakukannya, maka tidak menggunakan kata kunci "bergabung" membuat kemajuan yang lebih sederhana dari logika formal ke SQL.
Tetapi jika seperti 99% orang, Anda tidak menikmati logika formal dalam gelar matematika Anda, maka kata kunci gabungan lebih mudah dipelajari. SQL digunakan untuk dipresentasikan di universitas sebagai cara anter untuk menuliskan pertanyaan logika formal ....
sumber