logo

تعبير الجدول المشترك لـ MySQL (CTE)

في MySQL، ينتج عن كل عبارة أو استعلام نتيجة أو علاقة مؤقتة. يتم استخدام تعبير جدول شائع أو CTE قم بتسمية مجموعة النتائج المؤقتة هذه الموجودة ضمن نطاق تنفيذ هذا البيان المحدد، مثل CREATE، إدراج ، يختار ، تحديث , يمسح ، إلخ.

سلسلة concat جافا

بعض النقاط الرئيسية المتعلقة بـ CTE هي:

  • ويتم تعريفه باستخدام مع بند.
  • تسمح لنا جملة YOU بتحديد أكثر من CTEs في استعلام واحد.
  • يمكن أن تشير CTE إلى CTEs الأخرى التي تشكل جزءًا من نفس جملة YOU، ولكن يجب تعريف CTEs هذه مسبقًا.
  • يوجد نطاق تنفيذ CTE ضمن البيان المحدد الذي يتم استخدامه فيه.

بناء جملة MySQL CTE

يتضمن بناء جملة MySQL CTE الاسم وقائمة الأعمدة الاختيارية والبيان/الاستعلام الذي يحدد تعبير الجدول المشترك (CTE). بعد تعريف CTE، يمكننا استخدامه كطريقة عرض في استعلام SELECT، INSERT، UPDATE، وDELETE.

ما يلي هو بناء الجملة الأساسي لـ CTE في ماي إس كيو إل :

 WITH cte_name (column_names) AS (query) SELECT * FROM cte_name; 

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

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

على عكس الجدول المشتق، CTE هو استعلام فرعي يمكن أن يكون المرجعية الذاتية باستخدام اسمها الخاص. ومن المعروف أيضا باسم CTE العودية ويمكن أيضًا الرجوع إليها عدة مرات في نفس الاستعلام.

بعض النقاط الأساسية المتعلقة بـ CTE العودي هي:

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

MySQL بناء جملة CTE العودي

ما يلي هو بناء الجملة الأساسي لـ CTE العودي في MySQL:

 WITH RECURSIVE cte_name (column_names) AS ( subquery ) SELECT * FROM cte_name; 

هنا، الاستعلام الفرعي هو استعلام MySQL يشير إلى نفسه باستخدام cte_name كاسم خاص به.

com.webdriver

أمثلة MySQL CTE

دعونا نفهم كيفية عمل CTE في MySQL باستخدام أمثلة مختلفة. هنا سوف نستخدم الجدول 'موظفين' للمظاهرة. لنفترض أن هذا الجدول يحتوي على البيانات التالية:

تعبير الجدول المشترك لـ MySQL (CTE)

قم بتنفيذ العبارة التالية لفهم مفهوم CTE. في هذا المثال، اسم CTE هو موظف_في_كاليفورنيا ، يقوم الاستعلام الفرعي الذي يحدد CTE بإرجاع الأعمدة الثلاثة emp_name وemp_age والمدينة. وبالتالي، سيقوم موظف CTE_in_california بإرجاع جميع الموظفين الموجودين في مدينة كاليفورنيا .

بعد تحديد موظف CTE_in_california، قمنا بالإشارة إليه في ملف يختار بيان لاختيار الموظفين الموجودين في كاليفورنيا فقط.

 WITH employees_in_california AS ( SELECT * FROM employees WHERE city = 'California' ) SELECT emp_name, emp_age, city FROM employees_in_california WHERE emp_age >= 32 ORDER BY emp_name; 

بعد تنفيذ البيان أعلاه، فإنه سوف يعطي الإخراج التالي. هنا، يمكننا أن نرى أن النتيجة تُرجع فقط بيانات الموظفين الموجودين في كاليفورنيا.

تعبير الجدول المشترك لـ MySQL (CTE)

مثال MySQL CTE الأكثر تقدمًا

لنفترض أن لدينا جدول اسمه عميل و طلب الذي يحتوي على البيانات التالية:

الجدول: العميل

ر وما يليها
تعبير الجدول المشترك لـ MySQL (CTE)

الجدول: الطلبات

تعبير الجدول المشترك لـ MySQL (CTE)

