Common Table Expressions: Difference between revisions

From binaryoption
Jump to navigation Jump to search
Баннер1
(@pipegas_WP)
 
(@pipegas_WP)
 
Line 1: Line 1:
'''تعبيرات الجداول المشتركة: دليل شامل للمبتدئين'''
'''تعبيرات الجدول المشترك: دليل شامل للمبتدئين'''


'''مقدمة'''
تُعد [[تعبيرات الجدول المشترك]] (Common Table Expressions أو CTEs) أداة قوية في [[لغة SQL]] تسمح للمستخدمين بتحديد استعلامات فرعية مؤقتة أو "مجموعات نتائج" ضمن استعلام SQL أكبر. تُستخدم هذه المجموعات المؤقتة لتسهيل قراءة الاستعلامات المعقدة، وتقليل التكرار، وتحسين الأداء في بعض الحالات.  هذا المقال يهدف إلى تقديم شرح مفصل للمبتدئين حول CTEs، وكيفية استخدامها، وفوائدها.


تُعد تعبيرات الجداول المشتركة (Common Table Expressions أو CTEs) أداة قوية في لغة [[SQL]] تسمح لك بتحديد استعلام فرعي مؤقت ضمن استعلام أكبر. هذه الاستعلامات الفرعية المؤقتة تعمل كجداول افتراضية يمكن استخدامها داخل الاستعلام الرئيسي. توفر CTEs طريقة لتبسيط استعلامات [[SQL]] المعقدة، وتحسين قابليتها للقراءة، وإعادة استخدام منطق الاستعلام. هذا المقال موجه للمبتدئين ويهدف إلى شرح مفهوم CTEs بطريقة سهلة الفهم مع أمثلة عملية.
== ما هي تعبيرات الجدول المشترك؟ ==


'''ما هي تعبيرات الجداول المشتركة؟'''
ببساطة، CTE هي مجموعة نتائج يتم تعريفها داخل استعلام SQL.  تتشابه مع [[الاستعلامات الفرعية]] (Subqueries)، ولكنها توفر مزايا عديدة تجعلها أكثر فعالية وأسهل في الصيانة.  بدلاً من كتابة استعلام فرعي متكرر في أماكن متعددة، يمكنك تعريفه مرة واحدة كـ CTE واستخدامه عدة مرات داخل الاستعلام الرئيسي. 


ببساطة، CTE هي مجموعة نتائج من استعلام SELECT، يتم تحديدها بشكل مؤقت وتستخدم داخل استعلام آخرلا يتم تخزين CTE فعليًا في قاعدة البيانات مثل [[الجدول]] العادي. بدلاً من ذلك، يتم حسابها عند تنفيذ الاستعلام الرئيسي.  تُعرف CTE أيضًا باسم "استعلامات الجدول الفرعية المسماة".
تُستخدم كلمة مفتاحية `WITH` لتعريف CTE.  يتبعها اسم لـ CTE، ثم تعريف الاستعلام الذي يحدد محتويات CTE، وأخيراً الاستعلام الرئيسي الذي يستخدم CTE.


'''بناء الجملة (Syntax)'''
=== بناء الجملة الأساسي ===
 
يتم تعريف CTE باستخدام الكلمة الرئيسية `WITH` متبوعة باسم CTE، ثم استعلام `SELECT` الذي يحدد مجموعة النتائج. الاستعلام الرئيسي الذي يستخدم CTE يأتي بعد تعريف CTE.


```sql
```sql
WITH CTE_Name AS (
WITH CTE_Name AS (
    -- تعريف الاستعلام الفرعي هنا
     SELECT column1, column2
     SELECT column1, column2
     FROM Table_Name
     FROM table_name
     WHERE condition
     WHERE condition
)
)
SELECT column1, column2
-- الاستعلام الرئيسي الذي يستخدم CTE_Name
SELECT *
FROM CTE_Name
FROM CTE_Name
WHERE another_condition;
WHERE another_condition;
```
```


*  `WITH`:  تشير إلى بداية تعريف CTE.
في هذا المثال، `CTE_Name` هو اسم CTE، والاستعلام داخل الأقواس يحدد البيانات التي ستكون موجودة في CTE.  الاستعلام الرئيسي بعد ذلك يستخدم `CTE_Name` كأنه جدول عادي.
`CTE_Name`: هو الاسم الذي تختاره لـ CTE. يجب أن يكون الاسم فريدًا داخل الاستعلام.
*  `AS`:  تفصل بين اسم CTE واستعلام `SELECT`.
*  `SELECT ... FROM ... WHERE ...`: هو استعلام `SELECT` الذي يحدد مجموعة النتائج لـ CTE.
الاستعلام الرئيسي: الاستعلام الذي يستخدم CTE.


