В 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
Изпълнете следния оператор, за да разберете концепцията за 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
Да предположим, че имаме таблица с име клиент и поръчка който съдържа следните данни:
Маса: клиент
Таблица: поръчки
Вижте изявлението по-долу, което обяснява примера за разширен 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);
След изпълнение ще получим резултата, както е показано по-долу:
Пример за рекурсивен 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 'id' and 'n' 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'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 за опростяване на заявката.
- Може да се използва и за лесно изпълнение на рекурсивни заявки.
5)>5>