7
Tujuan
Dalam bab ini, anda mempelajari bagaimana cara menulis Query dengan menggunakan Set operator.
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
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 Hasil
UNION Semua baris distinct dipilih oleh query yang sama
UNION ALL Semua baris dipilih oleh query yang sama, termasuk semua duplikat
INTERSECT Semua baris distinct dipilih oleh kedua query
MINUS 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.
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.
Tabel-Tabel yang Digunakan dalam Pelajaran Ini
Tabel-tabel yang digunakan dalam pelajaran ini adalah :
EMPLOYEES
: Menyediakan rincian berdasarkan
pegawai-pegawai saat ini
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 31-Dec-98. Whalen kembali lagi menjabat sebagai AD_ADDT, sampai dengan saat ini.
Describe employees
Name Null ? Type
EMPLOYEE_ID NOT NULL NUMBER(6)
FIRST_NAME VARCHAR2(20)
LAST_NAME NOT NULL VARCHAR2(25)
EMAIL NOT NULL VARCHAR2(25)
PHONE_NUMBER VARCHAR2(20)
HIRE_DATE NOT NULL DATE
JOB_ID NOT NULL VARCHAR2120)
SALARY NUMBER(8,2)
COMMISION_PCT NUMBER(2,2)
MANAGER_ID NUMBER(6)
DEPARTMENT_ID NUMBER(4)
SELECT employee_id, last_name, job_id, hire_date, department_id FROM employees;
EMPLOYEE_ID LAST_NAME JOB_ID HIRE_DATE DEPARTMENT_ ID
100 King AD_PRES 17-JUN-87 90
101 Kochar AD_VP 21-SEP-89 90
102 De Hann AD_VP 13-JAN-93 90 103 Hunold IT_PROG 03-JAN-90 60 104 Ernst IT_PROG 21-MAY-91 60 107 Lorentz IT_PROG 07-FEB-99 60 124 Mourgos ST_MAN 16-NOV-99 50 141 Rajs ST_CLERK 17-OCT-95 50 142 Davies ST_CLERK 29-JAN-97 50 143 Matos ST_CLERK 15-MAR-98 50 144 Vargas IT_PROG 09-JUL-98 50 149 Zlotkey SA_MAN 29-JAN-00 80
174 Abel SA_REP 11-MAY-96 80
Taylor SA_REP 24-MAR-98 176
EMPLOYEE_ID LAST_NAME JOB_ID HIRE_DATE DEPARTMENT_ ID
178 Grant SA_REP 24-MAY-99
200 Whalen AD_ASST 17-SEP-87 10 201 Harstein MK_MAN 17-FEB-96 20
Tabel yang digunakan pada Bab ini (lanjutan)
DESCRIBE job_history
Name Null ? Type
EMPLOYEE_ID NOT NULL NUMBER(6)
START_DATE NOT NULL DATE
END_DATE NOT NULL DATE
JOB_ID NOT NULL VARCHAR2(10)
DEPARTMENT_ID 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 60 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
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.
Operator
UNION
Operator
UNION
mengembalikan hasil-hasil dari kedua query
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 AC_ACOUNT 90
200 AD_ASST 10
200 AD_ASST 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).
Menggunakan Operator
UNION
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.
Operator
UNION ALL
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 DEPARTMENT_ID
176 SA_REP 80
Menggunakan operator
UNION ALL
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.
Operator
INTERSECT
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 DEPARTMENT_ID
176 SA_REP 80
Karyawan 200 bukan lagi bagian dari hasil, hal ini dikarena nilai
EMPLOYEES.DEPARTMENT_ID berbeda dari nilai JOB_HISTORY.DEPARTMENT_ID
Menggunakan Operator
INTERSECT
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.
Operator
MINUS
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.
Operator
MINUS
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.
Petunjuk Set Operator
Ekspresi yang terdapat pada
SELECT
list harus sama
dengan nomor dan tipe datanya.
Parentheses dapat digunakan untuk merubah sequence.
ORDER BY
clause :
-
Dapat digunakan hanya diakhir dari suatu
statement.
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.
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.
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.
Membandingkan Dengan Pernyataan
SELECT
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.
Membandingkan Dengan Pernyataan
SELECT :
Contoh
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 :
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.
My dream
I’d like to teach
sing
the world to
Mengontrol Urutan Baris-Baris
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.
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.