ข้ามไปยังเนื้อหาหลัก
คู่มือระบบ เนื้อหาผ่านการตรวจสอบแล้ว

Subquery คืออะไร?

บทความนี้แนะนำ Subquery ซึ่งเป็น Query ย่อยที่ซ้อนอยู่ภายใน Query หลัก เพื่อดึงข้อมูลที่จำเป็นสำหรับการ Query หลัก ทำให้สามารถเขียน Query ที่ซับซ้อนและยืดหยุ่นไ...

Subquery คืออะไร?

ในบทที่ผ่านมา เราได้เรียนรู้เกี่ยวกับการ JOIN ตารางเพื่อรวมข้อมูลจากหลายตารางเข้าด้วยกัน ในบทนี้ เราจะมาทำความรู้จักกับอีกหนึ่งเครื่องมือที่ทรงพลังในการดึงข้อมูลจากฐานข้อมูล นั่นคือ Subquery หรือ Query ย่อย

Subquery คือ Query ที่ซ้อนอยู่ภายใน Query อื่นๆ โดยทั่วไปแล้ว Subquery จะถูกใช้เพื่อดึงข้อมูลที่จำเป็นสำหรับการ Query หลัก ทำให้เราสามารถเขียน Query ที่ซับซ้อนและมีความยืดหยุ่นมากขึ้นได้

ลองนึกภาพว่าคุณต้องการค้นหาชื่อลูกค้าทั้งหมดที่สั่งซื้อสินค้าที่มีราคาสูงสุด คุณสามารถทำได้โดยใช้ Subquery เพื่อค้นหาราคาสูงสุดก่อน จากนั้นจึงใช้ราคาสูงสุดนั้นใน Query หลักเพื่อค้นหาลูกค้าที่สั่งซื้อสินค้าราคาดังกล่าว

ทำไมต้องใช้ Subquery?

  • ความซับซ้อนที่ลดลง: ช่วยให้เราสามารถแบ่ง Query ที่ซับซ้อนออกเป็นส่วนย่อยๆ ที่ง่ายต่อการทำความเข้าใจและจัดการ
  • ความยืดหยุ่น: เพิ่มความยืดหยุ่นในการ Query ข้อมูล ทำให้เราสามารถดึงข้อมูลที่ต้องการได้หลากหลายรูปแบบ
  • การนำกลับมาใช้ใหม่: Subquery สามารถนำกลับมาใช้ใหม่ได้ใน Query อื่นๆ ทำให้ประหยัดเวลาในการเขียน Query

โครงสร้างของ Subquery

Subquery จะถูกเขียนอยู่ภายในวงเล็บ () และสามารถวางไว้ในหลายตำแหน่งของ Query หลัก เช่น ใน WHERE Clause, SELECT Clause, หรือ FROM Clause

โดยทั่วไปแล้ว Subquery จะคืนค่าเป็น:

  • ค่าเดียว (Scalar Subquery): ใช้เมื่อต้องการเปรียบเทียบค่าใน Query หลักกับค่าที่ได้จาก Subquery
  • ชุดของค่า (Multiple-Row Subquery): ใช้เมื่อต้องการเปรียบเทียบค่าใน Query หลักกับชุดของค่าที่ได้จาก Subquery (มักใช้กับ IN, NOT IN, ANY, ALL)
  • ตาราง (Table Subquery หรือ Derived Table): ใช้เมื่อต้องการใช้ผลลัพธ์ของ Subquery เป็นตารางใน Query หลัก (มักใช้ใน FROM Clause)

Subquery ใน WHERE Clause

Subquery ที่ใช้ใน WHERE Clause มักจะถูกใช้เพื่อกรองข้อมูลใน Query หลัก โดยเปรียบเทียบค่าใน Query หลักกับค่าที่ได้จาก Subquery

ตัวอย่าง: สมมติว่าเรามีตาราง customers และ orders ดังนี้:

-- ตาราง customers
CREATE TABLE customers (
  customer_id INT PRIMARY KEY,
  customer_name VARCHAR(255)
);

INSERT INTO customers (customer_id, customer_name) VALUES
(1, 'Alice'),
(2, 'Bob'),
(3, 'Charlie');

-- ตาราง orders
CREATE TABLE orders (
  order_id INT PRIMARY KEY,
  customer_id INT,
  order_total DECIMAL(10, 2),
  FOREIGN KEY (customer_id) REFERENCES customers(customer_id)
);

INSERT INTO orders (order_id, customer_id, order_total) VALUES
(101, 1, 100.00),
(102, 2, 200.00),
(103, 1, 150.00),
(104, 3, 50.00);

หากเราต้องการค้นหาชื่อลูกค้าที่เคยสั่งซื้อสินค้าที่มีมูลค่ามากกว่า 100 บาท เราสามารถใช้ Subquery ใน WHERE Clause ได้ดังนี้:

