Terkadang Anda mungkin ingin menggunakan hasil kueri sebagai bidang di kueri lain, atau sebagai kriteria untuk bidang kueri. Misalnya, anggaplah Anda ingin melihat interval antar pesanan untuk setiap produk Anda. Untuk membuat kueri yang memperlihatkan interval ini, Anda perlu membandingkan setiap tanggal pesanan dengan tanggal pesanan lain untuk produk tersebut. Membandingkan tanggal pesanan ini juga memerlukan kueri. Anda bisa menumpuk kueri ini di dalam kueri utama Anda dengan menggunakan subkueri.
Anda dapat menulis subkueri dalam ekspresi atau dalam pernyataan Bahasa Permintaan Terstruktur (SQL) di tampilan SQL.
Di artikel ini
Menggunakan hasil kueri sebagai bidang di kueri lain
Anda dapat menggunakan subkueri sebagai alias bidang. Gunakan subkueri sebagai alias bidang saat Anda ingin menggunakan hasil subkueri sebagai bidang di kueri utama Anda.
Catatan: Subkueri yang Anda gunakan sebagai alias bidang tidak dapat mengembalikan lebih dari satu bidang.
Anda bisa menggunakan alias bidang subkueri untuk menampilkan nilai yang bergantung pada nilai lain dalam baris saat ini, yang tidak dimungkinkan tanpa menggunakan subkueri.
Misalnya, izinkan kami kembali ke contoh di mana Anda ingin melihat interval antar pesanan untuk setiap produk Anda. Untuk menentukan interval ini, Anda perlu membandingkan setiap tanggal pesanan dengan tanggal pesanan lain untuk produk tersebut. Anda bisa membuat kueri yang memperlihatkan informasi ini dengan menggunakan templat database Northwind.
-
Pada tab File, klik Baru.
-
Di bawah Templat yang Tersedia, klik Templat Sampel.
-
Klik Northwind, lalu klik Create.
-
Ikuti arahan pada halaman Northwind Traders (pada tab objek Layar Awal) untuk membuka database, lalu tutup jendela Dialog Login.
-
Di tab Buat, dalam grup Kueri, klik Desain Kueri.
-
Klik tab Kueri , lalu klik ganda Pesanan Produk.
-
Klik ganda bidang ID Produk dan bidang Tanggal Pesanan untuk menambahkannya ke kisi desain kueri.
-
Dalam baris Urutkan dari kolom ID Produk dari kisi, pilih Naik.
-
Di baris Urutkan dari kolom Tanggal Urutan kisi, pilih Turun.
-
Di kolom ketiga kisi, klik kanan baris Bidang , lalu klik Zoom pada menu pintasan.
-
Dalam kotak dialog Zoom , ketik atau tempelkan ekspresi berikut:
Prior Date: (SELECT MAX([Order Date])
FROM [Product Orders] AS [Old Orders] WHERE [Old Orders].[Order Date] < [Product Orders].[Order Date] AND [Old Orders].[Product ID] = [Product Orders].[Product ID])Ekspresi ini adalah subkueri. Untuk setiap baris, subkueri memilih tanggal pesanan terbaru yang kurang terbaru daripada tanggal pesanan yang sudah terkait dengan baris. Perhatikan cara Anda menggunakan kata kunci AS untuk membuat alias tabel, sehingga Anda bisa membandingkan nilai dalam subkueri untuk nilai di baris kueri utama saat ini.
-
Di kolom keempat kisi, di baris Bidang , ketikkan ekspresi berikut:
Interval: [Order Date]-[Prior Date]
Ekspresi ini menghitung interval antara setiap tanggal pesanan dan tanggal pesanan sebelumnya untuk produk tersebut, menggunakan nilai untuk tanggal sebelumnya yang kami tentukan dengan menggunakan subkueri.
-
Pada tab Desain, dalam grup Hasil, klik Jalankan.
-
Kueri menjalankan dan menampilkan daftar nama produk, tanggal pesanan, tanggal pesanan sebelumnya, dan interval antar tanggal pesanan. Hasilnya diurutkan terlebih dahulu menurut ID Produk (dalam urutan naik), lalu menurut Tanggal Pesanan (dalam urutan menurun).
-
Catatan: Karena ID Produk adalah bidang pencarian, secara default, Access menampilkan nilai pencarian (dalam hal ini, nama produk), bukan ID Produk aktual. Meskipun ini mengubah nilai yang muncul, ini tidak mengubah susunan urutan.
-
-
Tutup database Northwind.
Menggunakan subkueri sebagai kriteria untuk bidang kueri
Anda dapat menggunakan subkueri sebagai kriteria bidang. Gunakan subkueri sebagai kriteria bidang saat Anda ingin menggunakan hasil subkueri untuk membatasi nilai yang ditampilkan bidang.
Misalnya, anggaplah Anda ingin meninjau daftar pesanan yang diproses oleh karyawan yang bukan perwakilan penjualan. Untuk membuat daftar ini, Anda perlu membandingkan ID karyawan untuk setiap pesanan dengan daftar ID karyawan untuk karyawan yang bukan perwakilan penjualan. Untuk membuat daftar ini dan menggunakannya sebagai kriteria bidang, gunakan subkueri, seperti yang diperlihatkan dalam prosedur berikut:
-
Buka Northwind.accdb dan aktifkan kontennya.
-
Tutup formulir masuk.
-
Pada tab Buat, di grup Lainnya, klik Desain Kueri.
-
Pada tab Tabel , klik ganda Pesanan dan Karyawan.
-
Dalam tabel Pesanan, klik ganda bidang ID Karyawan , bidang ID Pesanan , dan bidang Tanggal Pesanan untuk menambahkannya ke kisi desain kueri. Dalam tabel Karyawan, klik ganda bidang Jabatan untuk menambahkannya ke kisi desain.
-
Klik kanan baris Kriteria dari kolom ID Karyawan, lalu klik Zoom pada menu pintasan.
-
Dalam kotak Zoom , ketik atau tempelkan ekspresi berikut ini:
IN (SELECT [ID] FROM [Employees]
WHERE [Job Title]<>'Sales Representative')Ini adalah subkueri. Ini memilih semua ID karyawan di mana karyawan tidak memiliki jabatan Sales Representative, dan memasok hasil yang diatur ke kueri utama. Kueri utama kemudian memeriksa untuk melihat apakah ID karyawan dari tabel Pesanan berada dalam kumpulan hasil.
-
Pada tab Desain, dalam grup Hasil, klik Jalankan.
Kueri berjalan, dan hasil kueri memperlihatkan daftar pesanan yang diproses oleh karyawan yang bukan perwakilan penjualan.
Kata kunci SQL umum yang bisa Anda gunakan dengan subkueri
Ada beberapa kata kunci SQL yang bisa Anda gunakan dengan subkueri:
Catatan: Daftar ini tidak lengkap. Anda dapat menggunakan kata kunci SQL apa pun yang valid dalam subkueri, tidak termasuk kata kunci definisi data.
-
SEMUA Gunakan ALL dalam klausul WHERE untuk mengambil baris yang memenuhi kondisi jika dibandingkan dengan setiap baris yang dikembalikan oleh subkueri.
Misalnya, anggaplah Anda menganalisis data siswa di perguruan tinggi. Siswa harus mempertahankan IPK minimum, yang bervariasi dari jurusan ke jurusan. Jurusan dan GPA minimumnya disimpan dalam tabel bernama Jurusan, dan informasi siswa yang relevan disimpan dalam tabel yang disebut Student_Records.
Untuk melihat daftar jurusan (dan GPA minimumnya) di mana setiap siswa dengan jurusan tersebut melebihi IPK minimum, Anda dapat menggunakan kueri berikut:
SELECT [Major], [Min_GPA]
FROM [Majors] WHERE [Min_GPA] < ALL (SELECT [GPA] FROM [Student_Records] WHERE [Student_Records].[Major]=[Majors].[Major]); -
ANY Gunakan ANY dalam klausul WHERE untuk mengambil baris yang memenuhi kondisi jika dibandingkan dengan setidaknya satu baris yang dikembalikan oleh subkueri.
Misalnya, anggaplah Anda menganalisis data siswa di perguruan tinggi. Siswa harus mempertahankan IPK minimum, yang bervariasi dari jurusan ke jurusan. Jurusan dan GPA minimumnya disimpan dalam tabel bernama Jurusan, dan informasi siswa yang relevan disimpan dalam tabel yang disebut Student_Records.
Untuk melihat daftar jurusan (dan GPA minimumnya) di mana setiap siswa dengan jurusan tersebut tidak memenuhi IPK minimum, Anda dapat menggunakan kueri berikut:
SELECT [Major], [Min_GPA]
FROM [Majors] WHERE [Min_GPA] > ANY (SELECT [GPA] FROM [Student_Records] WHERE [Student_Records].[Major]=[Majors].[Major]);Catatan: Anda juga dapat menggunakan kata kunci SOME untuk tujuan yang sama; kata kunci SOME identik dengan ANY.
-
EXISTS Gunakan EXISTS dalam klausul WHERE untuk menunjukkan bahwa subkueri harus mengembalikan setidaknya satu baris. Anda juga bisa mengawali EXISTS dengan NOT, untuk menunjukkan bahwa subkueri tidak boleh mengembalikan baris apa pun.
Misalnya, kueri berikut mengembalikan daftar produk yang ditemukan dalam setidaknya satu pesanan yang sudah ada:
SELECT *
FROM [Products] WHERE EXISTS (SELECT * FROM [Order Details] WHERE [Order Details].[Product ID]=[Products].[ID]);Menggunakan NOT EXISTS, kueri mengembalikan daftar produk yang tidak ditemukan dalam setidaknya satu pesanan yang sudah ada:
SELECT *
FROM [Products] WHERE NOT EXISTS (SELECT * FROM [Order Details] WHERE [Order Details].[Product ID]=[Products].[ID]); -
IN Gunakan IN dalam klausul WHERE untuk memverifikasi bahwa nilai di baris kueri utama saat ini adalah bagian dari kumpulan yang dikembalikan subkueri. Anda juga bisa mengawali IN dengan NOT, untuk memverifikasi bahwa nilai di baris kueri utama saat ini bukan bagian dari kumpulan yang dikembalikan subkueri.
Misalnya, kueri berikut mengembalikan daftar pesanan (dengan tanggal pesanan) yang diproses oleh karyawan yang bukan perwakilan penjualan:
SELECT [Order ID], [Order Date]
FROM [Orders] WHERE [Employee ID] IN (SELECT [ID] FROM [Employees] WHERE [Job Title]<>'Sales Representative');Dengan MENGGUNAKAN NOT IN, Anda dapat menulis kueri yang sama dengan cara ini:
SELECT [Order ID], [Order Date]
FROM [Orders] WHERE [Employee ID] NOT IN (SELECT [ID] FROM [Employees] WHERE [Job Title]='Sales Representative');