SQL में, जहाँ तक मुझे पता है, लॉजिकल क्वेरी प्रोसेसिंग ऑर्डर, जो कि वैचारिक व्याख्या क्रम है, निम्न तरीके से FROM से शुरू होता है:
- से
- कहाँ पे
- समूह द्वारा
- होने
- चुनते हैं
- द्वारा आदेश
इस सूची के बाद यह देखना आसान है कि आप WHERE क्लॉज में सेलेक्ट अलायस क्यों नहीं रख सकते, क्योंकि उपनाम अभी तक नहीं बनाया गया है। T-SQL (SQL Server) इसका सख्ती से पालन करता है और जब तक आपने SELECT पास नहीं किया है तब तक आप SELECT उपनाम का उपयोग नहीं कर सकते हैं।
लेकिन MySQL में यह संभव है कि सेलेक्ट अलायसेस का उपयोग HAVING क्लॉज में किया जाए, भले ही इसे (तार्किक रूप से) SELECT क्लॉज से पहले संसाधित किया जाए। ऐसा कैसे हो सकता है?
एक उदाहरण देने के लिए:
SELECT YEAR(orderdate), COUNT(*) as Amount
FROM Sales.Orders
GROUP BY YEAR(orderdate)
HAVING Amount>1;
टी-एसक्यूएल में बयान अमान्य है (क्योंकि हवलिंग सेलेक्ट अलियास का जिक्र है 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 ...
। शायद यही कारण है कि वे सिलेक्ट अलायसेस का समर्थन सिर्फ इसलिए करते हैं क्योंकि वे इस तथ्य के कारण कर सकते हैं कि वे उन चीजों का समर्थन नहीं करते हैं जो इसे असंभव बना देंगे ... क्या आप जानते हैं? :)
HAVING
और SELECT
क्लॉज़ के निष्पादन का तार्किक क्रम परस्पर बदला जा सकता है। तो, ऐसा करने में कोई अस्पष्टता नहीं है और जब राक्षसी भाव होते हैं तो कोड के रूप को सरल बना सकते हैं SELECT
।
distincts
के Alias in the Having
बावजूद तेजी से परिणाम (के साथ ) का आनंद ले रहा है Explain
। इसलिए ऑप्टिमाइज़र के साथ कुछ बदलाव हो रहा है।