sql >> データベース >  >> RDS >> Mysql

MySQLの共通テーブル式

    Common Table Expressions(CTE)を使用すると、MySQLで複雑なSQLクエリを簡単に記述できます。この記事では、MySQLの共通テーブル式とは何か、およびMySQLでCTEを作成する方法について説明します。


    共通テーブル式とは

    Common Table Expressionは、名前付きの結果セットであり、そのスコープは、定義および使用されるSQLクエリに限定されます。派生テーブルに似ていますが、オブジェクトとして保存されず、派生テーブルとは異なり、自己参照することができます。その結果、CTEはMySQLの派生テーブルよりも優れたパフォーマンスを提供します。

    ボーナスリード:MySQLでマージンを計算する方法


    MySQLの一般的なテーブル式

    MySQLの一般的なテーブル式の構文は次のとおりです。

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

    上記のクエリでは、CTEの名前を指定する必要があります。SQLクエリの結果は、CTE名を使用して参照する必要があります。 column_listの列数に注意してください クエリのクエリと同じである必要があります 。

    一般的なテーブル式(CTE)の例を見てみましょう。

    ボーナスリード:SQLクエリを使用して最も売れている製品を取得する方法

    sales(id、order_date、amount)があるとします。 テーブル。

    mysql> create table sales(id int, order_date date, amount int);
    
    mysql> insert into sales(id, order_date, amount)
          values(1, '2021-01-01', 200),
          (2, '2021-01-02', 250),
          (3, '2021-01-03', 220),
          (4, '2021-01-04', 230),
          (5, '2021-01-05', 210),
          (6, '2021-01-06', 100),
          (7, '2021-01-07', 120),
          (8, '2021-01-08', 150),
          (9, '2021-01-09', 180),
          (10, '2021-01-10', 200);
    
     mysql> select * from sales;
     +------+------------+--------+
     | id   | order_date | amount |
     +------+------------+--------+
     |    1 | 2021-01-01 |    200 |
     |    2 | 2021-01-02 |    250 |
     |    3 | 2021-01-03 |    220 |
     |    4 | 2021-01-04 |    230 |
     |    5 | 2021-01-05 |    210 |
     |    6 | 2021-01-06 |    100 |
     |    7 | 2021-01-07 |    120 |
     |    8 | 2021-01-08 |    150 |
     |    9 | 2021-01-09 |    180 |
     |   10 | 2021-01-10 |    200 |
     +------+------------+--------+

    これは、金額が200を超える販売レコードのみを選択するためのCTEです。

    with test_cte as (
         select id,order_date,amount from sales
         where amount>200
     ) select * from test_cte; 
    
     +------+------------+--------+
     | id   | order_date | amount |
     +------+------------+--------+
     |    1 | 2021-01-01 |    200 |
     |    2 | 2021-01-02 |    250 |
     |    3 | 2021-01-03 |    220 |
     |    4 | 2021-01-04 |    230 |
     |    5 | 2021-01-05 |    210 |
     |   10 | 2021-01-10 |    200 |
     +------+------------+--------+

    上記のCTEでは、SELECTクエリを指定して、WITH句内で量が200を超える行をフィルタリングします。

    ボーナスリード:MySQLでCASEステートメントを使用する方法

    CTEは、SELECT、UPDATE、INSERT、およびDELETEステートメントで使用できることに注意してください。同じものの構文は次のとおりです。

    WITH … SELECT …
    WITH … UPDATE …
    WITH … DELETE …

    また、以下に示すように、サブクエリとしてCTEを使用することもできます

    SELECT … WHERE id IN (WITH … SELECT …);
    SELECT * FROM (WITH … SELECT …) AS temporary_table;

    SELECTステートメントの結果をCREATE/INSERT / REPLACEステートメントの入力として使用する場合は、その中でWITH句を使用することもできます。ここにいくつかの例があります、

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

    ボーナスリード:MySQLでさまざまな条件で複数のカウントを取得する


    Ubiqの共通テーブル式

    UbiqレポートツールはCTEベースのSELECTクエリをサポートし、さまざまな方法でSQL結果を簡単に視覚化できます。また、MySQLクエリ結果からダッシュボードとチャートを作成することもできます。これがUbiqでの上記のCTEクエリです。

    実際、クエリを実行した後、視覚化タイプをクリックするだけで、結果をグラフにプロットできます。

    MySQL用のレポートツールが必要ですか? Ubiqを使用すると、データを数分で簡単に視覚化し、リアルタイムのダッシュボードで監視できます。今日お試しください。

    1. MySQLまたはMariaDBデータベースをSQLインジェクションから保護する方法:パート2

    2. OracleではsubstrまたはLIKEの方が高速ですか?

    3. Djangoチャンネル入門

    4. chmodが失敗しました:AndroidのEPERM(操作は許可されていません)?