logo

MySQL Common Table Expression (CTE)

I MySQL produserer hver setning eller spørring et midlertidig resultat eller relasjon. Et vanlig tabelluttrykk eller CTE brukes til navngi de midlertidige resultatene som eksisterer innenfor utførelsesomfanget til den aktuelle setningen, for eksempel CREATE, SETT INN , PLUKKE UT , OPPDATER , SLETT , etc.

liste metoder java

Noen av nøkkelpunktene knyttet til CTE er:

  • Det defineres ved å bruke MED klausul.
  • WITH-klausulen lar oss spesifisere mer enn én CTE i en enkelt spørring.
  • En CTE kan referere til andre CTE-er som er en del av den samme WITH-klausulen, men disse CTE-ene bør defineres tidligere.
  • Utførelsesomfanget til CTE finnes innenfor den spesielle setningen den brukes i.

MySQL CTE-syntaks

Syntaksen til MySQL CTE inkluderer navnet, en valgfri kolonneliste og en setning/spørring som definerer det vanlige tabelluttrykket (CTE). Etter å ha definert CTE, kan vi bruke den som en visning i en SELECT-, INSERT-, UPDATE- og DELETE-spørring.

Følgende er den grunnleggende syntaksen til CTE i MySQL :

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

Det er for å sikre at antall kolonner i CTE-argumentene må være det samme som antall kolonner i spørringen. Hvis vi ikke har definert kolonnene i CTE-argumentene, vil den bruke spørringskolonnene som definerer CTE.

I likhet med den avledede tabellen kan den ikke lagres som et objekt og vil gå tapt så snart utførelsen av en spørring er fullført. En CTE gir bedre lesbarhet og øker også ytelsen sammenlignet med den utledede tabellen.

I motsetning til en avledet tabell, er en CTE en underspørring det kan være selvrefererende ved å bruke sitt eget navn. Det er også kjent som rekursiv CTE og kan også refereres flere ganger i samme spørring.

Noen av de essensielle punktene knyttet til den rekursive CTE er:

  • Det er definert ved å bruke WITH RECURSIVE-leddet.
  • En rekursiv CTE må inneholde en terminerende betingelse.
  • Vi vil bruke den rekursive CTE for seriegenerering og kryssing av hierarkiske eller trestrukturerte data.

MySQL rekursiv CTE-syntaks

Følgende er den grunnleggende syntaksen for rekursiv CTE i MySQL:

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

Her er underspørringen en MySQL-spørring som refererer seg selv ved å bruke cte_name som sitt eget navn.

MySQL CTE-eksempler

La oss forstå hvordan CTE fungerer i MySQL ved å bruke forskjellige eksempler. Her skal vi bruke et bord 'ansatte' for en demonstrasjon. Anta at denne tabellen inneholder følgende data:

størrelsen på vektor c++
MySQL Common Table Expression (CTE)

Utfør følgende setning for å forstå konseptet med CTE. I dette eksemplet er CTE-navnet ansatt_i_california , returnerer underspørringen som definerer CTE de tre kolonnene emp_name, emp_age og city. Derfor vil CTE-medarbeider_in_california returnere alle ansatte som befinner seg i California by .

Etter å ha definert CTE-ansatte_in_california, har vi referert til den i PLUKKE UT uttalelse for å velge bare de ansatte som er lokalisert i California.

 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; 

Etter å ha utført setningen ovenfor, vil den gi følgende utgang. Her kan vi se at resultatet kun returnerer de ansattes data som er lokalisert i California.

hvilket år ble datamaskinen oppfunnet
MySQL Common Table Expression (CTE)

Det mer avanserte MySQL CTE-eksemplet

Anta at vi har en tabell som heter kunde og rekkefølge som inneholder følgende data:

Tabell: kunde

MySQL Common Table Expression (CTE)

Tabell: bestillinger

MySQL Common Table Expression (CTE)

Se uttalelsen nedenfor som forklarer avansert CTE-eksempel ved å bruke INDRE BLI MED klausul.

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

Etter utførelse vil vi få utgangen som nedenfor:

MySQL Common Table Expression (CTE)

MySQL rekursiv CTE-eksempel

Følgende eksempler forklarer hvordan den rekursive CTE fungerer. Tenk på utsagnet nedenfor som genererer en serie av fem første oddetall :

 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>

For det andre kan vi bruke WITH-leddet i begynnelsen av en underspørring eller en avledet tabellunderspørring som nedenfor:

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

For det tredje kan vi bruke WITH-leddet umiddelbart foran SELECT-setninger som inkluderer en SELECT-ledd som nedenfor:

streng json java
 CREATE TABLE ... WITH ... SELECT ... CREATE VIEW ... WITH ... SELECT ... INSERT ... WITH ... SELECT ... REPLACE ... WITH ... SELECT ... DECLARE CURSOR ... WITH ... SELECT ... EXPLAIN ... WITH ... SELECT ... 

Fordeler med å bruke CTE

  • Det gir bedre lesbarhet av spørringen.
  • Det øker ytelsen til spørringen.
  • CTE lar oss bruke den som et alternativ til VIEW-konseptet
  • Den kan også brukes som kjeding av CTE for å forenkle spørringen.
  • Den kan også brukes til å implementere rekursive spørringer enkelt.