メインコンテンツにスキップ
モジュール 14 · レッスン 1 / 3コース内の 53/57~12 min
モジュールのレッスン (1/3)

CTE の概要 (WITH)

CTE の概要 (WITH)

遅かれ早かれ、このようなことは誰にでも起こります。集計の結果に基づいてデータをフィルタリングし、そのフィルタを取得して別の集計クエリと結合する必要があります。 SELECT 内で SELECT を書き始めると、最終的にはさらに別の SELECT の FROM になります。

結果? スパゲッティ SQL、人間には解読できないクエリ。

CTE (共通テーブル式) を使用すると、この混乱を解くことができます。 WITH キーワードを使用してこれらをアクティブにすると、一時的な名前付きクエリを定義し、最終的なクエリで「仮想テーブル」として再利用できるようになります。

基本的な構文

SQL
WITH premium_customers AS (
  SELECT customer_id, SUM(total_amount) AS total_spent
  FROM orders
  GROUP BY customer_id
  HAVING SUM(total_amount) > 1000
)
SELECT customers.first_name, premium_customers.total_spent
FROM customers
JOIN premium_customers ON customers.id = premium_customers.customer_id;

ご覧のとおり、下部のメイン クエリは、実際のテーブルであるかのように premium_customers から読み取ります。また、ネストされたサブクエリを使用したメガ内部結合よりもはるかに読みやすいです。

運動#sql.m14.l1.e1
試行回数: 0読み込み中…

私たちは非常に高価な製品が欲しいです。 「luxury_products」という CTE を使用して、「price > 500」の「products」から「id」と「price」を選択します。次に、この CTE に対してメイン クエリを実行し、すべてを表示します (*)。

エディターを読み込み中…
ヒントを表示

WITHluxury_products AS (...) から始めて、SELECT * FROMluxury_products を実行します。

3 回の試行後に解決策が利用可能になります

運動#sql.m14.l1.e2
試行回数: 0読み込み中…

レビューを書いてくれるユーザーを探しています。 「reviews」から一意の (DISTINCT) 'customer_id' 値を抽出する CTE 'reviewers' を作成します。次に、「customers」テーブルから「id」、「first_name」、「last_name」を抽出し、ID の「reviewers」CTE と「結合」します。

エディターを読み込み中…
ヒントを表示

WITH reviewers AS (SELECT DISTINCT customer_id FROM reviews) SELECT id, first_name, last_name FROM customer JOIN reviewers ON Customers.id = reviewers.customer_id;

3 回の試行後に解決策が利用可能になります