7
Menggunakan Set Operators
Tujuan Setelah menyelesaikan pelajaran ini, Anda akan dapat melakukan berikut ini : Menjelaskan set operators Menggunakan suatu set operator untuk mengkombinasikan beberapa query-query ke dalam query tunggal Mengontrol urutan baris yang dikembalikan
Tujuan Dalam bab ini, anda mempelajari bagaimana cara menulis Query dengan menggunakan Set operator.
Oracle Database 10g: Fundamentals I 7-2
Set Operators
Set Operator Set Operator menggabungkan hasil dari dua atau lebih komponen Query ke dalam sebuah penyelesaian. Query yang berisi beberapa Set Operator disebut sebagai Compound Query. Operator UNION UNION ALL INTERSECT MINUS
Hasil Semua baris distinct dipilih oleh query yang sama Semua baris dipilih oleh query yang sama, termasuk semua duplikat Semua baris distinct dipilih oleh kedua query Semua baris distinct yang telah dipilih oleh pernyataan SELECT dan tidak dipilih di pernyataan kedua
Semua Set Operator mempunyai pendahuluan yang sama. Jika sebuah pernyataan SQL berisi beragam Set Operator, Oracle server akan mengevaluasinya dari kiri (atas) ke kanan (bawah) jika tidak ada sisipan secara jelas yang mengarah pada perintah lain. Anda harus menggunakan sisipan untuk menggolongkan perintah dari hasil evaluasi secara jelas dalam query yang menggunakan operator INTERSECT dengan Set operator yang lain.
Oracle Database 10g: Fundamentals I 7-3
Tabel-Tabel yang Digunakan dalam Pelajaran Ini Tabel-tabel yang digunakan dalam pelajaran ini adalah : EMPLOYEES : Menyediakan rincian berdasarkan pegawaipegawai saat ini JOB_HISTORY :Rincian catatan dari tanggal mulai dan tanggal berakhir dari suatu job yang terdahulu, dan nomor identifikasi job serta departemen saat seorang pegawai berpindah job.
Tabel-tabel yang digunakan dalam pelajaran ini Bab ini menggunakan 2 tabel. Yaitu tabel EMPLOYEES dan tabel JOB_HISTORY. Tabel EMPLOYEES menyimpan detail karyawan. Untuk penrecord transaksi sumber daya manusia tabel ini bisa menyimpan nomor_id yang bersifat unik dan alamat email tiap karyawan. Detail dari no_id pekerjaan karyawan, gaji dan manajer juga akan tersimpan. Beberapa dari karyawan menerima komisi sebagai tambahan gaji mereka;informasi ini juga akan dicatat juga. Perusahaan mengatur karyawan sesuai dengan pekerjaannya. Beberapa karyawan sudah lama bekerja dalam perusahaan ini dan telah beberapa kali berganti-ganti pekerjaan. Hal ini dimonitor menggunakan tabel JOB_HISTORY. Ketika seorang karyawan berganti pekerjaan, detail dari tanggal mulai dan tanggal akhir pekerjaan terakhir, no_id pekerjaan, dan departemen disimpan dalam tabel JOB_HISTORY. Struktur dan data dari tabel EMPLOYEES dan table HISTORY ditunjukkan pada halaman berikut ini.
Oracle Database 10g: Fundamentals I 7-4
Tabel –tabel yang digunakan pada bab ini (lanjutan) Di dalam perusahaan ada beberapa orang yang bekerja dengan posisi yang sama lebih dari sekali sebelum mereka bergabung dengan perusahaan ini. Contohnya : salah satu karyawan yang bernama Taylor yang bergabung sebagai karyawan pada perusahaan ini pada 24-Mar-98. Taylor menempati jabatan sebagai SA_REP selama periode 24-Mar-98 sampai dengan 31-Dec-98 dan sebagai SA_MAN selama periode 01-Jan-99 sampai dengan 31-Dec-99. Taylor kembali lagi menjabat sebagai SA_REP, sampai dengan saat ini. Hal ini berbeda dengan Karyawan yang bernama Whalen, yang bergabung dengan perusahaan ini sejak 17-Sep-1987. Whalen memegang jabatan sebagai AD_ASST selama periode 17-Sep-87 sampai dengan 17-Jun-93 dan sebagai AC_ACCOUNT selama periode 01-Jul-94 sampai dengan 31Dec-98. Whalen kembali lagi menjabat sebagai AD_ADDT, sampai dengan saat ini. Describe employees Name EMPLOYEE_ID FIRST_NAME LAST_NAME EMAIL PHONE_NUMBER HIRE_DATE JOB_ID SALARY COMMISION_PCT MANAGER_ID DEPARTMENT_ID
Null ? NOT NULL NOT NULL NOT NULL NOT NULL NOT NULL
Type NUMBER(6) VARCHAR2(20) VARCHAR2(25) VARCHAR2(25) VARCHAR2(20) DATE VARCHAR2120) NUMBER(8,2) NUMBER(2,2) NUMBER(6) NUMBER(4)
SELECT employee_id, last_name, job_id, hire_date, department_id FROM employees; EMPLOYEE_ID LAST_NAME JOB_ID HIRE_DATE 100 101 102 103 104 107 124 141 142 143 144 149 174 EMPLOYEE_ID 178 200 201
King Kochar De Hann Hunold Ernst Lorentz Mourgos Rajs Davies Matos Vargas Zlotkey Abel Taylor LAST_NAME
AD_PRES AD_VP AD_VP IT_PROG IT_PROG IT_PROG ST_MAN ST_CLERK ST_CLERK ST_CLERK IT_PROG SA_MAN SA_REP SA_REP JOB_ID
17-JUN-87 21-SEP-89 13-JAN-93 03-JAN-90 21-MAY-91 07-FEB-99 16-NOV-99 17-OCT-95 29-JAN-97 15-MAR-98 09-JUL-98 29-JAN-00 11-MAY-96 24-MAR-98 HIRE_DATE
Grant Whalen Harstein
SA_REP AD_ASST MK_MAN
24-MAY-99 17-SEP-87 17-FEB-96
...
Oracle Database 10g: Fundamentals I 7-5
DEPARTMENT_ ID 90 90 90 60 60 60 50 50 50 50 50 80 80 176 DEPARTMENT_ ID 10 20
Tabel yang digunakan pada Bab ini (lanjutan) DESCRIBE job_history Name EMPLOYEE_ID START_DATE END_DATE JOB_ID DEPARTMENT_ID
Null ?
Type
NOT NULL NOT NULL NOT NULL NOT NULL
NUMBER(6) DATE DATE VARCHAR2(10) NUMBER(4)
SELECT * FROM job_history EMPLOYEE_ID
START_DATE
HIRE_DATE
JOB_ID
DEPARTMENT_ID
102
13-JAN-98
24-JUL-98
IT_PROG
101
21-SEP-93
27-OCT-93
AC_ACCOUNT
110
101
28-OCT-97
15-MAR-97
AC_MGR
110
201
17-FEB-96
19-DEC-99
MK_REP
20
114
24-MAR-98
31-DEC-99
ST_CLERK
50
122
01-JAN-99
31-DEC-99
ST_CLERK
50
200
17-SEP-87
17-JUN-93
AD_ASST
90
176
24-MAR-98
31-DEC-98
SA_REP
80
176
01-JAN-99
31-DEC-99
SA_MAN
80
200
01-JUL-94
31-DEC-98
AC_ACCOUNT
90
10 rows selected
Oracle Database 10g: Fundamentals I 7-6
60
Operator UNION
Operator UNION mengembalikan hasil-hasil dari kedua query setelah menghilangkan adanya duplikasi.
UNION Operator UNION Operator mengembalikan semua baris yang dipilih oleh query yang sama. Gunakan UNION Operator untuk mengembalikan semua baris dari beberapa tabel kemudian menghapus semua baris duplikat.
Pedoman-Pedoman Jumlah kolom dan tipe data dari kolom yang telah dipilih harus identik dengan semua pernyataan SELECT yang digunakan dalam Query. Nama kolom tidak harus identik. UNION mengubah keseluruhan kolom yang telah dipilih Nilai NULL tidak diperbolehkan sebelum dicek. Operator IN mempunyai prioritas lebih dulu daripada operator UNION Secara default, output akan diurutkan secara ascending dari kolom pertama kalimat SELECT.
Oracle Database 10g: Fundamentals I 7-7
Menggunakan Operator UNION Menampilkan detail pekerjaan dari semua karyawan baik yang sekarang atau sebelumnya. Menampilkan karyawan hanya sekali.
Menggunakan Operator UNION Operator UNION menghapus semua record duplikat. Jika record tidak ada dalam kedua tabel EMPLOYEES dan JOB_HISTORY secara identik, maka record tersebut ditampilkan hanya sekali. Amati dari tampilan output pada slide, record untuk karyawan dengan EMPLOYEE_ID200 ditampilkan dua kali karena JOB_ID berbeda-beda pada tiap row. Perhatikan contoh dibawah ini : SELECT employee_id, job_id, department_id FROM employees UNION SELECT employee_id, job_id, department_id FROM job_history; EMPLOYEE_ID
JOB_ID
DEPARTMENT_ID
… 200 200 200 ...
AC_ACOUNT AD_ASST AD_ASST
90 10 90
29 rows slected
Pada output tersebut diatas tadi, karyawan dengan EMPLOYEE_ID = 200 muncul 3 kali. Kenapa ? Perhatikan nilai DEPARTMENT_ID untuk karyawan 200. Satu baris mempunyai DEPARTMENT_ID 90, lainnya 10 dan 90. Karena ini merupakan gabungan unik dari job_IDs dan department_IDs, setiap baris untuk karyawan 200 ini unik dan maka bukan merupakan duplikat. Amati bahwa outputnya berurutan secara ascending dari kolom pertama kalimat SELECT (dalam hal ini, EMPLOYEE_ID).
Oracle Database 10g: Fundamentals I 7-8
Operator UNION ALL
UNION ALL operator mengembalikan hasil-hasil dari kedua query, termasuk semua hasil yang duplikasi.
Operator UNION ALL Gunakan operator UNION ALL untuk mengembalikan semua baris dari beberapa queri Pedoman-Pedoman Petunjuk untuk UNION dan UNION ALL semua sama, tapi dengan 2 perkecualian untuk UNION ALL yaitu : Tidak seperti UNION, baris duplikat tidak akan terhapus dan output tidak diurutkan secara default. Keyword DISTINCT tidak bisa digunakan.
Oracle Database 10g: Fundamentals I 7-9
Menggunakan operator UNION ALL Menampilkan semua karyawan yang bekerja di departemen baik yang sekarang maupun sebelumnya.
.
UNION ALL (lanjutan) Seperti yang pada contoh diatas, ada 30 baris yang terpilih. Gabungan antara dua tabel berjumlah 30 baris. Operator UNION ALL tidak menghapus baris duplikat. UNION mengembalikan semua baris distinct yang telah diseleksi oleh query tersebut. Fungsi UNION ALL mengembalikan semua baris yang telah diseleksi oleh query, termasuk semua duplikatnya. Perhatikan quey yang terdapat pada slide, sekarang tuliskan dengan menggunakan kalimat UNION : SELECT employee_id, job_id, department_id FROM employees UNION SELECT employee_id, job_id, department_id FROM job_history ORDER BY employee_id; Pada hasil query perintah diatas didapatkan hasil 29 baris. Hal ini dikarenakan perintah diatas telah menghapus baris berikut ini (yang merupakan sebuah baris duplikat) : EMPLOYEE_ID
JOB_ID 176
SA_REP
Oracle Database 10g: Fundamentals I 7-10
DEPARTMENT_ID 80
Operator INTERSECT
Operator INTERSECT mengembalikan nilai (baris) yang terletak diantara kedua query.
Operator INTERSECT Gunakan operator INTERSECT untuk mengembalikan semua baris yang ada (terlibat) dalam beberapa query. Petunjuk Nomor kolom dan tipe data kolom telah dipilih oleh pernyataan SELECT dalam query harus selalu identik di dalam semua pernyataan SELECT yang digunakan dalam query. Nama dari kolom tidak harus selalu identik. Membalikkan tabel yang telah diintersect tidak akan mengubah hasil. INTERSECT tidak akan memperbolehkan adanya nilai NULL.
Oracle Database 10g: Fundamentals I 7-11
Menggunakan Operator INTERSECT Menampilkan employee ID dan job ID dari tabel employee dimana karyawan tersebut mempunyai pekerjaan yang sama dengan pekerjaan mereka terdahulu (karyawan tersebut telah berganti pekerjaan tapi sekarang kembali lagi bekerja pada pekerjaan asal)
Operator INTERSECT (lanjutan) Seperti contoh pada slide, query hanya mengembalikan record yang mempunyai kesamaan nilai di dalam kolom yang telah dipilih di kedua tabel tersebut. Apa yang akan dihasilkan jika anda menambahkan kolom DEPARTMENT_ID ke dalam pernyataan SELECT dari table JOB_HISTORY dan menjalankan query ini ? Hasilnya bisa saja berbeda karena pendahuluan dari kolom lainnya dimana nilai bisa diduplikasikan atau tidak diduplikasikan. Contoh SELECT employee_id, job_id, department_id FROM employees INTERSECT SELECT employee_id, job_id, department_id FROM job_history; EMPLOYEE_ID
JOB_ID 176
DEPARTMENT_ID
SA_REP
80
Karyawan 200 bukan lagi bagian dari hasil, hal ini dikarena nilai EMPLOYEES.DEPARTMENT_ID berbeda dari nilai JOB_HISTORY.DEPARTMENT_ID
Oracle Database 10g: Fundamentals I 7-12
Operator MINUS
Operator MINUS mengembalikan baris pada query pertama dan tidak tampak pada query kedua.
Operator MINUS Gunakan Operator MINUS untuk mengembalikan baris, yang dikembalikan oleh query pertama, yang tidak tampak pada saat query kedua (pernyataan SELECT pertama MINUS pernyataan SELECT kedua). Petunjuk Jumlah kolom dan tipe data dari kolom telah dipilih oleh pernyataan SELECT di dalam query seharusnya identik di dalam semua pernyataan SELECT yang digunakan dalam query. Nama kolom tidak harus identik. Semua kolom dalam kalimat WHERE seharusnya berada dalam kalimat SELECT supaya operator MINUS berkerja.
Oracle Database 10g: Fundamentals I 7-13
Operator MINUS Menampilkan employee id dari karyawan-karyawan yang tidak pernah ganti pekerjaan sekalipun.
Operator MINUS (lanjutan) Seperti contoh pada slide, employee_ID dan job_ID dalam tabel JOB_HISTORY dikurangi dari tabel EMPLOYEES. Rnomorian hasil menampilkan sisa karyawan setelah pengurangan;data tersebut diperlihatkan oleh baris yang terdapat pada tabel EMPLOYEES tapi tidak terdapat dalam tabel JOB_HISTORY. Ini merupakan record dari karyawan yang tidak pernah berganti pekerjaan meskipun sekali.
Oracle Database 10g: Fundamentals I 7-14
Petunjuk Set Operator
Ekspresi yang terdapat pada SELECTlist harus sama dengan nomor dan tipe datanya. Parentheses dapat digunakan untuk merubah sequence. ORDER BY clause : - Dapat digunakan hanya diakhir dari suatu statement. - Dapat menggunakan nama kolom, alias dari SELECT statement yang pertama, atau sesuai dengan letak penulisan.
Petunjuk Tentang Set Operator Penulisan di dalam rnomori SELECT dari query harus sesuai dengan nomor dan tipe data. Query yang menggunakan operator-operator seperti UNION, UNION ALL, INTERSECT dan MINUS didalam kalimat WHEREnya harus mempunyai persamaan nomor dan tipe data kolom dalam rangkaian SELECT. Seperti pada contoh : SELECT employee_id, department_id FROM employees WHERE (employee_id, department_id) IN (SELECT employee_id, department_id) FROM employees UNION SELECT employee_id, department_id FROM employees); Kalimat ORDER_BY : Bisa muncul pada akhir sebuah pernyataan Akan menerima nama kolom, sebuah alias atau sesuai dengan letak penulisan Nama kolom atau alias, jika digunakan sebuah kalimat ORDER_BY, seharusnya berasal dari daftar SELECT yang pertama. Set operator bisa digunakan pada subqueri.
Oracle Database 10g: Fundamentals I 7-15
Server Oracle dan Set Operator
Baris yang duplikasi akan otomatis hilang kecuali pada UNION ALL. Nama Kolom dari query yang pertama akan muncul pada hasil. Output akan diurutkan secara ascending oleh order by default kecuali pada UNION ALL.
Server Oracle dan Set operator Ketika sebuah query menggunakan set operator, Server Oracle akan menghapus baris duplikat secara otomatis kecuali di dalam kondisi dengan operator UNION ALL. Nama kolom outputnya ditentukan oleh daftar kolom pada pernyataan SELECT yang pertama. Secara default output akan diurutkan secara ascending dari kolom pertama kalimat SELECT. Keterkaitan penulisan di dalam daftar SELECT yang merupakan komponen query dari campuran query harus sesuai dengan nomor dan tipe data. Jika komponen query memilih data karakter, tipe data dari nilai balik dengan ketentuan sebagai berikut :
Jika kedua query memilih nilai dari tipe data CHAR, nilai balik harus berupa tipe data CHAR.
Jika salah satu atau kedua query tersebut memilih nilai tipe data VARCHAR2, maka nilai balik berupa tipe data VARCHAR2.
Oracle Database 10g: Fundamentals I 7-16
Membandingkan Dengan Pernyataan SELECT Menggunakan operator UNION, untuk menampilkan Department_ID, Location, dan Hire Date untuk semua karyawan.
Membandingkan dengan Pernyataan SELECT Karena penulisan dari daftar pilih dari query harus sesuai dengan nomor, anda bisa menggunakan kolom dummy dan Para pengguna konversi tipe data sudah menyetujui hal ini. Di dalam slide, nama location itu diberikan sebagai nama heading kolom dummy. Fungsi dari TO_NUMBER ialah digunakan pada query pertama untuk membandingkan tipe data NUMBER dari kolom LOCATION_ID yang akan diterima kembali oleh query yang kedua. Begitupun, fungsi dari TO_DATE pada query yang kedua, digunakan untuk membandingkan tipe data kolom HIRE_DATE yang diterima kembali oleh first query.
Oracle Database 10g: Fundamentals I 7-17
Membandingkan Dengan Pernyataan SELECT : Contoh Menggunakan operator UNION, untuk menampilkan employee_ID, job_id, dan salary untuk semua karyawan.
Membandingkan dengan pernyataan SELECT : Contoh Table EMPLOYEES dan JOB_HISTORY mempunyai beberapa kolom di dalamnya (seperti contoh, EMPLOYEE_ID, JOB_ID dan DEPARTMENT_ID). Tapi apa yang dihasilkan, jika anda ingin melakukan query untuk menampilkan employee ID, ob ID dan gaji menggunakan operator UNION, diketahui bahwa gaji hanya terdapat di table EMPLOYEES ? Contoh kode seperti pada slide, membandingkan antara kolom EMPLOYEE_ID dan JOB_ID di dalam tabel EMPLOYEES dan JOB_HISTORY. Biasanya nilai 0 dihasilkan pernyataan JOB_HISTORY SELECT untuk membandingkan angka kolom SALARY pada pernyataan EMPLOYEE SELECT. Pada hasil sebelumnya, setiap baris di dalam output yang berhubungan dengan record dari tabel JOB_HISTORY yang berisi 0 pada kolom SALARY.
Oracle Database 10g: Fundamentals I 7-18
Mengontrol Urutan Baris-Baris Menghasilkan sebuah kalimat dalam bahasa Inggris menggunakan dua operator UNION.
Mengontrol permintaan akan baris Secara default, outputnya terurut berdasarkan ascending pada kolom pertama. Anda bisa menggunakan perintah ORDER BY untuk menggantinya. Perintah ORDER BY bisa digunakan hanya sekali dalam campuran query. Jika digunakan, perintah ORDER BY harus diletakkan di bagian akhir dari penulisan query. Perintah ORDER BY dapat digunakan pada nama kolom atau menggunakan alias. Kode contoh pada slide tersebut diatas, ketika tanpa menggunakan perintah ORDER BY maka akan menghasilkan output secara alphabet pada kolom pertamanya : My dream I’ d like to teach sing the world to Catatan : Pikirkan sebuah query campuran dimana set operator UNION digunakan lebih dari sekali. Dalam kasus ini, perintah ORDER BY bisa digunakan hanya ketika keberadaannya jarang daripada penulisan secara explisit Perintah iSQL*Plus COLUMN Anda bisa menggunakan perintah iSQL*Plus COLUMN untuk menyesuaikan heading kolom. Syntax : COL[UMN] [{column|alias}[option]] Dimana OPTION itu : CLE[AR] : Menghapus format kolom HEA[DING] text : Mengatur heading kolom FOR[MAT] format : Merubah tampilan kolom menggunakan format model NOPRINT | PRINT : Menindas atau menampilkan heading kolom dan data NULL Pernyataan berikut ini menindas data kolom dan heading judul untuk kolom dinamakan A_DUMMY. Perhatikan SELECT clause yang pertama dalam slide pendahuluan membuat sebuah kolom bernama A_DUMMY. COLUMN a_dummy NOPRINT
Oracle Database 10g: Fundamentals I 7-19
RINGKASAN Pada bab ini, anda harus mempelajari bagaimana cara untuk :
Menggunakan UNION untuk menghasilkan semua baris distinct Menggunakan UNION ALL untuk menghasilkan semua baris, termasuk duplikatnya. Menggunakan INTERSECT untuk menghasilkan semua baris dimana digunakan untuk saling berbagi antar kedua query tersebut. Menggunakan MINUS untuk menghasilkan semua baris distinct yang dipilih oleh query yang pertama tapi tidak dipilih di query yang kedua. Menggunakan ORDER BY hanya pada bagian paling akhir dari pernyataan query.
Ringkasan
Operator UNION menghasilkan semua baris yang pilih query tersebut. Menggunakan operator UNION untuk menghasilkan semua baris dari berbagai tabel dan menghapus semua baris duplikat. Menggunakan operator UNION ALL untuk menghasilkan semua baris dari beragam query. Tidak seperti dalam kondisi dengan menggunakan operator UNION, baris duplikat tidak dihapus dan output tidak diurutkan secara default. Menggunakan operator INTERSECT untuk mengembalikan semua baris yang ada ke multiple query. Menggunakan operator MINUS untuk mengembalikan baris yang dikembalikan oleh query yang pertama, dimana hal ini tidak tampak pada query yang kedua. Ingatlah untuk menggunakan ORDER BY clause hanya pada bagian terakhir pernyataan query beragam. Pastikan keterkaitan penulisan dalam kesesuaian daftar SELECT yaitu nomor dan tipe datanya.
Oracle Database 10g: Fundamentals I 7-20