I MySQL producerar varje påstående eller fråga ett tillfälligt resultat eller en tillfällig relation. Ett vanligt tabelluttryck eller CTE används för namnge dessa tillfälliga resultatuppsättningar som finns inom exekveringsomfånget för det specifika uttalandet, såsom CREATE, FÖRA IN , VÄLJ , UPPDATERING , RADERA , etc.
sträng i array i c
Några av nyckelpunkterna relaterade till CTE är:
- Den definieras med hjälp av MED klausul.
- WITH-satsen tillåter oss att specificera mer än en CTE i en enda fråga.
- En CTE kan referera till andra CTE:er som ingår i samma WITH-klausul, men dessa CTE:er bör definieras tidigare.
- Exekveringsomfånget för CTE finns inom den specifika satsen i vilken den används.
MySQL CTE-syntax
Syntaxen för MySQL CTE inkluderar namnet, en valfri kolumnlista och en sats/fråga som definierar det gemensamma tabelluttrycket (CTE). Efter att ha definierat CTE kan vi använda den som en vy i en SELECT-, INSERT-, UPDATE- och DELETE-fråga.
Följande är den grundläggande syntaxen för CTE i MySQL :
WITH cte_name (column_names) AS (query) SELECT * FROM cte_name;
Det är för att säkerställa att antalet kolumner i CTE-argumenten måste vara detsamma som antalet kolumner i frågan. Om vi inte har definierat kolumnerna i CTE-argumenten kommer den att använda frågekolumnerna som definierar CTE.
I likhet med den härledda tabellen kan den inte lagras som ett objekt och kommer att gå förlorad så snart exekveringen av en fråga är klar. En CTE ger bättre läsbarhet och ökar även prestandan jämfört med den härledda tabellen.
Till skillnad från en härledd tabell är en CTE en underfråga det kan vara självrefererande med sitt eget namn. Det är också känt som rekursiv CTE och kan även refereras flera gånger i samma fråga.
Några av de väsentliga punkterna relaterade till den rekursiva CTE är:
- Den definieras med hjälp av WITH RECURSIVE-satsen.
- En rekursiv CTE måste innehålla ett terminerande villkor.
- Vi kommer att använda den rekursiva CTE för seriegenerering och genomgång av hierarkiska eller trädstrukturerade data.
MySQL rekursiv CTE-syntax
Följande är den grundläggande syntaxen för rekursiv CTE i MySQL:
WITH RECURSIVE cte_name (column_names) AS ( subquery ) SELECT * FROM cte_name;
Här är underfrågan en MySQL-fråga som refererar sig själv genom att använda cte_name som sitt eget namn.
MySQL CTE-exempel
Låt oss förstå hur CTE fungerar i MySQL med hjälp av olika exempel. Här ska vi använda ett bord 'anställda' för en demonstration. Anta att denna tabell innehåller följande data:
byte array till sträng java
Utför följande påstående för att förstå begreppet CTE. I det här exemplet är CTE-namnet anställd_i_kalifornien , returnerar underfrågan som definierar CTE de tre kolumnerna emp_name, emp_age och city. Därför kommer CTE-employee_in_california att returnera alla anställda som finns i Kalifornien stad .
Efter att ha definierat CTE-medarbetaren_i_californien, har vi hänvisat till det i VÄLJ uttalande för att endast välja de anställda som finns i Kalifornien.
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;
Efter att ha kört ovanstående sats kommer den att ge följande utdata. Här kan vi se att resultatet endast returnerar personaldata som finns i Kalifornien.
modifieringsnycklar
Det mer avancerade MySQL CTE-exemplet
Anta att vi har en tabell som heter kund och beställa som innehåller följande data:
Tabell: kund
Tabell: beställningar
Se nedanstående uttalande som förklarar avancerad CTE-exempel med hjälp av INRE KOPPLING 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);
Efter exekvering kommer vi att få utdata enligt nedan:
MySQL Rekursiv CTE Exempel
Följande exempel förklarar hur den rekursiva CTE fungerar. Betrakta nedanstående uttalande som genererar en serie av första fem udda siffror :
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 'id' and 'n' 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'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>
För det andra kan vi använda WITH-satsen i början av en underfråga eller en härledd tabellunderfråga enligt nedan:
SELECT ... WHERE id IN (WITH ... SELECT ...); SELECT * FROM (WITH ... SELECT ...) AS derived_table;
För det tredje kan vi använda WITH-satsen omedelbart före SELECT-satser som inkluderar en SELECT-sats enligt nedan:
lär dig noggrannhetspoäng
CREATE TABLE ... WITH ... SELECT ... CREATE VIEW ... WITH ... SELECT ... INSERT ... WITH ... SELECT ... REPLACE ... WITH ... SELECT ... DECLARE CURSOR ... WITH ... SELECT ... EXPLAIN ... WITH ... SELECT ...
Fördelar med att använda CTE
- Det ger bättre läsbarhet för frågan.
- Det ökar prestandan för frågan.
- CTE tillåter oss att använda den som ett alternativ till VIEW-konceptet
- Den kan också användas som kedja av CTE för att förenkla frågan.
- Det kan också användas för att enkelt implementera rekursiva frågor.
5)>5>