본문으로 건너뛰기

เนื้อหาภาษาไทย / 태국어 콘텐츠

시스템 가이드 검수 완료된 콘텐츠

Subquery ใน WHERE Clause

บทความนี้กล่าวถึงการใช้ Subquery ใน `WHERE` Clause เพื่อสร้างเงื่อนไขการกรองข้อมูลที่ซับซ้อนและยืดหยุ่นกว่าการใช้ค่าคงที่โดยตรง โดย Subquery สามารถใช้ร่วมกับ op...

Subquery ใน WHERE Clause: กรองข้อมูลอย่างชาญฉลาด

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

การใช้ Subquery ใน WHERE Clause ช่วยให้เราสามารถสร้างเงื่อนไขการกรองที่ซับซ้อน และยืดหยุ่นกว่าการใช้ค่าคงที่โดยตรง ทำให้เราสามารถดึงข้อมูลที่ตรงกับเกณฑ์ที่เรากำหนดได้อย่างแม่นยำ

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

ลองจินตนาการว่าคุณต้องการค้นหาข้อมูลลูกค้าที่มียอดสั่งซื้อสูงกว่าค่าเฉลี่ยของยอดสั่งซื้อทั้งหมด คุณจะทำอย่างไร? การใช้ WHERE Clause ร่วมกับค่าคงที่โดยตรงอาจไม่สามารถทำได้ เพราะคุณต้องรู้ค่าเฉลี่ยก่อน

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

การเปรียบเทียบค่ากับผลลัพธ์ของ Subquery

รูปแบบการใช้งาน Subquery ใน WHERE Clause ที่พบบ่อยที่สุดคือการเปรียบเทียบค่าในคอลัมน์กับผลลัพธ์ที่ได้จาก Subquery โดยใช้ Operators ต่างๆ เช่น =, >, <, >=, <= และ !=

ตัวอย่าง: ค้นหาชื่อสินค้าที่มีราคาสูงกว่าราคาสินค้าที่มีรหัส 'P001'

SELECT product_name
FROM products
WHERE price > (SELECT price FROM products WHERE product_id = 'P001');

ในตัวอย่างนี้ Subquery (SELECT price FROM products WHERE product_id = 'P001') จะดึงราคาสินค้าที่มีรหัส 'P001' และนำมาเปรียบเทียบกับราคาสินค้าอื่นๆ ในตาราง products เพื่อคัดเลือกเฉพาะสินค้าที่มีราคาสูงกว่า

ข้อควรระวัง: Subquery ที่ใช้ในการเปรียบเทียบค่าโดยตรง ควรจะคืนค่าเพียงค่าเดียว (Single Value) เท่านั้น หาก Subquery คืนค่าหลายค่า จะทำให้เกิดข้อผิดพลาด

การใช้ Subquery กับ IN

หาก Subquery คืนค่าหลายค่า เราสามารถใช้ Operator IN เพื่อตรวจสอบว่าค่าในคอลัมน์อยู่ในชุดผลลัพธ์ที่ได้จาก Subquery หรือไม่

ตัวอย่าง: ค้นหาชื่อลูกค้าที่เคยสั่งซื้อสินค้าที่มีรหัส 'P002' หรือ 'P003'

SELECT customer_name
FROM customers
WHERE customer_id IN (SELECT customer_id FROM orders WHERE product_id IN ('P002', 'P003'));

ในตัวอย่างนี้ Subquery (SELECT customer_id FROM orders WHERE product_id IN ('P002', 'P003')) จะดึงรหัสลูกค้าที่เคยสั่งซื้อสินค้าที่มีรหัส 'P002' หรือ 'P003' และนำมาใช้ในการกรองข้อมูลลูกค้าในตาราง customers

การใช้ Subquery กับ EXISTS

Operator EXISTS ใช้ตรวจสอบว่า Subquery คืนค่าหรือไม่ โดยไม่สนใจว่า Subquery จะคืนค่าอะไร หาก Subquery คืนค่าอย่างน้อยหนึ่งค่า EXISTS จะคืนค่าเป็น TRUE หาก Subquery ไม่คืนค่าเลย EXISTS จะคืนค่าเป็น FALSE

