دالة WITH في SQL (Common Table Expression - CTE)
الـWITH
هي طريقة في SQL لتعريف استعلام فرعي (Subquery) بشكل مؤقت يمكن استخدامه في الاستعلام الرئيسي.
الهدف منها هو تحسين تنظيم الكود، جعله أكثر قابلية للفهم والصيانة، خاصة عند التعامل مع استعلامات معقدة أو متكررة.
الصيغة العامة:
WITH CTE_Name AS (
SELECT ... -- استعلام فرعي
)
SELECT ...
FROM CTE_Name;
CTE_Name
: اسم الاستعلام المؤقت الذي يمكن استخدامه كجدول في الاستعلام الرئيسي.SELECT ...
: الاستعلام الفرعي اللي هيتم تخزينه مؤقتًا.
مميزات WITH:
-
تنظيم الكود:
- بتسهل كتابة الكود بدل تكرار نفس الساب كويري.
- بتسمح بتقسيم الاستعلامات المعقدة لخطوات منطقية.
-
إعادة استخدام النتائج:
- تقدر تستخدم نفس CTE أكتر من مرة في نفس الاستعلام.
-
سهولة القراءة والصيانة:
- بتحسن وضوح الكود وبتسهل فهم منطق الاستعلام.
-
تعاملها كجدول مؤقت:
- تقدر تستدعي الـ CTE كأنه جدول مؤقت في الاستعلام الرئيسي.
مثال بسيط:
الجدول: EMPLOYEES
EmployeeID | Name | Salary | DepartmentID |
---|---|---|---|
1 | Alice | 5000 | 1 |
2 | Bob | 6000 | 1 |
3 | Charlie | 7000 | 2 |
4 | Diana | 8000 | 2 |
هدف: حساب متوسط الرواتب لكل قسم
WITH DepartmentSalary AS (
SELECT DepartmentID, AVG(Salary) AS AvgSalary
FROM EMPLOYEES
GROUP BY DepartmentID
)
SELECT DepartmentID, AvgSalary
FROM DepartmentSalary;
- شرح الكود:
- تعريف CTE باسم DepartmentSalary يحتوي على متوسط الرواتب لكل قسم.
- استخدام CTE في الاستعلام الرئيسي لعرض الأقسام ومتوسط الرواتب.
النتيجة:
DepartmentID | AvgSalary |
---|---|
1 | 5500 |
2 | 7500 |
استخدامات متقدمة:
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:
الميزة | CTE | Subquery |
---|---|---|
الوضوح | أكثر وضوحًا ومنظم | أقل وضوحًا إذا كان الاستعلام معقدًا |
إعادة الاستخدام | يمكن استخدامه في نفس الاستعلام | لا يمكن إعادة استخدامه مباشرةً |
الأداء | متشابه في معظم الحالات | متشابه في معظم الحالات |
ملحوظة:
- في بعض قواعد البيانات (مثل SQL Server)، الـ CTE يتم التعامل معها كأنها جدول مؤقت فقط في نطاق الاستعلام.
- الـ CTE لا يتم تخزينها بشكل دائم أو في ذاكرة، يعني بتكون سريعة وخفيفة.
الخلاصة:
دالة WITH
بتساعدك في تبسيط الاستعلامات وتنظيمها، وبتكون مفيدة جدًا في التعامل مع البيانات المعقدة أو الحالات اللي فيها تكرار. استخدمها لتحسين وضوح الكود وتقليل التكرار.