pendahuluan modul 5 fix

18
PRAKTIKUM BASIS DATA 2010 Laboratorium Pemrograman Jurusan Teknik Informatika Fakultas Teknologi Informasi Institut Teknologi Sepuluh November MODUL 5 QUERY LANJUT Soal Teori Advanced Query 1. Jelaskan dan beri contoh masing-masing operasi JOIN berikut: a. INNER JOIN Inner join berfungsi untuk menggabungkan dua buah table yang berkaitan. Inner join menampilkan nilai bila setidaknya ada satu baris yang cocok antara dua tabel, dan tidak menampilkan baris yang tidak memiliki ketidakcocokan dengan tabel lain. Syntax : SELECT field1, field2, field3 FROM tabel_pertama INNER JOIN tabel_kedua ON tabel_pertama.keyfield = tabel_kedua.foreign_keyfield Contoh : SELECT Pegawai.Nama, Pesanan.Produk FROM Pegawai INNER JOIN Pesanan ON Pegawai.ID_Pegawai=Pesanan.ID_Pegawai b. OUTER JOIN Outer join adalah join yang mengambil nilai dari luar (out). Outer join menampilkan semua baris dari tabel selama memenuhi kondisi walaupun tidak memiliki kecocokan data. Syntax: SELECT column_list FROM table_reference LEFT | RIGHT | FULL [OUTER] JOIN table_reference ON predicate [LEFT | RIGHT | FULL [OUTER] JOIN table_reference ON predicate...]

Transcript of pendahuluan modul 5 fix

Page 1: pendahuluan modul 5 fix

PRAKTIKUM BASIS DATA 2010Laboratorium PemrogramanJurusan Teknik Informatika

Fakultas Teknologi Informasi Institut Teknologi Sepuluh November

MODUL 5QUERY LANJUT

Soal Teori Advanced Query1. Jelaskan dan beri contoh masing-masing operasi JOIN berikut:

a. INNER JOINInner join berfungsi untuk menggabungkan dua buah table yang berkaitan. Inner join menampilkan nilai bila setidaknya ada satu baris yang cocok antara dua tabel, dan tidak menampilkan baris yang tidak memiliki ketidakcocokan dengan tabel lain.

Syntax :SELECT field1, field2, field3FROM tabel_pertama INNER JOIN tabel_keduaON tabel_pertama.keyfield = tabel_kedua.foreign_keyfield

Contoh :SELECT Pegawai.Nama, Pesanan.ProdukFROM PegawaiINNER JOIN PesananON Pegawai.ID_Pegawai=Pesanan.ID_Pegawai

b. OUTER JOINOuter join adalah join yang mengambil nilai dari luar (out). Outer join menampilkan semua baris dari tabel selama memenuhi kondisi walaupun tidak memiliki kecocokan data.

Syntax:SELECT column_listFROM table_referenceLEFT | RIGHT | FULL [OUTER] JOIN table_reference ON predicate[LEFT | RIGHT | FULL [OUTER] JOIN table_reference ON predicate...]

Contoh :SELECT *FROM Customer CLEFT OUTER JOIN Orders O ON (C.CustNo = O.CustNo)

c. LEFT OUTER JOINLeft Outer Join menampilkan nilai setiap baris (record) dari tabel pertama dan nilai setiap baris dari tabel kedua. Apabila terdapat ketidakcocokan, maka nilai pada baris (record) dari tabel kedua akan diisi dengan nilai NULL.

Contoh :

Page 2: pendahuluan modul 5 fix

PRAKTIKUM BASIS DATA 2010Laboratorium PemrogramanJurusan Teknik Informatika

Fakultas Teknologi Informasi Institut Teknologi Sepuluh November

SELECT trklinik.kdpasien, pasien.nmpasienFROM trklinikLEFT OUTER JOIN pasienON trklinik.kdpasien = pasien.kdpasien

d. RIGHT OUTER JOINRight Outer join memiliki kebalikan dengan Left Outer Join, dimana tabel di sebelah kanan yang akan ditampilkan semua recordnya, baru dicocokkan dengan tabel di sebelah kiri. Apabila tidak terdapat kecocokan, maka di tabel sebelah kiri akan diberi nilai NULL.

Contoh :SELECT trklinik.kdtransaksi, pasien.kdpasien, pasien.nmpasienFROM trklinik RIGHT OUTER JOIN pasienON trklinik.kdpasien = pasien.kdpasien

