العبارة ORDER BY
تتلخص مهمة عبارة 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 |
نعم | نعم | نعم | نعم | نعم |