Subkueri adalah cara yang ampuh untuk menemukan data yang ingin Anda gunakan untuk kueri lain. Mereka sering digunakan dalam pernyataan SELECT dan UPDATE untuk membuat kueri ini lebih efisien dan lebih mudah dikelola.
Ada beberapa cara berbeda untuk menggunakan subquery dalam pernyataan UPDATE. Mari kita lihat satu per satu.
SET dan Subkueri
Metode pertama yang akan kita lihat adalah menggunakan subquery dalam klausa SET dari pernyataan UPDATE.
Katakanlah kita memiliki tabel produk yang terlihat seperti ini:
[id tabel=29 /]
Ini menyimpan beberapa informasi tentang berbagai produk yang dijual perusahaan.
Asumsikan bahwa perusahaan memutuskan untuk menaikkan harga produk “Sofa” (id produk 1). Namun, alih-alih menetapkan harga tertentu, mereka ingin membuatnya 20% lebih tinggi daripada produk termahal yang mereka miliki.
Untuk melakukan ini, kita dapat menggunakan subquery dalam klausa SET. Kita bisa menggunakan pernyataan terpisah, tetapi lebih mudah untuk mempertahankannya menggunakan satu pernyataan.
Pernyataan kami akan terlihat seperti ini:
UPDATE product SET price = ( SELECT MAX(price) * 1.2 FROM product ) WHERE product_id = 1;
Anda dapat melihat bahwa klausa SET menyertakan subkueri, yang menemukan nilai MAX dari kolom harga di tabel produk dan mengalikannya dengan 1,2 untuk menambahkan 20%. Terakhir, klausa WHERE berada di luar subquery untuk hanya memperbarui product_id dari 1, karena berlaku untuk UPDATE daripada subquery.
Ini akan menghasilkan perubahan berikut:
[id tabel=30 /]
SET dan Subquery Berkorelasi
Cara lain untuk menggunakan subquery dalam pernyataan UPDATE adalah dengan menggunakan subquery yang berkorelasi.
Ini bekerja dengan cara yang mirip dengan contoh sebelumnya. Namun, subquery yang berkorelasi adalah subquery yang mengacu pada pernyataan luar dan mungkin merupakan bagian dari pernyataan UPDATE.
Menggunakan data dari contoh sebelumnya (tabel produk), perusahaan ingin menonaktifkan semua produk yang belum dipesan. Data untuk ini disimpan di tabel order_line.
Jika kita menulisnya sebagai subquery yang berkorelasi, kuerinya akan terlihat seperti ini:
UPDATE product p SET active = ( SELECT CASE WHEN COUNT(*) > 0 THEN 'Y' ELSE 'N' END FROM order_line o WHERE o.product_id = p.product_id );
Subquery akan melakukan fungsi COUNT menggunakan pernyataan CASE untuk menentukan apakah nilai yang dikembalikan adalah Y atau N tergantung pada nilai COUNT. Ini dihitung untuk setiap product_id dan cocok dengan kueri luar.
Ini akan menghasilkan kolom aktif untuk beberapa produk disetel ke Y dan lainnya disetel ke N:
[id tabel=31 /]
WHERE Lebih Besar dari Subquery
Dimungkinkan juga untuk menggunakan subquery dalam klausa WHERE. Sama seperti pada contoh sebelumnya, ini dapat dilakukan untuk menghapus langkah terpisah untuk menemukan nilai yang akan diperbarui dan kemudian menjalankan kueri untuk memperbaruinya.
Kita dapat melanjutkan bekerja dengan contoh kita dari langkah sebelumnya. Asumsikan bahwa perusahaan ingin mengaktifkan produk yang memiliki harga di atas rata-rata. Untuk melakukan ini, kita dapat menambahkan subquery ke klausa WHERE.
Pertama, nonaktifkan semua produk.
UPDATE product SET active = ’N’;
Kemudian, perbarui tabel menggunakan subkueri kami.
UPDATE product SET active = 'Y' WHERE price > ( SELECT AVG(price) FROM product );
Ini akan menetapkan nilai aktif ke Y untuk semua catatan yang memiliki harga di atas rata-rata.
Tabelnya sekarang terlihat seperti ini:
[id tabel=32 /]
Ini menunjukkan 2 record dengan nilai aktif Y karena berada di atas rata-rata.
Kueri semacam ini juga dapat dijalankan dengan operator lain yang mengizinkan satu nilai, seperti
DI MANA DI Subkueri
Juga, kita dapat menggunakan subquery dengan operator IN dalam klausa WHERE.
Ini mirip dengan contoh sebelumnya yang menggunakan operator lebih besar dari untuk satu nilai. Operator IN dapat diterapkan ke beberapa nilai.
Katakanlah perusahaan ingin memperbarui harga beberapa produk yang merupakan satu-satunya item dalam kategori tersebut. Harganya perlu dibelah dua.
Permintaan kami dapat terlihat seperti ini:
UPDATE product SET price = price / 2 WHERE category_id IN ( SELECT category_id FROM product GROUP BY category_id HAVING COUNT(*) = 1 );
Subquery menemukan semua nilai kategori_id di mana COUNT adalah 1. Kami tidak perlu memiliki COUNT di bagian SELECT dari subquery, namun, jika kami melakukannya, kueri akan menampilkan kesalahan.
Pernyataan UPDATE akan memperbarui harga di mana kategori memenuhi kriteria subquery.
Hasil kami kemudian akan terlihat seperti ini:
[id tabel=33 /]
Data terlihat sangat mirip. Namun, produk dengan ID kategori 1 telah diperbarui harganya menjadi setengah dari biaya aslinya, karena ini adalah satu-satunya produk dalam kategorinya.
PERBARUI Subkueri
Terakhir, Anda dapat menggunakan subkueri dalam pernyataan UPDATE agar tabel diperbarui.
Pada contoh sebelumnya, kita baru saja menggunakan tabel produk. Namun, Anda dapat menggunakan subkueri alih-alih tabel produk, yang akan mengembalikan kumpulan hasil yang dapat diperbarui.
Kumpulan hasil harus dapat diperbarui, mirip dengan kasus ketika Anda membuat objek VIEW dan mencoba memperbaruinya. Itu harus sederhana dan memiliki kunci utama.
Jadi, dengan menggunakan contoh sebelumnya, misalkan perusahaan ingin mengubah kategori untuk semua produk yang berada dalam kategori 4 menjadi kategori 5.
Permintaan kami dapat terlihat seperti ini:
UPDATE ( SELECT product_id, category_id FROM product) SET category_id = 5 WHERE category_id = 4;
Ini adalah contoh sederhana yang menunjukkan konsep tersebut. Tabel telah diganti dengan pernyataan SELECT yang hanya menampilkan dua kolom tabel.
Hasil dari kueri ini adalah:
[id tabel=34 /]
Hasil yang sama dapat diperoleh dengan memindahkan klausa WHERE ke pernyataan UPDATE:
UPDATE ( SELECT product_id, category_id FROM product WHERE category_id = 4) SET category_id = 5;
Kesimpulan
Menggunakan subquery dalam pernyataan UPDATE bisa menjadi cara yang baik untuk meningkatkan pemeliharaan kueri Anda. Ini juga dapat mengurangi jumlah langkah yang diperlukan untuk memperbarui data Anda dengan mengompresi dua kueri atau lebih ke dalam satu kueri.