'''لماذا تستخدم تعبيرات الجداول المشتركة؟'''
== أمثلة عملية ==


هناك العديد من الأسباب التي تجعلك تستخدم CTEs:
لنفترض أن لدينا جدولين: `Orders` (طلبات) و `Customers` (عملاء).


*  '''القراءة وسهولة الصيانة:'''  تساعد CTEs في تقسيم الاستعلامات المعقدة إلى أجزاء أصغر وأكثر قابلية للفهم، مما يجعلها أسهل في القراءة والصيانة.
{| class="wikitable"
*  '''إعادة الاستخدام:'''  يمكنك إعادة استخدام CTE عدة مرات داخل نفس الاستعلام الرئيسي، مما يقلل من تكرار التعليمات البرمجية.
|+ هيكل جدول Orders
*  '''الاستعلامات المتكررة:'''  تسمح CTEs بكتابة [[الاستعلامات المتكررة]]، وهي مفيدة للتعامل مع البيانات الهرمية مثل [[شجرة التنظيم]].
|-
*  '''تحسين الأداء:''' في بعض الحالات، يمكن أن تؤدي CTEs إلى تحسين أداء الاستعلام، خاصةً عند استخدامها مع [[المؤشرات]].
| Column Name || Data Type
*  '''التبسيط:'''  يمكن أن تبسط CTEs الاستعلامات التي تتطلب عمليات تجميع أو حسابات معقدة.
|-
| OrderID || INT
|-
| CustomerID || INT
|-
| OrderDate || DATE
|-
| TotalAmount || DECIMAL
|}


'''أمثلة عملية'''
{| class="wikitable"
 
|+ هيكل جدول Customers
دعنا نفترض أن لدينا جدولين: `Customers` و `Orders`.
|-
 
| Column Name || Data Type
{{| class="wikitable"
|-
|+ جداول المثال
| CustomerID || INT
|-
| CustomerName || VARCHAR
|-
|-
| الجدول | الأعمدة |
| City || VARCHAR
|---|---|
|}
| Customers | CustomerID, CustomerName, City |
| Orders | OrderID, CustomerID, OrderDate, TotalAmount |
}}


'''مثال 1: استرداد العملاء الذين لديهم طلبات بقيمة إجمالية تزيد عن 100 دولار'''
=== مثال 1: إيجاد الطلبات التي تتجاوز متوسط قيمة الطلب ===


بدون CTE:
بدون CTE، قد يكون الاستعلام معقدًا بعض الشيء:


```sql
```sql
SELECT c.CustomerName
SELECT o.OrderID, o.OrderDate, o.TotalAmount
FROM Customers c
FROM Orders o
WHERE c.CustomerID IN (SELECT o.CustomerID FROM Orders o WHERE o.TotalAmount > 100);
WHERE o.TotalAmount > (SELECT AVG(TotalAmount) FROM Orders);
```
```


باستخدام CTE:
باستخدام CTE، يصبح الاستعلام أكثر وضوحًا:


```sql
```sql
WITH HighValueOrders AS (
WITH AverageOrder AS (
     SELECT CustomerID
     SELECT AVG(TotalAmount) AS AvgAmount
     FROM Orders
     FROM Orders
    WHERE TotalAmount > 100
)
)
SELECT c.CustomerName
SELECT o.OrderID, o.OrderDate, o.TotalAmount
FROM Customers c
FROM Orders o, AverageOrder a
WHERE c.CustomerID IN (SELECT CustomerID FROM HighValueOrders);
WHERE o.TotalAmount > a.AvgAmount;
```
```


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


'''مثال 2: حساب متوسط قيمة الطلب لكل مدينة'''
=== مثال 2: إيجاد العملاء الذين قدموا طلبات ===


```sql
```sql
WITH CityOrderTotals AS (
WITH CustomersWithOrders AS (
     SELECT c.City, SUM(o.TotalAmount) AS TotalOrderAmount
     SELECT DISTINCT CustomerID
     FROM Customers c
     FROM Orders
    JOIN Orders o ON c.CustomerID = o.CustomerID
    GROUP BY c.City
)
)
SELECT City, TotalOrderAmount, AVG(TotalOrderAmount) OVER () AS OverallAverage
SELECT c.CustomerName
FROM CityOrderTotals;
FROM Customers c
WHERE c.CustomerID IN (SELECT CustomerID FROM CustomersWithOrders);
```
```


