SQLのFROM句をマスター!初心者向け基本構文から他の句との連携まで解説

この記事のポイント

SQL開発では「どのテーブルからデータを取得するかを指定したい」という場面によく遭遇します。

こんなとき、FROM句を使うとデータ取得元の指定を効率的に行うことができます。

この記事を読むと、次のようなことが身に付きます。

  • FROM句の基本的な書き方と役割が理解できる
  • 1つのテーブルや複数のテーブルからデータを取得する方法がわかる
  • JOINという機能を使った複数テーブルの組み合わせ方がわかる
  • INNER JOINとLEFT JOINの違いと使い分けができるようになる
  • WHERE(条件指定)、CASE(データ変換)、AS(別名付け)との連携方法を知る

ぜひ、この記事でFROM句をマスターしてしまいましょう。

目次

FROM句とは?基本的な役割と書き方

FROM句は、SQLにおいてデータを取得するテーブルを指定する重要な構文です。

例えば、「動物園の管理システムで動物の情報を調べたい」ときや「在庫管理システムで商品データを抽出したい」といった場面で使います。

FROM句が便利なのは、データベースのどのテーブルからデータを取得するかを明確に示すことで、適切な情報を効率的に取得できるという点です。

FROM句の特徴を見てみましょう。

FROM句の特徴

  • 複数のテーブルから、必要なテーブルを指定できる
  • 基本的にSELECT文には必須の要素で、省略できない
  • 単一テーブルだけでなく、複数テーブルを組み合わせた処理も可能
  • JOIN句と連携することで、関連するテーブル間のデータを統合して取得できる

実際の開発では、顧客管理、商品検索、売上分析など、さまざまな場面でデータベースからの情報取得が必要になります。

このような場面で、FROM句は必須だといえるでしょう。

【関連】
SQLをもっと詳しく学ぶならpaizaラーニング

FROM句の基本構文とSQL内での位置づけ

FROM句は、SELECT文の中でSELECT キーワードの後に続く構文です。

基本的な構文は「FROM テーブル名」で、この指定によってSQL文がどこからデータを取得するかが決まります。
データベースからデータを取得する際、省略することはできず、SELECT文には必須の要素です。

実際の書き方のイメージは下記の通りです。

SELECT column_name(列) FROM table_name;(テーブル)

指定したテーブルから指定した列のデータを表示することができます。

以降の解説では、次の2つのテーブルを使用します。

animalsテーブル(動物情報)

animal_id

name

species

age

animal_id

1

タロウ

イヌ

3

1

2

ハナ

ネコ

2

2

3

ゾウタ

ゾウ

15

3

4

キリン子

キリン

8

4

habitatsテーブル(飼育環境情報)

habitat_id

animal_id

location

temperature

1

1

屋外エリア

25

2

2

屋内エリア

22

3

3

大型動物エリア

28

例で使用するデータベースを作成したい方は、次のSQLスクリプトを参考にしてください。

-- animalsテーブルを作成 CREATE TABLE animals ( animal_id INTEGER PRIMARY KEY, name TEXT, species TEXT, age INTEGER ); -- habitatsテーブルを作成 CREATE TABLE habitats ( habitat_id INTEGER PRIMARY KEY, animal_id INTEGER, location TEXT, temperature INTEGER ); -- animalsテーブルにデータを挿入 INSERT INTO animals (animal_id, name, species, age) VALUES (1, 'タロウ', 'イヌ', 3), (2, 'ハナ', 'ネコ', 2), (3, 'ゾウタ', 'ゾウ', 15), (4, 'キリン子', 'キリン', 8); -- habitatsテーブルにデータを挿入 INSERT INTO habitats (habitat_id, animal_id, location, temperature) VALUES (1, 1, '屋外エリア', 25), (2, 2, '屋内エリア', 22), (3, 3, '大型動物エリア', 28); -- 確認 SELECT * FROM animals; SELECT * FROM habitats;

