วัน: 20 มิถุนายน 2004

Subqueries 101: ความแตกต่างระหว่าง Scalar, Multi-row และ Correlated SubquerySubqueries 101: ความแตกต่างระหว่าง Scalar, Multi-row และ Correlated Subquery

ในโลกของการจัดการข้อมูลขนาดใหญ่ (Big Data) การดึงข้อมูลที่ซับซ้อนและมีความสัมพันธ์กันอย่างลึกซึ้งถือเป็นหัวใจสำคัญของระบบวิเคราะห์ธุรกิจ แม้ว่าคำสั่ง JOIN จะเป็นเครื่องมือหลักในการเชื่อมโยงตาราง แต่ก็มีสถานการณ์ที่การเชื่อมโยงแบบทั่วไปไม่สามารถตอบโจทย์ได้ทั้งหมด

ในกรณีเช่นนี้ เราจึงต้องใช้แนวคิดของ Subqueries หรือการสืบค้นย่อย ซึ่งคือการนำคำสั่ง SELECT ไปฝังอยู่ภายในคำสั่ง SQL หลัก (เช่น ใน WHERE, FROM, หรือ SELECT) การทำความเข้าใจกลไกของ Subqueries อย่างถ่องแท้ โดยเฉพาะความแตกต่างระหว่าง Scalar, Multi-row และ Correlated จะช่วยให้คุณเขียนโค้ด PostgreSQL ที่มีประสิทธิภาพและแม่นยำสูง


ประเภทของ Subqueries ใน PostgreSQL

โดยทั่วไปแล้ว Subqueries สามารถแบ่งออกได้เป็น 3 ประเภทหลัก ซึ่งแต่ละประเภทมีข้อจำกัดและวิธีการใช้งานที่แตกต่างกันอย่างชัดเจน:

1. Scalar Subquery (ค่าเดียว)

หลักการ: Subquery ที่ถูกออกแบบมาให้ส่งกลับค่าเพียงค่าเดียว (Single Value) เท่านั้น ไม่ว่าจะเป็นตัวเลข (Integer), ข้อความ (Text), หรือวันที่ (Date)
การใช้งาน: มักใช้ในการเปรียบเทียบเงื่อนไขใน WHERE clause หรือ SELECT list เพื่อให้ได้ผลลัพธ์เป็นค่าเดียวเพื่อนำไปเปรียบเทียบ

ตัวอย่าง (หาพนักงานที่เงินเดือนสูงกว่าค่าเฉลี่ยของบริษัท):

SQL

SELECT name, salary FROM employees WHERE salary > (SELECT AVG(salary) FROM employees);

2. Multi-row Subquery (หลายแถว)

หลักการ: Subquery ที่สามารถส่งกลับชุดข้อมูลได้หลายแถว (Multiple Rows) แต่ต้องมีคอลัมน์เพียงคอลัมน์เดียวเท่านั้น
การใช้งาน: มักใช้ร่วมกับตัวดำเนินการเปรียบเทียบกลุ่ม (Set Operators) เช่น IN, ANY, หรือ ALL เพื่อตรวจสอบว่าค่าที่ต้องการนั้นอยู่ในรายการผลลัพธ์หรือไม่

ตัวอย่าง (หาพนักงานที่อยู่ในแผนกที่มีรหัส 10 หรือ 20):

SQL

SELECT name FROM employees WHERE department_id IN (SELECT department_id FROM departments WHERE location = 'Bangkok');

3. Correlated Subquery (สัมพันธ์กัน)

หลักการ: Subquery ประเภทที่ซับซ้อนที่สุด เพราะผลลัพธ์ของมันจะขึ้นอยู่กับแถวข้อมูลของคำสั่ง SQL หลัก (Outer Query) ที่กำลังถูกประมวลผลในขณะนั้น
ข้อควรระวัง: การใช้ Correlated Subquery อาจทำให้ประสิทธิภาพการทำงานลดลง หากไม่จำเป็น ควรพิจารณาใช้ JOIN แทน

ตัวอย่าง (หาพนักงานที่เงินเดือนสูงกว่าค่าเฉลี่ยของแผนกตัวเอง):

SQL

SELECT e1.name, e1.salary FROM employees e1 WHERE e1.salary > (SELECT AVG(e2.salary) FROM employees e2 WHERE e2.department_id = e1.department_id);

สรุปและข้อแนะนำจาก Senior Architect

การเลือกใช้ Subquery ที่ถูกต้องเป็นสิ่งสำคัญต่อประสิทธิภาพของระบบฐานข้อมูล:

  • ใช้ Scalar Subquery เมื่อคุณต้องการเปรียบเทียบกับค่าเดียว (เช่น ค่าเฉลี่ยรวม).
  • ใช้ Multi-row Subquery เมื่อคุณต้องการตรวจสอบว่าค่าอยู่ในกลุ่มรายการ (เช่น รหัสแผนกที่อยู่ในรายการที่กำหนด).
  • ใช้ Correlated Subquery เมื่อเงื่อนไขในการกรองข้อมูลต้องอ้างอิงถึงข้อมูลในแถวปัจจุบันของ Outer Query เท่านั้น.

ในฐานะ System Architect ขอแนะนำว่า หากสามารถแปลง Correlated Subquery ให้เป็น JOIN ได้ จะช่วยให้ Query มีความเร็วและประสิทธิภาพสูงกว่ามากเสมอ