Subquery คือ query ที่ซ้อนอยู่ภายในอีก query หนึ่ง — ใช้ใน WHERE, FROM, SELECT หรือกับ EXISTS มันช่วยให้คุณใช้ผลลัพธ์ของ query หนึ่งภายในอีก query หนึ่ง ทำให้สามารถกรองและคำนวณที่ซับซ้อนได้
Subquery คือ query ที่ซ้อนอยู่ภายในอีก query หนึ่ง — ใช้ใน WHERE, FROM, SELECT หรือกับ EXISTS มันช่วยให้คุณใช้ผลลัพธ์ของ query หนึ่งภายในอีก query หนึ่ง ทำให้สามารถกรองและคำนวณที่ซับซ้อนได้
-- find users who have placed an order (their id is in the orders table)
SELECT name FROM users
WHERE id IN (SELECT user_id FROM orders); -- the subquery returns a list of user_ids
-- find products more expensive than the average
SELECT name, price FROM products
WHERE price > (SELECT AVG(price) FROM products); -- subquery returns a single value
Subquery ใน WHERE ให้ค่าสำหรับใช้ในการกรอง — เป็นรายการ (ด้วย IN) หรือค่าเดียว (ด้วย operator เปรียบเทียบ)
-- for each user, find those with above-average orders FOR THEIR COUNTRY
SELECT name FROM users u
WHERE order_count > (
SELECT AVG(order_count) FROM users
WHERE country = u.country -- references the OUTER query's row (correlated)
);
Correlated subquery อ้างอิงถึง query ภายนอก — มันรันหนึ่งครั้งต่อแถวภายนอก (อาจช้ากว่า) ส่วน subquery ที่ไม่ correlated รันเพียงครั้งเดียว
-- users who have at least one order (often more efficient than IN)
SELECT name FROM users u
WHERE EXISTS (
SELECT 1 FROM orders o WHERE o.user_id = u.id -- just checks existence
);
EXISTS ตรวจสอบว่า subquery คืนค่าแถวใด ๆ หรือไม่ — มักมีประสิทธิภาพมากกว่า IN สำหรับการตรวจสอบการมีอยู่ (มันสามารถหยุดที่คู่ตรงกันแรกได้)
-- use a subquery result as a table
SELECT country, avg_age FROM (
SELECT country, AVG(age) AS avg_age FROM users GROUP BY country
) AS country_stats
WHERE avg_age > 30;
Many subqueries can be rewritten as JOINs (often more efficient/readable).
WHERE id IN (SELECT ...) → can often be a JOIN
Use subqueries for clarity in filtering/aggregation; JOINs for combining data.
CTEs (WITH) are often a cleaner alternative to complex nested subqueries.
Subquery เป็นเทคนิค SQL ที่สำคัญสำหรับการ query ที่ซับซ้อน — การใช้ผลลัพธ์ของ query หนึ่งภายในอีก query หนึ่งทำให้สามารถกรองและคำนวณที่ query ง่าย ๆ แสดงออกไม่ได้ ดังนั้นการเข้าใจมันจึงมีค่าต่อการเขียน query ในโลกจริง
การรู้จักรูปแบบต่าง ๆ — subquery ใน WHERE (การกรองด้วยรายการด้วย IN หรือค่าเดียวด้วยการเปรียบเทียบ), correlated subquery (การอ้างอิงถึง query ภายนอก รันต่อแถว), EXISTS (การตรวจสอบการมีอยู่อย่างมีประสิทธิภาพ) และ subquery ใน FROM (derived table) — ครอบคลุมรูปแบบทั่วไปสำหรับการแสดงตรรกะที่ซับซ้อน
การเข้าใจความแตกต่างระหว่าง subquery แบบ correlated และไม่ correlated สำคัญต่อประสิทธิภาพ (correlated subquery รันหนึ่งครั้งต่อแถวภายนอกและอาจช้า)
ที่มีค่าไม่แพ้กันคือการรู้ ความสัมพันธ์กับ JOIN และ CTE: subquery หลายอันสามารถเขียนใหม่เป็น JOIN ได้ (มักมีประสิทธิภาพและอ่านง่ายกว่า) หรือเป็น CTE (สะอาดกว่าสำหรับกรณีซับซ้อน) ดังนั้นการเข้าใจว่าควรใช้แต่ละอย่างเมื่อใด — subquery สำหรับความชัดเจนในการกรอง/aggregate, JOIN สำหรับการรวมข้อมูล — จึงเป็นทักษะเชิงปฏิบัติ
เนื่องจาก query ในโลกจริงมักต้องการการซ้อน (การกรองด้วยผลลัพธ์ที่ aggregate การตรวจสอบการมีอยู่ การเปรียบเทียบกับค่าที่คำนวณ) และเนื่องจากการเข้าใจ subquery ลักษณะด้านประสิทธิภาพของมัน (โดยเฉพาะแบบ correlated) และความสัมพันธ์ของมันกับ JOIN/CTE สำคัญต่อการเขียน query ที่ซับซ้อนอย่างมีประสิทธิภาพ การเชี่ยวชาญ subquery จึงเป็นความรู้ที่มีค่าและนำไปใช้บ่อยสำหรับ SQL ที่เหนือกว่าการ query พื้นฐาน และเป็นหัวข้อสัมภาษณ์ที่พบบ่อยซึ่งแสดงถึงความสามารถในการแสดงความต้องการข้อมูลที่ซับซ้อน