logo

MySQL Common Table Express (CTE)

U MySQL-u svaka izjava ili upit proizvodi privremeni rezultat ili relaciju. Koristi se uobičajeni tablični izraz ili CTE navedite taj skup privremenih rezultata koji postoje unutar opsega izvršenja te određene naredbe, kao što je CREATE, UMETNUTI , IZABERI , AŽURIRAJ , IZBRISATI itd.

regexp_like u mysql-u

Neke od ključnih točaka vezanih uz CTE su:

  • Definira se pomoću S klauzula.
  • Klauzula WITH omogućuje nam da navedemo više od jednog CTE-a u jednom upitu.
  • CTE može referencirati druge CTE-ove koji su dio iste klauzule WITH, ali te CTE-ove treba definirati ranije.
  • Opseg izvršenja CTE-a postoji unutar određene izjave u kojoj se koristi.

MySQL CTE sintaksa

Sintaksa MySQL CTE uključuje naziv, izborni popis stupaca i naredbu/upit koji definira izraz zajedničke tablice (CTE). Nakon definiranja CTE-a, možemo ga koristiti kao prikaz u upitu SELECT, INSERT, UPDATE i DELETE.

Slijedi osnovna sintaksa CTE u MySQL :

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

Treba osigurati da broj stupaca u CTE argumentima mora biti isti kao i broj stupaca u upitu. Ako nismo definirali stupce u CTE argumentima, koristit će se stupci upita koji definiraju CTE.

Slično kao i izvedena tablica, ne može se pohraniti kao objekt i bit će izgubljena čim se izvrši upit. CTE pruža bolju čitljivost i također povećava performanse u usporedbi s izvedenom tablicom.

Za razliku od izvedene tablice, CTE je a podupit to može biti samoreferenciranje koristeći vlastito ime. Također je poznat kao rekurzivni CTE a također se može referencirati više puta u istom upitu.

Neke od bitnih točaka vezanih uz rekurzivni CTE su:

  • Definira se korištenjem klauzule WITH RECURSIVE.
  • Rekurzivni CTE mora sadržavati završni uvjet.
  • Koristit ćemo rekurzivni CTE za generiranje serija i obilaženje hijerarhijskih ili stablo strukturiranih podataka.

MySQL rekurzivna CTE sintaksa

Slijedi osnovna sintaksa rekurzivnog CTE-a u MySQL-u:

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

Ovdje je podupit MySQL upit koji se sam referira koristeći cte_name kao vlastito ime.

MySQL CTE primjeri

Razmotrimo kako CTE radi u MySQL koristeći različite primjere. Ovdje ćemo koristiti tablicu 'zaposlenici' za demonstraciju. Pretpostavimo da ova tablica sadrži sljedeće podatke:

obilazak stabla
MySQL Common Table Express (CTE)

Izvršite sljedeću izjavu da biste razumjeli koncept CTE. U ovom primjeru naziv CTE je zaposlenik_u_kaliforniji , podupit koji definira CTE vraća tri stupca emp_name, emp_age i city. Stoga će CTE employee_in_california vratiti sve zaposlenike koji se nalaze u grad u Kaliforniji .

Nakon definiranja CTE zaposlenika_u_Kaliforniji, referencirali smo ga u IZABERI izjava za odabir samo onih zaposlenika koji se nalaze u 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; 

Nakon izvršenja gornje naredbe, dat će sljedeći izlaz. Ovdje možemo vidjeti da rezultat vraća samo podatke o zaposlenicima koji se nalaze u Kaliforniji.

MySQL Common Table Express (CTE)

Napredniji MySQL CTE primjer

Pretpostavimo da imamo tablicu pod imenom kupac i narudžba koji sadrži sljedeće podatke:

Stol: kupac

string.compare c#
MySQL Common Table Express (CTE)

Tablica: narudžbe

MySQL Common Table Express (CTE)

Pogledajte donju izjavu koja objašnjava primjer naprednog CTE-a pomoću UNUTARNJI SPOJ klauzula.

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

Nakon izvršenja, dobit ćemo izlaz kao u nastavku:

MySQL Common Table Express (CTE)

MySQL rekurzivni CTE primjer

Sljedeći primjeri objašnjavaju rad rekurzivnog CTE-a. Razmotrite donju izjavu koja generira niz prvih pet neparnih brojeva :

 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>

Drugo, možemo koristiti klauzulu WITH na početku podupita ili podupita izvedene tablice kao u nastavku:

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

Treće, možemo upotrijebiti klauzulu WITH koja neposredno prethodi naredbama SELECT koje uključuju klauzulu SELECT kao u nastavku:

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

Prednosti korištenja CTE

  • Omogućuje bolju čitljivost upita.
  • Povećava izvedbu upita.
  • CTE nam omogućuje da ga koristimo kao alternativu konceptu VIEW
  • Također se može koristiti kao ulančavanje CTE-a za pojednostavljenje upita.
  • Također se može koristiti za jednostavnu implementaciju rekurzivnih upita.

dereference pointer