logo

Загальний табличний вираз MySQL (CTE)

У MySQL кожен оператор або запит створює тимчасовий результат або відношення. Використовується загальний табличний вираз або CTE назвіть цей набір тимчасових результатів які існують в межах виконання цього конкретного оператора, наприклад CREATE, ВСТАВИТИ , ВИБРАТИ , ОНОВЛЕННЯ , ВИДАЛИТИ і т.д.

генератор випадкових чисел у c

Ось деякі з ключових моментів, пов’язаних з CTE:

  • Визначається за допомогою З пункт.
  • Речення WITH дозволяє нам вказувати більше одного CTE в одному запиті.
  • CTE може посилатися на інші CTE, які є частиною того самого речення WITH, але ці CTE слід визначити раніше.
  • Область виконання CTE існує в конкретному операторі, в якому він використовується.

Синтаксис MySQL CTE

Синтаксис MySQL CTE включає ім'я, необов'язковий список стовпців і оператор/запит, який визначає загальний табличний вираз (CTE). Після визначення CTE ми можемо використовувати його як представлення в запитах SELECT, INSERT, UPDATE і DELETE.

Нижче наведено базовий синтаксис CTE в MySQL :

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

Це необхідно для того, щоб кількість стовпців в аргументах CTE збігалася з кількістю стовпців у запиті. Якщо ми не визначили стовпці в аргументах CTE, він використовуватиме стовпці запиту, які визначають CTE.

Подібно до похідної таблиці, її не можна зберігати як об’єкт і буде втрачено, щойно виконання запиту завершиться. CTE забезпечує кращу читабельність, а також підвищує продуктивність порівняно з похідною таблицею.

На відміну від похідної таблиці, CTE є a підзапит це може бути самопосилання використовуючи власну назву. Він також відомий як рекурсивний КТР а також на нього можна посилатися кілька разів в одному запиті.

Деякі важливі моменти, пов’язані з рекурсивним 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 на різних прикладах. Тут ми будемо використовувати таблицю 'працівники' для демонстрації. Припустимо, що ця таблиця містить такі дані:

абстракція в java
Загальний табличний вираз MySQL (CTE)

Виконайте наступний оператор, щоб зрозуміти концепцію CTE. У цьому прикладі це ім’я CTE працівник_в_каліфорнії , підзапит, який визначає CTE, повертає три стовпці emp_name, emp_age та city. Отже, CTE employee_in_california поверне всіх працівників, які знаходяться в Місто Каліфорнія .

Після визначення CTE employee_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; 

Після виконання наведеного вище оператора він видасть наступний результат. Тут ми бачимо, що результат повертає лише дані про співробітників, які знаходяться в Каліфорнії.

iskcon повна форма
Загальний табличний вираз MySQL (CTE)

Більш просунутий приклад MySQL CTE

Припустимо, у нас є таблиця з назвою клієнт і порядок який містить такі дані:

Таблиця: клієнт

Загальний табличний вираз MySQL (CTE)

Таблиця: замовлення

Загальний табличний вираз MySQL (CTE)

Перегляньте наведену нижче заяву, яка пояснює розширений приклад CTE за допомогою ВНУТРІШНЄ З'ЄДНАННЯ пункт.

черга в java
 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)

Приклад рекурсивного 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, як показано нижче:

 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 для спрощення запиту.
  • Його також можна використовувати для легкої реалізації рекурсивних запитів.