ใน SQL เท่าที่ฉันรู้ลำดับการประมวลผลแบบสอบถามตรรกะซึ่งเป็นลำดับการตีความแนวคิดเริ่มต้นด้วย FROM ด้วยวิธีดังต่อไปนี้:
- จาก
- WHERE
- จัดกลุ่มตาม
- การมี
- เลือก
- สั่งโดย
การติดตามรายการนี้เป็นเรื่องง่ายที่จะดูว่าทำไมคุณไม่สามารถเลือกชื่อแทนในส่วนคำสั่ง WHERE เนื่องจากยังไม่ได้สร้างชื่อแทน T-SQL (SQL Server) ทำตามสิ่งนี้อย่างเคร่งครัดและคุณไม่สามารถใช้นามแฝง SELECT ได้จนกว่าคุณจะผ่าน SELECT
แต่ใน MySQL มันเป็นไปได้ที่จะใช้นามแฝง SELECT ในส่วนคำสั่ง HAVING แม้ว่ามันควรจะดำเนินการก่อน สิ่งนี้จะเป็นไปได้อย่างไร
เพื่อให้ตัวอย่าง:
SELECT YEAR(orderdate), COUNT(*) as Amount
FROM Sales.Orders
GROUP BY YEAR(orderdate)
HAVING Amount>1;
คำสั่งไม่ถูกต้องใน T-SQL (เนื่องจาก HAVING อ้างถึงนามแฝง SELECT Amount
) ...
Msg 207, Level 16, State 1, Line 5
Invalid column name 'Amount'.
... แต่ใช้งานได้ดีใน MySQL
จากสิ่งนี้ฉันสงสัยว่า:
- MySQL ใช้ช็อตคัตในกฎ SQL เพื่อช่วยผู้ใช้หรือไม่? อาจใช้การวิเคราะห์ล่วงหน้าบ้างไหม?
- หรือว่า MySQL ใช้ลำดับการตีความแนวความคิดที่แตกต่างจากที่ฉันคิดว่า RDBMS ทั้งหมดกำลังติดตามอยู่?
SELECT C, ROW_NUMBER() OVER (ORDER BY X) AS RN FROM T GROUP BY C HAVING RN = 1
จะเป็นปัญหาในขณะที่ROW_NUMBER
วิ่งหลังจากHAVING
SELECT @rownum:=@rownum + 1 as row ...
. บางทีเหตุผลที่พวกเขาสนับสนุนนามแฝง SELECT นั้นเป็นเพราะพวกเขาทำได้เพราะพวกเขาไม่สนับสนุนสิ่งที่จะทำให้มันเป็นไปไม่ได้ ... ใครจะไปรู้? :)
HAVING
และSELECT
ประโยคที่สามารถแลกเปลี่ยน SELECT
ดังนั้นมีความคลุมเครือในการทำเช่นนี้ไม่ได้และสามารถลดความซับซ้อนลักษณะของรหัสเมื่อมีการแสดงออกในมหึมา