logo

MySQL Common Table Expression (CTE)

ב-MySQL, כל הצהרה או שאילתה מייצרים תוצאה או קשר זמני. ביטוי טבלה נפוץ או CTE משמש תן שם לקבוצת התוצאות הזמניות שקיימים בטווח הביצוע של ההצהרה המסוימת, כגון CREATE, לְהַכנִיס , בחר , עדכון , לִמְחוֹק , וכו.

1 מיליון כמה 0

חלק מנקודות המפתח הקשורות ל-CTE הן:

  • הוא מוגדר על ידי שימוש ב- עם סָעִיף.
  • סעיף WITH מאפשר לנו לציין יותר מ-CTE אחד בשאילתה אחת.
  • CTE יכול להתייחס ל-CTEs אחרים שהם חלק מאותו סעיף WITH, אך יש להגדיר את ה-CTE הללו מוקדם יותר.
  • היקף הביצוע של CTE קיים בתוך ההצהרה הספציפית שבה הוא משמש.

תחביר MySQL CTE

התחביר של MySQL CTE כולל את השם, רשימת עמודות אופציונלית והצהרה/שאילתה המגדירים את ביטוי הטבלה המשותף (CTE). לאחר הגדרת ה-CTE, נוכל להשתמש בו כתצוגה בשאילתת SELECT, INSERT, UPDATE ומחק.

להלן התחביר הבסיסי של CTE ב MySQL :

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

זה להבטיח שמספר העמודות בארגומנטים של CTE חייב להיות זהה למספר העמודות בשאילתה. אם לא הגדרנו את העמודות בארגומנטים של CTE, הוא ישתמש בעמודות השאילתה שמגדירות את ה-CTE.

בדומה לטבלה הנגזרת, לא ניתן לאחסן אותה כאובייקט והיא תאבד ברגע שביצוע השאילתה הושלם. CTE מספק קריאה טובה יותר וגם מגדיל את הביצועים בהשוואה לטבלה הנגזרת.

בניגוד לטבלה נגזרת, CTE הוא א שאילתת משנה זה יכול להיות התייחסות עצמית משתמש בשם משלו. זה ידוע גם בשם CTE רקורסיבי וניתן גם להפנות אליו מספר פעמים באותה שאילתה.

כמה מהנקודות החיוניות הקשורות ל-CTE רקורסיבי הן:

  • הוא מוגדר על ידי שימוש בסעיף WITH RECURSIVE.
  • CTE רקורסיבי חייב להכיל תנאי מסיים.
  • אנו נשתמש ב-CTE רקורסיבי ליצירת סדרות ומעבר של נתונים היררכיים או במבנה עצים.

תחביר CTE רקורסיבי של MySQL

להלן התחביר הבסיסי של CTE רקורסיבי ב-MySQL:

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

כאן, שאילתת המשנה היא שאילתת MySQL הפנתה את עצמה על ידי שימוש ב-cte_name כשמה שלה.

דוגמאות של MySQL CTE

תן לנו להבין איך CTE עובד ב-MySQL באמצעות דוגמאות שונות. כאן, אנחנו הולכים להשתמש בטבלה 'עובדים' להפגנה. נניח שטבלה זו מכילה את הנתונים הבאים:

c מבנה במבנה
MySQL Common Table Expression (CTE)

בצע את ההצהרה הבאה כדי להבין את המושג CTE. בדוגמה זו, שם ה-CTE הוא עובד_בקליפורניה , שאילתת המשנה המגדירה את ה-CTE מחזירה את שלוש העמודות emp_name, emp_age ו-city. לפיכך, עובד CTE_in_california יחזיר את כל העובדים שנמצאים ב- עיר קליפורניה .

לאחר הגדרת ה-CTE working_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; 

לאחר ביצוע ההצהרה לעיל, הוא ייתן את הפלט הבא. כאן, אנו יכולים לראות שהתוצאה מחזירה רק את נתוני העובדים שנמצאים בקליפורניה.

np.random.rand
MySQL Common Table Expression (CTE)

הדוגמה המתקדמת יותר של MySQL CTE

נניח שיש לנו טבלה בשם צרכן ו להזמין שמכיל את הנתונים הבאים:

טבלה: לקוח

MySQL Common Table Expression (CTE)

טבלה: הזמנות

MySQL Common Table Expression (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 Common Table Expression (CTE)

דוגמה ל-CTE רקורסיבית של MySQL

הדוגמאות הבאות מסבירות את פעולתו של 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>

שנית, אנו יכולים להשתמש בסעיף WITH בתחילת שאילתת משנה או שאילתת משנה נגזרת של טבלה כמפורט להלן:

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

שלישית, אנו יכולים להשתמש בפסקה WITH הקודמת למשפטי SELECT הכוללים משפט SELECT כמפורט להלן:

מחרוזת של מערך c
 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 כדי לפשט את השאילתה.
  • זה יכול לשמש גם כדי ליישם שאילתות רקורסיביות בקלות.