مرتب سازی سطرها در کوئری های SQL

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

چیزی که در فرمت بالا مشخص است این است که اولا همانند عبارت WHERE استفاده از ORDER BY نیز در دستور SELECT اختیاری است و همچنین عبارت ORDER BY پس از عبارت WHERE می ایدفرض کنید می خواهید فهرست کارمندان را به صورت مرتب شده داشته باشید بنابراین می توانید بر اساس ستون های نام و نام خانوادگی، کارمندان را مرتب سازی کنید. در جدول محصولات که شامل قیمت می شود، می توانیم خروجی را بر اساس از کمترین قیمت تا بیشترین قیمت مرتب کنیم.

بنابراین ابتدا توسط دستور SELECT می توانیم تمامی سطرها را نمایش دهیم و یا اینکه از عبارت WHERE استفاده کنیم تا تنها برخی از سطرها را بر اساس شرایطی در خروجی نشان دهیم و در نهایت می توانیم توسط عبارت ORDER BY بر اساس یک یا چندین ستون از جدول، خروجی را به صورت صعودی یا نزولی مرتب کنیم.

مرتب سازی سطرهای خروجی می تواند به صورت صعودی (Ascending) یا نزولی (Descending) باشد. مطابق با فرمت کلی استفاده از عبارت ORDER BY که در بالا گفته شد، برای تعیین مرتب سازی صعودی سطرها، باید از ASC و برای تعیین مرتب سازی نزولی سطرها، از DESC استفاده شود. اگر هیچ یک از این دو روش در جلوی عبارت ORDER BY نوشته نشود، به صورت پیش مرتب سازی صعودی خواهد بود.

مرتب سازی هر ستون می تواند متفاوت از ستون دیگری باشد. به وطر مثال می توانیم کارمندان را بر اساس نام و نام خانوادگی آنها به صورت نزولی و ستون حقوق را به صورت صعودی (از کمترین حقوق تا بیشترین حقوق) مرتب کنیم.

مثالنام و نام خانوادگی و حقوق و میزان کمسیون تمامی کارمندانی را نشان دهید که یکی از مشاغل SA_MAN یا IT_PROG یا MK_MAN را داشته باشند. سپس خروجی را بر اساس نام خانوادگی مرتب کنید.

گفتیم اگر از ASC یا DESC استفاده نکنیم، مرتب سازی به صورت پیشفرض به صورت صعودی خواهد بود ولی می توانیم صراحتا تعیین کنیم که می خواهیم مرتب سازی به صورت صعودی باشد، پس باید ASC را استفاده کنیم.

همانطور که می بینید ASC جلوی نام ستون قرار می گیرد. ولی اگر بخواهیم مرتب سازی به صورت نزولی باشد، باید از DESC استفاده کنیم. کوئری زیر بازنویسی شده کوئری بالا است که نام های خانوادگی را به صورت نزولی نمایش می دهد.

مثالنام و نام خانوادگی و حقوق و میزان کمسیون تمامی کارمندانی را نشان دهید که یکی از مشاغل SA_MAN یا IT_PROG یا MK_MAN را داشته باشند  سپس خروجی را بر اساس نام خانوادگی به صورت صعودی و بر اساس حقوق به صورت نزولی مرتب کنید.

در کد بالا صراحتا تعیین کرده ایم که می خواهیم ستون last_name به صورت صعودی مرتب شود ولی می توانیم همانند کد زیر از نوشتن ASC برای تعیین کردن مرتب سازی صعوی صرف نظر کنیم.

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

در کد بالا ما همه کارمندان یا به عبارت دیگر تمامی سطرها را می خواهیم پس نیازی به تعیین شرط برای فیلتر کردن سطرها نیست، بنابراین نیازی به نوشتن عبارت WHERE نیز نیست. بنابراین تاکید می کنیم که هر دو عبارت WHERE و ORDER BY اختیاری هستند ولی اگر عبارت WHERE لازم باشد، حتما عبارت ORDER BY پس از آن نوشته می شود. همچنین چون  می خواهیم سطرها به صورت نزولی مرتب شوند باید DESC را در جلوی نام ستون بنویسیم.

