logo

MySQL Common Table Expression (CTE)

V MySQL každý příkaz nebo dotaz vytváří dočasný výsledek nebo vztah. Používá se běžný tabulkový výraz nebo CTE pojmenujte tyto dočasné výsledky které existují v rozsahu provádění tohoto konkrétního příkazu, jako je CREATE, VLOŽIT , VYBRAT , AKTUALIZACE , VYMAZAT , atd.

příklady kódu c#

Některé z klíčových bodů souvisejících s CTE jsou:

  • Je definován pomocí S doložka.
  • Klauzule WITH nám umožňuje zadat více než jeden CTE v jednom dotazu.
  • CTE může odkazovat na další CTE, které jsou součástí stejné klauzule WITH, ale tyto CTE by měly být definovány dříve.
  • Rozsah provádění CTE existuje v konkrétním příkazu, ve kterém je použit.

Syntaxe MySQL CTE

Syntaxe MySQL CTE zahrnuje název, volitelný seznam sloupců a příkaz/dotaz, který definuje společný tabulkový výraz (CTE). Po definování CTE jej můžeme použít jako pohled v dotazech SELECT, INSERT, UPDATE a DELETE.

Níže je uvedena základní syntaxe CTE in MySQL :

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

Je to zajistit, že počet sloupců v argumentech CTE musí být stejný jako počet sloupců v dotazu. Pokud jsme nedefinovali sloupce v argumentech CTE, použije sloupce dotazu, které definují CTE.

Podobně jako odvozenou tabulku ji nelze uložit jako objekt a bude ztracena, jakmile bude dokončeno provedení dotazu. CTE poskytuje lepší čitelnost a také zvyšuje výkon ve srovnání s odvozenou tabulkou.

Na rozdíl od odvozené tabulky je CTE a poddotaz to může být sebereferencování pomocí vlastního jména. Je také známý jako rekurzivní CTE a lze na ně také odkazovat vícekrát ve stejném dotazu.

Některé ze základních bodů souvisejících s rekurzivním CTE jsou:

  • Je definována pomocí klauzule WITH RECURSIVE.
  • Rekurzivní CTE musí obsahovat ukončovací podmínku.
  • Rekurzivní CTE použijeme pro generování sérií a procházení hierarchických nebo stromově strukturovaných dat.

Rekurzivní syntaxe MySQL CTE

Níže je uvedena základní syntaxe rekurzivního CTE v MySQL:

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

Zde je poddotaz dotaz MySQL, který se sám odkazuje pomocí cte_name jako svého vlastního jména.

Příklady MySQL CTE

Pojďme pochopit, jak CTE funguje v MySQL na různých příkladech. Zde použijeme tabulku 'zaměstnanci' na ukázku. Předpokládejme, že tato tabulka obsahuje následující údaje:

co je hashset java
MySQL Common Table Expression (CTE)

Chcete-li porozumět konceptu CTE, proveďte následující příkaz. V tomto příkladu je název CTE zaměstnanec_v_kalifornii , poddotaz, který definuje CTE, vrátí tři sloupce emp_name, emp_age a city. CTE staff_in_california tedy vrátí všechny zaměstnance, kteří se nacházejí v Kalifornské město .

Po definování CTE staff_in_california jsme na něj odkazovali v VYBRAT prohlášení pro výběr pouze těch zaměstnanců, kteří se nacházejí v Kalifornii.

 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 provedení výše uvedeného příkazu poskytne následující výstup. Zde vidíme, že výsledek vrací pouze data zaměstnanců, kteří se nacházejí v Kalifornii.

MySQL Common Table Expression (CTE)

Pokročilejší příklad MySQL CTE

Předpokládejme, že máme tabulku pojmenovanou zákazník a objednat který obsahuje následující údaje:

Tabulka: zákazník

double to string java
MySQL Common Table Expression (CTE)

Tabulka: objednávky

MySQL Common Table Expression (CTE)

Viz níže uvedené prohlášení, které vysvětluje pokročilý příklad CTE pomocí VNITŘNÍ SPOJENÍ doložka.

 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 provedení získáme výstup, jak je uvedeno níže:

system.out.println
MySQL Common Table Expression (CTE)

Příklad Rekurzivního CTE MySQL

Následující příklady vysvětlují fungování rekurzivního CTE. Zvažte níže uvedené prohlášení, které generuje řadu prvních pět lichých čísel :

 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>

Za druhé, můžeme použít klauzuli WITH na začátku poddotazu nebo poddotazu odvozené tabulky, jak je uvedeno níže:

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

Za třetí, můžeme použít klauzuli WITH bezprostředně předcházející příkazům SELECT, které obsahují klauzuli SELECT, jak je uvedeno níže:

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

Výhody použití CTE

  • Poskytuje lepší čitelnost dotazu.
  • Zvyšuje výkon dotazu.
  • CTE nám umožňuje používat jej jako alternativu ke konceptu VIEW
  • Může být také použit jako řetězení CTE pro zjednodušení dotazu.
  • Může být také použit pro snadnou implementaci rekurzivních dotazů.