هنا، تحسب CTE `CityOrderTotals` إجمالي قيمة الطلب لكل مدينة، ثم يستخدم الاستعلام الرئيسي هذه النتائج لحساب المتوسط العام.
هذا الاستعلام يحدد العملاء الذين قاموا بتقديم طلبات باستخدام CTE `CustomersWithOrders` ثم يسترجع أسماءهم من جدول `Customers`.
 
'''أنواع CTEs'''
 
*  '''CTEs غير المتكررة:''' هي الأكثر شيوعًا ولا تشير إلى نفسها داخل تعريفها.
*  '''CTEs المتكررة:'''  تستخدم في التعامل مع البيانات الهرمية. يجب أن تحتوي على شرط إنهاء لمنع حلقة لا نهائية.
 
'''الاستعلامات المتكررة (Recursive CTEs)'''
 
تسمح CTEs المتكررة بالاستعلام عن البيانات الهرمية، مثل هياكل الشجرة أو الرسوم البيانية.  تتطلب هذه الأنواع من CTEs شرطًا أساسيًا (anchor member) وشرطًا تكراريًا (recursive member).


مثال (افتراضي): لنفترض أن لدينا جدول `Employees` يحتوي على `EmployeeID` و `ManagerID`. يمكننا استخدام CTE متكررة للعثور على جميع الموظفين الذين يتبعون مديرًا معينًا:
== فوائد استخدام تعبيرات الجدول المشترك ==


```sql
*  '''القراءة والوضوح:''' CTEs تجعل الاستعلامات المعقدة أسهل في القراءة والفهم من خلال تقسيمها إلى أجزاء منطقية.
WITH RECURSIVE EmployeeHierarchy AS (
*  '''إعادة الاستخدام:''' يمكن إعادة استخدام CTEs عدة مرات داخل نفس الاستعلام، مما يقلل من التكرار.
    -- شرط أساسي: تحديد المدير المباشر
*  '''الصيانة:''' إذا تغيرت منطق الاستعلام الفرعي، يمكنك تعديل CTE واحد فقط بدلاً من تعديل عدة أماكن في الاستعلام الرئيسي.
    SELECT EmployeeID, ManagerID, 1 AS Level
*  '''الاستعلامات المتكررة:'''  CTEs تسمح بإجراء [[الاستعلامات المتكررة]] (Recursive Queries)، وهو أمر ضروري لمعالجة البيانات الهرمية مثل [[أشجار البيانات]] (Data Trees).
    FROM Employees
*  '''الأداء:''' في بعض الحالات، يمكن أن تساعد CTEs في تحسين أداء الاستعلامات، خاصةً عند استخدامها مع [[الفهارس]] (Indexes).
    WHERE ManagerID = 1 -- المدير المباشر ذو المعرف 1


    UNION ALL
== أنواع تعبيرات الجدول المشترك ==


    -- شرط تكراري: تحديد الموظفين الذين يتبعون الموظفين في المستوى السابق
*  '''CTEs غير المتكررة:''' هذه هي CTEs التي لا تشير إلى نفسها. الأمثلة المذكورة أعلاه هي CTEs غير متكررة.
    SELECT e.EmployeeID, e.ManagerID, eh.Level + 1
*  '''CTEs المتكررة:''' تستخدم لمعالجة البيانات الهرمية أو البيانات التي لها علاقة ذاتية. تتطلب CTEs المتكررة شرط إنهاء لمنع الاستعلام من التشغيل إلى الأبد. مثال: إيجاد جميع الأجداد في شجرة العائلة.
    FROM Employees e
    JOIN EmployeeHierarchy eh ON e.ManagerID = eh.EmployeeID
)
SELECT EmployeeID, Level
FROM EmployeeHierarchy;
```


'''اعتبارات الأداء'''
== اعتبارات الأداء ==


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


'''الخلاصة'''
==  أدوات التحليل والاستراتيجيات ذات الصلة ==


