العبارة ORDER BY

من موسوعة حسوب
< SQL

تتلخص مهمة عبارة ORDER BY بترتيب النتائج (تصاعديًا أو تنازليًا) ضمن استعلام SELECT وفق عمودٍ (أو أكثر) من الجدول.

تحديد نمط الترتيب التصاعدي أو التنازلي

تُستخدم الكلمتان المفتاحيتان ASC و DESC لتحديد نمط الترتيب التصاعدي ASC والتنازلي DESC بعدّ الترتيب التصاعدي الحالة الافتراضية للعبارة.

ليكن الجدول rivers الآتي موجودًا في قاعدة البيانات:

Continent Outflow LengthMiles LengthKm River Serial
South America Atlantic Ocean 4345 6992 Amazon 1
Africa Mediterranean 4258 6853 Nile 2
North America Gulf of Mexico 3902 6275 Mississippi 3
Asia Bohai Sea 3395 5464 Yellow River 4
Africa Atlantic Ocean 2922 4700 Congo 5
Asia Laptev Sea 2736 4400 Lena 6
Africa Gulf of Guinea 2611 4200 Niger 7
Europe Caspian Sea 2266 3645 Volga 8
Asia Andaman Sea 1901 3060 Salween 9

لدى تنفيذ الاستعلام الآتي:

SELECT *
FROM rivers
ORDER BY Serial DESC;

ستظهر السجلات مرتبة ترتيبًا تنازليًا وفق العمود Serial، أي سيظهر الجدول بترتيب عكسي:

Continent Outflow LengthMiles LengthKm River Serial
Asia Andaman Sea 1901 3060 Salween 9
Europe Caspian Sea 2266 3645 Volga 8
Africa Gulf of Guinea 2611 4200 Niger 7
Asia Laptev Sea 2736 4400 Lena 6
Africa Atlantic Ocean 2922 4700 Congo 5
Asia Bohai Sea 3395 5464 Yellow River 4
North America Gulf of Mexico 3902 6275 Mississippi 3
Africa Mediterranean 4258 6853 Nile 2
South America Atlantic Ocean 4345 6992 Amazon 1

ولا يشترط وجود العمود المذكور في عبارة ORDER BY ضمن قائمة الأعمدة المذكورة في SELECT، أي أن الاستعلام الآتي صحيح أيضًا (لا يُعرض عمود Serial في النتائج):

SELECT River, LengthKm, LengthMiles, Outflow, Continent
FROM rivers
ORDER BY Serial DESC;

ويُمكن استخدام التسمية البديلة (alias) في عبارة ORDER BY كما في الاستعلام الآتي (الذي نتيجته تماثل نتيجة الاستعلام الأول):

SELECT Serial AS sortingCol, River, LengthKm, LengthMiles, Outflow, Continent
FROM rivers
ORDER BY sortingCol DESC;

الترتيب وفق أكثر من عمود

عند وجود أكثر من عمود في عبارة ORDER BY تُرتَّب النتائج وفقًا للعمود المذكور أولًأ ثم تُرتب السجلات الناتجة عن الترتيب السابق وفقًا للعمود الثاني وهكذا.

الاستعلام الآتي يُرتب الجدول وفقًا لعمود القارة ترتيبًا هجائيًا تصاعديًا (لا يُشترَط ذكر الكلمة المفتاحية ASC) ومن ثم ترتيبًا تنازليًا وفقًا لعمود الطول المقدر بالكيلومتر:

SELECT River, LengthKm, Continent
FROM rivers
ORDER BY Continent ASC, LengthKm DESC;

وتظهر النتائج الآتية:

Continent LengthKm River
Africa 6853 Nile
Africa 4700 Congo
Africa 4200 Niger
Asia 5464 Yellow River
Asia 4400 Lena
Asia 3060 Salween
Europe 3645 Volga
North America 6275 Mississippi
South America 6992 Amazon

الترتيب الشرطي

