Subkueri dalam Klausa SELECT, FROM, WHERE, dan HAVING

Panduan praktis disertai dengan contoh

M. Ramadhan
Telematika
6 min readMar 5, 2024

--

Daftar Isi

· Pendahuluan
· Basis Data pub
· Subkueri dalam Klausa SELECT
Subkueri Skalar
· Subkueri dalam Klausa FROM
Subkueri Tabel
· Subkueri dalam Klausa WHERE
Subkueri Skalar
Subkueri Baris
· Subkueri dalam Klausa HAVING
Subkueri Skalar
· Penutup
· Referensi

Photo by Ivan Samkov

Pendahuluan

Structured Query Language (SQL) adalah tulang punggung manajemen basis data, menyediakan sarana standar untuk berinteraksi dan memanipulasi data. Dalam ranah SQL, subkueri muncul sebagai fitur dinamis dan kuat, menawarkan pendekatan berbeda untuk menyusun kueri canggih.

Pada intinya, subkueri adalah kueri yang disarangkan dalam pernyataan SQL lain, yang memungkinkan pengambilan data yang digunakan dalam kueri utama. Subkueri ini dapat diintegrasikan dengan mulus ke berbagai bagian pernyataan SQL, mengubah kueri sederhana menjadi alat analisis dan manipulasi data yang tangguh.

Subkueri adalah kueri yang disarangkan di dalam pernyataan SELECT, INSERT, UPDATE, atau DELETE , atau di dalam subkueri lain.
https://learn.microsoft.com/id-id/sql/relational-databases/performance/subqueries?view=sql-server-ver16

Dalam banyak kasus, subkueri digunakan bersama pernyataan SELECT. Subkueri dapat disarangkan dalam klausa SELECT, FROM, WHERE, atau HAVING. Hal inilah yang akan dibahas lebih lanjut. Subkueri di dalam INSERT, UPDATE, atau DELETEakan dibahas terpisah di postingan lain.

Subkueri hadir dalam beberapa varian, masing-masing disesuaikan dengan kasus penggunaan tertentu.

  • Subkueri Skalar. Mengembalikan nilai tunggal yang dapat digunakan jika ada nilai tunggal itu ada.
  • Subkueri Baris. Memberikan serangkaian baris, sering kali digunakan dalam skenario yang memerlukan beberapa perbandingan nilai.
  • Subkueri Kolom. Menghasilkan kolom nilai yang sesuai untuk situasi yang menuntut pengambilan data berdasarkan kolom.
  • Subkueri Tabel. Menghasilkan semua kumpulan hasil, membuat tabel sementara untuk digunakan lebih lanjut.

Kueri yang menampung subkueri biasanya disebut kueri luar, sedangkan subkueri disebut kueri dalam. Subkueri harus selalu diapit tanda kurung. Menyarangkan satu subkueri ke dalam subkueri lainnya dimungkinkan, sehingga memungkinkan beberapa level.

Basis Data pub

Artikel ini memerlukan basis data pub . Anda dapat mengunduh skripnya, instpubs.sql , dari tautan di bawah. Jalankan di SQL Server Management Studio.

Berikut diagramnya.

Subkueri dalam Klausa SELECT

Subkueri berpotensi muncul dalam daftar pilihan pernyataan SELECT lainnya. Penggunaan subkueri dalam daftar pilihan dicontohkan pada Listing 1, yang menunjukkan bagaimana Anda dapat mengambil total qty dari tabel salesuntuk setiap title di tabel titles.

Subkueri Skalar

Listing 1 Skrip SQL untuk menampilkan title dan total per title.

USE pubs
GO
SELECT title,
(SELECT sum(qty)
FROM sales AS s
WHERE s.title_id = t.title_id
) AS Quantity
FROM titles AS t

Dalam contoh ini, subkueri skalar:

SELECT sum(qty) 
FROM sales AS s
WHERE s.title_id = t.title_id

menghitung jumlah kuantitas untuk setiap title, yang ditampilkan di samping title.

Hasilnya diurutkan berdasarkan primary key (title_id).

Bandingkan hasilnya jika menggunakan left outer join.

Listing 2 Skrip SQL untuk menampilkan title dan kuantitas per title menggunakan left outer join.

SELECT title,
sum(qty) AS Quantity
FROM titles t LEFT OUTER JOIN
sales s
ON t.title_id = s.title_id
GROUP BY title

Hasilnya diurutkan berdasarkan atribut dalam klausa GROUP BY.

Subkueri dalam Klausa FROM

