FROM句とは?基本的な役割と書き方
FROM句は、SQLにおいてデータを取得するテーブルを指定する重要な構文です。
例えば、「動物園の管理システムで動物の情報を調べたい」ときや「在庫管理システムで商品データを抽出したい」といった場面で使います。
FROM句が便利なのは、データベースのどのテーブルからデータを取得するかを明確に示すことで、適切な情報を効率的に取得できるという点です。
FROM句の特徴を見てみましょう。
FROM句の特徴
- 複数のテーブルから、必要なテーブルを指定できる
- 基本的にSELECT文には必須の要素で、省略できない
- 単一テーブルだけでなく、複数テーブルを組み合わせた処理も可能
- JOIN句と連携することで、関連するテーブル間のデータを統合して取得できる
実際の開発では、顧客管理、商品検索、売上分析など、さまざまな場面でデータベースからの情報取得が必要になります。
このような場面で、FROM句は必須だといえるでしょう。
FROM句の基本構文とSQL内での位置づけ
FROM句は、SELECT文の中でSELECT キーワードの後に続く構文です。
基本的な構文は「FROM テーブル名」で、この指定によってSQL文がどこからデータを取得するかが決まります。
データベースからデータを取得する際、省略することはできず、SELECT文には必須の要素です。
実際の書き方のイメージは下記の通りです。
指定したテーブルから指定した列のデータを表示することができます。
以降の解説では、次の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スクリプトを参考にしてください。
単一テーブルからデータを取得する方法
最も基本的な使い方は、1つのテーブルからデータを取得することです。
FROM句でテーブル名を指定し、SELECT句で「何の情報が欲しいか」を指定します。
全ての列が欲しい場合は「SELECT *」を使い、特定の列だけが欲しい場合は列名を指定します。
出力結果
name |
species |
---|---|
タロウ |
イヌ |
ハナ |
ネコ |
ゾウタ |
ゾウ |
キリン子 |
キリン |
※使用するDBMS(データベース管理システム)によって表示結果が異なる場合があります。以後のコードも同様です
FROM animalsでanimalsテーブルを指定し、SELECT name, speciesで動物の名前と種類の列だけを取得しています。
必要な情報だけを効率的に取得できるのがSQLの特徴です。
複数テーブルを使うときの基礎的な考え方
複数のテーブルから情報を取得したいとき、2つの方法があります。
1つ目はFROM句を使ってカンマ区切りでテーブル名を並べる方法で、2つ目はJOINという機能を使う方法です。
出力結果
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つの種類があります。
- INNER JOIN - 両方のテーブルに存在するデータのみ表示
- LEFT JOIN - 左のテーブルの全データ + 右のテーブルの一致するデータ
- RIGHT JOIN - 右のテーブルの全データ + 左のテーブルの一致するデータ
- FULL JOIN - 両方のテーブルの全データ(一致しないものも含む)
です。
よく使われるのはINNER JOINと、LEFT JOINです。
左側とは、FROM句に書かれているテーブルを指し、右側とはJOIN句に書かれているテーブルを指します。
FROM句では「FROM テーブル1 JOIN テーブル2 ON 結合条件」という形で書き、結合条件では通常、2つのテーブルを関連付けるキーを指定します。
出力結果
name |
location |
---|---|
タロウ |
屋外エリア |
ハナ |
屋内エリア |
ゾウタ |
大型動物エリア |
両方のテーブルにデータが存在する動物の情報のみが表示されています。「どちらのテーブルにも存在する」という条件が重要なポイントです。
先述したカンマ区切りの方法とは別の書き方です。こちらの書き方も押さえておきましょう。
ちなみに、JOINは既存データの表示方法を変えているだけで、「新しいテーブルの作成」ではないので、その点は認識しておきましょう。
INNER JOINとLEFT JOINの違い
INNER JOINとLEFT JOINの2つのJOINの違いは、「データがない場合の扱い方」です。
INNER JOINは「両方のテーブルにデータがある場合のみ」結果に表示します。
一方、LEFT JOINは「左側のテーブル(FROM句で最初に指定したテーブル)のデータは必ず全て表示し、右側にデータがない場合はNULLを表示」します。
データの漏れがないかを確認したい場合は、LEFT JOINが便利です。
出力結果
name |
location |
---|---|
タロウ |
屋外エリア |
ハナ |
屋内エリア |
ゾウタ |
大型動物エリア |
キリン子 |
NULL |
LEFT JOINを使うことで、animalsテーブルの全ての動物を表示しています。
結果として、habitatsテーブルに対応するデータがないキリン子も表示され、location列はNULLになっています。
「左側のテーブルの情報は全て表示したい」という場合には、LEFT JOINが便利です。
JOINとFROMを組み合わせた実践的SQL文
実際の現場では、JOINとWHERE句を組み合わせて使うことがよくあります。
まずFROM句で最初のテーブルを指定し、JOINで他のテーブルと結合してデータを統合します。その後、WHERE句で「こんな条件のデータだけが欲しい」という絞り込みを行うようなイメージです。
また、テーブルに短い別名を付けることで、SQL文が読みやすくなり、後から修正するときも手間を省くことができます。
出力結果
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(または)」といった組み合わせが使えます。
出力結果
name |
species |
age |
---|---|---|
ゾウタ |
ゾウ |
15 |
キリン子 |
キリン |
8 |
FROM animalsでanimalsテーブルを指定し、WHERE age >= 5で年齢が5歳以上の動物だけに絞り込んでいます。
結果として、条件を満たす2匹の動物(ゾウタとキリン子)が表示されています。「特定の条件に合う情報だけを表示したい」という場合に便利です。
CASE文で条件に応じた値を表示
CASE文を使うと、FROM句から取得したデータを「もし○○なら△△、そうでなければ××」といった条件に応じて、表示内容を変換することができます。
書き方は「CASE WHEN 条件 THEN 値 ELSE 値 END」です。
複数の条件を実装することもできます。
例えば、数値の年齢を「若い」「中年」「高齢」といったわかりやすい文字に変換したり、点数を「合格」「不合格」に変換したりする際に便利です。
出力結果
name |
age_group |
---|---|
タロウ |
若い |
ハナ |
若い |
ゾウタ |
高齢 |
キリン子 |
中年 |
ポイントは次の通りです。
- 上から順番に条件をチェック
- 最初に当てはまった条件で決定
ELSEはどの条件にも合致しなかったケースです。
出力結果を見るとわかるかと思います。
AS句で列名やテーブル名に別名をつける方法
AS句を使うと、テーブルや列に「別名(エイリアス)」を付けることができます。
テーブルの別名は長いテーブル名を短くして、SQL文を書きやすくします。
列の別名は、計算結果や関数の結果にわかりやすい名前を付けたり、英語の列名を日本語に変更したりする際に使います。
出力結果
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文が先に実行されます。
「平均値より高いデータを取得したい」ときや「最大値と一致するデータを探したい」といった、動的な条件を使いたい場合に効果的です。
まず内側で計算を行い、その結果を外側の条件として使用します。
出力結果
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句にもサブクエリを使うことができ、「複雑な処理を段階的に行いたい」という場合に便利です。
サブクエリの結果を一時的なテーブルのように扱い、そこからさらにデータを取得する方法です。
ただし、サブクエリには必ず別名を付ける必要があります。また、大量のデータを扱う場合は処理が遅くなる可能性があるため、注意しましょう。
出力結果
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や条件指定が可能です。複雑な処理も読みやすく、後から修正しやすくなります。
出力結果
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句をマスターして、データベースを自在に操れるエンジニアへの第一歩を踏み出しましょう。