تعد تعبيرات الجداول المشتركة أداة قيمة لتبسيط استعلامات [[SQL]] وتحسين قابليتها للقراءة.  إنها مفيدة بشكل خاص للاستعلامات المعقدة، والاستعلامات المتكررة، وإعادة استخدام منطق الاستعلام. من خلال فهم بناء الجملة وأنواع CTEs المختلفة، يمكنك الاستفادة من هذه الميزة القوية لتحسين كفاءة تطوير قاعدة البيانات.
[[تحليل البيانات]] (Data Analysis)
*  [[تنقيب البيانات]] (Data Mining)
*  [[تحسين الاستعلام]] (Query Optimization)
*  [[فهم خطط التنفيذ]] (Understanding Execution Plans)
*  [[تحليل التكلفة]] (Cost Analysis)
*  [[تقسيم البيانات]] (Data Partitioning)
*  [[Indexing Strategies]] (استراتيجيات الفهرسة)
*  [[Normalization]] (التطبيع)
*  [[Denormalization]] (إلغاء التطبيع)
*  [[Data Warehousing]] (مستودعات البيانات)
*  [[ETL Processes]] (عمليات ETL)
*  [[Data Modeling]] (نمذجة البيانات)
*  [[Business Intelligence]] (ذكاء الأعمال)
*  [[OLAP Cubes]] (مكعبات OLAP)
*  [[Data Visualization]] (تصور البيانات)
*  [[Moving Averages]] (المتوسطات المتحركة)
*  [[Bollinger Bands]] (نطاقات بولينجر)
*  [[Fibonacci Retracements]] (نسب فيبوناتشي)
*  [[MACD]] (مؤشر الماكد)
*  [[RSI]] (مؤشر القوة النسبية)
*  [[Volume Weighted Average Price]] (متوسط السعر المرجح بالحجم)
*  [[Candlestick Patterns]] (أنماط الشموع اليابانية)
*  [[Support and Resistance Levels]] (مستويات الدعم والمقاومة)
*  [[Trend Following]] (متابعة الاتجاه)
*  [[Breakout Trading]] (تداول الاختراق)
*  [[Scalping]] (السلخ)


'''روابط ذات صلة'''
== الخلاصة ==


*  [[SQL]]
تعتبر تعبيرات الجدول المشترك أداة قيمة في لغة SQL.  فهي تحسن من قابلية قراءة الاستعلامات، وتسهل صيانتها، ويمكن أن تحسن الأداء في بعض الحالات.  من خلال فهم بناء الجملة وأنواع CTEs، يمكن للمطورين ومحللي البيانات الاستفادة الكاملة من هذه الميزة القوية.  لا تتردد في تجربة CTEs في استعلاماتك الخاصة واستكشاف إمكاناتها.
*  [[الاستعلامات الفرعية]]
*  [[الاستعلامات المتكررة]]
*  [[المؤشرات]]
*  [[نظام إدارة قواعد البيانات]]
*  [[البيانات الهرمية]]
*  [[تحليل البيانات]]
*  [[تصميم قواعد البيانات]]
*  [[تحسين الاستعلام]]
*  [[تجميع البيانات]]
*  [[البيانات]]
*  [[الجدول]]
*  [[العلاقات بين الجداول]]
*  [[عمليات الربط (JOINs)]]
*  [[التحليل الفني]]
*  [[التحليل الأساسي]]
*  [[استراتيجيات التداول]]
*  [[إدارة المخاطر]]
*  [[تحليل حجم التداول]]
*  [[مؤشرات التداول]]
*  [[الشموع اليابانية]]
*  [[مستويات الدعم والمقاومة]]
*  [[اتجاهات السوق]]
*  [[التقلبات السعرية]]
*  [[التحليل الموجي]]


[[Category:استعلامات SQL]]
[[Category:الفئة:لغة SQL]]


== ابدأ التداول الآن ==
== ابدأ التداول الآن ==

Latest revision as of 04:07, 23 April 2025

تعبيرات الجدول المشترك: دليل شامل للمبتدئين

تُعد تعبيرات الجدول المشترك (Common Table Expressions أو CTEs) أداة قوية في لغة SQL تسمح للمستخدمين بتحديد استعلامات فرعية مؤقتة أو "مجموعات نتائج" ضمن استعلام SQL أكبر. تُستخدم هذه المجموعات المؤقتة لتسهيل قراءة الاستعلامات المعقدة، وتقليل التكرار، وتحسين الأداء في بعض الحالات. هذا المقال يهدف إلى تقديم شرح مفصل للمبتدئين حول CTEs، وكيفية استخدامها، وفوائدها.

ما هي تعبيرات الجدول المشترك؟

ببساطة، CTE هي مجموعة نتائج يتم تعريفها داخل استعلام SQL. تتشابه مع الاستعلامات الفرعية (Subqueries)، ولكنها توفر مزايا عديدة تجعلها أكثر فعالية وأسهل في الصيانة. بدلاً من كتابة استعلام فرعي متكرر في أماكن متعددة، يمكنك تعريفه مرة واحدة كـ CTE واستخدامه عدة مرات داخل الاستعلام الرئيسي.

تُستخدم كلمة مفتاحية `WITH` لتعريف CTE. يتبعها اسم لـ CTE، ثم تعريف الاستعلام الذي يحدد محتويات CTE، وأخيراً الاستعلام الرئيسي الذي يستخدم CTE.

بناء الجملة الأساسي

