Transcript

Bab 3Query LanjutanPOKOK BAHASAN:Subquery dan penggunaannya Subquery dengan banyak kolom Pairwise Comparison SubQuery NonPairwise Comparison SubQuery Penggunaan Query dalam Klausa FROM Ekspresi Scalar Korelasi SubQuery dan penggunaannya Penggunaan Query dengan Klausa WITH

TUJUAN BELAJAR:Setelah mempelajari materi dalam bab ini, mahasiswa diharapkan : Dapat menulis subquery dengan banyak kolom Dapat menggambarkan dan menjelaskan karakteristik dari subqueries pada saat didapatkan nilai NULL Dapat menulis subquery dalam klausa FROM Dapat menggunakan scalar subqueries dalam SQL Dapat menggambarkan tipe dari persoalan yang dapat dipecahkan dengan menggunakan sub query yang berkorelasi. Dapat menulis subquery yang berkorelasi. Melakukan Update dan Delete baris dengan menggunakan subqueries yang berkorelasi. Dapat menggunakan operator EXISTS dan NOT EXISTS Dapat menggunakan klausa WITH

41

BAB 3 QUERY LANJUTAN

42

3.1.

TABEL YANG DIGUNAKAN PADA PEMBAHASAN

Bagian ini menjelaskan mengenai tabel yang digunakan pada pembahasan bab Query Lanjutan. Ada 3 buah tabel yang digunakan masing-masing memiliki struktur sebagai berikut : 1. Tabel DEPARTMENTS

2. Tabel EMPLOYEES

BAB 3 QUERY LANJUTAN

43

3. Tabel JOB_HISTORY

3.2.

APA ITU SUBQUERY ?Bagian ini membahas tentang penggunaan subquery dalam Query Lanjutan. Apa Subquery adalah statement SELECT yang

yang disebut dengan SubQuery ?

dilampirkan sebagai klausa dalam SQL Statement yang lain.

Main query

SELECT ... FROM ... WHERE ...

(SELECT ... FROM ... WHERE ...)

Subquery

Gambar 3-1: Subquery dalam Main Query

Pada gambar diatas, subquery (inner query) dijalankan sekali sebelum main query. Kemudian hasil dari subquery digunakan oleh main query (outer query). Berikut posisi penulisan subquery dalam SQL command :

SELECT select_list FROM table WHERE expr operator (SELECT select_list FROM table);

BAB 3 QUERY LANJUTAN

44

3.3 PENGGUNAAN SUBQUERYSubquery mengembalikan nilai ke main query. Subquery digunakan untuk menyelesaikan persoalan dimana terdapat suatu nilai yang tidak diketahui (unknown values). Berikut ini diberikan contoh penggunaan subquery.

SELECT last_name 10500 FROM employees WHERE salary > (SELECT salary FROM employees WHERE employee_id = 149) ;

Query diatas akan menampilkan nama pegawai yang gajinya lebih dari pegawai dengan nomer pegawai 149. Sebelumnya, gaji dari pegawai dengan nomer pegawai 149 tidak diketahui, untuk itu kita tempatkan sebagai subquery agar nilai yang tidak diketahui tersebut dapat diketahui dan pada ilustrasi gambar diatas nilai gaji dari pegawai 149 adalah 10500.

3.4. SUBQUERY BANYAK KOLOMPada subquery dengan banyak kolom, tiap baris dari main query dibandingkan dengan nilai dari subquery multiple-row dan multiple-column. pembandingan dengan banyak kolom dan baris : Berikut ini contoh

Main queryWHERE (MANAGER_ID, DEPARTMENT_ID) IN

Subquery100 102 124 90 60 50

BAB 3 QUERY LANJUTAN

45

3.5. PEMBANDINGAN KOLOMPembandingan kolom dalam subquery banyak kolom dapat berupa : Pembandingan berpasangan (Pairwise Comparison SubQuery) Pembandingan tidak berpasangan (NonPairwise Comparison SubQuery)

3.5.1. PAIRWISE COMPARISON SUBQUERYBerikut contoh pembandingan berpasangan untuk menampilkan detail dari data pegawai yang dimanajeri oleh manajer dan department yang sama dengan yang dimiliki oleh nomer pegawai 178SELECT employee_id, manager_id, department_id FROM employees WHERE (manager_id, department_id) IN (SELECT manager_id, department_id FROM employees WHERE employee_id IN (178,174)) AND employee_id NOT IN (178,174);

