عملگر ORDER BY در MySQL

69

0

عملگر ORDER By

این پست بخشی از مسیر متخصص MySQL است. اگر به این مسیر علاقه مندید اینجا کلیک کنید.

در ادامه ی مسیر یادگیری MySQL شاید براتون سوال شده باشه که وقتی پرس وجویی انجام میدیم MySQL بر چه اساسی این اطلاعات رو نمایش میده و چه ترتیبی برای به نمایش گذاشتن داده ها در نظر گرفته؟ در دیتابیس با عملگر ORDER BY در MySQL  به این مورد پاسخ خواهیم داد.

قبل اینکه به این بحث برسیم لازم در مورد کلید اصلی صحبت کنیم.

 

عملگر ORDER BY در MySQL

برای هر موجودیتی که در نظر میگیریم باید حتما یک ویژگی در نظر بگیریم که نسبت به سایر ویژگی های دیگه منحصر به فرد باشه. مثلا اگه دانشجویان یک دانشگاه رو در نظر بگیرید هر شخصی دارای یک شماره دانشجویی هست که مختص به اون، منحصر به فرد هست. در پایگاه داده هم برای هر موجودیت یک ویژگی منحصر به فرد وجود داره که به اون میگن کلید اصلی  و اطلاعات بر اساس این کلید های اصلی مرتب میشوند.

اما خب ما میتونیم با استفاده از کلمه ی کلیدی order by ترتیب آن ها رو عوض کنیم.

برای این کار لازم است اول تصمیم بگیریم که بر اساس کدوم یکی از ستون ها میخواهیم ترتیب صورت بگیره که باید بعد از ORDER BY اسم ستون رو بیاریم.

برای مثال به جدول زیر نگاه کنید:

مثال اول
عملگر ORDER BY در MySQL

این جدول در حال حاضر براساس کلید اصلی مرتب شده.که کلید اصلی در ستون اول به نام CodeNazer مشخص شده است همینطور که دارید میبینید هیچ دو داده ای وجود نداره که کلید اصلی یکسانی داشته باشه.

حال فرض کنید از شما خواسته شده این جدول رو بر اساس نام مرتب کنید.

به کد زیر توجه کنید:

SELECT * 
FROM Nazer
ORDER BY name

با توجه به اینکه نام ها بر اساس حروف الفبا مرتب میشن انتظار داریم در جدول خروجی اولین داده با حرف “A” شروع شده باشه. خب حالا من از کوئری رو اجرا میکنم با ببینیم خروجی به شکل خواهد بود:

خروجی مثال اول

همونطور که انتظار داشتیم نام “Ahmad” اولین نام در جدول خروجی بود و در ادامه اسامی بر اساس حروف الفبا مرتب شدن.

اما اگه لازم باشه بر اساس حروف الفبا اما از آخر به اول مرتب بشه چی؟

در اینجا لازم که از کلمه ی DESC  استفاده کنیم.

کلمه ی کلیدی DESC چهار حرف اول کلمه ی DESCENDING هست به معنی نزولی.

من عبارت کلیدی DESC رو به آخر کد بالا اضافه میکنم و دوباره اجرا میکنم تا خروجی رو ببینیم.

SELECT * 
FROM Nazer
ORDER BY name DESC

خروجی:

مرتب کردن داده‌ها بصورت کاهشی

در جدول بالا میبینید که اسامی براساس حروف الفبا به صورت نزولی مرتب شدند.

در جدول ناظر ما از یک داده با دونام یکسان داریم. یعنی اسامی رضا و محمد دوبار تکرار شده اند اما برای مرتب سازی چون اولیت دومی در نظر نگرفتیم به صورت خودکار براساس کلمه ی کلیدی مرتب کرده است یعنی داده ای که مقدار کدناظر کمتری داشته باشد در بالاتر قرار میگیرد.

حالا میخواهیم اولویت دومی برای مرتب سازی در نظر بگیریم و بگوییم اگر دو نام یکسان مشاهده شد در گام دوم بر اساس کد ملی مرتب سازی رو ادامه بدید.

برای این کار باید ستونی که در اولویت دوم ما قرار دارد رو بعد از اولویت اول بنویسیم

کد:

SELECT * 
FROM Nazer
ORDER BY name , CodeMelli

شما میتویند به تعداد ویژگی هایی(ستون ها) که برای موجودیت ها تعریف شده اولویت قرار بدید. اما من به همین دو اولویت اکتفا میکنم. کد بالا رو اجرا میکنم تا خروجی رو ببینیم:

خروجی MySQL

استفاده ازDESC برای دو اولویت:

ما میتونیم برای اولویت ها شرط نزولی با صعودی بودن رو هم اعمال کنیم.

این قابلیت هست که به جای کلمه ی DESC از ASC(Ascending) برای اعمال صعودی کردن مرتب سازی  استفاده کنیم اما ضرورتی برای اینکار نیست چون اگر ننویسیم باز هم به صورت صعودی مرتب میشه.

مثلا فرض کنید میخواهیم جدول خروجی بر اساس نام به صورت صعودی و کد ملی بر اساس نزولی نمایش داده شود.

کد:

SELECT *
FROM Nazer
ORDER BY name ASC , CodeMelli DESC

باید یادتون باشه که هر ویژگی که زودتر بیاد از اولویت بالاتری برخورداره.

خروجی:

دو الویت

تا الان درباره ی نمایش تمام ستون ها صحبت میکردیم حالا میخواهیم تنها یک ستون نمایش داده بشه ولی مرتب سازی بر اساس ویژگی دیگری باشد.

برای این کار باید ستون هایی که میخواهیم در خورجی نمایش داده شوند رو بنویسیم و در قسمت شرط برای اولویت دهی ویژگی مورد نظر خودمون رو بنویسیم.

کد:

SELECT  CodeMelli
FROM Nazer
ORDER BY name 

ممکن است این کار در DBMSهای دیگه خطا بده و کوئری اجرا نشه. اما در MySQL مشکلی نخواهیم داشت.

خروجی:

همونطور که میبیند تنها ستون CodeMelli در خروجی نمایش داده شده است اما مرتب سازی بر اساس نام صورت گرفته.

مهندس طهماس زاده

مهندس نرم افزار

1سال در کنار تاتژن

اشتراک
اطلاع از
guest
0 Comments
Inline Feedbacks
View all comments
ارسال تیکت
0
Would love your thoughts, please comment.x
()
x