```sql WITH CTE_Name AS (

   -- تعريف الاستعلام الفرعي هنا
   SELECT column1, column2
   FROM table_name
   WHERE condition

) -- الاستعلام الرئيسي الذي يستخدم CTE_Name SELECT * FROM CTE_Name WHERE another_condition; ```

في هذا المثال، `CTE_Name` هو اسم CTE، والاستعلام داخل الأقواس يحدد البيانات التي ستكون موجودة في CTE. الاستعلام الرئيسي بعد ذلك يستخدم `CTE_Name` كأنه جدول عادي.

أمثلة عملية

لنفترض أن لدينا جدولين: `Orders` (طلبات) و `Customers` (عملاء).

هيكل جدول Orders
Column Name Data Type
OrderID INT
CustomerID INT
OrderDate DATE
TotalAmount DECIMAL
هيكل جدول Customers
Column Name Data Type
CustomerID INT
CustomerName VARCHAR
City VARCHAR

مثال 1: إيجاد الطلبات التي تتجاوز متوسط قيمة الطلب

بدون CTE، قد يكون الاستعلام معقدًا بعض الشيء:

```sql SELECT o.OrderID, o.OrderDate, o.TotalAmount FROM Orders o WHERE o.TotalAmount > (SELECT AVG(TotalAmount) FROM Orders); ```

باستخدام CTE، يصبح الاستعلام أكثر وضوحًا:

```sql WITH AverageOrder AS (

   SELECT AVG(TotalAmount) AS AvgAmount
   FROM Orders

) SELECT o.OrderID, o.OrderDate, o.TotalAmount FROM Orders o, AverageOrder a WHERE o.TotalAmount > a.AvgAmount; ```

هنا، قمنا بتعريف CTE باسم `AverageOrder` لحساب متوسط قيمة الطلب. ثم استخدمنا هذا CTE في الاستعلام الرئيسي لتحديد الطلبات التي تتجاوز هذا المتوسط.

مثال 2: إيجاد العملاء الذين قدموا طلبات

```sql WITH CustomersWithOrders AS (

   SELECT DISTINCT CustomerID
   FROM Orders

) SELECT c.CustomerName FROM Customers c WHERE c.CustomerID IN (SELECT CustomerID FROM CustomersWithOrders); ```

هذا الاستعلام يحدد العملاء الذين قاموا بتقديم طلبات باستخدام CTE `CustomersWithOrders` ثم يسترجع أسماءهم من جدول `Customers`.

فوائد استخدام تعبيرات الجدول المشترك

  • القراءة والوضوح: CTEs تجعل الاستعلامات المعقدة أسهل في القراءة والفهم من خلال تقسيمها إلى أجزاء منطقية.
  • إعادة الاستخدام: يمكن إعادة استخدام CTEs عدة مرات داخل نفس الاستعلام، مما يقلل من التكرار.
  • الصيانة: إذا تغيرت منطق الاستعلام الفرعي، يمكنك تعديل CTE واحد فقط بدلاً من تعديل عدة أماكن في الاستعلام الرئيسي.
  • الاستعلامات المتكررة: CTEs تسمح بإجراء الاستعلامات المتكررة (Recursive Queries)، وهو أمر ضروري لمعالجة البيانات الهرمية مثل أشجار البيانات (Data Trees).
  • الأداء: في بعض الحالات، يمكن أن تساعد CTEs في تحسين أداء الاستعلامات، خاصةً عند استخدامها مع الفهارس (Indexes).

أنواع تعبيرات الجدول المشترك

  • CTEs غير المتكررة: هذه هي CTEs التي لا تشير إلى نفسها. الأمثلة المذكورة أعلاه هي CTEs غير متكررة.
  • CTEs المتكررة: تستخدم لمعالجة البيانات الهرمية أو البيانات التي لها علاقة ذاتية. تتطلب CTEs المتكررة شرط إنهاء لمنع الاستعلام من التشغيل إلى الأبد. مثال: إيجاد جميع الأجداد في شجرة العائلة.

اعتبارات الأداء

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

أدوات التحليل والاستراتيجيات ذات الصلة

الخلاصة

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

ابدأ التداول الآن

سجل في IQ Option (الحد الأدنى للإيداع $10) افتح حساباً في Pocket Option (الحد الأدنى للإيداع $5)

انضم إلى مجتمعنا

اشترك في قناة Telegram الخاصة بنا @strategybin للحصول على: ✓ إشارات تداول يومية ✓ تحليلات استراتيجية حصرية ✓ تنبيهات باتجاهات السوق ✓ مواد تعليمية للمبتدئين

Баннер