การใช้ข้อความสั่งแบบมีเงื่อนไขใน ON / WHERE
ที่นี่ฉันได้อธิบายเกี่ยวกับขั้นตอนการประมวลผลแบบสอบถามแบบตรรกะ
การอ้างอิง: การ
สืบค้นT-SQL ของMicrosoft® SQL Server ™ 2005
สำนักพิมพ์: Microsoft Press
Pub วันที่: 7 มีนาคม 2549
พิมพ์ ISBN-10: 0-7356-2313-9
พิมพ์ ISBN-13: 978-0-7356-2313-2
หน้า: 640
ภายในการสืบค้น T-SQL T-SQL ของMicrosoft® SQL Server ™ 2005
(8) SELECT (9) DISTINCT (11) TOP <top_specification> <select_list>
(1) FROM <left_table>
(3) <join_type> JOIN <right_table>
(2) ON <join_condition>
(4) WHERE <where_condition>
(5) GROUP BY <group_by_list>
(6) WITH {CUBE | ROLLUP}
(7) HAVING <having_condition>
(10) ORDER BY <order_by_list>
สิ่งที่สังเกตเห็นได้อย่างแรกของ SQL ที่แตกต่างจากภาษาการเขียนโปรแกรมอื่นคือลำดับที่ประมวลผลโค้ด ในภาษาโปรแกรมส่วนใหญ่รหัสจะถูกประมวลผลตามลำดับที่ถูกเขียน ใน SQL ส่วนคำสั่งแรกที่ถูกประมวลผลคือส่วนคำสั่ง FROM ในขณะที่ส่วนคำสั่ง SELECT ซึ่งปรากฏขึ้นครั้งแรกนั้นจะได้รับการประมวลผลเกือบจะสุดท้าย
แต่ละขั้นตอนสร้างตารางเสมือนที่ใช้เป็นอินพุตไปยังขั้นตอนต่อไปนี้ ตารางเสมือนเหล่านี้ไม่พร้อมใช้งานสำหรับผู้โทร (ไคลเอ็นต์แอปพลิเคชันหรือแบบสอบถามภายนอก) เฉพาะตารางที่สร้างโดยขั้นตอนสุดท้ายเท่านั้นที่จะถูกส่งกลับไปยังผู้โทร หากไม่มีการระบุประโยคใด ๆ ในแบบสอบถามขั้นตอนที่เกี่ยวข้องจะถูกข้ามไป
คำอธิบายสั้น ๆ ของขั้นตอนการประมวลผลแบบสอบถามตรรกะ
ไม่ต้องกังวลมากเกินไปถ้าคำอธิบายขั้นตอนดูเหมือนจะไม่สมเหตุสมผลสำหรับตอนนี้ สิ่งเหล่านี้มีไว้เพื่ออ้างอิง ส่วนที่มาหลังจากตัวอย่างสถานการณ์จะครอบคลุมรายละเอียดเพิ่มเติม
จาก: ผลิตภัณฑ์คาร์ทีเซียน (cross join) ดำเนินการระหว่างสองตารางแรกในส่วนคำสั่ง FROM และผลลัพธ์ตารางเสมือน VT1 จะถูกสร้างขึ้น
ON: ตัวกรอง ON จะใช้กับ VT1 เฉพาะแถวที่มีค่า<join_condition>
เป็น TRUE เท่านั้นที่ถูกแทรกไปยัง VT2
OUTER (join): หากระบุ OUTER JOIN (ตรงข้ามกับ CROSS JOIN หรือ INNER JOIN) แถวจากตารางหรือตารางที่สงวนไว้ซึ่งไม่พบการแข่งขันจะถูกเพิ่มไปยังแถวจาก VT2 เป็นแถวด้านนอก VT3 หากมีมากกว่าสองตารางปรากฏในส่วนคำสั่ง FROM จะใช้ขั้นตอนที่ 1 ถึง 3 ซ้ำ ๆ กันระหว่างผลลัพธ์ของการเข้าร่วมครั้งล่าสุดและตารางถัดไปในส่วนคำสั่ง FROM จนกว่าจะประมวลผลตารางทั้งหมด
ตำแหน่ง: ตัวกรองตำแหน่งถูกใช้กับ VT3 เฉพาะแถวที่มีค่า<where_condition>
เป็น TRUE เท่านั้นที่ถูกแทรกไปยัง VT4
GROUP BY: แถวจาก VT4 ถูกจัดเรียงเป็นกลุ่มตามรายการคอลัมน์ที่ระบุไว้ใน GROUP BY clause สร้าง VT5 แล้ว
CUBE | ROLLUP: Supergroups (กลุ่มของกลุ่ม) ถูกเพิ่มลงในแถวจาก VT5 สร้าง VT6
HAVING: ตัวกรอง HAVING ถูกนำไปใช้กับ VT6 เฉพาะกลุ่มที่ใส่<having_condition>
TRUE ไว้กับ VT7
SELECT: รายการ SELECT ได้รับการดำเนินการสร้าง VT8
DISTINCT: แถวที่ซ้ำกันจะถูกลบออกจาก VT8 สร้าง VT9 แล้ว
ORDER BY: แถวจาก VT9 เรียงตามรายการคอลัมน์ที่ระบุไว้ในข้อ ORDER BY เคอร์เซอร์ถูกสร้างขึ้น (VC10)
TOP: เลือกจำนวนหรือเปอร์เซ็นต์ของแถวที่ระบุตั้งแต่ต้น VC10 ตาราง VT11 ถูกสร้างและส่งคืนไปยังผู้เรียก
ดังนั้น (เข้าร่วมภายใน) ON จะกรองข้อมูล (จำนวนข้อมูลของ VT จะลดลงที่นี่) ก่อนที่จะใช้ WHERE clause เงื่อนไขการเข้าร่วมที่ตามมาจะถูกดำเนินการกับข้อมูลที่กรองซึ่งปรับปรุงประสิทธิภาพ หลังจากนั้นเฉพาะเงื่อนไข WHERE ที่จะใช้เงื่อนไขตัวกรอง
(การใช้ข้อความสั่งแบบมีเงื่อนไขใน ON / WHERE จะไม่สร้างความแตกต่างมากนักในบางกรณีทั้งนี้ขึ้นอยู่กับจำนวนตารางที่คุณเข้าร่วมและจำนวนแถวที่มีในแต่ละตารางการเข้าร่วม)