SQLを書くとき、必ずといっていいほど登場するのが「FROM句」です。
でも、「FROMって具体的に何をしているの?」「JOINと何が違うの?」と疑問に思ったことはありませんか?
この記事では、SQL初心者でも理解できるように、FROM句の役割や書き方、JOINとの関係まで順番に説明します。
SQLの基本構造とFROM句について

SQL文はどうやって組み立てるの?
SQLは決まった順番で書きます:
SELECT 列名 FROM テーブル名 WHERE 条件;
この中でFROM句は、「どのテーブルからデータを取ってくるか」を指定する大切な部分です。
FROM句の基本的な使い方
一番シンプルな例
SELECT name FROM users;
この文は「usersテーブルから、nameという列のデータを全て取り出す」という意味です。
複数の列を取り出す場合
SELECT name, age, email FROM users;
全ての列を取り出す場合
SELECT * FROM users;
*
(アスタリスク)は「全ての列」を表します。
FROM句がないとどうなるの?
FROM句を書かないと、SQLは「どのテーブルを見ればいいかわからない」状態になってエラーが出ます。
つまり、FROM句はSQLにとって必要不可欠な部分なんです。
テーブルに別名をつけて見やすくしよう
AS句を使った別名の付け方
テーブルに短い別名をつけることで、SQLが読みやすくなります。
基本的な書き方
SELECT u.name FROM users AS u;
users
テーブルをu
という短い名前で呼んでいます。
ASを省略した書き方
SELECT u.name FROM users u;
ASを書かなくても同じ意味になります。
どんなときに別名を使うの?
テーブル名が長いとき
-- 長いテーブル名の例
SELECT emp.employee_name
FROM employee_information AS emp;
複数のテーブルを使うとき
SELECT u.name, p.product_name
FROM users AS u, products AS p;
同じテーブルを複数回使うとき
-- 社員とその上司の情報を取得
SELECT e.name AS 社員名, m.name AS 上司名
FROM employees AS e, employees AS m
WHERE e.manager_id = m.id;
別名をつけるときのコツ
- 意味がわかりやすい略語を使う
- 一貫性を保つ(usersなら常にu、ordersなら常にoなど)
- 短すぎず、長すぎない(2〜3文字が目安)
FROM句とJOINの関係を理解しよう

JOINって何?
JOINは、複数のテーブルを関連付けてデータを結合する機能です。
実は、FROMとJOINにはとても深い関係がある。
INNER JOINの基本
基本的な書き方
SELECT u.name, o.amount
FROM users AS u
INNER JOIN orders AS o ON u.id = o.user_id;
この文は次のことをしています:
users
テーブルとorders
テーブルを結合users.id
とorders.user_id
が同じ行を組み合わせ- ユーザー名と注文金額を取得
JOINの種類と使い分け
INNER JOIN(内部結合) 両方のテーブルに該当データがあるもののみ表示
SELECT u.name, o.order_date
FROM users u
INNER JOIN orders o ON u.id = o.user_id;
LEFT JOIN(左外部結合) 左側のテーブルのデータは全て表示、右側は該当するもののみ
SELECT u.name, o.order_date
FROM users u
LEFT JOIN orders o ON u.id = o.user_id;
RIGHT JOIN(右外部結合) 右側のテーブルのデータは全て表示、左側は該当するもののみ
SELECT u.name, o.order_date
FROM users u
RIGHT JOIN orders o ON u.id = o.user_id;
FULL OUTER JOIN(完全外部結合) 両方のテーブルのデータを全て表示
SELECT u.name, o.order_date
FROM users u
FULL OUTER JOIN orders o ON u.id = o.user_id;
JOINを使うときの注意点
ON句は必須
JOINを使うときは、どの列を基準に結合するかをON句で指定する必要があります。
間違った例
-- これはエラーになります
SELECT * FROM users JOIN orders;
正しい例
SELECT * FROM users u
JOIN orders o ON u.id = o.user_id;
実際の仕事で使える例

