logo

„MySQL Common Table Expression“ (CTE)

„MySQL“ kiekvienas sakinys ar užklausa sukuria laikiną rezultatą arba ryšį. Tam naudojama įprasta lentelės išraiška arba CTE pavadinkite tuos laikinus rezultatų rinkinius kurie egzistuoja to konkretaus teiginio vykdymo srityje, pvz., CREATE, ĮDĖTI , PASIRINKTI , ATNAUJINTI , IŠTRINTI ir kt.

trečia normali forma

Kai kurie pagrindiniai dalykai, susiję su CTE, yra šie:

  • Jis apibrėžiamas naudojant SU sąlyga.
  • WITH sąlyga leidžia mums nurodyti daugiau nei vieną CTE vienoje užklausoje.
  • CTE gali nurodyti kitus CTE, kurie yra tos pačios sąlygos WITH dalis, tačiau tie CTE turėtų būti apibrėžti anksčiau.
  • CTE vykdymo sritis yra konkrečiame sakinyje, kuriame jis naudojamas.

MySQL CTE sintaksė

MySQL CTE sintaksė apima pavadinimą, pasirenkamą stulpelių sąrašą ir teiginį / užklausą, kuri apibrėžia bendrą lentelės išraišką (CTE). Apibrėžę CTE, galime naudoti jį kaip rodinį SELECT, INSERT, UPDATE ir DELETE užklausoje.

Toliau pateikiama pagrindinė CTE sintaksė MySQL :

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

Taip siekiama užtikrinti, kad stulpelių skaičius CTE argumentuose turi būti toks pat kaip ir užklausos stulpelių skaičius. Jei CTE argumentuose neapibrėžėme stulpelių, jis naudos užklausos stulpelius, kurie apibrėžia CTE.

Panašiai kaip išvestinė lentelė, ji negali būti saugoma kaip objektas ir bus prarasta, kai tik bus įvykdyta užklausa. CTE užtikrina geresnį skaitomumą ir padidina našumą, palyginti su išvestine lentele.

Skirtingai nuo išvestinės lentelės, CTE yra a antrinė užklausa tai gali būti savireferencija naudojant savo vardą. Jis taip pat žinomas kaip rekursinis CTE ir taip pat gali būti nurodoma kelis kartus toje pačioje užklausoje.

Kai kurie esminiai punktai, susiję su rekursiniu CTE, yra šie:

  • Jis apibrėžiamas naudojant WITH RECURSIVE sąlygą.
  • Rekursyviniame CTE turi būti baigiamoji sąlyga.
  • Mes naudosime rekursyvų CTE hierarchinių arba medžio struktūros duomenų serijoms generuoti ir pereiti.

MySQL rekursinė CTE sintaksė

Toliau pateikiama pagrindinė rekursinio CTE sintaksė MySQL:

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

Čia antrinė užklausa yra MySQL užklausa, kuri nurodo save naudojant cte_name kaip savo pavadinimą.

MySQL CTE pavyzdžiai

Leiskite mums suprasti, kaip CTE veikia MySQL, naudodami įvairius pavyzdžius. Čia mes naudosime lentelę 'darbuotojai' demonstracijai. Tarkime, kad šioje lentelėje yra šie duomenys:

np.log
„MySQL Common Table Expression“ (CTE)

Norėdami suprasti CTE sąvoką, atlikite šį teiginį. Šiame pavyzdyje CTE pavadinimas yra darbuotojas_kalifornijoje , antrinė užklausa, apibrėžianti CTE, pateikia tris stulpelius emp_name, emp_age ir city. Taigi CTE darbuotojas_kalifornijoje grąžins visus darbuotojus, esančius šioje Kalifornijos miestas .

Apibrėžę CTE darbuotojas_kalifornijoje, mes jį nurodėme PASIRINKTI pareiškimas, kad atrenkami tik tie darbuotojai, kurie yra Kalifornijoje.

 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; 

Įvykdęs aukščiau pateiktą teiginį, jis duos tokią išvestį. Čia matome, kad rezultate pateikiami tik Kalifornijoje esančių darbuotojų duomenys.

palyginti java eilutę
„MySQL Common Table Expression“ (CTE)

Pažangesnis MySQL CTE pavyzdys

Tarkime, kad turime lentelę pavadinimu klientas ir įsakymas kuriame yra šie duomenys:

Stalas: klientas

„MySQL Common Table Expression“ (CTE)

Stalas: užsakymai

„MySQL Common Table Expression“ (CTE)

Žr. toliau pateiktą teiginį, kuriame paaiškinamas išplėstinis CTE pavyzdys naudojant VIDINIS PRISIJUNGIMAS sąlyga.

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

Po vykdymo gausime išvestį, kaip nurodyta toliau:

„MySQL Common Table Expression“ (CTE)

MySQL rekursinis CTE pavyzdys

Šie pavyzdžiai paaiškina rekursinio CTE veikimą. Apsvarstykite toliau pateiktą teiginį, kuris generuoja eilę pirmieji penki nelyginiai skaičiai :

 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>

Antra, galime naudoti sąlygą WITH antrinės užklausos arba išvestinės lentelės antrinės užklausos pradžioje, kaip nurodyta toliau:

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

Trečia, galime naudoti sąlygą WITH prieš pat SELECT teiginius, kuriuose yra SELECT sąlyga, kaip nurodyta toliau:

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

CTE naudojimo pranašumai

  • Tai užtikrina geresnį užklausos skaitomumą.
  • Tai padidina užklausos našumą.
  • CTE leidžia mums jį naudoti kaip alternatyvą VIEW koncepcijai
  • Jis taip pat gali būti naudojamas kaip CTE grandinės sujungimas, siekiant supaprastinti užklausą.
  • Jis taip pat gali būti naudojamas norint lengvai įgyvendinti rekursines užklausas.