यह SQL मानक का नियम है (जो बल्कि जटिल है क्योंकि यह बहुत सारे विवरणों में जाता है जिसके बारे में SQL के उपयोगकर्ता शायद नहीं सोचते हैं)।
नियम के पीछे दो सिद्धांत हैं। पहला यह है कि मानक संचालन के क्रम को लागू नहीं करता है, सिवाय जब तार्किक रूप से आवश्यक हो (एक having
उदाहरण के लिए, क्लॉज को group by
. के बाद तार्किक रूप से प्रोसेस करना होता है ) यह SQL पर धारणा का आधार एक वर्णनात्मक है भाषा, जहां परिणाम वर्णित हैं। कोई भी विशेष डेटाबेस इंजन अपने स्वयं के निष्पादन पथ निर्धारित कर सकता है।
दूसरा सिद्धांत अस्पष्टता से बचना है। यह वह जगह है जहां स्कोपिंग नियम आते हैं, जो परिभाषित करते हैं कि SQL कंपाइलर कब जानता है।
निम्नलिखित कथन पर विचार करें:
select a as b, b as a, a + 1 as d
-----------------------^
from t
प्रश्न यह है:कौन सा a
a+1
. करता है देखें, कॉलम a
टेबल या कॉलम में b
(जिसे a
. के रूप में उपनाम दिया गया है ) select
. में . मानक के अनुसार यह स्पष्ट है। select
. में कॉलम उपनाम ज्ञात नहीं हैं खंड जहां उन्हें परिभाषित किया गया है।
यह where
. तक फैला हुआ है खंड भी, जिसका मूल्यांकन उसी दायरे में किया जाता है। उसी उदाहरण पर विचार करें:
select a as b, b as a, a + 1 as d
from t
where a > 100
कौन सा a
करता है where
हालत का संदर्भ लें? मानक असंदिग्ध है। where
खंड select
में स्तंभ उपनामों को नहीं समझता है . ऐसा इसलिए है क्योंकि select
(तार्किक रूप से) का मूल्यांकन where
. के बाद किया जाता है . तो, जब आप कहते हैं:
select row_number() over (order by a) as seqnum
from t
where a > 100
लौटाया गया मान पहले a
. से शुरू होता है बाद 100. एन्यूमरेशन पहले नहीं होता है, फ़िल्टर की गई पंक्तियों को अनुक्रम संख्याएँ मिलती हैं जिन्हें फ़िल्टर किया जाता है।