GORAGOD.com

ข้อแตกต่างระหว่างการ JOIN และ Subquery ใน SQL

JOIN และ Subquery เป็นคำสั่งในภาษา SQL เพื่อดึงข้อมูลจากหลายตารางหรือตามเงื่อนไข ทั้งสองวิธีมีข้อแตกต่างกันดังนี้
  1. JOIN จะรวมข้อมูลจากตารางอย่างน้อยสองตาราง ในขณะที่ Subquery ใช้คําสั่ง SELECT ที่ซ้อนกันเพื่อดึงข้อมูลจากตารางหนึ่งหรือใช้เป็นเงื่อนไขในการกรองข้อมูลจากตารางอื่น
  2. โดยทั่วไปการ JOIN จะเร็วกว่า Subquery เมื่อทํางานกับชุดข้อมูลขนาดใหญ่ เนื่องจากการ JOIN จะดำเนินการ Query ในครั้งเดียว ในขณะที่ Subquery จะถูกดําเนินการแยกต่างหากและผลลัพธ์จะถูกใช้เพื่อการกรองข้อมูลอีกที
  3. โดยปกติ JOIN จะอ่านและเข้าใจได้ง่ายกว่า ในขณะที่ Subquery อาจจะซับซ้อนและทำความเข้าใจได้ยากกว่า ด้วยความที่ Subquery มักจะซับซ้อนกว่าทําให้การอ่านและบํารุงรักษาอาจจะยากขึ้น
  4. การ JOIN จะใช้เมื่อจําเป็นต้องดึงข้อมูลจากหลายตาราง ในขณะที่ Subquery จะใช้เมื่อจําเป็นต้องใช้ข้อมูลจากตารางหนึ่งเป็นเงื่อนไขในการดึงข้อมูลจากตารางอื่น
  5. การ JOIN มีหลายประเภทเช่น INNER JOIN, LEFT JOIN, RIGHT JOIN และ FULL OUTER JOIN ที่ให้ผลลัพท์แตกต่างกัน ในขณะที่ Subquery ไม่มีประเภท
  6. การ JOIN อาจซับซ้อนและเขียนยากขึ้นเมื่อจํานวนตารางและความสัมพันธ์ระหว่าง Query เพิ่มขึ้น แต่ Subquery อาจเขียนได้ง่ายกว่าในกรณีที่คิวรีที่ซับซ้อนมากๆ
  7. Subquery สามารถใช้ในคิวรีที่ซ้อนกัน และช่วยกรองข้อมูลตามเงื่อนไขต่างๆ ได้ ในขณะที่การ JOIN จะไม่สามารถใช้คำสั่งซ้อนกันได้หากต้องการกรองข้อมูลหลายเงื่อนไขหลายข้ออาจต้องใช้วิธีการ JOIN หลายรายการ
  8. การ JOIN สามารถใช้สําหรับการจัดการข้อมูลเช่นการอัปเดต ลบ หรือบันทึกในหลายตารางพร้อมกัน ในขณะที่ Subquery ส่วนใหญ่จะใช้สําหรับการดึงข้อมูล
  9. การ JOIN อาจไม่สามารถใช้งานได้เมื่อทํางานกับชุดข้อมูลขนาดใหญ่มากๆหรือใน Query ที่ซับซ้อน เนื่องจากการ JOIN อาจจะให้ผลลัพท์ขนาดใหญ่ในขณะที่ทำการ JOIN ทำให้ประมวลผลได้ช้า ในขณะที่ Subquery อาจจะมีการกรองข้อมูลออกก่อนจำนวนหนึ่งแล้วถึงจะเอาผลลัพท์ที่ได้ไป Query ข้อมูลอีกที ทำให้ได้ผลลัพท์ที่น้อยกว่า

ตัวอย่างการ JOIN
SELECT R.id,U.name 
FROM `rooms`AS R 
LEFT JOIN user AS U ON U.id=R.owner_id

ในการ JOIN ขั้นตอนแรกจะมีการจับคู่ข้อมูลจากทั้งสองตารางก่อน ถึงจะนำผลลัพท์ที่ได้มาคัดเลือกรายการที่ต้องการ หากมี WHERE
ตัวอย่างการใช้งาน Subquery
SELECT R.id, (SELECT name FROM user WHERE id=R.owner_id) 
FROM `rooms`AS R

ในกรณีของ Subquery จะมีการเลือกข้อมูลออกมาจากตารางหลักก่อน จากนั้นเมื่อทำการเลือกผลลัพท์แต่ละรายการ (SELECT) ถึงจะไป Query เอาข้อมูลที่ต้องการออกมา จากตัวอย่างจะเห็นว่าการ JOIN จะเร็วกว่าการใช้ Subquery หลายเท่าตัวเลยทีเดียว

มาดูอีกสักตัวอย่างในการ JOIN
SELECT R.id,U.name 
FROM `rooms`AS R 
LEFT JOIN user AS U ON U.id=R.owner_id 
WHERE R.id=33;
และตัวอย่าง Subquery
SELECT R.id,(SELECT name FROM user WHERE id=R.owner_id LIMIT 1) AS name 
FROM `rooms`AS R 
WHERE R.id=33;

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

สรุป การใช้งาน JOIN หรือ Sebquery อาจจะมีประสิทธิภาพที่แตกต่างกันหากเงื่อนไขแตกต่างกัน ดังนั้นการเลือกใช้วิธีการใดจะต้องเลือกวิธีที่เหมาะสมเป็นกรณีไป เพราะวิธีการแต่ละแบบต่างก็มีจุดเด่นจุดด้อยแตกต่างกัน