logo

Expresia tabel comună MySQL (CTE)

În MySQL, fiecare instrucțiune sau interogare produce un rezultat sau o relație temporară. Este folosită o expresie de tabel comună sau CTE denumește acele set de rezultate temporare care există în domeniul de execuție al respectivei instrucțiuni, cum ar fi CREATE, INTRODUCE , SELECTAȚI , ACTUALIZAȚI , ȘTERGE , etc.

java aleatoriu matematică aleatorie

Unele dintre punctele cheie legate de CTE sunt:

  • Este definit prin utilizarea CU clauză.
  • Clauza WITH ne permite să specificăm mai mult de un CTE într-o singură interogare.
  • Un CTE poate face referire la alte CTE care fac parte din aceeași clauză WITH, dar acele CTE-uri ar trebui definite mai devreme.
  • Sfera de execuție a CTE există în cadrul instrucțiunii specifice în care este utilizat.

Sintaxa MySQL CTE

Sintaxa MySQL CTE include numele, o listă de coloane opțională și o instrucțiune/interogare care definește expresia tabelului comun (CTE). După definirea CTE, îl putem folosi ca vizualizare într-o interogare SELECT, INSERT, UPDATE și DELETE.

Următoarea este sintaxa de bază a CTE în MySQL :

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

Este pentru a se asigura că numărul de coloane din argumentele CTE trebuie să fie același cu numărul de coloane din interogare. Dacă nu am definit coloanele în argumentele CTE, va folosi coloanele de interogare care definesc CTE.

Similar cu tabelul derivat, acesta nu poate fi stocat ca obiect și va fi pierdut de îndată ce execuția unei interogări se încheie. Un CTE oferă o mai bună lizibilitate și, de asemenea, crește performanța în comparație cu tabelul derivat.

Spre deosebire de un tabel derivat, un CTE este a subinterogare asta poate fi auto-referire folosind propriul nume. Este cunoscut și ca CTE recursiv și poate fi, de asemenea, referit de mai multe ori în aceeași interogare.

Unele dintre punctele esențiale legate de CTE recursiv sunt:

  • Este definit prin utilizarea clauzei WITH RECURSIVE.
  • Un CTE recursiv trebuie să conțină o condiție de terminare.
  • Vom folosi CTE recursiv pentru generarea de serie și parcurgerea datelor ierarhice sau structurate în arbore.

Sintaxa CTE recursiva MySQL

Următoarea este sintaxa de bază a CTE recursiv în MySQL:

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

Aici, subinterogarea este o interogare MySQL care se referă la sine folosind cte_name ca propriul nume.

Exemple MySQL CTE

Să înțelegem cum funcționează CTE în MySQL folosind diverse exemple. Aici, vom folosi un tabel „angajați” pentru o demonstrație. Să presupunem că acest tabel conține următoarele date:

subliniați textul cu css
Expresia tabel comună MySQL (CTE)

Executați următoarea afirmație pentru a înțelege conceptul de CTE. În acest exemplu, numele CTE este angajat_in_california , subinterogarea care definește CTE returnează cele trei coloane emp_name, emp_age și oraș. Prin urmare, CTE employee_in_california va returna toți angajații care se află în Orașul California .

După ce am definit CTE employee_in_california, l-am referit în SELECTAȚI declarație pentru selectarea numai a acelor angajați care se află în 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; 

După executarea instrucțiunii de mai sus, va da următoarea ieșire. Aici, putem vedea că rezultatul returnează numai datele angajaților care se află în California.

Expresia tabel comună MySQL (CTE)

Exemplul mai avansat MySQL CTE

Să presupunem că avem un tabel numit client și Ordin care contine urmatoarele date:

Tabel: client

obiect al matricei în java
Expresia tabel comună MySQL (CTE)

Tabel: comenzi

Expresia tabel comună MySQL (CTE)

Consultați declarația de mai jos care explică exemplul CTE avansat folosind INNER JOIN clauză.

 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); 

După executare, vom obține rezultatul de mai jos:

Expresia tabel comună MySQL (CTE)

Exemplu CTE recursiv MySQL

Următoarele exemple explică funcționarea CTE recursiv. Luați în considerare declarația de mai jos care generează o serie de primele cinci numere impare :

 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>

În al doilea rând, putem folosi clauza WITH la începutul unei subinterogări sau a unei subinterogări de tabel derivate, după cum urmează:

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

În al treilea rând, putem folosi clauza WITH imediat anterioară instrucțiunilor SELECT care includ o clauză SELECT, după cum urmează:

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

Beneficiile utilizării CTE

  • Oferă o mai bună lizibilitate a interogării.
  • Mărește performanța interogării.
  • CTE ne permite să-l folosim ca alternativă la conceptul VIEW
  • Poate fi folosit și ca înlănțuire a CTE pentru simplificarea interogării.
  • Poate fi folosit și pentru a implementa cu ușurință interogări recursive.

actualizați în sql cu join