Programming Basics SQL HTML CSS JavaScript React Python C++ Java JavaFX Swing Problem Solving English English Conversations Computer Fundamentals Linux Learn Typing

SQLتحديد عدد الأسطر الأقصى التي يمكن أن يتم جلبها

  • أهمية تحديد عدد الأسطر
  • طريقة تحديد عدد الأسطر
  • تجهيز قاعدة البيانات التي سنطبق عليها
  • أمثلة حول ترتيب البيانات التي يتم جلبها

أهمية تحديد عدد الأسطر

من المهم جداً أن تضع حد أقصى لنتيجة الإستعلام إذا كان من المحتمل أن يرجع أكثر من سطر و ذلك للأسباب التالية.


1- أداء أفضل

وضع حد أقصى للنتائج من شأنه تحسين الأداء. إذا كان الإستعلام سيرجع عدد كبير من الأسطر فإنه سيستهلك الكثير من مصادر النظام (الذاكرة والمعالج) مما يؤدي إلى إبطاء عمل خادم قاعدة البيانات. إذاً تحديد النتائج، يقلل كمية البيانات التي يجب معالجتها و نقلها مما يؤدي إلى تسريع مدة تنفيذ الإستعلام.


2- كفاءة الموارد

النتائج الكبيرة تستهلك مساحة كبيرة من الذاكرة و كذلك الشبكة التي ستمر البيانات من خلالها. من خلال تحديد عدد الأسطر التي سترجه، فإنك تحرر هذه المصادر لمهمات أخرى و تحسن أداء خادم قاعدة البيانات.


3- تجربة مستخدم أفضل

المستخدم بشكل عام لا يحب أن يتفاعل مع عدد ضخم من النتائج. وضع حد أقصى للنتائج يضمن أن يتلقى المستخدم البيانات بشكل جيد و مفيد له، مما يحسن تجربة المستخدم. فمثلاً يفضل المستخدم أن يرى 10 مقالات جديدة في كل مرة يختار رؤية المزيد.


4- مزيد من الأمان

يمكن أن يساعد تحديد النتائج في منع تسرب البيانات و حماية المعلومات الحساسة حيث أنه في حال قيام الاستعلام عن طريق الخطأ باسترداد عدد كبير جداً من الأسطر فإنه قد يعرض البيانات لمستخدمين غير مصرح لهم رؤيتها.


5- قابلية التوسع

عندما يزداد عدد مستخدمي التطبيق فإن عدد الإتصالات المتزامنة إلى قاعدة البيانات ستزداد معهم، عندها يصبح الحد من نتائج الإستعلام مهم جداً للحفاظ على أداء النظام. بدون وضع حدود للنتائج، يمكن أن تصبح قاعدة البيانات مكتظة بالطلبات.


تحديد عدد النتائج هو أمر أساسي في أي مشروع، فمثلاً في قسم المقالات لاحظ أننا نعرض 10 مقالات فقط في كل صفحة لأنه لو كنا سنعرض جميع المقالات في كل مرة لأدى ذلك لضغط هائل على خادم قاعدة البيانات. أيضاً في حال بحثت في جوجل، يوتيوب، فيسبوك و في أي موقع آخر ستلاحظ دائماً أنهم يرجعوا لك عدد محدد من النتائج في كل مرة و ليس جميعها.

طريقة تحديد عدد الأسطر

طريقة تحديد عدد الأسطر الأقصى التي يمكن أن يرجعها الإستعلام تختلف من قاعدة بيانات لأخرى كما يلي:

  • في قواعد بيانات MySQL و SQLite نستخدم الجملة LIMIT.
  • في قواعد بيانات SQL Server و Access نستخدم الجملة TOP.
  • في قواعد بيانات Oracle نستخدم الجملة ROWNUM أو أسلوب FETCH FIRST n ROWS ONLY

في هذه الدورة سنعتمد تحديد النتائج بأسلوب قواعد بيانات MySQL.


طريقة تحديد عدد النتائج في MySQL

في قواعد بيانات MySQL نستخدم الجملة LIMIT في نهاية الأمر SELECT لتحديد عدد النتائج الأقصى التي قد ترجع على النحو التالي.

SELECT column1, column2, ...
FROM table_name
WHERE condition
LIMIT [offset,] row_count;
  • مكان الكلمة offset يمكن وضع عدد الأسطر المراد تجاوزها.
  • مكان الكلمة row_count يجب وضع عدد الأسطر الأقصى التي يمكن أن تحتويها النتيجة.

تجهيز قاعدة البيانات التي سنطبق عليها

