Gambar 1. Pengenalan Subquery.
Subquery dalam SQL adalah query yang ada di dalam query utama. Subquery [1] digunakan untuk mendapatkan data yang diperlukan untuk pemrosesan lebih lanjut dalam query utama. Subquery dapat mengambil data dari satu tabel atau beberapa tabel yang berbeda dalam basis data.
Cara kerja subquery dalam sebuah query SQL adalah sebagai berikut:
Performa subquery dalam SQL adalah bagaimana subquery mempengaruhi waktu eksekusi query secara keseluruhan. Sangat penting untuk mengoptimalkan kinerja query. Berikut adalah beberapa poin yang perlu diperhatikan:
a. Jumlah dan kompleksitas subquery
Semakin banyak dan kompleks subquery yang digunakan, semakin lama waktu yang dibutuhkan untuk mengeksekusi query secara keseluruhan.
b. Ukuran data
Jumlah data yang diproses dalam subquery dapat mempengaruhi waktu eksekusi. Semakin besar ukuran data yang diperlukan untuk subquery, semakin lama waktu yang dibutuhkan.
c. Indeks dan indeksasi
Memastikan penggunaan indeks pada kolom yang digunakan dalam subquery dapat meningkatkan performa, karena indeks memungkinkan akses data yang lebih cepat.
a. Penggunaan subquery yang tidak efisien dapat menyebabkan peningkatan waktu eksekusi secara keseluruhan. Hal ini terjadi ketika subquery dievaluasi untuk setiap baris dalam query utama.
b. Sebaiknya hindari penggunaan subquery berlebihan atau bersarang yang tidak perlu. Jika mungkin, pertimbangkan untuk mengubah subquery menjadi join atau menggunakan fungsi agregasi untuk mengurangi kompleksitas dan mempercepat waktu eksekusi.
a. Pertimbangkan menggunakan join daripada subquery jika memungkinkan. Join dapat menjadi lebih efisien daripada subquery dalam beberapa kasus.
b. Gunakan indeks dengan bijak pada kolom yang digunakan dalam subquery untuk meningkatkan performa.
c. Gunakan klausa WHERE atau HAVING sebelum subquery untuk melakukan pemfilteran awal data, mengurangi jumlah data yang dievaluasi dalam subquery.
d. Evaluasi ulang kebutuhan subquery dan pertimbangkan alternatif lain, seperti penggunaan fungsi agregasi atau CTE (Common Table Expression), untuk mengurangi kompleksitas query.
Penting untuk diingat bahwa optimasi query dengan subquery tergantung pada kasus-kasus individu dan struktur database yang digunakan. Melakukan profiling dan pengujian performa query pada lingkungan produksi dapat memberikan wawasan yang lebih baik tentang bagaimana subquery mempengaruhi kinerja secara spesifik dalam konteks aplikasi yang sedang digunakan.
Umumnya, subquery yang digunakan dalam SQL dapat dibagi menjadi beberapa tipe berdasarkan penggunaannya, namun yang paling umum adalah scalar subquery. Berikut adalah penjelasan dan contoh-contoh subquery tipe yang umum:
Scalar subquery adalah salah satu jenis subquery yang sering digunakan dalam pengolahan data. Fungsinya adalah menghasilkan satu nilai tunggal sebagai hasilnya. Kemudian nilai ini dapat digunakan dalam klausa SELECT, WHERE, atau HAVING untuk membandingkan data dalam query utama dengan nilai tunggal yang dihasilkan dari subquery. Contoh scalar subquery adalah sebagai berikut:
Gambar 2. Tabel products.
Gambar 3. Contoh penggunaan scalar subquery.
Gambar 4. Hasil contoh penggunaan scalar subquery.
Pada program di gambar 3, scalar subquery (SELECT AVG(price) FROM products) digunakan untuk menghitung rata-rata harga dari semua produk dalam tabel "products". Kemudian, hasil rata-rata ini dibandingkan dengan harga setiap produk dalam klausa WHERE. Produk dengan harga di atas rata-rata akan ditampilkan dalam hasil query seperti pada gambar 4.
Single row subquery adalah salah satu jenis subquery yang menghasilkan data dalam bentuk satu baris. Hasil dari subquery ini kemudian digunakan sebagai operator pembanding, seperti tanda sama dengan (=), lebih besar dari (>), lebih kecil dari (<), atau digunakan dalam klausa IN. Contoh penggunaan single row subquery adalah sebagai berikut:
Gambar 5. Tabel students.
Gambar 6. Contoh penggunaan single row subquery.
Gambar 7. Hasil contoh penggunaan single row subquery.
Pada program di gambar 6, single row subquery (SELECT AVG(grade) FROM students) digunakan untuk mencari nilai rata-rata dari semua siswa dalam tabel "students". Kemudian, hasil rata-rata ini digunakan dalam klausa WHERE untuk membandingkan dengan nilai setiap siswa. Siswa dengan nilai lebih tinggi dari rata-rata akan ditampilkan dalam hasil query seperti pada gambar 7.
Multiple row subquery adalah jenis subquery yang menghasilkan beberapa baris data. Mirip dengan single row subquery, hasil yang diperoleh dari subquery digunakan sebagai operator pembanding dalam pernyataan SQL. Namun, karena hasilnya adalah gabungan dari beberapa baris data, kita hanya dapat menggunakan klausa IN atau NOT IN untuk membandingkan hasil multiple row subquery dengan data dalam query utama. Contoh penggunaan multiple row subquery adalah sebagai berikut:
Gambar 8. Tabel students.
Gambar 9. Contoh penggunaan multi row subquery.
Gambar 10. Hasil dari penggunaan multi row subquery.
Pada program di gambar 9, multiple row subquery (SELECT grade FROM students WHERE name = 'John Doe') digunakan untuk mencari nilai (grade) dari siswa dengan nama 'John Doe' dalam tabel "students". Baris-baris ini kemudian digunakan dalam klausa WHERE pada tabel "students" dengan klausa IN untuk mencari siswa-siswa yang memiliki nilai yang sama.
Correlated subquery adalah jenis subquery yang bergantung pada query utama (main query). Perbedaannya dengan jenis subquery lainnya adalah correlated subquery memiliki sumber data yang sama dengan query utama. Hasil yang diperoleh dari correlated subquery umumnya digunakan untuk memfilter hasil dari query utama. Contoh penggunaan correlated subquery adalah sebagai berikut:
Gambar 11. Tabel employee
Gambar 12. Contoh penggunaan correlated subquery.
Gambar 13. Hasil dari penggunaan correlated subquery.
Pada program di gambar 12, correlated subquery (SELECT AVG(salary) FROM employee WHERE job = employee.job) digunakan untuk mencari nilai (salary) dari karyawan dengan job dalam tabel "employee". Baris-baris ini kemudian digunakan dalam klausa WHERE pada tabel "employee" dengan pembanding (>) untuk mencari nama karyawan dan job dengan jumlah salary diatas rata-rata.
Nested subqueries, atau subquery yang bersarang, merupakan jenis subquery di mana terdapat subquery lain di dalam subquery utama. Dalam nested subqueries, subquery yang ada di dalam subquery dapat digunakan untuk melakukan perhitungan atau filter yang lebih kompleks terhadap dataset. Contoh nested subqueries adalah sebagai berikut:
Gambar 14. Tabel products (kiri) dan tabel orders (kanan).
Gambar 15. Contoh penggunaan nested subqueries.
Gambar 16. Hasil dari penggunaan nested subqueries.
Pada program di gambar 15, nested subqueries digunakan untuk melakukan perhitungan yang lebih kompleks. Subquery pertama (SELECT AVG(price) FROM orders) digunakan untuk menghitung rata-rata harga dari semua pesanan dalam tabel "orders". Subquery ini kemudian digunakan dalam subquery kedua (SELECT product_id FROM orders WHERE price > (SELECT AVG(price) FROM orders)) untuk mengambil product_id dari pesanan yang memiliki harga lebih tinggi dari rata-rata. Subquery kedua ini menjadi subquery yang bersarang di dalam klausa WHERE product_id IN (...) pada query utama. Hal ini memastikan bahwa hanya produk dengan product_id yang ditemukan dalam subquery kedua yang akan diambil dalam hasil akhir.
Quiz
1. Apa pengertian subquery dalam SQL?
a) Query utama dalam SQL
b) Query yang dieksekusi terakhir dalam SQL
c) Query yang ada di dalam query utama dalam SQL
d) Query yang menggabungkan beberapa tabel dalam SQL
e) Query yang hanya mengambil satu nilai dalam SQL
2. Apa kegunaan subquery dalam SQL?
a) Menggabungkan beberapa tabel dalam SQL
b) Mengurutkan data dalam SQL
c) Mendapatkan data yang diperlukan untuk pemrosesan lebih lanjut dalam query utama dalam SQL
d) Menambahkan kolom baru dalam tabel SQL
e) Menghapus data dari tabel SQL
3. Apa yang dimaksud dengan single-row subquery dalam SQL?
a) Subquery yang menghasilkan satu baris data dalam SQL
b) Subquery yang menghasilkan beberapa baris data dalam SQL
c) Subquery yang menghasilkan satu nilai tunggal dalam SQL
d) Subquery yang menghasilkan gabungan data dari beberapa tabel dalam SQL
e) Subquery yang tidak dapat dieksekusi dalam SQL
4. Berikut adalah contoh penggunaan single-row subquery dalam SQL:
a) SELECT * FROM employees WHERE salary > (SELECT AVG(salary) FROM employees)
b) SELECT * FROM employees WHERE department = (SELECT department_name FROM departments WHERE department_id = 1)
c) SELECT * FROM employees WHERE employee_id IN (SELECT employee_id FROM orders)
d) SELECT * FROM employees WHERE hire_date < (SELECT MAX(hire_date) FROM employees)
e) SELECT * FROM employees WHERE salary = (SELECT SUM(salary) FROM employees)
5. Apa yang dimaksud dengan nested subqueries dalam SQL?
a) Subquery yang menghasilkan beberapa baris data dalam SQL
b) Subquery yang menghasilkan gabungan data dari beberapa tabel dalam SQL
c) Subquery yang ada di dalam subquery utama dalam SQL
d) Subquery yang tidak dapat dieksekusi dalam SQL
e) Subquery yang hanya mengambil satu nilai dalam SQL
6. Berikut adalah contoh penggunaan nested subqueries dalam SQL:
a) SELECT * FROM products WHERE category_id IN (SELECT category_id FROM categories WHERE department_id = (SELECT department_id FROM departments WHERE department_name = 'Electronics'))
b) SELECT * FROM products WHERE price > (SELECT AVG(price) FROM products)
c) SELECT * FROM products WHERE product_id = (SELECT MAX(product_id) FROM products)
d) SELECT * FROM products WHERE supplier_id IN (SELECT supplier_id FROM suppliers WHERE country = 'USA')
e) SELECT * FROM products WHERE quantity < (SELECT MIN(quantity) FROM products)
7. Apa pengaruh subquery terhadap waktu eksekusi dalam SQL?
a) Subquery tidak memiliki pengaruh terhadap waktu eksekusi dalam SQL
b) Semakin banyak dan kompleks subquery yang digunakan, semakin lama waktu yang dibutuhkan untuk mengeksekusi query secara keseluruhan dalam SQL
c) Subquery selalu mempercepat waktu eksekusi dalam SQL
d) Subquery hanya mempengaruhi indeks dan indeksasi dalam SQL
e) Subquery hanya berpengaruh terhadap jumlah data yang diproses dalam SQL
8. Bagaimana cara mengoptimalkan performa subquery dalam SQL?
a) Menghindari penggunaan subquery berlebihan atau bersarang yang tidak perlu
b) Menggunakan indeks dengan bijak pada kolom yang digunakan dalam subquery
c) Menggunakan klausa WHERE atau HAVING sebelum subquery untuk melakukan pemfilteran awal data
d) Mengevaluasi ulang kebutuhan subquery dan mempertimbangkan alternatif lain, seperti penggunaan fungsi agregasi atau CTE (Common Table Expression)
e) Semua jawaban diatas benar
9. Jenis subquery yang sering digunakan untuk menghasilkan satu nilai tunggal disebut:
a) Scalar subquery
b) Single-row subquery
c) Multiple-row subquery
d) Correlated subquery
e) Nested subquery
10. Subquery yang bergantung pada query utama dan memiliki sumber data yang sama disebut:
a) Scalar subquery
b) Single-row subquery
c) Multiple-row subquery
d) Correlated subquery
e) Nested subquery
https://www.programiz.com/sql/join
https://www.ibm.com/docs/en/tivoli-netcoolimpact/7.1?topic=filters-sql
https://dataschool.com/how-to-teach-people-sql/sql-join-types-explained-visually/
https://codepolitan.com/blog/tujuh-teknik-join-di-sql-596c537f0deb3
https://hariono.site.unwaha.ac.id/operator-and-or-dan-not-pada-sql/