取得元テーブルを指定 - FROM
取得元のテーブルやビュー、サブクエリを指定する句。テーブルエイリアスと FROM 内サブクエリを解説
概念図
構文
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 の最初に評価される句で、ここで集めた行に対して WHERE や GROUP 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 を使うことが推奨されます。結合条件と絞り込み条件が分離され、意図が明確になります。