商品とカテゴリ情報を一緒に表示
SELECT p.product_name, p.price, c.category_name
FROM products AS p
LEFT JOIN categories AS c ON p.category_id = c.id;
この例では:
- 商品テーブルから商品名と価格を取得
- カテゴリテーブルからカテゴリ名を取得
- LEFT JOINで、カテゴリが設定されていない商品も表示
顧客の購入履歴を確認
SELECT c.customer_name, c.email, o.order_date, o.total_amount
FROM customers AS c
INNER JOIN orders AS o ON c.id = o.customer_id
WHERE o.order_date >= '2025-01-01';
この例では:
- 顧客テーブルから名前とメールアドレスを取得
- 注文テーブルから注文日と金額を取得
- 2025年1月1日以降の注文のみを表示
社員と部署の情報を組み合わせ
SELECT e.employee_name, e.salary, d.department_name, d.location
FROM employees AS e
LEFT JOIN departments AS d ON e.department_id = d.id
ORDER BY d.department_name, e.employee_name;
この例では:
- 社員テーブルから名前と給与を取得
- 部署テーブルから部署名と所在地を取得
- 部署名、社員名順で並び替え
複数テーブルを結合した高度な例
SELECT
c.customer_name,
p.product_name,
o.order_date,
od.quantity,
od.unit_price
FROM customers c
INNER JOIN orders o ON c.id = o.customer_id
INNER JOIN order_details od ON o.id = od.order_id
INNER JOIN products p ON od.product_id = p.id
WHERE o.order_date >= '2025-01-01'
ORDER BY o.order_date DESC;
この例では:
- 顧客、注文、注文詳細、商品の4つのテーブルを結合
- どの顧客が何をいつ買ったかがわかる
よくある間違いと対処法

テーブル名やカラム名の間違い
よくある間違い
- スペルミス(user → users)
- 存在しない列を指定
- 大文字小文字の間違い
対処法
-- テーブル構造を確認するコマンド
DESCRIBE users; -- MySQL
\d users; -- PostgreSQL
JOINのON条件を忘れる
間違った例
SELECT * FROM users JOIN orders;
正しい例
SELECT * FROM users u
JOIN orders o ON u.id = o.user_id;
同じ名前の列で曖昧エラー
エラーになる例
SELECT id, name FROM users u
JOIN orders o ON u.id = o.user_id;
両方のテーブルにid
があるため、どちらのid
かわからずエラーになります。
正しい例
SELECT u.id, u.name FROM users u
JOIN orders o ON u.id = o.user_id;
パフォーマンスの問題
効率の悪い例
-- 不要な列まで取得している
SELECT * FROM users u
JOIN orders o ON u.id = o.user_id;
効率の良い例
-- 必要な列だけ取得
SELECT u.name, o.order_date FROM users u
JOIN orders o ON u.id = o.user_id;
応用テクニック

サブクエリとの組み合わせ
SELECT u.name, sub.order_count
FROM users u
JOIN (
SELECT user_id, COUNT(*) as order_count
FROM orders
GROUP BY user_id
) sub ON u.id = sub.user_id;
UNION ALLとの組み合わせ
SELECT 'customer' as type, name FROM customers
UNION ALL
SELECT 'supplier' as type, company_name FROM suppliers;
自己結合の活用
SELECT
e.name AS employee_name,
m.name AS manager_name
FROM employees e
LEFT JOIN employees m ON e.manager_id = m.id;
FROM句を使うときのベストプラクティス
読みやすいコードを書く
改行とインデントを使う
SELECT
u.name,
u.email,
o.order_date,
o.total_amount
FROM users AS u
INNER JOIN orders AS o
ON u.id = o.user_id
WHERE o.order_date >= '2025-01-01'
ORDER BY o.order_date DESC;
適切な別名を使う
意味のある別名
-- 良い例
FROM customers AS cust
JOIN orders AS ord ON cust.id = ord.customer_id
-- 避けたい例
FROM customers AS a
JOIN orders AS b ON a.id = b.customer_id
必要最小限のデータを取得
効率的なクエリ
-- 必要な列だけ指定
SELECT u.name, o.total
FROM users u
JOIN orders o ON u.id = o.user_id
-- 条件を適切に設定
WHERE o.order_date >= '2025-01-01'
まとめ
FROM句は、SQLの基礎中の基礎でありながら、JOINと組み合わせることで非常に強力な機能を発揮します。
重要なポイント
- FROM句は「どのテーブルからデータを取るか」を指定する
- 別名(AS句)を使うとコードが読みやすくなる
- JOINを使えば複数のテーブルのデータを組み合わせられる
- ON句でJOINの条件を正しく指定することが重要
- エラーの多くは基本的な書き間違い
これからSQLを書くときは、「どのテーブルから何のデータが欲しいのか」を最初に整理してから、適切なFROM句とJOINを使ってクエリを組み立ててみてください。
コメント