Memahami konsep dan sintaks gabungan
Metode yang paling mendasar dan umum untuk menggabungkan data dari beberapa tabel adalah dengan menggunakan operasi JOIN. Beberapa orang menganggap JOIN sebagai klausul terpisah dalam pernyataan SELECT, tetapi yang lain menganggapnya sebagai bagian dari klausul FROM. Modul ini terutama akan menganggapnya sebagai bagian dari klausul FROM. Dalam modul ini, kita akan menemukan bagaimana klausul FROM dalam pernyataan T-SQL SELECT membuat tabel virtual menengah yang akan dikonsumsi oleh fase kueri nanti.
Klausul FROM dan Tabel Virtual
Jika Anda telah mempelajari tentang urutan operasi logis yang dilakukan saat SQL Server memproses kueri, Anda telah melihat bahwa klausul FROM dari pernyataan SELECT adalah klausul pertama yang diproses. Klausul ini menentukan tabel atau tabel mana yang akan menjadi sumber baris untuk kueri. FROM dapat mereferensikan satu tabel atau menyatukan beberapa tabel sebagai sumber data untuk kueri Anda. Anda dapat menganggap klausul FROM sebagai membuat dan mengisi tabel virtual. Tabel virtual ini akan menahan output klausul FROM dan digunakan oleh klausul pernyataan SELECT yang diterapkan nanti, seperti klausul WHERE. Saat Anda menambahkan fungsionalitas tambahan, seperti operator gabungan, ke klausul FROM, akan sangat membantu untuk memikirkan tujuan elemen klausul FROM untuk menambahkan baris ke, atau menghapus baris dari, tabel virtual.
Tabel virtual yang dibuat oleh klausul FROM hanya entitas logika. Dalam SQL Server, tidak ada tabel fisik yang dibuat, baik persisten atau sementara, untuk menahan hasil klausul FROM, karena diteruskan ke klausul WHERE atau bagian lain dari kueri.
Tabel virtual yang dibuat oleh klausul FROM berisi data dari semua tabel yang digabungkan. Ini dapat berguna untuk memikirkan hasil sebagai set , dan mengonsep hasil gabungan sebagai diagram Venn.
Sepanjang sejarahnya, bahasa T-SQL telah diperluas untuk mencerminkan perubahan pada standar American National Standards Institute (ANSI) untuk bahasa pemrogram SQL. Salah satu tempat paling terkenal di mana perubahan ini terlihat adalah dalam sintaks untuk bergabung dalam klausul FROM. Dalam standar SQL-89 ANSI, gabungan ditentukan dengan menyertakan beberapa tabel dalam klausul FROM dalam daftar yang dipisahkan koma. Pemfilteran apa pun untuk menentukan baris mana yang akan disertakan dilakukan dalam klausul WHERE, seperti ini:
SELECT p.ProductID, m.Name AS Model, p.Name AS Product
FROM SalesLT.Product AS p, SalesLT.ProductModel AS m
WHERE p.ProductModelID = m.ProductModelID;
Sintaks ini masih didukung oleh SQL Server, tetapi karena kompleksitas mewakili filter untuk gabungan yang kompleks, itu tidak disarankan. Selain itu, jika klausul WHERE secara tidak sengaja dihilangkan, gabungan gaya ANSI SQL-89 dapat dengan mudah menjadi produk Kartesius dan mengembalikan jumlah baris hasil yang berlebihan, menyebabkan masalah performa, dan mungkin hasil yang salah.
Ketika belajar tentang menulis kueri multi-tabel di T-SQL, penting untuk memahami konsep produk Kartesius. Dalam matematika, produk Kartesius adalah produk dari dua set. Produk dari satu set dua elemen dan satu set enam elemen adalah satu set 12 elemen, atau 6 x 2. Setiap elemen dalam satu set dikombinasikan dengan setiap elemen di set lainnya. Dalam contoh di bawah ini, kami memiliki seperangkat nama dengan dua elemen dan satu set produk dengan tiga elemen. Produk Kartesius menggabungkan setiap nama dengan setiap produk menghasilkan enam elemen.
Dalam database, produk Kartesius adalah hasil dari menggabungkan setiap baris dalam satu tabel ke setiap baris tabel lain. Produk tabel dengan 10 baris dan tabel dengan 100 baris adalah hasil yang diatur dengan 1.000 baris. Hasil yang mendasari operasi JOIN adalah produk Kartesius tetapi untuk sebagian besar kueri T-SQL, produk Kartesius bukanlah hasil yang diinginkan. Dalam T-SQL, produk Kartesius terjadi ketika dua tabel input digabungkan tanpa mempertimbangkan hubungan di antara mereka. Tanpa informasi tentang hubungan, prosesor SQL Server akan mengembalikan semua kombinasi baris yang memungkinkan. Meskipun hasil ini dapat memiliki beberapa aplikasi praktis, seperti menghasilkan data pengujian, itu biasanya tidak berguna dan dapat memiliki implikasi performa yang parah.
Dengan munculnya standar ANSI SQL-92, dukungan untuk kata kunci klausul JOIN dan ON ditambahkan. T-SQL juga mendukung sintaks ini. Gabungan diwakili dalam klausul FROM dengan menggunakan operator JOIN yang sesuai. Hubungan logis antara tabel, yang menjadi predikat filter, ditentukan dalam klausul ON.
Contoh berikut membuat kueri sebelumnya berada pada sintaks yang lebih baru:
SELECT p.ProductID, m.Name AS Model, p.Name AS Product
FROM SalesLT.Product AS p
JOIN SalesLT.ProductModel AS m
ON p.ProductModelID = m.ProductModelID;
Catatan
Sintaks ANSI SQL-92 membuatnya lebih sulit untuk membuat produk Kartesius yang tidak disengaja. Setelah kata kunci JOIN ditambahkan, kesalahan sintaks akan dinaikkan jika klausul ON hilang, kecuali JOIN ditentukan sebagai CROSS JOIN.