تحديد عدد السجلات في استعلامات SQL

من موسوعة حسوب
< SQL
مراجعة 15:43، 28 يناير 2018 بواسطة عبد اللطيف ايمش (نقاش | مساهمات) (استبدال النص - '\[\[تصنيف:(.*)\]\]' ب'{{SUBPAGENAME}}')

يمكن تحديد عدد السجلات التي ستُجلب من الجدول ضمن استعلام SELECT أو التي ستُحذف من الجدول ضمن استعلام DELETE أو ستُحدَّث قيمها ضمن استعلام UPDATE، ولكن تختلف محركات قواعد البيانات فيما بينها بالصياغة العامة للاستعلام، وسيُذكر ذلك تباعًا.

تحديد عدد سجلات النتائج

يكون للاستعلام البنية العامة الآتية في محرك SQL Server، والتي تعتمد على الكلمة المفتاحية TOP:

SELECT TOP number | percent column_name(s)
FROM table_name
WHERE condition;

إذ يُعبّر المتحول number عن عدد السجلات المطلوبة، وتُعبّر الكلمة المفتاحية percent عن نسبة السجلات المئوية التي نريد عرضها (أي يُمكن جلب نسبة محددة من عدد السجلات الإجمالي). ويكون للاستعلام البنية العامة الآتية في محركات PostgreSQL و SQLite و MySQL، والتي تعتمد على الكلمة المفتاحية LIMIT:

SELECT column_name(s)
FROM table_name
WHERE condition
LIMIT number;

ويمكن استخدام العبارة المفتاحية  FETCH FIRST number ROWS ONLY في محرك PostgreSQL بدلًا من LIMIT، إذ يُعبِّر المتحول number عن عدد السجلات المطلوبة، أما في محرك Oracle، فيكون للاستعلام البنية العامة الآتية، والتي تعتمد على الكلمة المفتاحية ROWNUM:

SELECT column_name(s)
FROM table_name
WHERE ROWNUM <= number;

إذ يُعبّر المتحول number عن عدد السجلات المطلوبة.

أمثلة

يُراد الحصول على السجلات الخمس الأولى المحققة لشرط العمر أكبر من 25 سنة من الجدول الآتي (باسم 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
Fateh Cardiology 55 Sarah 1180
Hadi Critical Care 23 Fadi 1076
Abd Allah Neurology 36 Naim 987
Fateh Cardiology 70 Batoul 1156
Amnah Maternity 24 Rahaf 1181
Nasser Cardiology 66 Aya 808
Fateh Cardiology 30 Raghad 1256
Amnah Maternity 17 Mona 1161
Nasser Cardiology 50 Sami 809

فيكون الاستعلام المطلوب تنفيذه هو (بحسب المحركات المختلفة):

في محرك SQL Server:

SELECT TOP 3 * 
FROM patients
WHERE Age>25;

أو بالاستفادة من النسبة المئوية (5 مرضى من أصل 20 مريضًا تعادل نسبة 25%):

SELECT TOP 25 PERCENT * 
FROM patients
WHERE Age>25;

في محركات PostgreSQL و SQLite و MySQL:

SELECT * 
FROM patients
WHERE Age>25
LIMIT 5;

في محرك Oracle:

SELECT * 
FROM patients
WHERE Age>25 AND ROWNUM <= 5;

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

Doctor Section Age Patient PatientID
Nasser Cardiology 76 Salem 1029
Fateh Cardiology 65 Rami 1070
Hadi Critical Care 65 Roushd 1097
Reem Maternity 27 Sana 1034
Abd Allah Neurology 49 Helen 963

حذف عدد محدد من السجلات

تكون للاستعلام البنية العامة الآتية في محرك SQL Server:

DELETE TOP number FROM table_name;

أما في محركات PostgreSQL و SQLite و MySQL، فتكون البنية العامة له كما يلي:

DELETE FROM table_name
LIMIT number;

مثال

لحذف المرضى الخمسة الأكبر سنًا من جدول المرضى patients السابق، يُستخدَم الاستعلام الآتي في محرك SQL Server:

DELETE TOP 5 FROM patients
ORDER BY age DESC;

في محركات PostgreSQL و SQLite و MySQL:

DELETE FROM patients
ORDER BY age DESC
LIMIT 5;

الحصول على عدد نتائج محدد مع الإزاحة

تستخدم الإزاحة مع العبارة ORDER BY وذلك لاستبعاد عددٍ مُحدّدٍ من النتائج الأولى في الجدول.

مثال

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

Colour Price Year Company Model CarID
White 22,500 2018 KIA Optima 05081
Red 25,995 2017 KIA Optima Hybrid 05082
Red 31,900 2018 KIA Stinger 05083
Black 31,990 2017 KIA Cadenza 05084
Blue 23,240 2018 KIA Niro 05085
Grey 14,200 2018 KIA Rio 5-Door 05086
Blue 18,200 2018 KIA Forte5 05087
Blue 32,250 2017 KIA Soul EV 05088

للحصول على السيارات ذات الثمن الأعلى بدءًا من الرابعة حتى الأقل ثمنًا، يصبح الاستعلام بالشكل الآتي:

SELECT *
FROM cars
ORDER BY Price DESC
OFFSET 3 ROWS;

لتظهر النتائج بالشكل:

Colour Price Year Company Model CarID
Red 25,995 2017 KIA Optima Hybrid 05082
Blue 23,240 2018 KIA Niro 05085
White 22,500 2018 KIA Optima 05081
Blue 18,200 2018 KIA Forte5 05087
Grey 14,200 2018 KIA Rio 5-Door 05086

مصادر