تحديد عدد السجلات في استعلامات SQL
يمكن تحديد عدد السجلات التي ستُجلب من الجدول ضمن استعلام 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 |