البرمجة

الاستعلامات الفرعية والإجراءات في SQL

الاستعلامات الفرعية والإجراءات في SQL

تعد لغة SQL (Structured Query Language) واحدة من أهم اللغات المستخدمة في إدارة قواعد البيانات العلائقية. تتيح هذه اللغة للمستخدمين إجراء العديد من العمليات على البيانات مثل الاستعلامات (Queries)، التحديثات (Updates)، والإضافات (Insertions)، وكذلك الحذف (Deletions). من بين الأدوات الأكثر استخدامًا في SQL، نجد الاستعلامات الفرعية والإجراءات المخزنة. في هذا المقال، سوف نغطي بالتفصيل كيفية استخدام الاستعلامات الفرعية والإجراءات في SQL، ونعرض أمثلة عملية توضح كيفية الاستفادة من هاتين الأداتين.

أولاً: الاستعلامات الفرعية في SQL

تعريف الاستعلام الفرعي

الاستعلام الفرعي (Subquery) هو استعلام يُدرج داخل استعلام آخر. يتم تنفيذ الاستعلام الفرعي أولاً، ثم يتم استخدام نتائجه في الاستعلام الأساسي. يمكن أن يكون الاستعلام الفرعي جزءًا من أي جزء من أجزاء الاستعلام الرئيسي مثل جملة SELECT أو WHERE أو FROM أو HAVING.

أنواع الاستعلامات الفرعية

  1. الاستعلامات الفرعية في جملة SELECT:
    في هذا النوع، يتم تضمين استعلام فرعي داخل جملة SELECT للحصول على نتائج من عدة جداول أو مصادر بيانات.

    مثال:

    sql
    SELECT name, salary FROM employees WHERE salary > (SELECT AVG(salary) FROM employees);

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

  2. الاستعلامات الفرعية في جملة WHERE:
    يستخدم هذا النوع من الاستعلامات في جملة WHERE لتصفية البيانات بناءً على نتائج استعلام آخر.

    مثال:

    sql
    SELECT name, department FROM employees WHERE department_id = (SELECT department_id FROM departments WHERE department_name = 'HR');

    في هذا المثال، يتم اختيار الموظفين الذين ينتمون إلى قسم “الموارد البشرية”. يقوم الاستعلام الفرعي أولاً بالحصول على department_id لقسم الموارد البشرية، ثم يتم استخدامه في الاستعلام الرئيسي للبحث عن الموظفين في نفس القسم.

  3. الاستعلامات الفرعية في جملة FROM:
    في بعض الأحيان، يمكن وضع الاستعلام الفرعي في جملة FROM كما لو كان جدولًا. وهذا يُعرف باسم “الاستعلام الفرعي في FROM“.

    مثال:

    sql
    SELECT avg_salary FROM (SELECT salary AS avg_salary FROM employees WHERE department_id = 1) AS dept_salaries;

    في هذا المثال، يقوم الاستعلام الفرعي بحساب الرواتب لكل موظف في القسم 1، ثم يتم حساب المتوسط في الاستعلام الرئيسي.

ملاحظات حول الاستعلامات الفرعية

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

  • يمكن أن تحتوي الاستعلامات الفرعية على استعلامات مرتبطة، أي أنه يعتمد على الأعمدة في الاستعلام الرئيسي.

  • يمكن استخدام الاستعلامات الفرعية في جملة HAVING لتصفية البيانات بناءً على نتائج تجميعية.

الأداء في الاستعلامات الفرعية

على الرغم من أن الاستعلامات الفرعية تعد من الأدوات القوية، إلا أنه في بعض الأحيان قد تكون غير فعالة من حيث الأداء، خاصة في الاستعلامات المتداخلة (nested subqueries) التي تتطلب حسابات متعددة. في مثل هذه الحالات، يمكن أن تكون الإجراءات المخزنة أو الانضمام (JOIN) بديلاً أفضل في تحسين الأداء.

ثانياً: الإجراءات المخزنة في SQL

تعريف الإجراءات المخزنة

الإجراء المخزن (Stored Procedure) هو مجموعة من أوامر SQL يتم تخزينها وتنفيذها على الخادم. على عكس الاستعلامات الفردية، يتم تنفيذ الإجراءات المخزنة بشكل مُجمع ولها القدرة على قبول المعلمات (Parameters) وإرجاع القيم. يتم استخدام الإجراءات المخزنة لأغراض مختلفة مثل معالجة البيانات، الأمان، تحسين الأداء، وتنفيذ العمليات المعقدة.