مثالفهرست از نام و نام خانوادگی و حقوق سالیانه تمامی کارمندانی را پیدا کنید که شناسه عددی آنها میان ۱۲۰ تا ۱۸۰ باشد و نام خانوادگی آنها با e خاتمه پیدا کند. سپس فهرست خروجی را به صورت نزولی بر اساس حقوق مرتب کنید.

مثالنام خانوادگی، میزان حقوق، تاریخ استخدام و مقدار محاسبه شده  hire_date – (salary/10) تمامی کارمندانی را بدست آورید که شغل آنها SA_REP یا SA_MAN باشد. سپس خروجی را به صورت صعودی و بر اساس مقدار محسابه شده عبارت hire_date – (salary/10) مرتب کنید. توجه کنید که لازم است یک نام مستعار به عبارت محاسباتی فوق اختصاص دهیم.

در کوئری بالا یک نام مستعار به نام emp_value به عبارت اختصاص داده شده است و در نهایت سطرهای خروجی را بر اساس همین نام مستعار مرتب سازی کرده ایم. توجه کنید که اگر از نام مستعار استفاده نمی کردیم مطابق شکل زیر یک ستون همنام با عبارت محاسباتی در خروجی نشان داده می شود که بسیار ناخوانا است و مطابق کوئری زیر محبور هستیم از همین نام در جلوی عبارت ORDER BY استفاده کنیم.

توجه کنید که در کوئری بالا ابتدا عملیات تقسیم داخل پرانتز انجام می شود و سپس حاصل از مقدار hire_date کم خواهد شد.

مثالفهرست از نام و نام خانوادگی و حقوق سالیانه تمامی کارمندانی را پیدا کنید که شناسه عددی آنها میان ۱۲۰ تا ۱۸۰ باشد و نام خانوادگی آنها با e خاتمه پیدا کند. سپس فهرست خروجی را به صورت نزولی بر اساس حقوق مرتب کنید.

مثالنام خانوادگی، میزان حقوق، تاریخ استخدام و مقدار محاسبه شده  hire_date – (salary/10) تمامی کارمندانی را بدست آورید که شغل آنها SA_REP یا SA_MAN باشد. سپس خروجی را به صورت صعودی و بر اساس مقدار محسابه شده عبارت hire_date – (salary/10) مرتب کنید. توجه کنید که لازم است یک نام مستعار به عبارت محاسباتی فوق اختصاص دهیم.

در کوئری بالا یک نام مستعار به نام emp_value به عبارت اختصاص داده شده است و در نهایت سطرهای خروجی را بر اساس همین نام مستعار مرتب سازی کرده ایم. توجه کنید که اگر از نام مستعار استفاده نمی کردیم مطابق شکل زیر یک ستون همنام با عبارت محاسباتی در خروجی نشان داده می شود که بسیار ناخوانا است و مطابق کوئری زیر محبور هستیم از همین نام در جلوی عبارت ORDER BY استفاده کنیم.

توجه کنید که در کوئری بالا ابتدا عملیات تقسیم داخل پرانتز انجام می شود و سپس حاصل از مقدار hire_date کم خواهد شد.

مثالنام و نام خانوادگی و میزان حقوق تمامی کارمندانی را پیدا کنید که شغل آنها SA_MAN است و حرف اول نام آنها A و حرف آخر نام خانوادگی آنها a است. همچنین سطرهای خروجی را بر اساس شناسه کارمند و به صورت صعودی مرتب کنید.

در مورد دستور بالا اول اینکه چون می خواهیم خروجی به صورت صعودی مرتب شود، پس باید یا صراحتا از ASC استفاده کنیم و یا اینکه اگر ASC را ننویسیم، به صورت پیش فرض مرتب سازی به صورت صعودی خواهد بوددوم اینکه از ستونی برای مرتب سازی سطرهای خروجی استفاده کرده ایم که نام آن در میان نام ستون های جلوی دستور SELECT وجود ندارد. به عبارت دیگر اجباری نیست که حتما از نام ستونی استفاده کنیم که نام آن در جلوی دستور SELECT وجود دارد و می توانیم از دیگر ستون های جدول نیز برای مرتب سازی استفاده کنیم. همچنین اگر بخواهیم مرتب سازی به صورت نزولی باشد، پس باید مطابق دستور زیر از DESC استفاده کنیم.

مثال – سطرها را بر اساس شناسه کارمندی و به صورت نزولی مرتب سازی کنید و سپس سطر نخست ر نشان دهید.