Query Go
取得元テーブルを指定 - FROM の使い方・オプション・サンプル

取得元テーブルを指定 - FROM

取得元のテーブルやビュー、サブクエリを指定する句。テーブルエイリアスと FROM 内サブクエリを解説

概念図

FROM diagram

構文

sql
SELECT ... FROM テーブル [AS エイリアス] [, テーブル2 ...]

サンプル

テーブルエイリアスと FROM 内サブクエリ(派生テーブル)の併用例

sql
SELECT u.id, u.name, s.total
FROM users AS u,
     (SELECT user_id, SUM(amount) AS total
        FROM orders GROUP BY user_id) AS s
WHERE s.user_id = u.id;

FROM の役割

FROMどこからデータを読むかを指定する句です。テーブル、ビュー、派生テーブル(サブクエリ)、CTE、テーブル関数など、行の集合を返すものなら何でも置けます。

論理的には SQL の最初に評価される句で、ここで集めた行に対して WHEREGROUP BY が適用されます。

テーブルエイリアス

テーブルに短い別名を付けると、同じ列名が複数テーブルに存在するときの曖昧さを避けられ、自己結合でも同一テーブルを区別できます。AS は省略可能で、FROM users u と書くのが一般的です。

sql
-- 自己結合: 社員と上司を突き合わせる
SELECT e.name AS employee, m.name AS manager
FROM employees e
LEFT JOIN employees m ON m.id = e.manager_id;

FROM 内サブクエリ(派生テーブル)

FROM (SELECT ...) AS t の形で、クエリ結果そのものを仮想テーブルとして扱えます。集約してから結合する前処理を一段噛ませるなどに便利です。ほとんどの RDBMS で派生テーブルには必ず別名が必要です。

sql
SELECT u.name, agg.order_count
FROM users u
JOIN (
  SELECT user_id, COUNT(*) AS order_count
  FROM orders
  GROUP BY user_id
) AS agg ON agg.user_id = u.id;

落とし穴: カンマ結合とデカルト積

FROM a, b と書くとクロス結合(デカルト積)になります。WHERE で条件を書き忘れると行数が爆発し、パフォーマンス事故の温床です。

現代的な SQL では 必ず明示的な JOIN ... ON を使うことが推奨されます。結合条件と絞り込み条件が分離され、意図が明確になります。

関連トピック