Saya mengalami kesulitan memahami aljabar relasional dalam hal gabungan theta, equijoins, dan gabungan natural. Bisakah seseorang membantu saya lebih memahaminya? Jika saya menggunakan tanda = pada gabungan theta apakah sama persis dengan hanya menggunakan gabungan alami?
sql
database
relational-database
relational-algebra
maclunian.dll
sumber
sumber
Jawaban:
Sebuah theta bergabung memungkinkan untuk hubungan perbandingan sewenang-wenang (seperti ≥).
Sebuah Equijoin adalah theta bergabung menggunakan operator kesetaraan.
Gabungan alami adalah equijoin pada atribut yang memiliki nama yang sama di setiap hubungan.
Selain itu, gabungan alami menghapus kolom duplikat yang terlibat dalam perbandingan kesetaraan sehingga hanya tersisa 1 dari setiap kolom yang dibandingkan; dalam istilah aljabar relasional kasar:
⋈ = πR,S-as ○ ⋈aR=aS
sumber
theta
gabungan in theta mengacu pada kondisi arbitrer yang digunakan sebagai kriteria untuk gabungan. (lihat Sistem Database: Buku Lengkap oleh Garcia-Molina, Ullman, Widom, bab 2, Theta Join)Meskipun jawaban yang menjelaskan perbedaan pastinya baik-baik saja, saya ingin menunjukkan bagaimana aljabar relasional diubah menjadi SQL dan berapa nilai sebenarnya dari 3 konsep tersebut.
Konsep kunci dalam pertanyaan Anda adalah gagasan bergabung. Untuk memahami gabungan, Anda perlu memahami Produk Cartesian (contoh didasarkan pada SQL di mana padanannya disebut gabungan silang seperti yang ditunjukkan onedaywhen);
Ini tidak terlalu berguna dalam praktiknya. Pertimbangkan contoh ini.
Produk Kartesius Produk x Komponen akan - di bawah atau sumbu sql . Bisa dilihat ada 12 baris = 3 x 4. Ternyata baris seperti "Laptop" dengan "roda" tidak ada artinya, inilah mengapa dalam prakteknya produk Cartesian jarang digunakan.
GABUNG di sini untuk menambah nilai lebih pada produk ini. Yang benar-benar kami inginkan adalah "menggabungkan" produk dengan komponen terkaitnya, karena setiap komponen adalah milik suatu produk. Cara melakukannya adalah dengan bergabung:
Kueri SQL terkait akan seperti ini (Anda dapat bermain dengan semua contoh di sini )
dan hasilnya:
Perhatikan bahwa hasilnya hanya 4 baris, karena Laptop memiliki 3 komponen, Mobil memiliki 1 dan Airplane tidak ada. Ini jauh lebih berguna.
Kembali ke pertanyaan Anda, semua gabungan yang Anda tanyakan adalah variasi dari JOIN yang baru saja saya tunjukkan:
Natural Join = gabungan (klausa ON) dibuat pada semua kolom dengan nama yang sama; itu menghapus kolom duplikat dari hasil, sebagai lawan dari semua gabungan lainnya; kebanyakan DBMS (sistem database yang dibuat oleh berbagai vendor seperti Microsoft SQL Server, Oracle's MySQL, dll.) bahkan tidak perlu repot-repot mendukung ini, ini hanya praktik yang buruk (atau sengaja memilih untuk tidak mengimplementasikannya). Bayangkan seorang pengembang datang dan mengubah nama kolom kedua di Produk dari Harga menjadi Biaya. Kemudian semua gabungan natural akan dilakukan pada PName AND pada Cost, menghasilkan 0 baris karena tidak ada angka yang cocok.
Theta Join = ini adalah gabungan umum yang digunakan semua orang karena memungkinkan Anda untuk menentukan kondisi (klausa ON dalam SQL). Anda dapat bergabung dalam kondisi apa pun yang Anda suka, misalnya pada Produk yang memiliki 2 huruf pertama yang serupa, atau yang memiliki harga berbeda. Dalam praktiknya, ini jarang terjadi - dalam 95% kasus, Anda akan bergabung dalam kondisi kesetaraan, yang mengarahkan kami ke:
Equi Join = yang paling umum digunakan dalam latihan. Contoh di atas adalah equi join. Database dioptimalkan untuk jenis gabungan ini! Kebalikan dari gabungan eku adalah gabung non-eku, yaitu saat Anda bergabung pada kondisi selain "=". Database tidak dioptimalkan untuk ini! Keduanya adalah himpunan bagian dari gabungan theta umum. Gabungan alami juga merupakan gabungan theta tetapi kondisinya (theta) tersirat.
Sumber informasi: universitas + pengembang SQL Server bersertifikat + baru saja menyelesaikan MOO "Pengantar database" dari Stanford, jadi saya berani mengatakan bahwa saya memiliki aljabar relasional yang segar dalam pikiran.
sumber
CROSS JOIN
Operasi dalam SQL menghasilkan ekspresi tabel (baris kolom). Operasi himpunan hasil produk Cartesian dalam satu set pasangan.SELECT * FROM...
(dan mungkin Anda melakukannya). Tetapi dalam bahasa, itu ada dalam setiap implementasi SQL dan saya sering menggunakannya (dan saya yakin Anda juga melakukannya!). Petunjuk tidak semua kode adalah kode produksi.Jawaban @ outis bagus: ringkas dan benar dalam hal relasi.
Namun, situasinya sedikit lebih rumit sehubungan dengan SQL.
Pertimbangkan pemasok biasa dan database suku cadang tetapi diimplementasikan dalam SQL:
akan mengembalikan kumpulan hasil ** dengan kolom
SNO, SNAME, STATUS, CITY, PNO, QTY
Gabungan dilakukan pada kolom dengan nama yang sama di kedua tabel
SNO
,. Perhatikan bahwa kumpulan hasil memiliki enam kolom dan hanya berisi satu kolom untukSNO
.Sekarang pertimbangkan theta eqijoin, di mana nama kolom untuk gabungan harus ditentukan secara eksplisit (ditambah variabel rentang
S
danSP
diperlukan):Kumpulan hasil akan memiliki tujuh kolom, termasuk dua kolom untuk
SNO
. Nama kumpulan hasil adalah apa yang disebut Standar SQL sebagai "dependen implementasi" tetapi bisa terlihat seperti ini:SNO, SNAME, STATUS, CITY, SNO, PNO, QTY
atau mungkin ini
S.SNO, SNAME, STATUS, CITY, SP.SNO, PNO, QTY
Dengan kata lain,
NATURAL JOIN
dalam SQL dapat dianggap untuk menghapus kolom dengan nama digandakan dari ResultSet (tapi sayangnya tidak akan menghapus duplikat baris - Anda harus ingat untuk perubahanSELECT
keSELECT DISTINCT
diri sendiri).** Saya tidak begitu tahu apa hasilnya
SELECT * FROM table_expression;
. Saya tahu ini bukan relasi karena, di antara alasan lain, dapat memiliki kolom dengan nama duplikat atau kolom tanpa nama. Saya tahu ini bukan satu set karena, di antara alasan lain, urutan kolomnya signifikan. Ini bahkan bukan tabel SQL atau ekspresi tabel SQL. Saya menyebutnya kumpulan hasil.sumber
JOIN ... USING(...)
.SELECT * FROM table_expression;
" ?Natural adalah bagian dari Equi yang merupakan bagian dari Theta.
Belum tentu, tapi itu akan menjadi Equi. Natural berarti Anda mencocokkan semua kolom dengan nama yang mirip, Equi berarti Anda menggunakan '=' secara eksklusif (dan tidak 'kurang dari', suka, dll.)
Ini murni akademisi, Anda dapat bekerja dengan database relasional selama bertahun-tahun dan tidak pernah mendengar siapa pun menggunakan istilah ini.
sumber
Theta Join: Ketika Anda membuat kueri untuk bergabung menggunakan operator apa pun, (misalnya, =, <,>,> = dll.), Maka kueri gabungan itu berada di bawah gabungan Theta.
Equi Join: Saat Anda membuat query untuk join menggunakan operator persamaan saja, maka query join tersebut berada di bawah Equi join.
Contoh:
Catatan: Equi join juga merupakan gabungan theta!
Natural Join: tipe Equi Join yang muncul secara implisit dengan membandingkan semua kolom nama yang sama di kedua tabel.
Catatan: di sini, hasil gabungan hanya memiliki satu kolom untuk setiap pasangan kolom bernama yang sama.
Contoh
sumber
Hasil kali kartesius dari dua tabel memberikan semua kemungkinan kombinasi tupel seperti contoh dalam matematika hasil perkalian dua set. karena sering kali ada beberapa nilai sampah yang menempati ruang yang tidak perlu dalam memori juga, jadi di sini bergabung datang untuk menyelamatkan yang memberikan kombinasi hanya nilai atribut yang diperlukan dan bermakna.
Inner join memberikan field berulang dalam tabel dua kali sedangkan natural join memecahkan masalah dengan hanya menyaring kolom berulang dan menampilkannya hanya sekali. Lain, keduanya bekerja sama. gabungan alami lebih efisien karena mempertahankan memori. Selain itu, redundansi dihapus dalam gabungan alami.
Equi join dari dua tabel sedemikian rupa sehingga mereka hanya menampilkan tupel yang cocok dengan nilai di tabel lain. sebagai contoh: misalkan new1 dan new2 menjadi dua tabel. jika sql query pilih * dari new1 gabung new2 di new1.id = new.id (id adalah kolom yang sama di dua tabel) kemudian mulai dari tabel new2 dan gabung yang cocok dengan id di tabel kedua. Selain itu, gabungan non equi tidak memiliki operator persamaan yang dimiliki <,>, dan antar operator.
theta join terdiri dari semua operator pembanding termasuk persamaan dan lainnya <,> operator pembanding. jika menggunakan operator persamaan (=), ini dikenal sebagai gabungan eku.
sumber
Gabungan Alami: Gabungan alami dapat dimungkinkan bila ada setidaknya satu atribut umum dalam dua relasi.
Gabung Theta: Gabung Theta dapat dimungkinkan ketika dua orang bertindak pada kondisi tertentu.
Equi Join: Equi dapat dimungkinkan ketika dua bertindak dalam kondisi ekuitas. Ini adalah salah satu jenis gabungan theta.
sumber