logo

MySQL kopējā tabulas izteiksme (CTE)

MySQL katrs paziņojums vai vaicājums rada pagaidu rezultātu vai relāciju. Tiek izmantota parastā tabulas izteiksme vai CTE nosauciet šīs pagaidu rezultātu kopas kas atrodas konkrētā paziņojuma izpildes tvērumā, piemēram, CREATE, IEVIETOT , IZVĒLĒTIES , ATJAUNINĀT , DZĒST utt.

1 miljons cik 0

Daži no galvenajiem punktiem saistībā ar CTE ir:

  • To nosaka, izmantojot AR klauzula.
  • WITH klauzula ļauj mums norādīt vairāk nekā vienu CTE vienā vaicājumā.
  • CTE var atsaukties uz citiem CTE, kas ir daļa no tās pašas WITH klauzulas, taču šie CTE ir jādefinē agrāk.
  • CTE izpildes joma pastāv konkrētajā paziņojumā, kurā tas tiek izmantots.

MySQL CTE sintakse

MySQL CTE sintakse ietver nosaukumu, neobligātu kolonnu sarakstu un paziņojumu/vaicājumu, kas definē kopējo tabulas izteiksmi (CTE). Pēc CTE definēšanas mēs to varam izmantot kā skatu vaicājumā SELECT, INSERT, UPDATE un DELETE.

Tālāk ir norādīta CTE pamata sintakse MySQL :

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

Tas ir paredzēts, lai nodrošinātu, ka kolonnu skaitam CTE argumentos ir jābūt tādam pašam kā kolonnu skaitam vaicājumā. Ja mēs neesam definējuši kolonnas CTE argumentos, tas izmantos vaicājuma kolonnas, kas definē CTE.

Līdzīgi kā atvasināto tabulu, to nevar saglabāt kā objektu, un tā tiks zaudēta, tiklīdz vaicājuma izpilde būs pabeigta. CTE nodrošina labāku lasāmību un arī palielina veiktspēju salīdzinājumā ar atvasināto tabulu.

Atšķirībā no atvasinātas tabulas, CTE ir a apakšvaicājums tā var būt uz sevi atsaucoties izmantojot savu nosaukumu. Tas ir pazīstams arī kā rekursīvs CTE un tajā pašā vaicājumā var arī norādīt vairākas reizes.

Daži no būtiskiem punktiem, kas saistīti ar rekursīvo CTE, ir:

  • To nosaka, izmantojot WITH RECURSIVE klauzulu.
  • Rekursīvajam CTE ir jāietver beigu nosacījums.
  • Mēs izmantosim rekursīvo CTE hierarhisku vai koku strukturētu datu sēriju ģenerēšanai un šķērsošanai.

MySQL rekursīvā CTE sintakse

Šī ir rekursīvās CTE pamata sintakse MySQL:

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

Šeit apakšvaicājums ir MySQL vaicājums, kas atsaucas uz sevi, izmantojot cte_name kā savu nosaukumu.

MySQL CTE piemēri

Ļaujiet mums saprast, kā CTE darbojas MySQL, izmantojot dažādus piemērus. Šeit mēs izmantosim tabulu 'darbinieki' par demonstrāciju. Pieņemsim, ka šajā tabulā ir šādi dati:

nejauši c
MySQL kopējā tabulas izteiksme (CTE)

Izpildiet šo paziņojumu, lai saprastu CTE jēdzienu. Šajā piemērā CTE nosaukums ir darbinieks_kalifornijā , apakšvaicājums, kas definē CTE, atgriež trīs kolonnas emp_name, emp_age un city. Tādējādi CTE darbinieks_kalifornijā atgriezīs visus darbiniekus, kas atrodas Kalifornijas pilsēta .

Pēc CTE darbinieka_kalifornijā definēšanas mēs uz to esam atsaukušies dokumentā ATLASĪT paziņojums par to darbinieku atlasi, kuri atrodas Kalifornijā.

 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; 

Pēc iepriekš minētā paziņojuma izpildes tas sniegs šādu izvadi. Šeit mēs redzam, ka rezultāts atgriež tikai darbinieku datus, kas atrodas Kalifornijā.

MySQL kopējā tabulas izteiksme (CTE)

Uzlabotāks MySQL CTE piemērs

Pieņemsim, ka mums ir tabula ar nosaukumu klientu un pasūtījums kas satur šādus datus:

Tabula: klients

atšķirība starp $ un $ $
MySQL kopējā tabulas izteiksme (CTE)

Tabula: pasūtījumi

MySQL kopējā tabulas izteiksme (CTE)

Skatiet tālāk sniegto paziņojumu, kurā izskaidrots uzlabotais CTE piemērs, izmantojot IEKŠĒJĀ PIEVIENOŠANĀS 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); 

Pēc izpildes mēs saņemsim tālāk norādīto izvadi:

MySQL kopējā tabulas izteiksme (CTE)

MySQL rekursīvās CTE piemērs

Sekojošie piemēri izskaidro rekursīvā CTE darbību. Apsveriet tālāk sniegto paziņojumu, kas ģenerē virkni pirmie pieci nepāra skaitļi :

 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>

Otrkārt, mēs varam izmantot klauzulu WITH apakšvaicājuma vai atvasinātas tabulas apakšvaicājuma sākumā, kā norādīts tālāk:

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

Treškārt, mēs varam izmantot klauzulu WITH tieši pirms SELECT priekšrakstiem, kas ietver SELECT klauzulu, kā norādīts tālāk:

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

CTE lietošanas priekšrocības

  • Tas nodrošina labāku vaicājuma lasāmību.
  • Tas palielina vaicājuma veiktspēju.
  • CTE ļauj mums to izmantot kā alternatīvu VIEW koncepcijai
  • To var izmantot arī kā CTE ķēdi, lai vienkāršotu vaicājumu.
  • To var arī izmantot, lai viegli ieviestu rekursīvus vaicājumus.

javascript base64 atšifrējums