يمكن تحديد الترتيب ضمن عبارة ORDER BY وفقًا لشرط محدد وذلك باستخدام الكلمات المفتاحية CASE و WHEN و THEN و END والتي تعبر عن الشرط CASE المعروف في لغات البرمجة.

لترتيب السجلات وفقًا لأطوالها في قارة Africa ووفقًا لأسمائها في القارات البقية، يُنفذ الاستعلام الآتي:

SELECT * 
FROM rivers 
ORDER BY 
  CASE Country 
  WHEN 'Africa' THEN length 
  ELSE Name 
  END;

والذي يفحص القيمة الموجودة في حقل Country للسجل، فإن كانت Africa فترتب بحسب الترتيب التصاعدي للطول أما في الحالات الأخرى فستُرتب ترتيبًا هجائيًا تصاعديًا حسب اسم القارة، إذ إن الكلمات المفتاحية السابقة لها الصيغة التالية:

CASE field_name 
WHEN value THEN expression 
ELSE expression
END

وستظهر النتائج الآتية:

Continent LengthKm River
Africa 4200 Niger
Africa 4700 Congo
Africa 6853 Nile
Asia 4400 Lena
Asia 3060 Salween
Asia 5464 Yellow River
Europe 3645 Volga
North America 6275 Mississippi
South America 6992 Amazon

مثال ثانٍ

إن كان الجدول الآتي (patients) موجودًا في قاعدة البيانات:

Doctor Section Age Patient PatientID
Nasser Cardiology 76 Salem 1029
Abd Allah Neurology 17 Hasan 896
Reem Maternity 23 Nadine 964
Fateh Cardiology 65 Rami 1070
Kareem Neurology 19 Abd al-Rahim 1150
Hadi Critical Care 65 Roushd 1097
Reem Maternity 27 Sana 1034
Abd Allah Neurology 49 Helen 963
Hadi Critical Care 58 Ahmad 1154
Kareem Neurology 40 Maher 1069
Amnah Maternity 30 Zeina 1028

الاستعلام الآتي يرتب السجلات ترتيبًا تصاعديًا بحسب العمر إن كان القسم Cardiology وبحسب الاسم إن كان القسم Neurology وبحسب الرقم التسلسلي فيما تبقى من حالات:  

SELECT * 
FROM patients 
ORDER BY 
  CASE Section 
  WHEN 'Cardiology' THEN Age 
  WHEN 'Neurology' THEN Name 
  ELSE PatientID 
  END;

وتظهر النتائج الآتية:

Doctor Section Age Patient PatientID
Fateh Cardiology 65 Rami 1070
Nasser Cardiology 76 Salem 1029
Kareem Neurology 19 Abd al-Rahim 1150
Abd Allah Neurology 17 Hasan 896
Abd Allah Neurology 49 Helen 963
Kareem Neurology 40 Maher 1069
Reem Maternity 23 Nadine 964
Amnah Maternity 30 Zeina 1028
Reem Maternity 27 Sana 1034
Hadi Critical Care 65 Roushd 1097
Hadi Critical Care 58 Ahmad 1154

ترتيب نتائج الربط

يمكن ترتيب نتائج الربط ما بين جدولين أو جزئين من جدول عبر معاملات الربط UNION أو EXCEPT أو INTERSECT وذلك بذكر العمود الذي سترتب النتائج وفقًا له عند عبارة ORDER BY.

لترتيب الأنهار الواقعة في قارتي آسيا وإفريقيا فقط بحسب أطوالها ترتيبًا تنازليًا، يُنفذ الاستعلام الآتي:

SELECT River, LengthKm, Continent 
FROM rivers 
WHERE Continent = Asia
UNION ALL
SELECT River, LengthKm, Continent 
FROM rivers 
WHERE Continent = Africa
ORDER BY LengthKm;

وتكون النتيجة:

Continent LengthKm River
Africa 6853 Nile
Asia 5464 Yellow River
Africa 4700 Congo
Asia 4400 Lena
Africa 4200 Niger
Asia 3060 Salween

التوافقية

SQLServer SQLite Oracle PostgreSQL MySQL
نعم نعم نعم نعم نعم

مصادر