ลำดับการทำงานของคำสั่ง SELECT ใน MySQL

หลายๆคนอาจไม่เคยรู้ว่า MySQL มีลำดับการทำงานของคำสั่ง SELECT ที่เราใช้กันอยู่อย่างไร และหลายๆคนอีกเช่นกัน คงถามผมว่า แล้วเราจะรู้มันไปทำไม(ฟะ)

ในทางการโปรแกรม การกำหนดลำดับก่อนหลังของการทำงาน มีความสำคัญเป็นอย่างยิ่งครับ กำหนดลำดับถูกก็ทำให้ผลลัพท์ถูก กำหนดผิด ก็อาจทำให้ผลลัพท์ผิดได้ เช่นการคูณ 2 + 5 * 3 การคูณก่อนบวก จะได้ผลลัท์เป็น 17 แต่ถ้าบวกก่อนคูณ จะได้ผลลัพท์เป็น 21 ซึ่งไม่เท่ากัน ส่วนผลลัพท์อันไหนมันจะถูกก็แล้วแต่โจทย์ ซึ่งเรามีวิธีบังคับให้ผลลัพท์มันถูกเสมอ ด้วยการ จัดลำดับการทำงานครับ เช่น

SELECT 2 + 5 * 3 และ  SELECT 5 * 3 + 2


ผลลัพท์จะได้เป็น 17 เสมอ เนื่องจาก MySql จะทำคำสั่ง * ก่อน + เสมอ ดังนั้นหากผลลัพท์ที่ถูกต้องเป็น 21 แล้วการคำนวณนี้ก็เท่ากับผิดพลาด การควบคุมให้ผลลัพท์ถูกต้องเสมอด้วยการใส่วงเล็บครอบลำดับที่ต้องการ โดยที่ MySQL จะคำนวณผลลัพท์จาก

วงเล็บชั้นในสุด -> วงเล็บชั้นนอกสุด เช่น

SELECT (3 * (2 + 5)) = SELECT (3 * (7)) = 21

และสำหรับ ลำดับชั้นเดียวกัน จะประมวลผลจากซ้ายไปขวา เช่น

SELECT (2 + 5) * 3 = SELECT 7 * 3 = 21

SELECT (2 + 5) * ( 3 * 1 ) = SELECT (7) * (3 * 1) = SELECT (7) * (3) = 21

นอกเรื่องไปหน่อย กลับมาที่ ลำดับการทำงานของ SELECT

SELECT .....
FROM ......
[WHERE .....]
[GROUP BY .....]
[HAVING ......]

1.เริ่มต้นครั้งแรก MySQL จะประมวลผลที่บรรทัด FROM เพื่อเลือกฐานข้อมูลก่อน รวมถึงคำสั่ง JOIN ต่างๆ ด้วย (ถ้ามี) เพื่อเลือกข้อมูลที่ได้จาการ JOIN ก่อน
2.ถัดมา หากมีคำสั่ง WHERE MySQL จะประมวลผลจากคำสั่งนี้ต่อ โดยการประมวลผลจะประมวลผลคำสั่งจากซ้ายไปขวา การกำหนดลำดับการเปรียบเทียบในส่วนนี้ มีความสำคัญต่อผลลัพท์เป็นอย่างมากครับ หากกำหนดผิด ผลลัพท์ที่ได้อาจไม่ถูกต้อง โดยที่ กฏ ลำดับความสำคัญต่างๆ จะเป็นไปตามข้อกำหนดของ MySQL แต่ในทางปฏิบัติ เราควรเลือก query ที่ให้ผลลัพท์ เหลือน้อยที่สุด อยู่ด้านซ้ายมือ และ query ที่ให้ผลลัพท์จำนวนมากกว่า อยู่ทางขวามือ ครับ
3.คำสั่ง GROUP BY จะถูกประมวลผลถัดมา (ถ้ามี) เพื่อแบ่งกลุ่มตารางตามเงื่อนไขที่กำหนด
4. HAVING จะถูกประมวลผลต่อ เพื่อกรองผลลัพท์ที่ได้จาก GROUP BY อีกที
6. และสุดท้าย SELECT จะทำงานเพื่อเลือกคอลัมน์ที่ต้องการตามคำสั่ง
ผู้เขียน goragod โพสต์เมื่อ 28 ก.พ. 2552 เปิดดู 17,471 ป้ายกำกับ SQL
^