単一テーブルからデータを取得する方法

最も基本的な使い方は、1つのテーブルからデータを取得することです。

FROM句でテーブル名を指定し、SELECT句で「何の情報が欲しいか」を指定します。

全ての列が欲しい場合は「SELECT *」を使い、特定の列だけが欲しい場合は列名を指定します。

SELECT name, species FROM animals;

出力結果

name

species

タロウ

イヌ

ハナ

ネコ

ゾウタ

ゾウ

キリン子

キリン

※使用するDBMS(データベース管理システム)によって表示結果が異なる場合があります。以後のコードも同様です

FROM animalsでanimalsテーブルを指定し、SELECT name, speciesで動物の名前と種類の列だけを取得しています。
必要な情報だけを効率的に取得できるのがSQLの特徴です。

複数テーブルを使うときの基礎的な考え方

複数のテーブルから情報を取得したいとき、2つの方法があります。

1つ目はFROM句を使ってカンマ区切りでテーブル名を並べる方法で、2つ目はJOINという機能を使う方法です。

SELECT a.name, h.location FROM animals a, habitats h WHERE a.animal_id = h.animal_id;

出力結果

name

location

タロウ

屋外エリア

ハナ

屋内エリア

ゾウタ

大型動物エリア

FROM animals a, habitats hで2つのテーブルを指定し、WHERE a.animal_id = h.animal_idで関連性を定義しています。

結果として、動物の名前とその生息場所が組み合わせて表示されています。aとhは長いテーブル名を短縮するための別名(エイリアス)です。

ちなみに、カンマ区切りの方法ではWHERE句で条件を指定しないと、予期しない大量のデータが表示されてしまうという事態につながりかねません。
この例でいうと、4匹の動物と3つの環境情報が全て組み合わさって12行(4×3)というデータが表示されます。

実際に、WHERE a.animal_id = h.animal_id;を削除して実行してみるとわかるかと思います。

そのため、JOINを使ってテーブル間の関係を明確に指定するのが推奨される方法です。

JOIN句とFROM句の連携方法や構文

JOIN句とFROM句を組み合わせることで、複数テーブル間のデータを効率的に結合し、より豊富な情報を取得できます。

「動物の情報と飼育環境の情報を同時に表示したい」ときや「関連するデータが存在する場合のみ表示したい」といった場面で有用です。

結合の種類によって取得されるデータが異なるため、目的に応じて適切な結合方法を選択することが重要です。

JOINの種類とFROM句での使い方の違い

JOINには主に4つの種類があります。

  1. INNER JOIN - 両方のテーブルに存在するデータのみ表示
  2. LEFT JOIN  - 左のテーブルの全データ + 右のテーブルの一致するデータ
  3. RIGHT JOIN - 右のテーブルの全データ + 左のテーブルの一致するデータ  
  4. FULL JOIN  - 両方のテーブルの全データ(一致しないものも含む)

です。

よく使われるのはINNER JOINと、LEFT JOINです。

左側とは、FROM句に書かれているテーブルを指し、右側とはJOIN句に書かれているテーブルを指します。

FROM句では「FROM テーブル1 JOIN テーブル2 ON 結合条件」という形で書き、結合条件では通常、2つのテーブルを関連付けるキーを指定します。

SELECT a.name, h.location FROM animals a INNER JOIN habitats h ON a.animal_id = h.animal_id;

出力結果

name

location

タロウ

屋外エリア

ハナ

屋内エリア

ゾウタ

大型動物エリア

両方のテーブルにデータが存在する動物の情報のみが表示されています。「どちらのテーブルにも存在する」という条件が重要なポイントです。

先述したカンマ区切りの方法とは別の書き方です。こちらの書き方も押さえておきましょう。

ちなみに、JOINは既存データの表示方法を変えているだけで、「新しいテーブルの作成」ではないので、その点は認識しておきましょう。

INNER JOINとLEFT JOINの違い