e. SELF JOINSuatu bentuk join yang melibatkan tabel yang sama. Dalam penggunaannya harus menggunakan ALIAS yang berbeda untuk tabel yang sama. Kesamaan tabel sumber membuat sedikit masalah karena kondisi JOIN tidak mengijinkan nama tabel yang sama.

Contoh :SELECT dm.nmdokter AS Dokter_Muda, spv.nmdokter AS SupervisorFROM dokter dm, dokter spvWHERE dm.supervisor = spv.kddokter

2. Sebutkan minimal 3 limitasi dalam penggunaan OUTER JOIN! Sertakan pula contohnya!Pembatasan pada operan kanan dari LEFT JOIN (ekuivalen dengan operan kiri dari RIGHT JOIN).Contoh:

Code di atas tidak dapat dieksekusi, karena operan kanannya berupa:

Untuk mengatasi masalah di atas code dapat diubah menjadi:

Namun, bentuk ini biasanya akan lebih lambat dibandingkan dengan code awal.

Page 3: pendahuluan modul 5 fix

PRAKTIKUM BASIS DATA 2010Laboratorium PemrogramanJurusan Teknik Informatika

Fakultas Teknologi Informasi Institut Teknologi Sepuluh November

Pembatasan pada apa yang bisa masuk dalam klausa ON yang menentukan join. Kondisi pada klausa ON dapat dikombinasikan hanya dengan menggunakan AND, kondisi lain seperti OR dan NOT tidak dapat muncul dalam klausul ON.Contoh:

Page 4: pendahuluan modul 5 fix

PRAKTIKUM BASIS DATA 2010Laboratorium PemrogramanJurusan Teknik Informatika

Fakultas Teknologi Informasi Institut Teknologi Sepuluh November

Tidak dapat menggunakan kondisi outer join dengan operator IN,Contoh:

3. Jelaskan dan beri contoh masing-masing Set Operator berikut :a. UNION ALL

Operator UNION ALL mengembalikan kedua nilai dari table termasuk semua duplikasi.

Contoh : tampilkan detail job saat ini dan job sebelumnya dari semua employee.SELECT employee_id, job_id, department_id

Page 5: pendahuluan modul 5 fix

PRAKTIKUM BASIS DATA 2010Laboratorium PemrogramanJurusan Teknik Informatika

Fakultas Teknologi Informasi Institut Teknologi Sepuluh November

FROM employeesUNION ALLSELECT employee_id, job_id, department_idFROM job_historyORDER BY employee_id;

b. UNIONOperator UNION mengembalikan kedua nilai dari table dengan mengeleminasi duplikasi yang ada.

Contoh : Untuk menampilkan detail job saat ini dan job sebelumnya dari semua employee. Tampilkan tiap employee hanya sekali.SELECT employee_id, job_idFROM employeesUNIONSELECT employee_id, job_idFROM job_history;

c. INTERSECTOperator intersect menghasilkan sebuah daftar yang berisi hanya record-record yang ter-dapat pada kedua tabel dan kedua tabel tersebut harus sesuai.

Contoh : tampilkan nomer pegawai dan nomer dari job-job yang pernah dipegang oleh pegawai sebelum memasuki masa pensiun.SELECT employee_id, job_idFROM employeesINTERSECTSELECT employee_id, job_idFROM job_history;

d. MINUSMengembalikan baris yang ada pada query pertama dan tidak termasuk dalam query kedua.

Contoh : tampilkan nomer pegawai yang merubah pekerjaannya sedikitnya sekali.SELECT employee_id,job_id

Page 6: pendahuluan modul 5 fix

PRAKTIKUM BASIS DATA 2010Laboratorium PemrogramanJurusan Teknik Informatika

Fakultas Teknologi Informasi Institut Teknologi Sepuluh November

FROM employeesMINUSSELECT employee_id,job_idFROM job_history;

4. Jelaskan syarat dalam penggunaan set operator! Syarat “Set Operator” expressions di SELECT harus “match” dalam jumlah dan data type. tanda “( .. )” dapat dipakai untuk merobah urutan eksekusi ORDER BY clause:

o ditulis hanya di akhir statemento bisa menerima column name, alias dr SELECT statement,atau

positional notation

5. Jelaskan dan beri contoh penggunaan fungsi DECODE !Fungsi DECODE menyediakan fasilitas pencocokan seperti yang dikerjakan oleh CASE atau IF-THEN-ELSE.Fungsi decode ini digunakan untuk membandingkan sebuah nilai dengan nilai yang lain. Apabila nilainya adalah sama, makan fungsi DECODE () akan kembali ke result, namun jika tidak makan akan kebali ke nilai default.