SELECT customer_name
FROM customers
WHERE customer_id IN (
  SELECT customer_id
  FROM orders
  WHERE order_total > 100
);

คำอธิบาย:

  1. Subquery (SELECT customer_id FROM orders WHERE order_total > 100) จะทำการค้นหา customer_id ของลูกค้าที่เคยสั่งซื้อสินค้าที่มีมูลค่ามากกว่า 100 บาท
  2. Query หลัก SELECT customer_name FROM customers WHERE customer_id IN (...) จะทำการค้นหาชื่อลูกค้าจากตาราง customers โดยกรองเอาเฉพาะลูกค้าที่มี customer_id อยู่ในชุดของค่าที่ได้จาก Subquery

ผลลัพธ์:

+---------------+
| customer_name |
+---------------+
| Alice         |
| Bob           |
+---------------+

จะเห็นว่าเราได้ชื่อของ Alice และ Bob ซึ่งเป็นลูกค้าที่เคยสั่งซื้อสินค้าที่มีมูลค่ามากกว่า 100 บาท

ข้อควรระวัง: การใช้ IN กับ Subquery ที่คืนค่าเป็นชุดของค่า อาจทำให้ Query ทำงานช้าลงได้ หากชุดของค่ามีขนาดใหญ่ ในกรณีนี้ อาจพิจารณาใช้ JOIN แทน

Subquery ใน SELECT Clause

Subquery ที่ใช้ใน SELECT Clause มักจะถูกใช้เพื่อดึงค่าเพิ่มเติมที่เกี่ยวข้องกับข้อมูลใน Query หลัก ตัวอย่างเช่น การคำนวณค่าเฉลี่ย, ค่าสูงสุด, หรือค่าต่ำสุด

ตัวอย่าง: หากเราต้องการแสดงชื่อลูกค้าพร้อมกับจำนวนคำสั่งซื้อทั้งหมดของลูกค้าแต่ละคน เราสามารถใช้ Subquery ใน SELECT Clause ได้ดังนี้:

SELECT
  customer_name,
  (SELECT COUNT(*) FROM orders WHERE customer_id = customers.customer_id) AS total_orders
FROM customers;

คำอธิบาย:

  1. Subquery (SELECT COUNT(*) FROM orders WHERE customer_id = customers.customer_id) จะทำการนับจำนวนคำสั่งซื้อทั้งหมดของลูกค้าแต่ละคน โดยใช้ customer_id จากตาราง customers ใน Query หลัก เพื่อกรองข้อมูลใน Subquery
  2. Query หลัก SELECT customer_name, (...) AS total_orders FROM customers จะทำการเลือกชื่อลูกค้าจากตาราง customers พร้อมกับจำนวนคำสั่งซื้อที่คำนวณได้จาก Subquery โดยกำหนด alias ให้กับผลลัพธ์ของ Subquery เป็น total_orders

ผลลัพธ์:

+---------------+--------------+
| customer_name | total_orders |
+---------------+--------------+
| Alice         |            2 |
| Bob           |            1 |
| Charlie       |            1 |
+---------------+--------------+

จะเห็นว่าเราได้ชื่อลูกค้าแต่ละคนพร้อมกับจำนวนคำสั่งซื้อทั้งหมดของลูกค้าคนนั้น

ข้อควรระวัง: การใช้ Subquery ใน SELECT Clause อาจทำให้ Query ทำงานช้าลงได้ โดยเฉพาะอย่างยิ่งถ้า Subquery ถูกเรียกใช้สำหรับทุกแถวในตารางหลัก ในกรณีนี้ อาจพิจารณาใช้ JOIN ร่วมกับ GROUP BY แทน

สรุป

Subquery เป็นเครื่องมือที่ทรงพลังในการดึงข้อมูลจากฐานข้อมูล ช่วยให้เราสามารถเขียน Query ที่ซับซ้อนและมีความยืดหยุ่นมากขึ้นได้ อย่างไรก็ตาม การใช้ Subquery อย่างไม่ระมัดระวังอาจทำให้ Query ทำงานช้าลงได้ ดังนั้นจึงควรทำความเข้าใจถึงข้อดีข้อเสียของการใช้ Subquery และเลือกใช้ Subquery ในกรณีที่เหมาะสม

ในบทถัดไป เราจะลงลึกในรายละเอียดของการใช้ Subquery ใน WHERE Clause และ SELECT Clause พร้อมทั้งยกตัวอย่างการใช้งานที่ซับซ้อนยิ่งขึ้น

Office.in.th Custom Service

ต้องการพัฒนาระบบหรือปรับแต่งจากโครงสร้างนี้?

Office.in.th รับพัฒนาและออกแบบ Enterprise Web Application, API Integration และระบบบริหารงานภาครัฐ/เอกชน พร้อมการสนับสนุนระยะยาว

ดูบริการรับพัฒนาซอฟต์แวร์