INNER JOINとLEFT JOINの2つのJOINの違いは、「データがない場合の扱い方」です。

INNER JOINは「両方のテーブルにデータがある場合のみ」結果に表示します。
一方、LEFT JOINは「左側のテーブル(FROM句で最初に指定したテーブル)のデータは必ず全て表示し、右側にデータがない場合はNULLを表示」します。

データの漏れがないかを確認したい場合は、LEFT JOINが便利です。

SELECT a.name, h.location FROM animals a LEFT JOIN habitats h ON a.animal_id = h.animal_id;

出力結果

name

location

タロウ

屋外エリア

ハナ

屋内エリア

ゾウタ

大型動物エリア

キリン子

NULL

LEFT JOINを使うことで、animalsテーブルの全ての動物を表示しています。

結果として、habitatsテーブルに対応するデータがないキリン子も表示され、location列はNULLになっています。

「左側のテーブルの情報は全て表示したい」という場合には、LEFT JOINが便利です。

JOINとFROMを組み合わせた実践的SQL文

実際の現場では、JOINとWHERE句を組み合わせて使うことがよくあります。

まずFROM句で最初のテーブルを指定し、JOINで他のテーブルと結合してデータを統合します。その後、WHERE句で「こんな条件のデータだけが欲しい」という絞り込みを行うようなイメージです。

また、テーブルに短い別名を付けることで、SQL文が読みやすくなり、後から修正するときも手間を省くことができます。

SELECT a.name, a.species, h.location, h.temperature FROM animals a INNER JOIN habitats h ON a.animal_id = h.animal_id WHERE h.temperature > 23;

出力結果

name

species

location

temperature

タロウ

イヌ

屋外エリア

25

ゾウタ

ゾウ

大型動物エリア

28

INNER JOINで2つのテーブルを結合し、その後WHERE句で温度が23度より高い環境にいる動物だけに絞り込んでいます。

結果として、暖かい環境にいる2匹の動物の詳細情報が表示されています。「関連するデータを組み合わせて、さらに条件で絞り込む」という実用的なパターンです。

FROM句と他のSQL句(WHERE、CASE、AS)との組み合わせ

FROM句は通常、他の機能と組み合わせて使います。
具体的には、次のような機能です。

WHERE句(条件指定)
CASE文(データ変換)
AS句(別名付け)

「特定の条件のデータだけ取得したい」ときや「データを見やすい形に変換したい」とき、「結果にわかりやすい名前を付けたい」といった場合に有用です。

実際の開発現場でよく使われるパターンを学んでいきましょう。

WHERE句とFROM句の組み合わせで条件抽出

FROM句でテーブルを指定した後、WHERE句を使って「こんな条件のデータだけが欲しい」という絞り込みができます。

条件には「=(等しい)」「>(より大きい)」「<(より小さい)」といった比較や、「AND(かつ)」「OR(または)」といった組み合わせが使えます。

SELECT name, species, age FROM animals WHERE age >= 5;

出力結果

name

species

age

ゾウタ

ゾウ

15

キリン子

キリン

8

FROM animalsでanimalsテーブルを指定し、WHERE age >= 5で年齢が5歳以上の動物だけに絞り込んでいます。

結果として、条件を満たす2匹の動物(ゾウタとキリン子)が表示されています。「特定の条件に合う情報だけを表示したい」という場合に便利です。

CASE文で条件に応じた値を表示

CASE文を使うと、FROM句から取得したデータを「もし○○なら△△、そうでなければ××」といった条件に応じて、表示内容を変換することができます。

書き方は「CASE WHEN 条件 THEN 値 ELSE 値 END」です。

複数の条件を実装することもできます。
例えば、数値の年齢を「若い」「中年」「高齢」といったわかりやすい文字に変換したり、点数を「合格」「不合格」に変換したりする際に便利です。

SELECT name, CASE WHEN age < 5 THEN '若い' WHEN age < 10 THEN '中年' ELSE '高齢' END AS age_group FROM animals;

