logo

MySQL Common Table Expression (CTE)

V MySQL vsaka izjava ali poizvedba ustvari začasen rezultat ali relacijo. Uporablja se izraz skupne tabele ali CTE poimenujte ta niz začasnih rezultatov ki obstajajo v obsegu izvajanja tega določenega stavka, kot je CREATE, VSTAVI , IZBERI , NADGRADNJA , IZBRIŠI itd.

niz nizov v jeziku c

Nekatere ključne točke, povezane s CTE, so:

  • Določen je z uporabo Z klavzula.
  • Klavzula WITH nam omogoča, da podamo več kot en CTE v eni poizvedbi.
  • CTE se lahko sklicuje na druge CTE, ki so del iste klavzule WITH, vendar je treba te CTE definirati prej.
  • Obseg izvajanja CTE obstaja v določenem stavku, v katerem se uporablja.

Sintaksa MySQL CTE

Sintaksa MySQL CTE vključuje ime, izbirni seznam stolpcev in izjavo/poizvedbo, ki definira izraz skupne tabele (CTE). Ko definiramo CTE, ga lahko uporabimo kot pogled v poizvedbi SELECT, INSERT, UPDATE in DELETE.

Sledi osnovna sintaksa CTE v MySQL :

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

Zagotoviti mora, da mora biti število stolpcev v argumentih CTE enako številu stolpcev v poizvedbi. Če nismo definirali stolpcev v argumentih CTE, bo uporabil stolpce poizvedbe, ki definirajo CTE.

Podobno kot izpeljano tabelo je ni mogoče shraniti kot objekt in bo izgubljena takoj, ko bo izvedba poizvedbe končana. CTE zagotavlja boljšo berljivost in tudi poveča zmogljivost v primerjavi z izpeljano tabelo.

Za razliko od izpeljane tabele je CTE a podpoizvedbo to je lahko samonanašanje z uporabo lastnega imena. Znan je tudi kot rekurzivni CTE in se lahko tudi večkrat sklicuje v isti poizvedbi.

Nekaj ​​bistvenih točk, povezanih z rekurzivnim CTE, je:

  • Definiran je z uporabo klavzule WITH RECURSIVE.
  • Rekurzivni CTE mora vsebovati končni pogoj.
  • Uporabili bomo rekurzivni CTE za ustvarjanje serij in prečkanje hierarhičnih ali drevesno strukturiranih podatkov.

Rekurzivna sintaksa MySQL CTE

Sledi osnovna sintaksa rekurzivnega CTE v MySQL:

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

Tu je podpoizvedba poizvedba MySQL, ki se sama sklicuje z uporabo cte_name kot lastnega imena.

Primeri MySQL CTE

Razumejmo, kako CTE deluje v MySQL na različnih primerih. Tukaj bomo uporabili tabelo 'zaposleni' za demonstracijo. Recimo, da ta tabela vsebuje naslednje podatke:

niz predmetov v Javi
MySQL Common Table Expression (CTE)

Izvedite naslednji stavek, da razumete koncept CTE. V tem primeru je ime CTE zaposleni_v_kaliforniji , podpoizvedba, ki definira CTE, vrne tri stolpce emp_name, emp_age in city. Zato bo CTE employee_in_california vrnil vse zaposlene, ki se nahajajo v Kalifornijsko mesto .

Po definiranju CTE employee_in_california smo se nanj sklicevali v IZBERI izjava za izbiro samo tistih zaposlenih, ki se nahajajo v Kaliforniji.

 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; 

Po izvedbi zgornjega stavka bo dal naslednji rezultat. Tukaj lahko vidimo, da rezultat vrne samo podatke o zaposlenih, ki se nahajajo v Kaliforniji.

array sort java
MySQL Common Table Expression (CTE)

Naprednejši primer MySQL CTE

Recimo, da imamo tabelo z imenom stranka in naročilo ki vsebuje naslednje podatke:

Tabela: stranka

MySQL Common Table Expression (CTE)

Tabela: naročila

MySQL Common Table Expression (CTE)

Oglejte si spodnjo izjavo, ki pojasnjuje primer naprednega CTE z uporabo NOTRANJI SPOJ klavzula.

protokol udp
 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 izvedbi bomo dobili izhod kot spodaj:

MySQL Common Table Expression (CTE)

Primer rekurzivnega CTE MySQL

Naslednji primeri pojasnjujejo delovanje rekurzivnega CTE. Razmislite o spodnji izjavi, ki ustvari vrsto prvih pet lihih številk :

 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>

Drugič, na začetku podpoizvedbe ali izpeljane podpoizvedbe tabele lahko uporabimo klavzulo WITH, kot je prikazano spodaj:

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

Tretjič, uporabimo lahko klavzulo WITH neposredno pred stavki SELECT, ki vključujejo klavzulo SELECT, kot je prikazano spodaj:

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

Prednosti uporabe CTE

  • Zagotavlja boljšo berljivost poizvedbe.
  • Poveča zmogljivost poizvedbe.
  • CTE nam omogoča, da ga uporabimo kot alternativo konceptu VIEW
  • Uporablja se lahko tudi kot veriženje CTE za poenostavitev poizvedbe.
  • Uporablja se lahko tudi za enostavno izvajanje rekurzivnih poizvedb.