logo

Общ табличен израз на MySQL (CTE)

В MySQL всяко изявление или заявка произвежда временен резултат или връзка. Използва се общ израз на таблица или CTE наименувайте тези временни резултати които съществуват в обхвата на изпълнение на този конкретен оператор, като CREATE, ВМЪКНЕТЕ , ИЗБЕРЕТЕ , АКТУАЛИЗИРАНЕ , ИЗТРИЙ и т.н.

сравнение с java

Някои от ключовите точки, свързани с 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 и може също да бъде препратен многократно в една и съща заявка.

Някои от основните точки, свързани с рекурсивния 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; 

След изпълнение на горния оператор, той ще даде следния изход. Тук можем да видим, че резултатът връща само данните за служителите, които се намират в Калифорния.

филми от 123 до
Общ табличен израз на MySQL (CTE)

По-напредналият пример за MySQL CTE

Да предположим, че имаме таблица с име клиент и поръчка който съдържа следните данни:

Маса: клиент

Общ табличен израз на MySQL (CTE)

Таблица: поръчки

Общ табличен израз на MySQL (CTE)

Вижте изявлението по-долу, което обяснява примера за разширен CTE с помощта на ВЪТРЕШНО СЪЕДИНЕНИЕ клауза.

numpy средно
 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 за опростяване на заявката.
  • Може да се използва и за лесно изпълнение на рекурсивни заявки.