SQLのFROM句を完全マスター!テーブル指定からJOINまで徹底解説

データベース・SQL

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;

この文は次のことをしています:

  1. usersテーブルとordersテーブルを結合
  2. users.idorders.user_idが同じ行を組み合わせ
  3. ユーザー名と注文金額を取得

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を使ってクエリを組み立ててみてください。

コメント

タイトルとURLをコピーしました