出力結果

name

age_group

タロウ

若い

ハナ

若い

ゾウタ

高齢

キリン子

中年

ポイントは次の通りです。

  • 上から順番に条件をチェック
  • 最初に当てはまった条件で決定

ELSEはどの条件にも合致しなかったケースです。

出力結果を見るとわかるかと思います。

AS句で列名やテーブル名に別名をつける方法

AS句を使うと、テーブルや列に「別名(エイリアス)」を付けることができます。

テーブルの別名は長いテーブル名を短くして、SQL文を書きやすくします。

列の別名は、計算結果や関数の結果にわかりやすい名前を付けたり、英語の列名を日本語に変更したりする際に使います。

SELECT a.name AS animal_name, a.species AS type, h.location AS habitat_area FROM animals AS a INNER JOIN habitats AS h ON a.animal_id = h.animal_id;

出力結果

name

type

habitat_area

タロウ

イヌ

屋外エリア

ハナ

ネコ

屋内エリア

ゾウタ

ゾウ

大型動物エリア

テーブルにAS aとAS hで短い別名を付け、列にもAS animal_nameのようなわかりやすい名前を付けています。

ここまでの例を目にしてきて認識済みかもしれませんが、ASは省略することができます。

しかし、ASを付けた方が「ここは別名だ」ということが明確にわかるのはメリットです。

特に初心者のうちは、ASを付ける習慣をつけて、より理解しやすいSQL文が書くことを習慣づけましょう。

サブクエリやWITH句の活用

より高度なSQL文を書きたいときは、サブクエリやWITH句という機能が役立ちます。

サブクエリは「SQL文の中にもう一つSQL文を入れる」技術で、WITH句は「複雑な処理を段階的に分けてわかりやすくする」機能です。

「平均値より高いデータだけを取得したい」ときや「複雑な計算を段階的に行いたい」といった場合に高度な処理ができるようになります。

サブクエリの基本構造と使いどころ

サブクエリとは、「SQL文の中に別のSQL文を入れ子にする」技術のことです。

主にWHERE句、SELECT句、FROM句で使用され、括弧で囲んだ内側のSQL文が先に実行されます。

「平均値より高いデータを取得したい」ときや「最大値と一致するデータを探したい」といった、動的な条件を使いたい場合に効果的です。

まず内側で計算を行い、その結果を外側の条件として使用します。

SELECT name, age FROM animals WHERE age > (SELECT AVG(age) FROM animals);

出力結果

name

age

ゾウタ

15

キリン子

8

構造は次のようになっています。

内側のSQL:SELECT AVG(age) FROM animals → 結果:7

外側のSQL:SELECT name, age FROM animals WHERE age > 7

「他の値との比較で条件を決めたい」という場合にはサブクエリが便利です。

ちなみに、AVGは平均値を計算する集計関数です。

「SELECT AVG(列名) FROM テーブル名」という形で使います。

他には次のような集計関数があります。

  • COUNT():件数を数える
  • SUM():合計を計算
  • MAX():最大値を取得
  • MIN():最小値を取得

この機会に使い方と種類を覚えておきましょう。

FROM句にサブクエリを組み込む方法と注意点

FROM句にもサブクエリを使うことができ、「複雑な処理を段階的に行いたい」という場合に便利です。

サブクエリの結果を一時的なテーブルのように扱い、そこからさらにデータを取得する方法です。

ただし、サブクエリには必ず別名を付ける必要があります。また、大量のデータを扱う場合は処理が遅くなる可能性があるため、注意しましょう。

SELECT avg_data.species, avg_data.avg_age FROM (SELECT species, AVG(age) AS avg_age FROM animals GROUP BY species) AS avg_data WHERE avg_data.avg_age > 5;

出力結果

species

avg_age

キリン

8

ゾウ

15

構造は次のようになっています。

内側のSQL:SELECT species, AVG(age) AS avg_age FROM animals GROUP BY species → 結果:各動物種(speciesごと)の平均年齢

