دالة WITH في SQL (Common Table Expression - CTE)

الـWITH هي طريقة في SQL لتعريف استعلام فرعي (Subquery) بشكل مؤقت يمكن استخدامه في الاستعلام الرئيسي. الهدف منها هو تحسين تنظيم الكود، جعله أكثر قابلية للفهم والصيانة، خاصة عند التعامل مع استعلامات معقدة أو متكررة.


الصيغة العامة:

WITH CTE_Name AS (
    SELECT ... -- استعلام فرعي
)
SELECT ...
FROM CTE_Name;
  • CTE_Name: اسم الاستعلام المؤقت الذي يمكن استخدامه كجدول في الاستعلام الرئيسي.
  • SELECT ...: الاستعلام الفرعي اللي هيتم تخزينه مؤقتًا.

مميزات WITH:

  1. تنظيم الكود:

    • بتسهل كتابة الكود بدل تكرار نفس الساب كويري.
    • بتسمح بتقسيم الاستعلامات المعقدة لخطوات منطقية.
  2. إعادة استخدام النتائج:

    • تقدر تستخدم نفس CTE أكتر من مرة في نفس الاستعلام.
  3. سهولة القراءة والصيانة:

    • بتحسن وضوح الكود وبتسهل فهم منطق الاستعلام.
  4. تعاملها كجدول مؤقت:

    • تقدر تستدعي الـ CTE كأنه جدول مؤقت في الاستعلام الرئيسي.

مثال بسيط:

الجدول: EMPLOYEES

EmployeeIDNameSalaryDepartmentID
1Alice50001
2Bob60001
3Charlie70002
4Diana80002

هدف: حساب متوسط الرواتب لكل قسم

WITH DepartmentSalary AS (
    SELECT DepartmentID, AVG(Salary) AS AvgSalary
    FROM EMPLOYEES
    GROUP BY DepartmentID
)
SELECT DepartmentID, AvgSalary
FROM DepartmentSalary;
  • شرح الكود:
    1. تعريف CTE باسم DepartmentSalary يحتوي على متوسط الرواتب لكل قسم.
    2. استخدام CTE في الاستعلام الرئيسي لعرض الأقسام ومتوسط الرواتب.

النتيجة:

DepartmentIDAvgSalary
15500
27500

استخدامات متقدمة:

1. استخدام أكثر من CTE:

يمكن تعريف أكثر من CTE في نفس الاستعلام.

WITH CTE1 AS (
    SELECT DepartmentID, AVG(Salary) AS AvgSalary
    FROM EMPLOYEES
    GROUP BY DepartmentID
),
CTE2 AS (
    SELECT DepartmentID, COUNT(*) AS EmployeeCount
    FROM EMPLOYEES
    GROUP BY DepartmentID
)
SELECT CTE1.DepartmentID, CTE1.AvgSalary, CTE2.EmployeeCount
FROM CTE1
JOIN CTE2 ON CTE1.DepartmentID = CTE2.DepartmentID;

2. استخدام CTE مع شروط متكررة:

إذا كنت تحتاج فلترة البيانات عدة مرات بنفس الشرط، يمكن استخدام CTE لتجنب التكرار.

WITH HighSalaryEmployees AS (
    SELECT *
    FROM EMPLOYEES
    WHERE Salary > 6000
)
SELECT Name, Salary
FROM HighSalaryEmployees;

مقارنة بين CTE و Subqueries:

الميزةCTESubquery
الوضوحأكثر وضوحًا ومنظمأقل وضوحًا إذا كان الاستعلام معقدًا
إعادة الاستخداميمكن استخدامه في نفس الاستعلاملا يمكن إعادة استخدامه مباشرةً
الأداءمتشابه في معظم الحالاتمتشابه في معظم الحالات

ملحوظة:

  • في بعض قواعد البيانات (مثل SQL Server)، الـ CTE يتم التعامل معها كأنها جدول مؤقت فقط في نطاق الاستعلام.
  • الـ CTE لا يتم تخزينها بشكل دائم أو في ذاكرة، يعني بتكون سريعة وخفيفة.

الخلاصة:

دالة WITH بتساعدك في تبسيط الاستعلامات وتنظيمها، وبتكون مفيدة جدًا في التعامل مع البيانات المعقدة أو الحالات اللي فيها تكرار. استخدمها لتحسين وضوح الكود وتقليل التكرار.