كيفية إنشاء إجراء مخزن

يتم إنشاء إجراء مخزن باستخدام جملة CREATE PROCEDURE. يمكن أن تحتوي الإجراءات على معلمات إدخال (Input Parameters) ومعلمات إخراج (Output Parameters) لتوفير مرونة أكبر.

مثال:

sql
CREATE PROCEDURE GetEmployeeInfo (IN emp_id INT) BEGIN SELECT name, department, salary FROM employees WHERE employee_id = emp_id; END;

في هذا المثال، يتم إنشاء إجراء مخزن يُسمى GetEmployeeInfo الذي يستقبل معلمة إدخال emp_id ويُرجع اسم الموظف، القسم، والراتب بناءً على employee_id.

كيفية تنفيذ إجراء مخزن

بعد إنشاء الإجراء المخزن، يمكن تنفيذه باستخدام جملة CALL في SQL.

مثال:

sql
CALL GetEmployeeInfo(101);

في هذا المثال، يتم تنفيذ الإجراء المخزن GetEmployeeInfo مع تمرير قيمة 101 كمعلمة إدخال للبحث عن معلومات الموظف الذي يحمل هذا الرقم.

المزايا الرئيسية للإجراءات المخزنة

  1. تحسين الأداء:
    الإجراءات المخزنة تعمل على خادم قاعدة البيانات مباشرة، مما يجعلها أكثر كفاءة من إرسال استعلامات منفصلة من العميل.

  2. إعادة الاستخدام:
    يمكن استخدام الإجراءات المخزنة عدة مرات، مما يقلل من الحاجة إلى إعادة كتابة استعلامات معقدة.

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

  4. المرونة:
    يمكن للإجراءات المخزنة قبول معلمات متعددة واستخدامها لتخصيص النتائج بناءً على مدخلات المستخدم.

الأنواع المختلفة للإجراءات المخزنة

  • إجراءات مخزنة مع معلمات إدخال فقط: هذه الإجراءات تستخدم فقط معلمات لإدخال البيانات ومعالجتها.

  • إجراءات مخزنة مع معلمات إدخال وإخراج: يمكن للإجراءات المخزنة قبول معلمات إدخال وتوفير معلمات إخراج، مما يتيح للمستخدم الحصول على نتائج أو رسائل مخصصة.

  • الإجراءات المخزنة بدون معلمات: تقوم هذه الإجراءات بتنفيذ استعلامات ثابتة أو عمليات في قاعدة البيانات دون الحاجة إلى مدخلات إضافية.

مقارنة بين الاستعلامات الفرعية والإجراءات المخزنة

على الرغم من أن الاستعلامات الفرعية والإجراءات المخزنة كلاهما أدوات قوية في SQL، إلا أن لكل منهما مزايا وعيوبًا معينة:

  1. الأداء:

    • الاستعلامات الفرعية قد تؤدي إلى أداء ضعيف إذا كانت متداخلة بشكل معقد أو تحتوي على عمليات غير ضرورية.

    • الإجراءات المخزنة تكون عادة أكثر كفاءة لأنها تُنفذ ككتلة واحدة ويمكن تحسينها من خلال التخزين المسبق على الخادم.

  2. التخصيص:

    • الاستعلامات الفرعية لا توفر نفس مستوى التخصيص الذي توفره الإجراءات المخزنة. مع الإجراءات المخزنة، يمكن استخدام المعلمات لإجراء عمليات أكثر تعقيدًا.

  3. التكرار وإعادة الاستخدام:

    • يمكن إعادة استخدام الإجراءات المخزنة بسهولة، بينما الاستعلامات الفرعية قد تتطلب تكرارًا في الاستعلامات المعقدة.

  4. الأمان:

    • الإجراءات المخزنة تعزز الأمان حيث يمكن تحديد الإجراءات المسموح بها دون السماح بالوصول المباشر إلى الجداول.

الخاتمة

الاستعلامات الفرعية والإجراءات المخزنة هما عنصران أساسيان في لغة SQL، ولها استخدامات متعددة تلبي احتياجات متنوعة في إدارة قواعد البيانات. بينما تُستخدم الاستعلامات الفرعية لمعالجة البيانات في استعلامات معقدة وتصفية البيانات بناءً على نتائج استعلامات أخرى، فإن الإجراءات المخزنة توفر بيئة أكثر مرونة وأمانًا لتنفيذ العمليات المعقدة في قاعدة البيانات.

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