EXISTS มักใช้เพื่อตรวจสอบความสัมพันธ์ระหว่างตารางสองตาราง

ตัวอย่าง: ค้นหาชื่อลูกค้าที่เคยสั่งซื้อสินค้าอย่างน้อยหนึ่งครั้ง

SELECT customer_name
FROM customers
WHERE EXISTS (SELECT 1 FROM orders WHERE orders.customer_id = customers.customer_id);

ในตัวอย่างนี้ Subquery (SELECT 1 FROM orders WHERE orders.customer_id = customers.customer_id) จะตรวจสอบว่ามีรายการสั่งซื้อสำหรับลูกค้ารายนั้นๆ ในตาราง orders หรือไม่ หากมีอย่างน้อยหนึ่งรายการ EXISTS จะคืนค่าเป็น TRUE และลูกค้าคนนั้นจะถูกเลือก

ข้อดีของการใช้ EXISTS: โดยทั่วไปแล้ว EXISTS จะมีประสิทธิภาพที่ดีกว่า IN โดยเฉพาะอย่างยิ่งเมื่อ Subquery คืนค่าจำนวนมาก เนื่องจาก EXISTS จะหยุดการทำงานทันทีที่พบค่าอย่างน้อยหนึ่งค่า ในขณะที่ IN จะต้องตรวจสอบทุกค่าที่ Subquery คืนมา

การกรองข้อมูลแบบซับซ้อน

Subquery ใน WHERE Clause สามารถใช้เพื่อสร้างเงื่อนไขการกรองที่ซับซ้อนได้ โดยการซ้อน Subquery หลายชั้น หรือใช้ Subquery ร่วมกับ Operators และ Clauses อื่นๆ

ตัวอย่าง: ค้นหาชื่อสินค้าที่อยู่ในหมวดหมู่ที่มีจำนวนสินค้ามากกว่า 10 รายการ

SELECT product_name
FROM products
WHERE category_id IN (SELECT category_id FROM products GROUP BY category_id HAVING COUNT(*) > 10);

ในตัวอย่างนี้ Subquery ด้านใน (SELECT category_id FROM products GROUP BY category_id HAVING COUNT(*) > 10) จะดึงรหัสหมวดหมู่ที่มีจำนวนสินค้ามากกว่า 10 รายการ และ Subquery ด้านนอกจะเลือกสินค้าที่อยู่ในหมวดหมู่เหล่านั้น

แนวปฏิบัติที่ดีในการใช้ Subquery ใน WHERE Clause

  • พยายามหลีกเลี่ยง Subquery ที่ซ้อนกันหลายชั้น: Subquery ที่ซ้อนกันหลายชั้นอาจทำให้ Query อ่านยาก และมีผลต่อประสิทธิภาพการทำงาน ควรพิจารณาใช้ JOIN แทนหากเป็นไปได้
  • ตรวจสอบประสิทธิภาพของ Subquery: Subquery บางประเภทอาจมีประสิทธิภาพไม่ดี ควรตรวจสอบ EXPLAIN Plan เพื่อดูว่า Subquery ทำงานอย่างไร และพิจารณาปรับปรุง Query หากจำเป็น
  • ใช้ EXISTS แทน IN เมื่อเป็นไปได้: โดยทั่วไปแล้ว EXISTS จะมีประสิทธิภาพที่ดีกว่า IN โดยเฉพาะอย่างยิ่งเมื่อ Subquery คืนค่าจำนวนมาก
  • ใช้ Alias สำหรับตาราง: การใช้ Alias สำหรับตารางช่วยให้ Query อ่านง่าย และหลีกเลี่ยงความสับสนเมื่อใช้ Subquery

สรุป

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

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

Office.in.th Custom Service

이 구조를 바탕으로 시스템을 개발하거나 맞춤 변경하고 싶으신가요?

Office.in.th는 엔터프라이즈 웹 애플리케이션, API 연동, 공공/민간 업무 관리 시스템을 설계·개발하며 장기 지원을 제공합니다.

소프트웨어 개발 서비스 보기