外側のSQL:SELECT avg_data.species, avg_data.avg_age FROM (内側の結果) AS avg_data WHERE avg_data.avg_age > 5

各動物種(speciesごと)の平均年齢は、この例だと各種類1匹ずつなので、結果的に個々の年齢と同じになります。

WITH句を使ってSQL文を整理・再利用する

WITH句は、複雑なサブクエリを事前に定義して、SQL文をわかりやすくする機能です。

「まず○○のデータを準備して、次に△△の処理をする」といった段階的な処理を明確に表現できます。

WITH句で定義したデータは、そのSQL文の中でだけ使える一時的なテーブルのようなもので、通常のテーブルと同じようにJOINや条件指定が可能です。複雑な処理も読みやすく、後から修正しやすくなります。

WITH adult_animals AS ( SELECT * FROM animals WHERE age >= 5 ) SELECT a.name, h.location FROM adult_animals a INNER JOIN habitats h ON a.animal_id = h.animal_id;

出力結果

name

location

ゾウタ

大型動物エリア

「キリン子はどうして表示されないんだろう?」
そう思った方は、JOINの性質についてもう一度振り返ってみてください。

キリン子が表示されないのは、habitatsテーブルにデータがないからです。

よくある質問(Q&A)

Q: FROM文は必ず必要ですか?

A: SELECT文でテーブルからデータを取得する際はFROM文が必須となります。ただし、計算結果のみを表示する場合など、テーブルを使わない場合は不要です。

Q: 複数テーブルを同時に指定できますか?

A: FROM文では複数のテーブルを指定できます。カンマで区切って記述するか、JOIN文を使用して結合することで、複数テーブルからデータを取得できます。

Q: テーブル名を間違えるとどうなりますか?

A: 存在しないテーブル名を指定するとエラーが発生します。「テーブルまたはビューが存在しません」といったメッセージが表示され、クエリは実行されません。正確なテーブル名を確認して再実行する必要があります。

Q: FROM文で取得順序は指定できますか?

A: FROM文自体では順序を指定できません。データの並び順を制御するには、ORDER BY句を使用します。これにより、指定した列の値に基づいて昇順または降順でソートできます。

まとめ

FROM句は、データベース操作の基礎となる重要な構文です。

この記事では、FROM句の基本構文から実用的な応用例まで解説しました。FROM句の活用場面について確認しておきましょう。

FROM句が活躍する場面

  • 複数のテーブルから、必要なテーブルを指定したいとき
  • JOIN句と組み合わせて、関連するテーブル間のデータをまとめて取得したいとき
  • WHERE、CASE、AS句などと連携して、柔軟な条件検索とデータ変換処理を行いたいとき
  • サブクエリやWITH句を活用して、複雑なデータ処理を実装したいとき

FROM句を使う上で押さえておきたいポイントは次の通りです。

重要なポイント

  • FROM句はSELECT文において必須の構文
  • JOIN句の特性
  • 別名(エイリアス)を付けると可読性や保守性の向上につながる
  • 実行順序(FROM → JOIN → WHERE → SELECT)の理解
  • 大量データを扱う場合は、パフォーマンスに影響する

初めてSQLを学ぶ方も、この記事で紹介したFROM句の基本的な使い方と実用例を参考に、ぜひ実際にSQL文を書いてみてください。

データベースから的確に情報を取得できるスキルがあれば、ユーザーが本当に求めている情報を瞬時に提供でき、より価値の高いシステムを構築することができるようになります。

FROM句をマスターして、データベースを自在に操れるエンジニアへの第一歩を踏み出しましょう。

レベルを更に上げたい方はpaizaプログラミングスキルチェックへ

  1. paizaラーニングトップ
  2. ナレッジ
  3. SQLのナレッジ記事一覧
  4. SQLのFROM句をマスター!初心者向け基本構文から他の句との連携まで解説