SQLの SELECT * FROM (SELECT * FROM TABLE2 WHERE FIELD1 >= 1) のように、FROM 句の中で副問い合わせを使用するケース(派生テーブル、またはインラインビュー)について解説します。
🏗️ FROM句での副問い合わせ(派生テーブル / インラインビュー)
SQLで FROM 句の中で副問い合わせを使用する構文は、派生テーブル (Derived Table) または インラインビュー (Inline View) と呼ばれます。
1. 動作の仕組み
この副問い合わせは、主クエリが実行される前に独立したテーブルとして扱われます。
- 副問い合わせの実行: まず、括弧内の副問い合わせ
(SELECT * FROM TABLE2 WHERE FIELD1 >= 1)が実行されます。- この結果、
TABLE2の中でFIELD1が 1以上の行だけからなる一時的な結果セット(仮想のテーブル)が作成されます。
- この結果、
- 主クエリの実行: 次に、外側の主クエリ
SELECT * FROM ...が、この一時的な結果セットをあたかもデータベース内の通常のテーブルであるかのように扱って実行されます。
2. 利用目的とメリット
派生テーブルの主な目的は、複雑な処理を段階的に実行し、可読性を高めることです。
- 前処理: 複雑な集計やフィルタリングを主クエリの前に完了させ、その結果に対してさらに操作(
JOIN,WHERE,GROUP BYなど)を適用する場合に利用されます。- 例: 部署ごとの月間売上合計をまず計算し、その結果(一時テーブル)に対して、売上トップ3の部署を抽出する。
- 名前の付け替え: 結合や複雑な計算を行う前のテーブルに対して、事前にわかりやすい名前(エイリアス)を付けたり、行を絞り込んだりするのに役立ちます。
3. R言語での対応
R言語の dplyr パッケージでは、この派生テーブルの概念は、パイプ演算子 (%>%) を使った操作の連鎖によって自然に実現されます。
SQLの派生テーブルが前処理の結果を表すのに対し、Rのパイプ操作では前の処理の結果がそのまま次の操作に渡されます。
| SQLの意図 (派生テーブル) | R言語 (dplyr) |
SELECT * FROM (SELECT * FROM TABLE2 WHERE FIELD1 >= 1) | TABLE2 %>% filter(FIELD1 >= 1)(主クエリが全選択なので、Rではそのままフィルタリングを連鎖させる) |
コード例 (SQLの段階的な処理)
SQL (派生テーブルの利用例):
「まず、products テーブルから価格が $500$ 以上の製品を抽出し、その結果(T1)に対してさらに名前が ‘A’ で始まるものを抽出する」
SQL
SELECT *
FROM (
SELECT *
FROM products
WHERE price >= 500
) AS T1
WHERE T1.product_name LIKE 'A%';
R言語 (dplyr でのパイプによる連鎖操作):
R
library(dplyr)
# products データフレームに対して操作を連鎖
products %>%
# 1. 派生テーブルの処理: 価格が500以上の製品を抽出
filter(price >= 500) %>%
# 2. 主クエリの処理: その結果に対して、名前が 'A' で始まるものを抽出
filter(startsWith(product_name, "A"))
結論として、SQLの FROM 句の副問い合わせ(派生テーブル)は、R言語ではパイプ演算子 (%>%) によるデータ操作の連鎖によって、より直感的かつ効率的に表現されます。