قم بتنفيذ الإستعلام التالي حتى تنشئ قاعدة بيانات جديدة إسمها harmash و تنشئ فيها جدول إسمه employees يحتوي على بيانات 10 موظفين.

مثال

-- سيتم حذفها harmash في حال كان يوجد بالأساس قاعدة بيانات إسمها
DROP DATABASE IF EXISTS harmash;

-- harmash هنا قمنا بإنشاء قاعدة بيانات جديدة إسمها
CREATE DATABASE harmash;

-- harmash هنا قمنا بتحديد أن أي إستعلام جديد سيتم تنفيذه على قاعدة البيانات
USE harmash;

-- يتألف من 6 أعمدة employees هنا قمنا بإنشاء جدول جديد إسمه
-- لأننا قمنا بتحديدها قبل إستدعاء هذا الأمر harmash سيتم إنشاء هذا الجدول بداخل قاعدة البيانات
CREATE TABLE employees (
    id         INT NOT NULL PRIMARY KEY AUTO_INCREMENT,
    first_name VARCHAR(50),
    last_name  VARCHAR(20),
    is_married BOOLEAN,
    salary     DECIMAL(7,2),
    birthday   Date
);

-- هنا قمنا بإضافة 10 أسطر في الجدول, أي أضفنا معلومات 10 موظفين
-- لاحظ أننا لم نحدد أسماء الأعمدة التي سنضع فيها البيانات لأننا قمنا بملئ جميع المعلومات
-- في البداية هو حتى يكون عدد القيم الموضوعة يساوي عدد أعمدة الجدول null سبب وضع الكلمة
-- ستقوم قاعدة البيانات بوضع رقم تعرفة مختلف لكل سطر null مكان الكلمة
INSERT INTO employees VALUES (null, "Ahmad", "Alhazem", false, 800, "1990-10-23");
INSERT INTO employees VALUES (null, "Rami", "Algharib", false, 750, "1992-05-08");
INSERT INTO employees VALUES (null, "Said", "Alnaja", true, 900, "1988-07-12");
INSERT INTO employees VALUES (null, "Noura", "Jamali", false, 845, "1994-12-04");
INSERT INTO employees VALUES (null, "Amani", "Sarrouf", true, 1000, "1991-10-27");
INSERT INTO employees VALUES (null, "Mhamad", "Harmush", false, 700, "1993-11-12");
INSERT INTO employees VALUES (null, "Ahmad", "Asaadi", true, 850, "1995-03-10");
INSERT INTO employees VALUES (null, "Mostafa", "Shawki", true, 920, "1990-02-14");
INSERT INTO employees VALUES (null, "Jana", "Alkassem", false, 780, "1991-08-12");
INSERT INTO employees VALUES (null, "Houssam", "Zahrani", true, 880, "1985-09-20");

بعد تنفيذ الإستعلام السابق في phpMyAdmin سيتم إنشاء قاعدة البيانات harmash و إنشاء الجدول employees بداخلها.
قم بالنقر على إسم قاعدة البيانات harmash من القائمة اليسرى حتى تبدأ بالتعامل معها و تطبيق ما ستتعلمه في هذا الدرس.


فيما يلي البيانات التي قمنا بإضافتها بشكل إفتراضي في الجدول employees.

id first_name last_name is_married salary birthday
1 Ahmad Alhazem 0 800.00 1990-10-23
2 Rami Algharib 0 750.00 1992-05-08
3 Said Alnaja 1 900.00 1988-07-12
4 Noura Jamali 0 845.00 1994-12-04
5 Amani Sarrouf 1 1000.00 1991-10-27
6 Mhamad Harmush 0 700.00 1993-11-12
7 Ahmad Asaadi 1 850.00 1995-03-10
8 Mostafa Shawki 1 920.00 1990-02-14
9 Jana Alkassem 0 780.00 1991-08-12
10 Houssam Zahrani 1 880.00 1985-09-20

أمثلة حول ترتيب البيانات التي يتم جلبها

الإستعلام التالي يجلب معلومات أول ثلاث موظفين في الجدول.

المثال الأول

SELECT * FROM employees   -- employees أحضر جميع المعلومات المتوفرة في الجدول
LIMIT 3;                  -- أحضر أول ثلاث أسطر تم إيجادها في الجدول فقط

يمكنك كتابة الإستعلام كما يلي أيضاً.

SELECT * FROM employees   -- employees أحضر جميع المعلومات المتوفرة في الجدول
LIMIT 0,3;                -- لا تتجاوز أي سطر في الجدول، و أحضر أول ثلاث أسطر تم إيجادها فيه فقط

