Anda di halaman 1dari 3

Modul 11 : Subquery SQL

11.1. Waktu Pelaksanaan Praktikum


Durasi kegiatan praktikum = 170 menit, dengan rincian sebagai berikut (misalkan):
1. 10 menit untuk penjelasan singkat tentang modul
2. 100 menit untuk pengayaan
3. 60 menit pembahasan

11.2. Tujuan
Setelah mengikuti praktikum ini mahasiswa diharapkan dapat:
1. Menggambarkan tipe persoalan yang dapat dipecahkan oleh subquery
2. Mendefinisikan subquery
3. Memahami tipe-tipe subquery
4. Menulis subquery baris tunggal dan baris berganda

11.3. Alat Dan Bahan


1. Komputer

11.4. Dasar Teori


11.4.1. Sub Query Untuk Menyelesaikan Masalah
Pengertian subquery, nested query akan dijelaskan melalui ilustrasi berikut ini: "Misal kita ingin
membuat suatu query untuk mencari gaji semua instructor yang lebih besar dari gaji yang dimiliki oleh
instructor bernama ‘Moreira’. Untuk memecahkan persoalan ini, kita membutuhkan dua query, satu query
untuk mencari gaji yang dimiliki oleh Moreira dan satu query lagi untuk mencari instructor yang memiliki
gaji lebih besar daripada gaji Moreira.

11.4.2. Sub Query


Sebuah subquery adalah query yang bersarang dalam sebuah pernyataan SELECT, INSERT, UPDATE
atau DELETE, atau berada dalam subquery yang lain. Sebuah subquery dapat digunakan di mana saja
ekspresi diperbolehkan jika ia mengembalikan nilai tunggal. Sebuah subquery disebut juga sebagai inner
query atau inner select, sedangkan pernyataan yang mengandung subquery disebut juga dengan outer query
atau outer select. Inner query akan menghasilkan suatu nilai yang nantinya dipakai oleh outer query. Query
SELECT dari subquery harus selalu berada dalam tanda kurung.

SELECT * FROM instructor WHERE salary > outer query


(
SELECT salary FROM instructor WHERE name='Moreira'
inner query
)
11.4.3. Penempatan Sub Query
Subquery dapat diletakkan di klausa SELECT, di klausa FROM atau di klausa WHERE.

11.4.3.1. Sub Query di Klausa SELECT


Contoh: Menggunakan subquery untuk menampilkan id, name dan jumlah course yang telah diambil oleh
student.
SELECT id, name, (SELECT COUNT(*) FROM takes t WHERE t.id=s.id) AS course_count

FROM student s

11.4.3.2. Sub Query di Klausa FROM


Contoh: Menggunakan subquery untuk menampilkan id, name, min_score (nilai course terendah) dan
max_score (nilai course tertinggi) dari setiap student.
SELECT a.id, name, min_score, max_score
FROM (SELECT id, MIN(score) AS min_score, MAX(score) AS max_score
FROM takes GROUP BY id) a, student s
WHERE a.id = s.id

11.4.3.3. Sub Query di Klausa WHERE


Contoh: Menggunakan subquery untuk menampilkan instructor yang memiliki gaji di atas rata-rata.
SELECT * FROM instructor WHERE salary > (SELECT AVG(salary) FROM instructor)

11.4.4. Petunjuk Penggunaan Sub Query


Berikut beberapa petunjuk dari penggunaan subquery:
• Letakkan subquery di dalam tanda kurung
• Tempatkan subquery pada sisi kanan dari kondisi perbandingan
• Klausa ORDER BY dalam subquery tidak diperlukan jika yang dibentuk adalah Top-N analysis.
• Gunakan operator baris tunggal dengan subquery baris tunggal dan operator baris ganda
dengan subquery baris ganda.

11.4.5. Tipe-Tipe Sub Query


Beberapa tipe dari subquery:
• Single row, subquery baris tunggal
• Multiple-row, subquery baris ganda
• Correlated subquery

11.4.5.1. Sub Query Baris Tunggal


Single row subquery memberikan hasil hanya satu baris data (scalar value). Untuk single row
subquery ini yang digunakan adalah operator perbandingan: = , > , >= , < , <= , atau <>. Semua contoh
subquery di atas merupakan subquery baris tunggal.

11.4.5.2. Sub Query Baris Ganda


Multiple row subquery adalah subquery yang menghasilkan lebih dari satu baris. Untuk multiple row
subquery ini operator perbandingan yang dapat digunakan antara lain: IN/ NOT IN, ANY, ALL atau EXIST/
NOT EXIST.

11.4.5.3. Sub Query dengan Operator IN/ NOT IN


Operator IN mengambil output dari inner query yang mana bisa saja 0 atau lebih nilai yang akan
dikirim ke outer query. Outer query akan mem-fetch semua baris yang match.
Contoh: Menggunakan subquery untuk menampilkan semua course yang memiliki section lebih dari
satu.
SELECT * FROM course
WHERE course_id IN (
SELECT course_id FROM section
GROUP BY course_id HAVING COUNT(sec_id) >1
)

11.4.5.4. Sub Query dengan Operator EXISTS/NOT EXISTS


Kata kunci EXISTS hanya menghasilkan nilai Boolean [TRUE/FALSE]. Klausa WHERE dari outer query
menguji apakah subquery menghasilkan baris data atau tidak (TRUE jika menghasilkan baris data/FALSE jika
tidak menghasilkan baris data sama sekali). Subquery dengan EXIST tidak memproduksi data apapun, selain
TRUE/FALSE.
Contoh: Menggunakan subquery untuk menampilkan semua course yang tidak memiliki prerequisite.
SELECT * FROM course a WHERE NOT EXISTS (
SELECT * FROM prereq b WHERE b.course_id=a.course_id
)

11.4.5.5. Correlated Sub Query


Kebanyakan subquery dieksekusi sekali dan hasilnya akan menggantikannya nilai atau nilai-nilai yang
dihasilkan dalam klausa WHERE dari outer query. Pada query yang melibatkan correlated subquery (juga
dikenal sebagai repeating subquery), subquery bergantung pada outer query untuk nilai-nilainya. Ini berarti
bahwa subquery dieksekusi berulang kali, sekali untuk setiap baris yang mungkin terpilih oleh outer query.
Sebuah correlated subquery memerlukan sebuah nilai dari outer query sebagai bagian dari inner query (data
dari setiap baris di main query di-passing ke subquery untuk diproses).Contoh: Menggunakan subquery
untuk menampilkan instructor yang memiliki gaji di atas rata-rata gaji dalam satu department yang sama.
SELECT name, dept_name, salary
FROM instructor a
WHERE salary > (
SELECT AVG(salary) FROM instructor b WHERE b.dept_name=a.dept_name
)

11.5. Latihan
Buat subquery untuk:
1. Menampilkan instructor yang belum pernah mengajar!
2. Menampilkan course yang pernah diajar setidaknya 2 instructor!
3. Menampilkan student yang paling banyak mendapat nilai A!

Anda mungkin juga menyukai