تاریخچه ORDER BY در SQL: از محدودیتهای دهه ۸۰ تا استاندارد مدرن
خلاصهٔ کاملتر
کلاز ORDER BY از اون دستوراتیه که همه باهاش کار کردن، ولی خیلیها نمیدونن چقدر در طول زمان تغییر کرده. این مقاله سیر تکامل ORDER BY رو از استاندارد اولیه SQL تا نسخه ISO/IEC 9075-2:2023 دنبال میکنه.
دهه ۸۰: محدودیتهای اولیه
در ابتدا، ORDER BY فقط میتونست به ستونهایی که در SELECT انتخاب شده بودن ارجاع بده، از expressionها پشتیبانی نمیکرد، ترتیب NULLها تعریفنشده بود و فقط در آخرین کلاز یه کوئری مجاز بود. چرا؟ چون در ترتیب منطقی اجرا، ORDER BY بعد از SELECT کار میکنه و فقط به خروجی اون دسترسی داره؛ پس اگه ستونی در SELECT نبود، ORDER BY هم نمیتونست ببینهش.
سه نوع ترتیب در SQL
یه نکته مهم که خیلی از اینفوگرافیکهای رایج بهش اشاره نمیکنن اینه که SQL سه نوع ترتیب داره: ترتیب نحوی (syntax)، ترتیب منطقی اجرا، و ترتیب واقعی اجرا. استاندارد SQL صراحتاً میگه که موتورهای پایگاه داده مجبور نیستن دقیقاً مراحل تعریفشده رو طی کنن؛ کافیه نتیجه یکسان باشه. یعنی توصیه به «فیلتر زودهنگام» برای بهبود پرفورمنس (مثلاً با subquery یا CTE) اشتباهه؛ موتورها این کار رو خودشون انجام میدن — به execution plan اعتماد کنید، نه اینفوگرافیک.
SQL:1999: انقلاب ORDER BY
نسخه ۱۹۹۹ استاندارد تغییرات بزرگی آورد. از اون به بعد ORDER BY میتونه به ستونهای غیرانتخابی هم ارجاع بده. چطور؟ استاندارد بهصورت خودکار اون ستونها رو به SELECT اضافه میکنه و بعد از مرتبسازی حذفشون میکنه. این یه syntactic transformation هست — بازنویسی خودکار کوئری توسط استاندارد. ضمناً expressionهای دلخواه هم در ORDER BY مجاز شدن، هرچند هنوز بعضی موتورها محدودیتهایی دارن:
SELECT a + b AS x
FROM t
ORDER BY COALESCE(x, 0) -- در بعضی سیستمها کار نمیکنهNULLS FIRST/LAST (2003) و ORDER BY در Subqueryها (2008)
در SQL:2003، امکان کنترل مستقیم جایگاه مقادیر NULL اضافه شد: ORDER BY b NULLS FIRST. قبل از این، رفتار NULLها در مرتبسازی به پیادهسازی بستگی داشت. در SQL:2008 هم با معرفی کلاز FETCH FIRST (معادل قدرتمندتر LIMIT)، نیاز به ORDER BY داخل subqueryها به وجود اومد و استاندارد این رو مجاز کرد. امروز ORDER BY در جاهای دیگهای مثل OVER(ORDER BY) برای window functionها، WITHIN GROUP (ORDER BY) و JSON_ARRAYAGG(ORDER BY) هم استفاده میشه.
نکات کلیدی:
- تا قبل از SQL:1999 فقط ستونهای SELECTشده در ORDER BY مجاز بودن
- استاندارد SQL ترتیب واقعی اجرا رو تعریف نمیکنه؛ فقط نتیجه نهایی مهمه
- توصیه به فیلتر زودهنگام با subquery برای پرفورمنس بیمعنیه — موتورها خودشون این کار رو میکنن
- مرجع positional مثل ORDER BY 1 از SQL:1999 به بعد دیگه در استاندارد نیست، ولی هنوز همهجا پشتیبانی میشه
- NULLS FIRST/LAST از SQL:2003 و ORDER BY در subqueryها از SQL:2008 اضافه شدن