النتيجة

id first_name last_name is_married salary birthday
1 Ahmad Alhazem 0 800.00 1990-10-23
2 Rami Algharib 0 750.00 1992-05-08
3 Said Alnaja 1 900.00 1988-07-12

الإستعلام التالي يتجاوز سطرين في الجدول ثم يجلب معلومات أول ثلاث موظفين من بعدهم.

المثال الثاني

SELECT * FROM employees   -- employees أحضر جميع المعلومات المتوفرة في الجدول
LIMIT 2,3;                -- تجاوز أول سطرين في الجدول، ثم أحضر أول ثلاث أسطر من بعدهم فقط

النتيجة

id first_name last_name is_married salary birthday
3 Said Alnaja 1 900.00 1988-07-12
4 Noura Jamali 0 845.00 1994-12-04
5 Amani Sarrouf 1 1000.00 1991-10-27

الإستعلام التالي يجلب معلومات أول ثلاثة موظفين ولدوا عام 1990 أو بعده.

المثال الثالث

SELECT * FROM employees          -- employees أحضر جميع المعلومات المتوفرة في الجدول
WHERE birthday >= '1990-01-01'   -- '1990-01-01' في السطر يملك تاريخ أكبر أو يساوي birthday بشرط أن يكون الحقل
LIMIT 3;                         -- أحضر أول ثلاث أسطر تم إيجادها في الجدول

يمكنك كتابة الإستعلام كما يلي أيضاً.

SELECT * FROM employees          -- employees أحضر جميع المعلومات المتوفرة في الجدول
WHERE birthday >= '1990-01-01'   -- '1990-01-01' في السطر يملك تاريخ أكبر أو يساوي birthday بشرط أن يكون الحقل
LIMIT 0,3;                       -- لا تتجاوز أي سطر في الجدول، و أحضر أول ثلاث أسطر تم إيجادها فيه فقط

النتيجة

id first_name last_name is_married salary birthday
1 Ahmad Alhazem 0 800.00 1990-10-23
2 Rami Algharib 0 750.00 1992-05-08
4 Noura Jamali 0 845.00 1994-12-04

الإستعلام التالي يحضر أعلى راتب يتم إعطاؤه للموظف في الشركة.
الحيلة التي سنفعلها هنا للحصول على أعلى راتب هي ترتيب أسطر الجدول بشكل تنازلي (أي من الأكبر إلى الأصغر) على أساس الراتب و من ثم نعرض الراتب الموضوع في أول سطر لأنه حينها سيكون هو أعلى راتب في العمود كله.

المثال الرابع

SELECT salary AS 'Highest Salary' -- و قمنا بإعطاء إسم للعمود salary هنا قمنا بتحديد أننا نريد قيم العامود
FROM employees                    -- employees هنا قمنا بتحديد أن نريد إحضار القيم من الجدول
ORDER BY salary DESC              -- فقط من الأكبر إلى الأصغر salary هنا قمنا بترتيب قيم الجدول الذي سيرجع و الذي يتألف من العامود
LIMIT 1;                          -- هنا قمنا بتحديد أننا نريد السطر الأول فقط الذي يرجعه هذا الإستعلام، أي القيمة الأولى التي سيتم إرجاعها

يمكنك كتابة الإستعلام كما يلي أيضاً.

SELECT salary AS 'Highest Salary' -- و قمنا بإعطاء إسم للعمود salary هنا قمنا بتحديد أننا نريد قيم العامود
FROM employees                    -- employees هنا قمنا بتحديد أن نريد إحضار القيم من الجدول
ORDER BY salary DESC              -- فقط من الأكبر إلى الأصغر salary هنا قمنا بترتيب قيم الجدول الذي سيرجع و الذي يتألف من العامود
LIMIT 0,1;                        -- هنا قمنا بتحديد أننا نريد السطر الأول فقط الذي يرجعه هذا الإستعلام، أي القيمة الأولى التي سيتم إرجاعها

النتيجة

Highest Salary
1000.00

في المثال السابق كان باستطاعتنا استخدام دالة إسمها MAX() للحصول على أعلى قيمة و هذا الأمر سيمر معك في درس لاحق.


الإستعلام التالي يحضر أدنى راتب يتم إعطاؤه للموظف في الشركة.
الحيلة التي سنفعلها هنا للحصول على أدنى راتب هي ترتيب أسطر الجدول بشكل تصاعدي ( أي من الأصغر إلى الأكبر ) على أساس الراتب و من ثم نعرض الراتب الموضوع في أول سطر لأنه حينها سيكون هو أدنى راتب في العمود كله.

