logo

MySQL 共通テーブル式 (CTE)

MySQL では、すべてのステートメントまたはクエリが一時的な結果または関係を生成します。共通テーブル式または CTE は、次の目的で使用されます。 それらの一時的な結果セットに名前を付ける CREATE などの特定のステートメントの実行スコープ内に存在するもの 入れる 、 選択する 、 アップデート消去 、など。

ランダムc

CTE に関連する重要なポイントは次のとおりです。

  • を使用して定義されます。 句。
  • WITH 句を使用すると、1 つのクエリで複数の CTE を指定できます。
  • CTE は、同じ WITH 句の一部である他の CTE を参照できますが、それらの CTE は事前に定義する必要があります。
  • CTE の実行スコープは、それが使用される特定のステートメント内に存在します。

MySQL CTE 構文

MySQL CTE の構文には、名前、オプションの列リスト、および共通テーブル式 (CTE) を定義するステートメント/クエリが含まれます。 CTE を定義すると、それを SELECT、INSERT、UPDATE、および DELETE クエリのビューとして使用できます。

以下は、CTE の基本構文です。 MySQL :

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

これは、CTE 引数の列数がクエリ内の列数と同じである必要があることを確認するためです。 CTE 引数で列を定義していない場合は、CTE を定義するクエリ列が使用されます。

派生テーブルと同様に、オブジェクトとして保存することはできず、クエリの実行が完了するとすぐに失われます。 CTE は、派生テーブルと比較して可読性が向上し、パフォーマンスも向上します。

派生テーブルとは異なり、CTE は サブクエリ それはあり得る 自己言及 独自の名前を使用しています。としても知られています 再帰的 CTE また、同じクエリ内で複数回参照することもできます。

再帰的 CTE に関連する重要なポイントは次のとおりです。

npmキャッシュをクリアする
  • これは、WITH RECURSIVE 句を使用して定義されます。
  • 再帰的 CTE には終了条件が含まれている必要があります。
  • シリーズの生成と階層またはツリー構造のデータの走査に再帰的 CTE を使用します。

MySQL 再帰 CTE 構文

以下は、MySQL の再帰 CTE の基本構文です。

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

ここで、サブクエリは、それ自身の名前として cte_name を使用してそれ自体を参照する MySQL クエリです。

MySQL CTE の例

さまざまな例を使用して、MySQL で CTE がどのように機能するかを理解しましょう。ここではテーブルを使用します '従業員' デモンストレーション用に。このテーブルに次のデータが含まれているとします。

MySQL 共通テーブル式 (CTE)

CTE の概念を理解するには、次のステートメントを実行します。この例では、CTE 名は次のとおりです。 カリフォルニアの従業員 の場合、CTE を定義するサブクエリは emp_name、emp_age、city の 3 つの列を返します。したがって、CTE のemployee_in_california は、次の場所にあるすべての従業員を返します。 カリフォルニア市

CTE 従業員_in_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; 

上記のステートメントを実行すると、次の出力が得られます。ここでは、結果がカリフォルニアにある従業員データのみを返していることがわかります。

MySQL 共通テーブル式 (CTE)

より高度な MySQL CTE の例

という名前のテーブルがあるとします。 お客様 そして 注文 これには次のデータが含まれます。

表: 顧客

Cの配列の文字列
MySQL 共通テーブル式 (CTE)

表: 注文

MySQL 共通テーブル式 (CTE)

を使用した高度な CTE の例を説明する以下のステートメントを参照してください。 内部結合 句。

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

実行後、次のような出力が得られます。

MySQL 共通テーブル式 (CTE)

MySQL 再帰的 CTE の例

次の例では、再帰的 CTE の動作について説明します。一連のメッセージを生成する以下のステートメントを考えてみましょう。 最初の 5 つの奇数 :

 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>

2 番目に、以下のようにサブクエリまたは派生テーブル サブクエリの先頭で WITH 句を使用できます。

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

3 番目に、以下のように SELECT 句を含む SELECT ステートメントの直前に WITH 句を使用できます。

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

CTE を使用する利点

  • これにより、クエリの読みやすさが向上します。
  • これにより、クエリのパフォーマンスが向上します。
  • CTE を使用すると、VIEW コンセプトの代替として使用できます。
  • クエリを簡素化するための CTE のチェーンとして使用することもできます。
  • 再帰クエリを簡単に実装するために使用することもできます。

私のiPhoneアンドロイドを見つけてください