Sintaks :DECODE(col/expression, search1, result1[, search2, result2, …., ][, default])

Contoh :

6. Jelaskan dan beri contoh penggunaan fungsi CASE !Fungsi SQL CASE merupakan salah satu ekspresi kondisional dengan menggunakan logika IF-THEN-ELSE di dalam SQL Statement.

Contoh:

Page 7: pendahuluan modul 5 fix

PRAKTIKUM BASIS DATA 2010Laboratorium PemrogramanJurusan Teknik Informatika

Fakultas Teknologi Informasi Institut Teknologi Sepuluh November

7. Jelaskan dan beri contoh penggunaan fungsi:a. RANK()

untuk memberikan penomoran peringkat record berdasarkan suatu kolom. Juga bisa mengelompokkan kolom tersebut menjadi beberapa group dengan kategorisasi yang telah kita tentukan.

Sintaks :RANK() OVER( [PARTITION BY partition_clause]ORDER BY column [ASC | DESC [NULLS FIRST | LAST ] )

Contoh :

b. DENSE_RANK()

Page 8: pendahuluan modul 5 fix

PRAKTIKUM BASIS DATA 2010Laboratorium PemrogramanJurusan Teknik Informatika

Fakultas Teknologi Informasi Institut Teknologi Sepuluh November

Fungsi DENSE_RANK bekerja seperti fungsi RANK namun memberikan peringkat berturut-turut.

Contoh :

c. ROW_NUMBER()Melakukan penomoran item yang dikelompokkan berdasarkan suatu nilai.

Contoh

d. OVER PARTITION

Contoh :

Page 9: pendahuluan modul 5 fix

PRAKTIKUM BASIS DATA 2010Laboratorium PemrogramanJurusan Teknik Informatika

Fakultas Teknologi Informasi Institut Teknologi Sepuluh November

Soal Shift

Kerjakan soal-soal berikut dengan mengacu pada PDM APOTEK yang telah diberikan pada modul 4 !

1. Tampilkan seluruh apoteker urut berdasarkan jumlah penjualan terbesar, jika belum pernah melayani transaksi penjualan maka tampilkan ‘0’. Jika jumlah penjualan melebihi 350000 maka tampilkan keterangan ‘Aman’, jika jumlah penjualan sama dengan 0 maka tampilkan keterangan ‘Pecat’ selain itu ‘Bahaya’Tampilan hasil :

select id_apoteker,nama_apoteker,total_penjualan,keteranganfrom (select id_apoteker as id_apoteker,nama_apoteker as nama_apoteker, total_penjualan as total_penjualan, (case when total_penjualan >350000 then 'aman' when total_penjualan = 0 then 'pecat' else 'bahaya' end)keterangan from (select ap.id_apoteker as id_apoteker,ap.nama_apoteker as nama_apoteker,

Page 10: pendahuluan modul 5 fix

PRAKTIKUM BASIS DATA 2010Laboratorium PemrogramanJurusan Teknik Informatika

Fakultas Teknologi Informasi Institut Teknologi Sepuluh November

nvl(sum(p.total_penjualan),0) as total_penjualan from apoteker ap, penjualan p where ap.id_apoteker= p.id_apoteker(+) group by ap.id_apoteker, ap.nama_apoteker))order by total_penjualan desc

2. Tampilkan apoteker yang paling banyak melayani penjualan dan supplier yang paling sering menyuplai obat dalam satu hasil query dan dapat diketahui jenisnya apakah apoteker atau supplier! (Petunjuk: gunakan UNION).Tampilan hasil :

select id_apoteker,nama_apoteker,total,total_uang, (case when id_apoteker like 'A%' then 'apoteker' else 'supplier' end) keteranganfrom ( select p.id_apoteker as id_apoteker, ap.nama_apoteker as nama_apoteker,count(p.id_apoteker) as total ,sum(p.total_penjualan)as total_uang from penjualan p, apoteker ap where p.id_apoteker= ap.id_apoteker group by p.id_apoteker, ap.nama_apoteker union select p.id_supplier as id_apoteker,s.nama_supplier as nama_apoteker,count(p.id_supplier)as total,sum(p.total_pembelian)as total_uang from pembelian p, supplier s where p.id_supplier= s.id_supplier group by p.id_supplier, s.nama_supplier)

order by total desc

3. Tampilkan obat SELAIN obat yang terlaris (termasuk obat yang belum pernah terjual) beserta dengan jumlah stok, jumlah yang terjual, dan sisa obat di stok obat. Harus menggunakan minus dan tidak perlu mengecek kadaluarsa. Tampilan hasil :

Page 11: pendahuluan modul 5 fix

PRAKTIKUM BASIS DATA 2010Laboratorium PemrogramanJurusan Teknik Informatika

Fakultas Teknologi Informasi Institut Teknologi Sepuluh November

select obat.id_obat, stock_obat.jumlah_stock, temp.tempJumlah as jumlah_terjual, (stock_obat.jumlah_stock - temp.tempJumlah) as sisafrom obat, stock_obat, (select obat.id_obat, SUM(rincian_penjualan.jumlah)tempJumlah from obat, rincian_penjualan where obat.id_obat= rincian_penjualan.id_obat group by obat.id_obat order by tempJumlah desc)tempwhere stock_obat.id_obat=obat.id_obat AND temp.id_obat= obat.id_obatminusselect obat.id_obat, stock_obat.jumlah_stock, temp.tempJumlah as jumlah_terjual, (stock_obat.jumlah_stock - temp.tempJumlah) as sisafrom obat, stock_obat, (select obat.id_obat, SUM(rincian_penjualan.jumlah)tempJumlah from obat, rincian_penjualan where obat.id_obat= rincian_penjualan.id_obat group by obat.id_obat order by tempJumlah desc)tempwhere stock_obat.id_obat=obat.id_obat and temp.id_obat= obat.id_obat and rownum < 2;

4. Buatlah query yang dapat menampilkan ranking jumlah obat yang terjual pada tahun 2008 untuk setiap golongan yang ada. Ranking berdasar jumlah obat yang terjual terbanyak. Gunakan fungsi Rank() dan over partition.Tampilan hasil :

select keterangan, nama_obat,jumlah_terjual,rank() over (partition by keterangan order by jumlah_terjual desc ) ranking_per_keterangan

Page 12: pendahuluan modul 5 fix

PRAKTIKUM BASIS DATA 2010Laboratorium PemrogramanJurusan Teknik Informatika

Fakultas Teknologi Informasi Institut Teknologi Sepuluh November

from( select g.keterangan as keterangan, o.nama_obat as nama_obat,sum(r.jumlah)as jumlah_terjual from rincian_penjualan r, obat o, golonganobat g, penjualan p where r.id_obat= o.id_obat and o.kode_gol= g.kode_gol and p.id_penjualan= r.id_penjualan and to_char(p.tanggal_penjualan,'yyyy')='2010' group by r.id_obat,o.nama_obat, g.keterangan) order by keterangan,jumlah_terjual desc

5. Tampilkan 2 obat yang jumlah terjualnya paling tinggi untuk setiap golongan pada tahun 2008. Gunakan Row_NUMBER() dan Over Partition (Jangan menggunakan Rank()).Tampilan hasil :

select golongan, nama_obat, jumlah_terjualfrom (select golonganobat.keterangan as golongan, obat.nama_obat as nama_obat , sum(rincian_penjualan.jumlah) as jumlah_terjual, row_number() over (partition by golonganobat.keterangan order by sum(rincian_penjualan.jumlah)desc) as ranking from obat, golonganobat, rincian_penjualan, penjualan where obat.kode_gol=golonganobat.kode_gol and rincian_penjualan.id_penjualan=penjualan.id_penjualan and obat.id_obat= rincian_penjualan.id_obat and to_char(penjualan.tanggal_penjualan, 'YYYY')=2008 group by obat.nama_obat, golonganobat.keterangan)tempwhere ranking<3

6. Buatlah query yang dapat menampilkan masing-masing jumlah obat yang terjual pada tahun 2008. Tambahkan satu kolom yang digunakan untuk menampilkan keterangan jika jumlah yang terjual 0 atau tidak terjual diberi keterangan 'Tidak Laku', jika jumlah terjual lebih dari 15 buah maka diberi keterangan 'Laris'. Selain itu diberi keterangan 'Standar'. Gunakan sintaks case untuk menampilkan query tersebut seperti dibawah ini :

Page 13: pendahuluan modul 5 fix

PRAKTIKUM BASIS DATA 2010Laboratorium PemrogramanJurusan Teknik Informatika

Fakultas Teknologi Informasi Institut Teknologi Sepuluh November

select nama_obat,jumlah_terjual, (case when jumlah_terjual > 15 then 'laris' when jumlah_terjual = 0 then 'tidak laku' else 'standart' end)keterangan from( select o.nama_obat as nama_obat,nvl(temp.jumlah_terjual,0)as jumlah_terjual from obat o, (select o.nama_obat as nama_obat,sum(r.jumlah)as jumlah_terjual, r.id_obat as id_obat from rincian_penjualan r,obat o, penjualan p where r.id_obat = o.id_obat and p.id_penjualan = r.id_penjualan and to_char(p.tanggal_penjualan,'yyyy')='2010' group by r.id_obat, o.nama_obat)temp where o.id_obat=temp.id_obat(+) )

7. Buatlah rekap pembelian dan penjualan perbulan pada tahun 2008. Kemudian beri keterangan: jika nilai sisa > 0 maka beri keterangan untung, jika nilai sisa < 0 maka beri keterangan rugi, dan jika nilai sisa = 0 maka keterangannya adalah impas! Gunakan fungsi Decode dan Sign. Tampilan hasil :

select bulan, nvl(temp.total_jual,0) as penjualan, nvl(temp2.total_beli,0) as pembelian, (nvl(temp.total_jual,0) - nvl(temp2.total_beli,0)) as sisa,decode(sign(nvl(temp.total_jual,0) - nvl(temp2.total_beli,0)), 1, 'untung', 0, 'impas!', -1, 'rugi')keterangan

Page 14: pendahuluan modul 5 fix

PRAKTIKUM BASIS DATA 2010Laboratorium PemrogramanJurusan Teknik Informatika

Fakultas Teknologi Informasi Institut Teknologi Sepuluh November

from (select to_char (tanggal_penjualan, 'month') as bulan, sum(total_penjualan) as total_jual from penjualan where to_char (tanggal_penjualan, 'yyyy')='2010' group by to_char (tanggal_penjualan, 'month') order by to_char (tanggal_penjualan, 'month') asc )tempfull outer join (select to_char (tanggal_pembelian, 'month') as bulan, sum(total_pembelian) as total_beli from pembelian where to_char (tanggal_pembelian, 'yyyy')='2010' group by to_char (tanggal_pembelian, 'month') order by to_char (tanggal_pembelian, 'month') asc )temp2using (bulan)order by bulan asc

8. Tampilkan seluruh obat beserta stoknya yang belum kadaluarsa, apabila stoknya di

bawah atau sama dengan 4 maka tampilkan message “warning”, bila stoknya masih di

atas 4 maka tampilkan message “aman”. Tampilan hasil :

select id_obat,nama_obat,tgl,stock, (case when stock >=4 then 'aman' else 'warning' end) msgfrom( select o.id_obat as id_obat, o.nama_obat as nama_obat,nvl(so.kadaluarsa,sysdate) as tgl,nvl(so.jumlah_stock,0) as stock from stock_obat so,obat o where so.id_obat(+)= o.id_obat )where tgl >= sysdate

9. Tampilkan supplier beserta obat yang di supply, apabila nama obat itu ganja atau sabu-sabu maka beri tanda “warning“ selain itu diberi tanda “aman”

Page 15: pendahuluan modul 5 fix

PRAKTIKUM BASIS DATA 2010Laboratorium PemrogramanJurusan Teknik Informatika

Fakultas Teknologi Informasi Institut Teknologi Sepuluh November

select supplier.nama_supplier, obat.nama_obat, ( case when obat.nama_obat = 'ganja' then 'warning' when obat.nama_obat = 'sabu-sabu' then 'warning' ELSE 'aman' END) messagefrom supplier, obat, rincianpembelian, pembelianwhere supplier.id_supplier= pembelian.id_supplier and pembelian.id_pembelian= rincianpembelian.id_pembelian and rincianpembelian.id_obat= obat.id_obatorder by supplier.nama_supplier

Catatan : Masa asistensi untuk modul 3 adalah 7-12 Mei 2010. Silakan hubungi asisten masing-masing

untuk penjadwalan asistensi.

Jadwal Praktikum untuk modul 3 adalah sebagai berikut :

Kelas C : Jumat, 14 Mei 2010 pukul 13.00 WIB di AJK

Kelas A : Jumat, 14 Mei 2010 pukul 13.00 WIB di LP

Kelas B : Jumat, 14 Mei 2010 pukul 15.30 WIB di LP