المثال الخامس

SELECT salary AS 'Lowest Salary'  -- و قمنا بإعطاء إسم للعمود salary هنا قمنا بتحديد أننا نريد قيم العامود
FROM employees                    -- employees هنا قمنا بتحديد أن نريد إحضار القيم من الجدول
ORDER BY salary                   -- فقط من الأصغر إلى الأكبر salary هنا قمنا بترتيب قيم الجدول الذي سيرجع و الذي يتألف من العامود
LIMIT 1;                          -- هنا قمنا بتحديد أننا نريد السطر الأول فقط الذي يرجعه هذا الإستعلام، أي القيمة الأولى التي سيتم إرجاعها

يمكنك كتابة الإستعلام كما يلي أيضاً.

SELECT salary AS 'Lowest Salary'  -- و قمنا بإعطاء إسم للعمود salary هنا قمنا بتحديد أننا نريد قيم العامود
FROM employees                    -- employees هنا قمنا بتحديد أن نريد إحضار القيم من الجدول
ORDER BY salary                   -- فقط من الأصغر إلى الأكبر salary هنا قمنا بترتيب قيم الجدول الذي سيرجع و الذي يتألف من العامود
LIMIT 0,1;                        -- هنا قمنا بتحديد أننا نريد السطر الأول فقط الذي يرجعه هذا الإستعلام، أي القيمة الأولى التي سيتم إرجاعها

النتيجة

Lowest Salary
700.00

في المثال السابق كان باستطاعتنا استخدام دالة إسمها MIN() للحصول على أدنى قيمة و هذا الأمر سيمر معك في درس لاحق.


الإستعلام التالي يحضر ثاني أعلى راتب يتم إعطاؤه للموظف في الشركة.
الحيلة التي سنفعلها هنا للحصول على ثاني أعلى راتب هي ترتيب أسطر الجدول بشكل تنازلي (أي من الأكبر إلى الأصغر) على أساس الراتب مع التأكد من أنه لا يوجد أي قيم مكررة في النتيجة و من ثم نعرض الراتب الموضوع في ثاني سطر لأنه حينها سيكون هو ثاني أعلى راتب في العمود كله.

المثال السادس

SELECT DISTINCT salary AS 'Second Highest Salary' -- بدون وجود أي قيم مكررة و قمنا بإعطاء إسم للعمود salary هنا قمنا بتحديد أننا نريد قيم العامود
FROM employees                                    -- employees هنا قمنا بتحديد أن نريد إحضار القيم من الجدول
ORDER BY salary DESC                              -- فقط من الأكبر إلى الأصغر salary هنا قمنا بترتيب قيم الجدول الذي سيرجع و الذي يتألف من العامود
LIMIT 1,1;                                        -- إبتداءاً من السطر رقم 0 و الذي هو نفسه السطر الأول أحضر أول سطر تم إيجاده في الجدول

النتيجة

Second Highest Salary
920.00

في حال أردت عرض أول أعلى ثلاث رواتب يمكنك وضع الإستعلامات التي كتبتها في الأمثلة السابقة نفسها بشكل متداخل و من ثم تجميعها بداخل أمر SELECT و هذا الأسلوب يسمى Sub Queries.

المثال السابع

-- الخارجي سيجلب كل الإستعلامات التي وضعناها بداخله و كل جدول يرجعوه سيتم وضعه كعمود فيه SELECT الأمر
SELECT
    -- الإستعلام التالي يمثل أول عمود و القيمة التي ستوضع فيه
    (SELECT salary FROM employees ORDER BY salary DESC LIMIT 0,1) AS 'First Highest Salary',
    -- الإستعلام التالي يمثل ثاني عمود و القيمة التي ستوضع فيه
    (SELECT DISTINCT salary FROM employees ORDER BY salary DESC LIMIT 1,1) AS 'Second Highest Salary',
    -- الإستعلام التالي يمثل ثالث عمود و القيمة التي ستوضع فيه
    (SELECT DISTINCT salary FROM employees ORDER BY salary DESC LIMIT 2,1) AS 'Third Highest Salary';

النتيجة

First Highest Salary Second Highest Salary Third Highest Salary
1000.00 920.00 900.00

طريقة كتابة هذا الإستعلام معقدة قليلاً و لم نشرحها من قبل، و لكن لا تقلق لأنك ستتعلمها لاحقاً في درس خاص في الدورة و الهدف من المثال كان فقط إعلامك أنه يمكنك الإستفادة من الكلمة LIMIT في حالات متقدمة ليس إلا.