ORDER BY چیست؟
با استفاده از کلیدواژه ی ORDER BY می توانیم result-set (نتایج برگشتی از پایگاه داده) خود را به ترتیب صعودی یا نزولی مرتب کنیم.
حالت پیش فرض این کلیدواژه، مرتب سازی به صورت صعودی است اما اگر می خواهید مقادیری را به صورت نزولی مرتب کنید می توانید از کلیدواژه ی DESC استفاده کنید.
ابتدا نگاهی به ساختار کلی (syntax) بیندازید:
|
SELECT column1, column2, ...
FROM table_name
ORDER BY column1, column2, ... ASC|DESC;
|
توجه: قسمت “ASC | DESC” در کد بالا یعنی یا می توانید از ASC استفاده کنید و یا DESC. هیچ گاه همزمان از هر دو استفاده نکنید چرا که منطقی نیست؛ نمی توان نتایج را همزمان به صورت صعودی و نزولی مرتب کرد.
بیایید چند مثال واقعی از این کلیدواژه ببینیم…
مثال ها
قبل از هر کاری، نگاهی به قسمتی از پایگاه داده ی Northwind بیندازید:
ما تمامی مثال ها را روی این جدول پیاده سازی خواهیم کرد.
مثال اول از ORDER BY
به کد زیر دقت کنید:
|
SELECT * FROM Customers
ORDER BY Country;
|
این کد تمام مشتریان را از جدول Customers انتخاب می کند و آن ها را بر اساسِ ستون country مرتب می کند.
سوال: این مرتب سازی به چه ترتیبی خواهد بود؟
پاسخ: همانطور که گفتیم حالت پیش فرض این دستور، ASC (صعودی) است اما در مورد اینکه چطور می خواهد اسم کشور ها را صعودی مرتب کند باید گفت این کار کار را بر اساس ترتیب حروف الفبا در انگلیسی انجام می دهد. با استفاده از لینک زیر به خروجی این کد بروید و به ستون country و CustomerID دقت کنید. بلافاصله متوجه می شوید که ترتیب نمایش مشتریان دیگر بر اساس CustomerID نیست بلکه اولین ردیف برگردانده شده دارای CustomerID = 12 و دومین ردیف دارای CustomerID = 54 است.
برای مشاهده ی نتیجه ی کد بالا روی این لینک کلیک کنید.
نکته: از آن جایی که حالت پیش فرضِ ORDER BY صعودی (ASC) است، دیگر نیازی به نوشتن این مورد نیست. در واقع اگر دستور ASC را به کد بالا اضافه کنید هیچ تغییری مشاهده نمی کنید و خطایی نیز رخ نمی دهد اما زیاده نویسی کرده اید.
مثال دوم از ORDER BY DESC
به کد زیر توجه کنید:
|
SELECT * FROM Customers
ORDER BY Country DESC;
|
این کد، دقیقا مانند کد قبل، تمام مشتریان را از جدول Customers انتخاب می کند و آن ها را بر اساسِ ستون country مرتب می کند اما فرق کوچکی با آن دارد. فرقشان در این است که این دستور نتایج را به صورت نزولی (DESC) مرتب می کند.
برای مشاهده ی نتیجه ی کد بالا روی این لینک کلیک کنید.
مثال سوم از ORDER BY به صورت چند ستونی
بله می توان از ORDER BY به صورت چند ستونی نیز استفاده کرد:
|
SELECT * FROM Customers
ORDER BY Country, CustomerName;
|
این کد، دقیقا مانند دو کد قبلی، تمام مشتریان را از جدول Customers انتخاب می کند و آن ها را بر اساسِ ستون country و CustomerName مرتب می کند. این به چه معنی است؟ اگر هنگام استفاده از ORDER BY به آن دو ستون یا بیشتر بدهید رفتارش به شکل زیر می شود:
- دریافت تمام مشتریان از جدولِ پایگاه داده طبق دستور SQL
- مرتب کردن تمام result set ها (نتایج) بر اساس نام کشور (ستون country در جدولِ پایگاه داده)
- اگر چند مشتری از یک کشور باشند، ستون country یکسان خواهد شد (به طور مثال سه نفر از Germany).
- اگر چنین حالتی اتفاق افتاد، آن چند مشتری بر اساس CustomerName مرتب می شوند.
برای مشاهده ی نتیجه ی کد بالا روی این لینک کلیک کنید.
نکته: شما می توانید در چنین حالتی از دستورات ASC و DESC نیز استفاده کنید:
|
SELECT * FROM Customers
ORDER BY Country ASC, CustomerName DESC;
|
چند لحظه فکر کنید و سعی کنید خودتان به این جواب برسید که در جواب این کد چه نتیجه ای به ما نشان داده خواهد شد.
رفتار این کد به شکل زیر خواهد بود:
- دریافت تمام مشتریان از جدولِ پایگاه داده طبق دستور SQL
- مرتب کردن تمام result set ها (نتایج) بر اساس نام کشور (ستون country در جدولِ پایگاه داده) و به صورت صعودی (ASC).
- اگر چند مشتری از یک کشور باشند، ستون country یکسان خواهد شد (به طور مثال سه نفر از Germany).
- اگر چنین حالتی اتفاق افتاد، آن چند مشتری بر اساس CustomerName و به صورت نزولی (DESC) مرتب می شوند.
برای مشاهده ی نتیجه ی کد بالا روی این لینک کلیک کنید.
به تفاوت این کد و کد قبلی خوب توجه کنید:
کد اول: ORDER BY ASC
کد دوم: ORDER BY DESC
آیا متوجه تفاوت شدید؟ دو تصویر بالا، دارای 3 ردیف اول (همان 3 مشتری اول) از result set های کد های ما هستند. هر دو کدِ ما آن ها را در ابتدا بر اساس country مرتب کرده اند (حرف A اولین حرف الفبا در زبان انگلیسی است بنابراین این نتایج در ردیف های اول قرار گرفته اند). حالا برای مرتب کردن خودشان باید بر اساس CustomerName حرکت کرد اما صعودی یا نزولی؟ کد اول صعودی و کد دوم نزولی عمل کرده است (ما اینطور کد نوشته ایم) بنابراین نتایج آن ها دقیقا برعکس هستند. برای مقایسه ی CustomerName به این شکل عمل می شود:
- حرف اول از نامِ مشتریان گرفته می شود. به طور مثال، حرفِ اول آقا/خانم Rancho grande، حرفِ R است که هجدهمین حرف الفبای انگلیسی است. بعد از آن حرف اول نام Océano Atlántico Ltda و Cactus Comidas para llevar گرفته می شود که به ترتیب O (حرف پانزدهم الفبا) و C (حرف سوم الفبا) است.
- شماره ی حرف الفبا مقایسه می شود.
- نتایج ما بر اساس صعودی یا نزولی بودنِ دستور و شماره ی حروف الفبایشان مرتب می شوند.
سوال: اگر حرف های اول نام مشتریان یکی بود چطور؟ مثلا نام یکی Jack و نام دیگری Joe باشد.
پاسخ: در این صورت حرف اول رها شده و به سراغ حرف دوم می رویم. در این مثال Jack و Joe را داریم که حرف اولشان یکسان است اما حرف دومشان خیر. از آن جایی که a زودتر از o می آید، Jack قبل از Joe قرار می گیرد مگر آنکه ترتیب را نزولی بگذاریم. اگر حرف دومشان نیز یکی باشد، به سراغ حرف سوم می رویم و همینطور الی آخر.
خلاصه ی مقاله
در این قسمت با کلیدواژه ی ORDER BY برای مرتب سازی result set ها (نتایج برگشتی از پایگاه داده پس از اجرای کوئری) آشنا شدیم و نکات کلیدی و ریز پیرامون آن را با ذکر مثال توضیح دادیم. امیدوارم از این قسمت لذت برده باشید.
منبع: سایت روکسو