共通テーブル式(CTE)

SQL のデータ操作

Mona Khalil

Data Scientist, Greenhouse Software

サブクエリを追加する場合...

  • クエリはすぐに複雑に
    • 情報の把握も困難

解決策: 共通テーブル式!

SQL のデータ操作

共通テーブル式(CTE)

共通テーブル式(CTE)

  • メインクエリの前に宣言するテーブル
  • 名前を付け、あとで FROM 句から参照

CTE の設定

WITH cte AS (
    SELECT col1, col2
    FROM table)

SELECT AVG(col1) AS avg_col FROM cte;
SQL のデータ操作

FROM でサブクエリを取得

SELECT
  c.name AS country,
  COUNT(s.id) AS matches
FROM country AS c
INNER JOIN (
  SELECT country_id, id 
  FROM match
  WHERE (home_goal + away_goal) >= 10) AS s
ON c.id = s.country_id
GROUP BY country;
| country     | matches |
|-------------|---------|
| England     | 3       |
| Germany     | 1       |
| Netherlands | 1       |
| Spain       | 4       |
SQL のデータ操作

先頭に配置

(
  SELECT country_id, id 
  FROM match
  WHERE (home_goal + away_goal) >= 10
)
SQL のデータ操作

先頭に配置

WITH s AS (
  SELECT country_id, id 
  FROM match
  WHERE (home_goal + away_goal) >= 10
)
SQL のデータ操作

CTE を表示

WITH s AS (
  SELECT country_id, id 
  FROM match
  WHERE (home_goal + away_goal) >= 10
)
SELECT
  c.name AS country,
  COUNT(s.id) AS matches
FROM country AS c
INNER JOIN s
ON c.id = s.country_id
GROUP BY country;
| country     | matches |
|-------------|---------|
| England     | 3       |
| Germany     | 1       |
| Netherlands | 1       |
| Spain       | 4       |
SQL のデータ操作

すべての CTE を表示

WITH s1 AS (
  SELECT country_id, id 
  FROM match
  WHERE (home_goal + away_goal) >= 10),
s2 AS (                              -- New subquery
  SELECT country_id, id 
  FROM match
  WHERE (home_goal + away_goal) <= 1
)
SELECT
  c.name AS country,
  COUNT(s1.id) AS high_scores,
  COUNT(s2.id) AS low_scores         -- New column
FROM country AS c
INNER JOIN s1
ON c.id = s1.country_id
INNER JOIN s2                        -- New join
ON c.id = s2.country_id
GROUP BY country;
SQL のデータ操作

CTE を使う理由

  • 1 回だけ実行

    • CTE はその後メモリに保存
    • クエリのパフォーマンスを向上
  • クエリの整理を改善

  • 他の CTE を参照

  • 自身も参照可能(SELF JOIN
SQL のデータ操作

練習しましょう!

SQL のデータ操作

Preparing Video For Download...