logo

MySQL Common Table Expression (CTE)

MySQL:ssä jokainen lauseke tai kysely tuottaa väliaikaisen tuloksen tai suhteen. Yleistä taulukkolauseketta tai CTE:tä käytetään nimeä ne väliaikaiset tulosjoukot jotka ovat kyseisen käskyn suoritusalueella, kuten CREATE, LISÄÄ , SELECT , PÄIVITTÄÄ , POISTAA , jne.

java kartta esimerkki

Jotkut CTE:hen liittyvistä avainkohdista ovat:

  • Se määritellään käyttämällä KANSSA lauseke.
  • WITH-lauseen avulla voimme määrittää useamman kuin yhden CTE:n yhdessä kyselyssä.
  • CTE voi viitata muihin CTE:ihin, jotka ovat osa samaa WITH-lausetta, mutta kyseiset CTE:t tulisi määrittää aikaisemmin.
  • CTE:n suoritusalue on tietyssä käskyssä, jossa sitä käytetään.

MySQL CTE syntaksi

MySQL CTE:n syntaksi sisältää nimen, valinnaisen sarakeluettelon ja lausunnon/kyselyn, joka määrittää yhteisen taulukkolausekkeen (CTE). Kun CTE on määritetty, voimme käyttää sitä näkymänä SELECT-, INSERT-, UPDATE- ja DELETE-kyselyissä.

Seuraava on CTE:n perussyntaksi MySQL :

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

Sen tarkoituksena on varmistaa, että CTE-argumenttien sarakkeiden lukumäärän on oltava sama kuin kyselyn sarakkeiden lukumäärän. Jos emme ole määrittäneet CTE-argumenttien sarakkeita, se käyttää kyselysarakkeita, jotka määrittävät CTE:n.

Kuten johdettua taulukkoa, sitä ei voi tallentaa objektina ja se katoaa heti, kun kyselyn suorittaminen on valmis. CTE tarjoaa paremman luettavuuden ja parantaa myös suorituskykyä johdettuun taulukkoon verrattuna.

Toisin kuin johdettu taulukko, CTE on a alikysely se voi olla itseään viittaava käyttäen omaa nimeään. Se tunnetaan myös nimellä rekursiivinen CTE ja siihen voidaan viitata useita kertoja samassa kyselyssä.

Jotkut rekursiiviseen CTE:hen liittyvistä olennaisista kohdista ovat:

  • Se määritellään käyttämällä WITH RECURSIVE -lausetta.
  • Rekursiivisen CTE:n tulee sisältää päättävä ehto.
  • Käytämme rekursiivista CTE:tä hierarkkisen tai puurakenteisen datan sarjan luomiseen ja läpikulkuun.

MySQL:n rekursiivinen CTE-syntaksi

Seuraava on rekursiivisen CTE:n perussyntaksi MySQL:ssä:

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

Tässä alikysely on MySQL-kysely, joka viittaa itseensä käyttämällä cte_name omaa nimeään.

MySQL CTE -esimerkkejä

Ymmärrämme, kuinka CTE toimii MySQL:ssä käyttämällä erilaisia ​​esimerkkejä. Tässä aiomme käyttää pöytää 'työntekijät' mielenosoitusta varten. Oletetaan, että tämä taulukko sisältää seuraavat tiedot:

lambda-toiminto java
MySQL Common Table Expression (CTE)

Suorita seuraava lause ymmärtääksesi CTE:n käsitteen. Tässä esimerkissä CTE-nimi on työntekijä_kaliforniassa , CTE:n määrittelevä alikysely palauttaa kolme saraketta emp_name, emp_age ja city. Näin ollen CTE työntekijä_in_california palauttaa kaikki työntekijät, jotka sijaitsevat alueella Kalifornian kaupunki .

Kun olet määrittänyt CTE-työntekijän_kaliforniassa, olemme viitanneet siihen asiakirjassa VALITSE lausunto vain Kaliforniassa sijaitsevien työntekijöiden valinnasta.

 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; 

Kun yllä oleva lause on suoritettu, se antaa seuraavan tulosteen. Tässä voimme nähdä, että tulos palauttaa vain Kaliforniassa sijaitsevat työntekijätiedot.

pitkä int javaan
MySQL Common Table Expression (CTE)

Edistyneempi MySQL CTE -esimerkki

Oletetaan, että meillä on taulukko nimeltä asiakas ja Tilaus joka sisältää seuraavat tiedot:

Taulukko: asiakas

MySQL Common Table Expression (CTE)

Taulukko: tilaukset

MySQL Common Table Expression (CTE)

Katso alla oleva lausunto, joka selittää edistyneen CTE-esimerkin käyttämällä SISÄLIITTYMINEN lauseke.

alfa-beta karsiminen
 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); 

Suorituksen jälkeen saamme tulosteen seuraavasti:

MySQL Common Table Expression (CTE)

MySQL Rekursiivinen CTE-esimerkki

Seuraavat esimerkit selittävät rekursiivisen CTE:n toiminnan. Harkitse alla olevaa lausetta, joka luo sarjan viisi ensimmäistä paritonta numeroa :

 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>

Toiseksi voimme käyttää WITH-lausetta alikyselyn tai johdetun taulukon alikyselyn alussa seuraavasti:

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

Kolmanneksi voimme käyttää WITH-lausetta välittömästi ennen SELECT-lauseketta, jotka sisältävät SELECT-lauseen, kuten alla:

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

CTE:n käytön edut

  • Se tarjoaa paremman kyselyn luettavuuden.
  • Se lisää kyselyn suorituskykyä.
  • CTE antaa meille mahdollisuuden käyttää sitä vaihtoehtona VIEW-konseptille
  • Sitä voidaan käyttää myös CTE:n ketjutuksena kyselyn yksinkertaistamiseksi.
  • Sitä voidaan käyttää myös rekursiivisten kyselyiden toteuttamiseen helposti.