logo

MySQL Common Table Expression (CTE)

A MySQL-ben minden utasítás vagy lekérdezés ideiglenes eredményt vagy relációt produkál. Egy általános táblázatos kifejezést vagy CTE-t használnak nevezze el ezeket az ideiglenes eredményhalmazokat amelyek az adott utasítás végrehajtási hatókörén belül léteznek, mint például a CREATE, BESZÁLLÍTÁS , SELECT , FRISSÍTÉS , TÖRÖL stb.

rr algoritmus

A CTE-vel kapcsolatos legfontosabb szempontok közül néhány:

  • A segítségével határozható meg VAL VEL kikötés.
  • A WITH záradék lehetővé teszi, hogy egynél több CTE-t adjunk meg egyetlen lekérdezésben.
  • A CTE hivatkozhat más CTE-kre, amelyek ugyanannak a WITH-záradéknak a részét képezik, de ezeket a CTE-ket korábban meg kell határozni.
  • A CTE végrehajtási hatóköre az adott utasításon belül létezik, amelyben használják.

MySQL CTE szintaxis

A MySQL CTE szintaxisa tartalmazza a nevet, egy opcionális oszloplistát és egy utasítást/lekérdezést, amely meghatározza a közös táblakifejezést (CTE). A CTE meghatározása után nézetként használhatjuk a SELECT, INSERT, UPDATE és DELETE lekérdezésekben.

A következő a CTE alapvető szintaxisa MySQL :

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

Annak biztosítása, hogy a CTE argumentumokban lévő oszlopok számának meg kell egyeznie a lekérdezés oszlopainak számával. Ha nem definiáltuk az oszlopokat a CTE argumentumokban, akkor a CTE-t meghatározó lekérdezési oszlopokat fogja használni.

A származtatott táblához hasonlóan nem tárolható objektumként, és a lekérdezés végrehajtása után azonnal elveszik. A CTE jobb olvashatóságot biztosít, és növeli a teljesítményt a származtatott táblázathoz képest.

A származtatott táblákkal ellentétben a CTE a részlekérdezés az lehet önmagára utaló saját nevét használva. Úgy is ismert, mint rekurzív CTE és többször is hivatkozhat rájuk ugyanabban a lekérdezésben.

Néhány lényeges pont a rekurzív CTE-vel kapcsolatban:

  • A WITH RECURSIVE záradék használatával határozható meg.
  • A rekurzív CTE-nek tartalmaznia kell egy befejező feltételt.
  • A rekurzív CTE-t fogjuk használni hierarchikus vagy fastrukturált adatok sorozatgenerálására és bejárására.

MySQL rekurzív CTE szintaxis

A következő a rekurzív CTE alapvető szintaxisa a MySQL-ben:

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

Itt az allekérdezés egy MySQL lekérdezés, amely önmagára hivatkozik a cte_name saját neveként.

MySQL CTE példák

Különféle példákon keresztül értsük meg, hogyan működik a CTE a MySQL-ben. Itt egy táblázatot fogunk használni 'alkalmazottak' egy demonstrációra. Tegyük fel, hogy ez a táblázat a következő adatokat tartalmazza:

listakészítés java-ban
MySQL Common Table Expression (CTE)

Hajtsa végre a következő utasítást a CTE fogalmának megértéséhez. Ebben a példában a CTE neve a következő alkalmazott_kaliforniában , a CTE-t meghatározó részlekérdezés a három oszlopot adja vissza: emp_name, emp_age és city. Ennélfogva a CTE_in_california munkavállalója visszaküldi az összes olyan alkalmazottat, aki az országban található Kaliforniai város .

A CTE-alkalmazott_kaliforniában meghatározása után hivatkoztunk rá a KIVÁLASZTÁS nyilatkozat csak a kaliforniai alkalmazottak kiválasztására vonatkozóan.

 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; 

A fenti utasítás végrehajtása után a következő kimenetet adja. Itt láthatjuk, hogy az eredmény csak a Kaliforniában található munkavállalói adatokat adja vissza.

feladatkezelő Linuxhoz
MySQL Common Table Expression (CTE)

A fejlettebb MySQL CTE példa

Tegyük fel, hogy van egy nevű táblázatunk vevő és rendelés amely a következő adatokat tartalmazza:

Asztal: vevő

MySQL Common Table Expression (CTE)

Táblázat: rendelések

MySQL Common Table Expression (CTE)

Lásd az alábbi nyilatkozatot, amely elmagyarázza a fejlett CTE-példát a BELSŐ ÖSSZEKAPCSOLÁS kikötés.

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

A végrehajtás után az alábbi kimenetet kapjuk:

MySQL Common Table Expression (CTE)

MySQL rekurzív CTE példa

A következő példák a rekurzív CTE működését mutatják be. Tekintsük az alábbi állítást, amely egy sorozatot generál az első öt páratlan szám :

latex betűméret
 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>

Másodszor, használhatjuk a WITH záradékot egy segédlekérdezés vagy egy származtatott tábla-allekérdezés elején, az alábbiak szerint:

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

Harmadszor, használhatjuk a WITH záradékot közvetlenül a SELECT utasításokat megelőzően, amelyek SELECT záradékot tartalmaznak, az alábbiak szerint:

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

A CTE használatának előnyei

  • A lekérdezés jobb olvashatóságát biztosítja.
  • Növeli a lekérdezés teljesítményét.
  • A CTE lehetővé teszi számunkra, hogy a VIEW koncepció alternatívájaként használjuk
  • Használható a CTE láncolásaként is a lekérdezés egyszerűsítésére.
  • Rekurzív lekérdezések egyszerű megvalósítására is használható.