راجع البيان أدناه الذي يشرح مثال CTE المتقدم باستخدام صلة داخلية بند.

 WITH total_customer_2020 AS ( SELECT cust_id, name, occupation FROM customer INNER JOIN orders USING (cust_id) ORDER BY age ) SELECT * FROM orders JOIN total_customer_2020 USING (cust_id); 

بعد التنفيذ سنحصل على النتيجة كما يلي:

فئة مجردة
تعبير الجدول المشترك لـ MySQL (CTE)

مثال MySQL العودي CTE

تشرح الأمثلة التالية عمل CTE العودي. النظر في البيان أدناه الذي يولد سلسلة من أول خمسة أرقام فردية :

 WITH RECURSIVE odd_num_cte (id, n) AS ( SELECT 1, 1 union all SELECT id+1, n+2 from odd_num_cte where id <5 ) select * from odd_num_cte; < pre> <p>After executing the above statement, it will give the output as below:</p> <img src="//techcodeview.com/img/mysql-tutorial/80/mysql-common-table-expression-6.webp" alt="MySQL Common Table Expression (CTE)"> <p>The above statement consists of two parts one is non-recursive, and another is recursive.</p> <p> <strong>Non-recursive: SELECT 1, 1</strong> </p> <p>This part will produce the initial rows with two columns as &apos;id&apos; and &apos;n&apos; and a single row.</p> <p> <strong>Recursive: SELECT id+1, n+2 from odd_num_cte where id <5< strong> </5<></strong></p> <p>This part is responsible for adding rows to the previous output until the terminating condition (id <5) will not be satisfied. when the id reached 5, condition becomes false, and recursion process is terminated.< p> <h3>The WITH clause uses</h3> <p>MySQL provides many contexts to use the WITH clause for creating CTE. Let&apos;s discuss one by one in detail.</p> <p>First, we can use the WITH clause at the beginning of SELECT, UPDATE, and DELETE query as below.</p> <pre> WITH ... SELECT ... WITH ... UPDATE ... WITH ... DELETE ... </pre> <p>Second, we can use the WITH clause at the beginning of a subquery or a derived table subquery as below:</p> <pre> SELECT ... WHERE id IN (WITH ... SELECT ...); SELECT * FROM (WITH ... SELECT ...) AS derived_table; </pre> <p>Third, we can use the WITH clause immediately preceding of SELECT statements that include a SELECT clause as below:</p> <pre> CREATE TABLE ... WITH ... SELECT ... CREATE VIEW ... WITH ... SELECT ... INSERT ... WITH ... SELECT ... REPLACE ... WITH ... SELECT ... DECLARE CURSOR ... WITH ... SELECT ... EXPLAIN ... WITH ... SELECT ... </pre> <h3>Benefits of using CTE</h3> <ul> <li>It provides better readability of the query.</li> <li>It increases the performance of the query.</li> <li>The CTE allows us to use it as an alternative to the VIEW concept</li> <li>It can also be used as chaining of CTE for simplifying the query.</li> <li>It can also be used to implement recursive queries easily.</li> </ul> <hr></5)></p></5>

ثانيًا، يمكننا استخدام جملة NOT في بداية استعلام فرعي أو استعلام فرعي لجدول مشتق على النحو التالي:

 SELECT ... WHERE id IN (WITH ... SELECT ...); SELECT * FROM (WITH ... SELECT ...) AS derived_table; 

ثالثًا، يمكننا استخدام عبارة 'WTH' التي تسبق عبارات SELECT مباشرةً والتي تتضمن عبارة SELECT على النحو التالي:

 CREATE TABLE ... WITH ... SELECT ... CREATE VIEW ... WITH ... SELECT ... INSERT ... WITH ... SELECT ... REPLACE ... WITH ... SELECT ... DECLARE CURSOR ... WITH ... SELECT ... EXPLAIN ... WITH ... SELECT ... 

فوائد استخدام CTE

  • يوفر إمكانية قراءة أفضل للاستعلام.
  • أنه يزيد من أداء الاستعلام.
  • يسمح لنا CTE باستخدامه كبديل لمفهوم VIEW
  • ويمكن استخدامه أيضًا كتسلسل لـ CTE لتبسيط الاستعلام.
  • ويمكن استخدامه أيضًا لتنفيذ الاستعلامات العودية بسهولة.