ข้อแตกต่างระหว่างการ JOIN และ Subquery ใน SQL
JOIN และ Subquery เป็นคำสั่งในภาษา SQL เพื่อดึงข้อมูลจากหลายตารางหรือตามเงื่อนไข ทั้งสองวิธีมีข้อแตกต่างกันดังนี้
ตัวอย่างการ JOIN
ในการ JOIN ขั้นตอนแรกจะมีการจับคู่ข้อมูลจากทั้งสองตารางก่อน ถึงจะนำผลลัพท์ที่ได้มาคัดเลือกรายการที่ต้องการ หากมี WHERE
ตัวอย่างการใช้งาน Subquery
ในกรณีของ Subquery จะมีการเลือกข้อมูลออกมาจากตารางหลักก่อน จากนั้นเมื่อทำการเลือกผลลัพท์แต่ละรายการ (SELECT) ถึงจะไป Query เอาข้อมูลที่ต้องการออกมา จากตัวอย่างจะเห็นว่าการ JOIN จะเร็วกว่าการใช้ Subquery หลายเท่าตัวเลยทีเดียว
มาดูอีกสักตัวอย่างในการ JOIN
- JOIN จะรวมข้อมูลจากตารางอย่างน้อยสองตาราง ในขณะที่ Subquery ใช้คําสั่ง SELECT ที่ซ้อนกันเพื่อดึงข้อมูลจากตารางหนึ่งหรือใช้เป็นเงื่อนไขในการกรองข้อมูลจากตารางอื่น
- โดยทั่วไปการ JOIN จะเร็วกว่า Subquery เมื่อทํางานกับชุดข้อมูลขนาดใหญ่ เนื่องจากการ JOIN จะดำเนินการ Query ในครั้งเดียว ในขณะที่ Subquery จะถูกดําเนินการแยกต่างหากและผลลัพธ์จะถูกใช้เพื่อการกรองข้อมูลอีกที
- โดยปกติ JOIN จะอ่านและเข้าใจได้ง่ายกว่า ในขณะที่ Subquery อาจจะซับซ้อนและทำความเข้าใจได้ยากกว่า ด้วยความที่ Subquery มักจะซับซ้อนกว่าทําให้การอ่านและบํารุงรักษาอาจจะยากขึ้น
- การ JOIN จะใช้เมื่อจําเป็นต้องดึงข้อมูลจากหลายตาราง ในขณะที่ Subquery จะใช้เมื่อจําเป็นต้องใช้ข้อมูลจากตารางหนึ่งเป็นเงื่อนไขในการดึงข้อมูลจากตารางอื่น
- การ JOIN มีหลายประเภทเช่น INNER JOIN, LEFT JOIN, RIGHT JOIN และ FULL OUTER JOIN ที่ให้ผลลัพท์แตกต่างกัน ในขณะที่ Subquery ไม่มีประเภท
- การ JOIN อาจซับซ้อนและเขียนยากขึ้นเมื่อจํานวนตารางและความสัมพันธ์ระหว่าง Query เพิ่มขึ้น แต่ Subquery อาจเขียนได้ง่ายกว่าในกรณีที่คิวรีที่ซับซ้อนมากๆ
- Subquery สามารถใช้ในคิวรีที่ซ้อนกัน และช่วยกรองข้อมูลตามเงื่อนไขต่างๆ ได้ ในขณะที่การ JOIN จะไม่สามารถใช้คำสั่งซ้อนกันได้หากต้องการกรองข้อมูลหลายเงื่อนไขหลายข้ออาจต้องใช้วิธีการ JOIN หลายรายการ
- การ JOIN สามารถใช้สําหรับการจัดการข้อมูลเช่นการอัปเดต ลบ หรือบันทึกในหลายตารางพร้อมกัน ในขณะที่ Subquery ส่วนใหญ่จะใช้สําหรับการดึงข้อมูล
- การ 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;
และตัวอย่าง SubquerySELECT 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 อาจจะมีประสิทธิภาพที่แตกต่างกันหากเงื่อนไขแตกต่างกัน ดังนั้นการเลือกใช้วิธีการใดจะต้องเลือกวิธีที่เหมาะสมเป็นกรณีไป เพราะวิธีการแต่ละแบบต่างก็มีจุดเด่นจุดด้อยแตกต่างกัน