3.5.2. NONPAIRWISE COMPARISON SUBQUERYBerikut contoh pembandingan tidak berpasangan untuk menampilkan detail dari data pegawai yang dimanajeri oleh manager yang sama dengan pegawai dengan nomer pegawai 174 atau 141 dan bekerja dalam departement yang sama dengan pegawai yang memiliki nomer pegawai 174 atau 141.

SELECT FROM WHERE

AND

employee_id, manager_id, department_id employees manager_id IN (SELECT manager_id FROM employees WHERE employee_id IN (174,141)) department_id IN (SELECT department_id FROM employees WHERE employee_id IN (174,141)) employee_id NOT IN(174,141);

AND

BAB 3 QUERY LANJUTAN

46

3.6. PENGGUNAAN QUERY DALAM KLAUSA FROMQuery bisa diletakkan di dalam klausa FROM untuk membentuk tabel temporer. Query semacam ini dikenal juga dengan istilah inline view, karena tidak membentuk object database. Berikut ini contoh penggunaan Query dalam klausa FROM.

SELECT FROM

WHERE AND

a.last_name, a.salary, a.department_id, b.salavg employees a, (SELECT department_id, AVG(salary) salavg FROM employees GROUP BY department_id) b a.department_id = b.department_id a.salary > b.salavg;

Query diatas menampilkan nama dan gaji dari pegawai yang gajinya lebih besar dari rata-rata gaji pegawai pada departemen tempat dia bekerja.

3.7. EKSPRESI SCALAR SUBQUERYEkspresi scalar subquery adalah subquery yang mengembalikan hanya satu nilai kolom dari satu baris. Scalar subquery pada standart SQL-92 hanya terbatas pada : SELECT Statement (klausa FROM dan WHERE saja) Daftar VALUE dari statement INSERT Pada standart SQL-99, scalar subqueries dapat diguanakan dalam : Kondisi dan ekspresi sebagai bagian dari perintah DECODE dan CASE. Semua klausa dari SELECT Statement kecuali GROUP BY.

BAB 3 QUERY LANJUTAN

47

Berikut ini contoh penggunaan scalar subquery dalam ekspresi CASE :

SELECT employee_id, last_name, (CASE 20 WHEN department_id = (SELECT department_id FROM departments WHERE location_id = 1800) FROM THEN 'Canada' ELSE 'USA' END) location employees;Berikut ini contoh penggunaan scalar subquery dalam klausa ORDER BY :

SELECT employee_id, last_name FROM employees e ORDER BY (SELECT department_name FROM departments d WHERE e.department_id = d.department_id);

3.8. KORELASI SUBQUERYKorelasi SubQuery digunakan untuk pemrosesan baris per baris. subquery dijalankan sekali untuk setiap baris dari outer query. Prosesnya sebagai berikut : Tiap-tiap

AMBIL Baris dari outer query JALANKAN

inner query dengan menggunakan nilai baris kandidat

GUNAKAN Nilai dari inner query untuk qualify / disqualify baris kandidatGambar 3-2 : Proses Korelasi Subquery

BAB 3 QUERY LANJUTAN

48

Pada gambar 3-2, proses korelasi dimulai dengan mengambil baris dari outer query, kemudian inner query dijalankan dengan menggunakan nilai baris kandidat, kemudian nilai dari inner query digunakan untuk melakukan kualifikasi atau mendiskualifikasi baris kandidat. Berikut ini cara penulisan dari Korelasi SubQuery :

SELECT column1, column2, ... outer FROM table1 WHERE column1 operator (SELECT FROM WHERE

colum1, column2 table2 expr1 = outer .expr2);

Pada gambar diatas, subquery merefer ke kolom dari tabel yang ada pada parent atau outer query. Berikut ini contoh penggunaan korelasi subquery untuk mencari pegawai yang penghasilannya melebihi rata-rata penghasilan pada departemen tempat mereka bekerja.

SELECT last_name, salary, department_id FROM employees outer WHERE salary > (SELECT AVG(salary) FROM employees WHERE department_id = outer.department_id) ;Setiap saat baris dari outer query diproses, maka inner query dievaluasi.