Subkueri dalam klausa FROM menjalani evaluasi terlebih dahulu, dan hasil evaluasi ini selanjutnya disimpan dalam relasi sementara yang baru. Setelah ini, kueri luar dievaluasi, khususnya memilih tupel dari relasi sementara yang memenuhi kondisi yang ditentukan dalam klausa WHERE dari kueri luar.

Subkueri Tabel

Listing 3 Skrip SQL untuk menampilkan pub_id, pub_name, dan jumlah title.

USE pubs
GO
SELECT t.pub_id,
pub_name,
title_number
FROM (
SELECT pub_id,
Count(*) title_number
FROM titles
GROUP BY pub_id
) AS t
INNER JOIN publishers AS p
ON t.pub_id = p.pub_id

Subkueri tabel:

SELECT pub_id,
Count(*) AS title_number
FROM titles
GROUP BY pub_id

mengidentifikasi jumlah title untuk masing-masing pub_id, dan kueri luar menggabungkan tabel turunan ini dengan tabel publishers untuk mengambil pub_name.

Hasilnya diurutkan berdasarkan atribut dalam klausa GROUP BY.

Tentu saja Anda dapat menggunakan inner join atau Product Cartesian yang diseleksi dan mendapatkan hasil yang sama.

Listing 4 Skrip SQL untuk menampilkan pub_id, pub_name, dan jumlah title menggunakan inner join atau produk Cartesian.

-- Inner Join
SELECT t.pub_id,
pub_name,
Count(*) AS title_number
FROM titles t INNER JOIN
publishers AS p
ON t.pub_id = p.pub_id
GROUP BY t.pub_id, pub_name

-- Product Cartesian
SELECT t.pub_id,
pub_name,
Count(*) AS title_number
FROM titles t, publishers AS p
WHERE t.pub_id = p.pub_id
GROUP BY t.pub_id, pub_name

Subkueri dalam Klausa WHERE

Subkueri Skalar

Listing 5 skrip SQL untuk menampilkan judul dengan harga terendah.

SELECT title, price
FROM titles
WHERE price =
(SELECT MIN(price)
FROM titles)

-- Another alternative is to
-- replace the = operator with IN
SELECT title, price
FROM titles
WHERE price IN
(SELECT MIN(price)
FROM titles)

Subkueri skalar SELECT MIN(price) FROM titlesmengambil harga minimum dan kueri luar memfilter judul berdasarkan harga ini.

Hasilnya diurutkan berdasarkan primary key (title_id).

Subkueri Baris

Listing 6 Skrip SQL untuk menampilkan judul dan harga yang state penerbitnya adalah ’MA’.

SELECT title, price
FROM titles
WHERE pub_id IN
(SELECT pub_id
FROM publishers
WHERE state = 'MA')

Subkueri baris:

SELECT pub_id 
FROM publishers
WHERE state = 'MA'

menampilkan pub_id, dan kueri luar memfilter berdasarkan pub_id ini menggunakan operatorIN.

Hasilnya diurutkan berdasarkan primary key (title_id).

Anda dapat menggunakan inner join atau Product Cartesian yang diseleksi dan mendapatkan hasil yang sama.

Subkueri dalam Klausa HAVING

Subkueri Skalar

Listing 7 Skrip SQL yang merinci pub_id, harga rata-rata per pub_id kurang dari rata-rata keseluruhan.

SELECT pub_id,
avg(price) AvgPrice,
sum(qty) Quantity
FROM titles t INNER JOIN
sales s
ON t.title_id = s.title_id
GROUP BY pub_id
HAVING avg(price) <=
(SELECT Avg(price)
FROM titles)

Subkueri skalar SELECT Avg(price) FROM titlesmengambil harga rata-rata keseluruhan, dan kueri luar memfilter berdasarkan harga ini.

Hasilnya diurutkan berdasarkan atribut dalam klausal GROUP BY.

Penutup

  • Subkueri meningkatkan kueri SQL ke tingkat yang lebih tinggi, memberikan fleksibilitas dan kompleksitas yang tidak dapat dicapai oleh kueri standar saja.
  • Subkueri dapat disarangkan dalam klausa SELECT, FROM, WHERE, atau HAVING.
  • Subkueri hadir dalam beberapa jenis: (1) subkueri skalar, (2) subkueri baris, (3) subkueri kolom, dan (4) subkueri tabel, masing-masing disesuaikan dengan kasus penggunaan tertentu.

--

--

M. Ramadhan
Telematika

I’m a database designer and developer, childhood in Menggala, living in Palembang.