Theories come and go, but fundamental data always remain the same. - Mary Leakey
Alfa Nugraha Pradana
Prodi Statistika dan Sains Data IPB University
Kueri SQL Tingkat Lanjut
Operasi pada nilai NULL
Kueri bersarang (Kueri di dalam kueri)
Kueri bersarang yang berkorelasi
Fungsi EXISTS dan NOT EXISTS
EXPLICIT SETS
Mengubah nama atribut
Joined relations
CROSS JOIN, MULTIWAY JOIN, NATURAL JOIN, LEFT JOIN, RIGHT JOIN, dan sebagainya
Fungsi agregat
Pengelompokan
Klausa HAVING
Operasi pada nilai NULL
Menampilkan nama, alamat dan umur dari tabel pasien dimana umur bernilai NULL
SELECT nama, alamat, umurFROM pasienWHERE umur ISNULL;
Menjalankan kueri di atas pada R dapat menggunakan sintaks berikut:
# memuat package dan set driver DBMSlibrary(RPostgreSQL)driver <-dbDriver('PostgreSQL')# bangun koneksi ke DBMSDB <-dbConnect( driver, dbname="hospital", host="localhost",port=5433,user="postgres", password="root")# definisikan kueri yang ingin dieksekusiq <-"SELECT nama, alamat, umur FROM pasien WHERE umur IS NULL;"# request kueri ke DBMSrs <-dbGetQuery(DB, q)
Kueri bersarang (kueri di dalam kueri)
Kueri ini terdiri dari kueri outer dan kueri inner
Menampilkan kamar yang ditempati oleh pasien yang berobat di poli saraf
SELECT id_kamarFROM kamar_untuk_pasienWHERE id_pasien IN (SELECT id_pasien FROM tindakanWHERE id_dokter IN (SELECT id_dokter FROM dokterWHERE spesialis='Saraf' ) );
Menampilkan nama_dokter, spesialis, dan upah dengan kondisi umur di atas 40 tahun dan upah > 6500000
Kondisi dimana klausa WHERE pada kueri bersarang berpadanan/mewakili beberapa atribut dari relasi yang dideklarasikan pada kueri terluarnya (outer) sehingga dua kueri ini dikatakan berkorelasi
Menampilkan id_pasien berikut namanya yang berobat ke poli kardiovaskular
SELECT p.id_pasien, p.namaFROM tindakan AS t, dokter AS d, pasien AS pWHERE t.id_dokter = d.id_dokter AND p.id_pasien = t.id_pasienAND d.spesialis ='Kardiovaskular';
Fungsi EXISTS dan NOT EXISTS
Menampilkan id_pasien dan namanya yang masuk ke instalasi rawat inap dengan kelas kamar=VVIP
SELECT p.id_pasien, p.namaFROM pasien AS pWHEREEXISTS (SELECT*FROM kamar_untuk_pasien AS kpWHERE P.id_pasien=kp.id_pasien ANDEXISTS (SELECT*FROM kamar AS k WHERE kp.id_kamar=k.id_kamar AND k.kelas='VVIP' ) );
Ruangan yang kosong (belum diisi oleh pasien) yang disajikan dengan id_kamar dan kelas
SELECT k.id_kamar, k.kelasFROM kamar AS kWHERENOTEXISTS (SELECT*FROM kamar_untuk_pasien AS kpWHERE kp.id_kamar=k.id_kamar );
EXPLICIT SETS
Menampilkan daftar pasien yang ditangani oleh dokter spesialis saraf dan kardiovaskular
SELECTDISTINCT p.id_pasien, p.nama, d.nama_dokter, d.spesialisFROM tindakan AS t, dokter AS d, pasien AS pWHERE t.id_dokter = d.id_dokter AND p.id_pasien = t.id_pasienAND d.spesialis IN ('Kardiovaskular', 'Saraf');
Mencari pasien dan dokter yang memiliki usia sama.
SELECT*FROM dokter AS d CROSSJOIN pasien AS PWHERE d.umur_dokter = p.umur;
Menampilkan nama dan usia pasien yang dirawat di kamar VVIP dan berusia > 17.
SELECT p.nama, p.umur, k.kelasFROM pasien as p, kamar_untuk_pasien as kp, kamar as kWHERE p.id_pasien=kp.id_pasien AND kp.id_kamar=k.id_kamar AND k.kelas ='VVIP'AND p.umur>17;
MULTIWAY JOIN
SELECT p.nama, p.umurFROM ( (pasien as p JOIN kamar_untuk_pasien as kp ON p.id_pasien=kp.id_pasien) JOIN kamar as k ON kp.id_kamar=k.id_kamar )WHERE k.kelas ='VVIP'AND p.umur>17;
NATURAL JOIN
Menampilkan nama dan usia dari pasien anak-anak dibawah 18 tahun dan id_dokter yang merawatnya
SELECT nama, umur, id_dokter FROM pasien AS pNATURALJOIN tindakan WHERE umur <18;
Fungsi agregat
Menampilkan jumlah dokter, total upah, upah tertinggi, upah terendah, dan rata-rata upah dari dokter
SELECTCOUNT(*), SUM (upah) AS total_upah,MAX (upah) AS upah_tertinggi, MIN (upah) AS upah_terendah,AVG (upah) AS rataan_upahFROM dokter;
Menampilkan upah tertinggi, upah terendah, dan rataan upah dari dokter yang jumlah spesialisasinya lebih dari satu
SELECT spesialis, MAX (upah) AS upah_tertinggi, MIN (upah) AS upah_terendah, AVG (upah) AS rataan_upah FROM dokter as dGROUPBY d.spesialisHAVINGCOUNT(*) >1;
Mencari dokter yang menangani dua atau lebih pasien.
SELECT nama_dokterFROM dokterWHERE (SELECTCOUNT(*) FROM tindakan WHERE tindakan.id_dokter=dokter.id_dokter) >=2;
Pengelompokan
Menghitung total dan rata-rata upah setiap dokter spesialis dan mengurutkannya secara menurun