Berikut ini contoh yang lain dari korelasi subquery yaitu untuk menampilkan pegawai yang pernah berganti job maksimal dua kali.

BAB 3 QUERY LANJUTAN

49

SELECT e.employee_id, last_name,e.job_id FROM employees e WHERE 2 (SELECT dept_avg FROM avg_cost) ORDER BY department_name;Contoh penggunaan klausa WITH diatas digunakan untuk menampilkan nama departemen dan total gaji untuk tiap departemen yang memiliki total gaji lebih besar dari gaji rata-rata pada sembarang department.

RINGKASAN:Subquery digunakan untuk menyelesaikan persoalan dimana terdapat suatu nilai yang tidak diketahui (unknown values) Pada subquery dengan banyak kolom, tiap baris dari main query dibandingkan dengan nilai dari subquery multiple-row dan multiple-column. Pembandingan kolom dalam subquery banyak kolom dapat berupa pembandingan berpasangan comparison). Query bisa diletakkan di dalam klausa FROM untuk membentuk tabel temporer, dan dikenal juga dengan istilah inline view. Korelasi SubQuery digunakan untuk pemrosesan baris per baris. Klausa WITH dapat menggunakan blok query yang sama dalam statement SELECT pada saat terjadi lebih dari sekali dalam complex query. (pairwise comparison) dan tidak berpasangan (nonpairwise

BAB 3 QUERY LANJUTAN

53

LATIHAN SOAL :1) Buat query untuk menampilkan nama, nomer departemen, dan gaji dari pegawai yang yang memiliki nomer departemen dan gaji yang sama dengan nomer departemen dan gaji dari pegawai yang memiliki komisi. 2) Buat query untuk menampilkan nama pegawai, nama departemen, dan gaji dari pegawai yang memiliki gaji dan komisi yang sama dengan gaji dan komisi dari pegawai yang memiliki location ID 1700. 3) Buat query untuk menampilkan nama pegawai, tanggal mulai masuk kerja (hire date), dan gaji untuk semua pegawai yang memiliki gaji dan komisi seperti yang dimiliki oleh pegawai yang bernama Kochhar. Note: Data Kochhar tidak ditampilkan dalam hasil query. 4) Buat query untuk menampilkan detail dari nomer pegawai, nama pegawai dan nomer pegawai yang sama dengan pegawai yang bertempat tinggal di kota yang nama kotanya diawali dengan huruf T. 5) Buat query untuk menampilkan data semua pegawai yang memiliki gaji yang lebih dari rata-rata gaji pada departemen tempat mereka bekerja. Data yang ditampilkan yaitu nama pegawai, gaji, nomer departemen, dan rata-rata gaji pada departemen tempat mereka bekerja. Urutkan berdasarkan rata-rata gaji. 6) Tampilkan semua pegawai yang bukan supervisor a. Cara pertama gunakan operator NOT EXISTS. b. Apakah persoalan dapat dipecahkan dengan menggunakan operator NOT IN? Jika bisa bagaimana caranya, dan jika tidak bisa mengapa ? (Supervisor adalah pegawai yang punya bawahan pegawai yang lain => employee_id nya menjadi manager_id dari pegawai yang lain) 7) Buat query untuk menampilkan nama pegawai yang gajinya kurang dari rata-rata gaji pada departemen tempat dia bekerja. 8) Buat query untuk menampilkan nama dari pegawai yang memiliki satu atau lebih kolega (teman satu departemen) dimana kolega tersebut masuk lebih akhir tapi memiliki gaji lebih tinggi.

BAB 3 QUERY LANJUTAN

54

9) Buat query untuk menampilkan nomer pegawai, nama pegawai dan nama departemen dari semua pegawai yang ada. Note: Gunakan scalar subquery untuk mendapatkan nama departemen dalam statemen SELECT. 10) Buat query untuk menampilkan nama departemen dari tiap departemen yang memiliki total gaji diatas 1/8 dari total gaji keseluruhan pada perusahaan. Gunakan klausa WITH untuk menulis query tersebut. Beri nama SUMMARY. 11) Buat query untuk menampilkan peagwai yang memiliki gaji yang lebih tinggi dari gaji semua sales managers (JOB_ID = ' SA_MAN' Urutkan berdasarkan jumlah ). gaji dari tinggi ke rendah.