Aljabar Relasional dan Query #5: Operasi Union
Operator UNION dan UNION ALL dalam query menghasilkan gabungan baris dari dua tabel atau lebih. Apa perbedaannya?
Daftar Isi
• Pendahuluan
• Operasi UNION
▹ Aljabar Relasional
▹ Query
▹ Contoh
• Operator UNION ALL
• Penutup
• Daftar Pustaka
Pendahuluan
Aljabar relasional adalah bahasa teoritis yang mengoperasikan satu atau beberapa relasi dan menghasilkan relasi lain tanpa mengubah relasi asli. Keluaran sebuah operasi dapat menjadi masukan operasi lainnya. Menurut Codd (1972), ada 8 operasi yaitu 5 operasi dasar: seleksi, proyeksi, produk Cartesian, union, set difference (selisih) dan 3 operasi tambahan (turunan dari operasi dasar): join, intersection (irisan), divisi.
Query adalah kata dalam bahasa Inggris, merupakan kata benda, bentuk jamaknya queries, secara semantik berarti pertanyaan atau permintaan informasi tentang sesuatu. Sebagai istilah dalam basis data, query berarti permintaan data atau informasi yang diambil dari basis data. Pada basis data relasional — Structured Query Language (SQL) sebagai bahasa bakunya — query menggunakan pernyataan SELECT
.
A query is a question or a request for information about something (https://www.merriam-webster.com/dictionary/query)
A query is a request for data or information from a database table or combination of tables. This data may be generated as results returned by Structured Query Language (SQL).
https://www.techopedia.com/definition/5736/query)
Operasi UNION
Aljabar Relasional
Operasi UNION — menggunakan simbol ⋃ sebagai operatornya — menggabungkan tuple dua buah relasi atau lebih. Sebagai contoh, ekspresi aljabar relasional R⋃S menggabungkan i tuple relasi R dengan j tuple relasi S, tanpa duplikasi tuple, sehingga diperoleh maksimum (i+j) tuple.
Pada operasi union berlaku:
• hukum komutatif: R⋃S = S⋃R
• hukum asosiatif: (R⋃S)⋃T = R⋃(S⋃T)
Query
Sintaks query untuk operasi union adalah sebagai berikut.
SELECT DaftarEkspresi FROM tabel
UNION
SELECT DaftarEkspresi FROM tabel
Bila diperlukan, pernyataan SELECT
boleh dikombinasikan dengan operasi lain: proyeksi, seleksi, produk Cartesian, inner join, outer join, dsb. Daftar ekspresi dapat berupa kolom tabel, konstanta, perhitungan, fungsi skalar, fungsi agregasi. Yang penting, kolom dalam setiap pernyataan SELECT
harus union compatible yaitu:
• jumlah kolom sama
• urutan kolom sama dengan tipe data sama atau kompatibel.
Contoh
Berikut adalah contoh data yang ada dalam tabel Dosen dan Karyawan.
SELECT * FROM DosenNID Nama
---- ----------
123 Mawar
234 Sabar
456 Budi
678 Melati(4 row(s) affected)SELECT * FROM KaryawanNIK Nama
---- ----------
012 Budi
234 Sabar
345 Cempaka
567 Sentosa
678 Melati(5 row(s) affected)
Operasi union tabel karyawan dengan tabel dosen
Ekspresi aljabar relasional: Dosen⋃Karyawan.
Berikut adalah query dan hasilnya.
SELECT * FROM Dosen
UNION
SELECT * FROM Karyawan-- Hasilnya: data terurut berdasarkan primary key (kolom NID)
NID Nama
---- ----------
012 Budi
123 Mawar
234 Sabar
345 Cempaka
456 Budi
567 Sentosa
678 Melati(7 row(s) affected)SELECT Nama, NID FROM Dosen
UNION
SELECT Nama, NIK FROM Karyawan-- Hasilnya tetap terurut berdasarkan primary key (kolom NID)
Nama NID
---------- ----
Budi 012
Mawar 123
Sabar 234
Cempaka 345
Budi 456
Sentosa 567
Melati 678(7 rows affected)
Operasi union menghasilkan baris data unik terurut berdasarkan primary key; untuk baris data yang sama hanya diambil satu. Tabel Dosen dan tabel Karyawan memiliki dua baris data yang sama sehingga hasilnya 7 baris, bukan 9 baris.
Hukum komutatif berlaku sehingga ekspresi aljabar relasional dapat pula ditulis: Karyawan⋃Dosen.
SELECT * FROM Karyawan
UNION
SELECT * FROM Dosen-- Hasilnya judul kolom menggunakan nama kolom dalam SELECT pertama
NIK Nama
---- ----------
012 Budi
123 Mawar
234 Sabar
345 Cempaka
456 Budi
567 Sentosa
678 Melati(7 row(s) affected)
Keduanya memberikan hasil yang sama. Yang membedakan hanya nama kolom; yang digunakan adalah nama kolom dalam pernyataan SELECT
pertama.
Bagaimana kalau primary key tidak termasuk dalam pernyataan SELECT
? Berikut contohnya.
SELECT Nama FROM Dosen
UNION
SELECT Nama FROM Karyawan-- Hasilnya: nama terurut
Nama
----------
Budi
Cempaka
Mawar
Melati
Sabar
Sentosa(6 rows affected)SELECT Nama, 'Dosen' AS Keterangan FROM Dosen
UNION
SELECT Nama, 'Karyawan' FROM Karyawan-- Hasilnya terurut berdasarkan gabungan kolom Nama dan Keterangan
Nama Keterangan
---------- ----------
Budi Dosen
Budi Karyawan
Cempaka Karyawan
Mawar Dosen
Melati Dosen
Melati Karyawan
Sabar Dosen
Sabar Karyawan
Sentosa Karyawan(9 rows affected)SELECT 'Dosen' AS Keterangan, Nama FROM Dosen
UNION
SELECT 'Karyawan', Nama FROM Karyawan-- Hasilnya terurut berdasarkan gabungan kolom Keterangan dan Nama
Keterangan Nama
---------- ----------
Dosen Budi
Dosen Mawar
Dosen Melati
Dosen Sabar
Karyawan Budi
Karyawan Cempaka
Karyawan Melati
Karyawan Sabar
Karyawan Sentosa(9 rows affected)
Ternyata hasilnya terurut menaik berdasarkan gabungan semua kolom yang ada dalam pernyataan SELECT
pertama. Pertama, data diurutkan berdasarkan kolom ke-1. Untuk nilai kolom ke-1 yang sama, data diurutkan lagi berdasarkan kolom ke-2, dan seterusnya.
Operator UNION ALL
Operator UNION ALL
tidak menghilangkan duplikat baris. Operator ini mengambil semua baris dari semua tabel dan menggabungkannya ke dalam tabel. Berikut contohnya.
SELECT * FROM Dosen
UNION ALL
SELECT * FROM KaryawanNID Nama
---- ----------
123 Mawar
234 Sabar
456 Budi
678 Melati
012 Budi
234 Sabar
345 Cempaka
567 Sentosa
678 Melati(9 row(s) affected)
Operator UNION ALL
tidak mengurutkan data sehingga memberikan hasil lebih cepat. Gunakan klausa ORDER BY
di bagian akhir untuk mengurutkannya. Jangan menggunakan nama kolom yang ada di pernyataan SELECT
ke-2 sebagai kunci pengurutan.
SELECT NID, Nama FROM Dosen
UNION ALL
SELECT NIK, Nama FROM Karyawan
ORDER BY NIKMsg 207, Level 16, State 1, Line 28
Invalid column name 'NIK'.
Gunakan hanya nama kolom yang ada di pernyataan SELECT
pertama.
SELECT NID, Nama FROM Dosen
UNION ALL
SELECT NIK, Nama FROM Karyawan
ORDER BY NID-- Hasilnya terurut berdasarkan NID
NID Nama
---- ----------
012 Budi
123 Mawar
234 Sabar
234 Sabar
345 Cempaka
456 Budi
567 Sentosa
678 Melati
678 Melati(9 row(s) affected)SELECT Nama, NID FROM Dosen
UNION ALL
SELECT Nama, NIK FROM Karyawan
ORDER BY Nama, NIDNama NID
---------- ----
Budi 012
Budi 456
Cempaka 345
Mawar 123
Melati 678
Melati 678
Sabar 234
Sabar 234
Sentosa 567(9 rows affected)
Boleh juga menggunakan nama alias sebagai kunci pengurutan.
SELECT NID AS NoInduk, Nama FROM Dosen
UNION ALL
SELECT NIK, Nama FROM Karyawan
ORDER BY NoIndukNoInduk Nama
------- ----------
012 Budi
123 Mawar
234 Sabar
234 Sabar
345 Cempaka
456 Budi
567 Sentosa
678 Melati
678 Melati(9 rows affected)
Penutup
Operator UNION
menghasilkan gabungan baris unik terurut dari dua tabel atau lebih. Data diurutkan berdasarkan primary key (bila ada) atau berdasarkan gabungan kolom yang ada di pernyataan SELECT
pertama. Operator UNION ALL
menghasilkan gabungan semua baris dari dua tabel atau lebih tanpa pengurutan.
Daftar Pustaka
Codd, E.F. (March 1972). “Relational Completeness of Data Base Sublanguages” in Computer Sciences. San Jose, California: IBM Research Laboratory.
Connolly, Thomas M., & Begg, Carolyn E. (2015). Database Systems: A Practical Approach to Design, Implementation, and Management (6th Edition). Essex, England: Pearson Education.
Coronel, C., Morris, S., Crockett, K., & Blewett, C. (2020). Database Principles: Fundamentals of Design, Implementation, and Management. 3rd Edition. Hampshire, United Kingdom: Cengage Learning.