SELECT文の基本(射影と選択)
概要
- 日程: Day 1 / セッション 6
- 時間: 13:00-13:30
- 形式: 座学
- ゴール: SELECT/FROM/WHERE の役割をそれぞれ説明し、最も単純なSELECT文を書ける
- 学習形式: 対話型解説
導入(5分)
午前中、皆さんは SELECT * FROM employees LIMIT 5; のような呪文を何回か打ちました。動いていましたね。でも、ここで少し考えてみてください。
「全員じゃなくて、営業部の人だけ見たい」
「全部の列じゃなくて、名前と給与だけ見たい」
——こうなったとき、何をどう書けばいいでしょうか?
このセッションでは、SELECT文の3兄弟「SELECT・FROM・WHERE」の役割を明確にして、皆さんの「データの取り出し方」の引き出しを増やします。キーワードは射影と選択。少し難しそうに聞こえますが、たとえ話で一発で分かります。
本編(20分)
1. SELECTという「お願い」の構造
SELECT文は、データベースへの「お願い」です。お願いには3つのパーツがあります。
SELECT 列の指定
FROM テーブル名
WHERE 行の条件;
- SELECT:どの列を見せてほしいか
- FROM:どのテーブルから取るか
- WHERE:どの行だけ欲しいか(省略可)
これは、いわばカフェでの注文に似ています。「(FROM)あのケーキケースから、(WHERE)チーズケーキを、(SELECT)一切れだけ」と頼んでいるイメージです。
ここで、SELECT と WHERE には専門用語があります。
- 射影(しゃえい):列を選ぶこと。SELECTがやる仕事
- 選択(せんたく):行を絞ること。WHEREがやる仕事
「射影=列選び、選択=行選び」。この対比だけ覚えてください。試験に出ます(出ません。でも覚えると一生使えます)。
ここがポイント
- 「選択」という日本語の罠:日常会話の「選ぶ」ではなく、「行を絞る」というSQL用語
- まずは FROM、次に WHERE(行を絞る)、最後に SELECT(列を選ぶ)の順で考えるとミスが減る
2. 最小限のSELECT文から
一番シンプルなSELECT文はこれです。
コード例・実例
SELECT * FROM departments;
全列・全行を取ってくる「とりあえず全部見せて」の呪文です。* はワイルドカードで「全列」を意味します。
次に、列を絞ってみましょう(射影)。
SELECT department_name, location FROM departments;
これで department_name と location の2列だけが返ります。実務では SELECT * ではなく「必要な列だけ」を書くのが鉄則です。理由は3つ:
- 余計なデータを読まないので速い
- 結果を見やすい
- 後でテーブル定義が変わっても影響を受けにくい
employeesから「名前と給与だけ」を取り出すなら:
SELECT first_name, last_name, salary FROM employees;
3. WHEREで行を絞る(選択)
次は行を絞る番です。たとえば「営業部(department_id = 1)の社員だけ」見たいとします。
コード例・実例
SELECT first_name, last_name, salary
FROM employees
WHERE department_id = 1;
これで department_id が 1 の行だけ返ります。サンドボックスでは太郎・山田、一郎・田中、大輔・加藤 の3人が出てくるはずです。
数値の比較もできます。「給与が50万以上の社員」なら:
SELECT first_name, last_name, salary
FROM employees
WHERE salary >= 500000;
文字列を比較するときはシングルクォート ' で囲みます。
SELECT customer_name, address
FROM customers
WHERE customer_name = '株式会社ABC';
ダブルクォート " は別の意味(識別子のクォート)に使われるので、文字列はシングルクォートと覚えてください。
ここがポイント
- 等価は
=(プログラミング言語の==ではないので注意) - 文字列は
'シングルクォート'で囲む - 数値はクォート不要
4. AS句で列に別名をつける
SELECTで返ってくる列名は、デフォルトではテーブルの列名そのままです。でも「画面上の見出しだけ変えたい」「計算結果に名前を付けたい」ときがあります。そのために使うのが AS 句です。
コード例・実例
SELECT first_name AS 名,
last_name AS 姓,
salary AS 月給
FROM employees;
これで結果の見出しが「名・姓・月給」になります。AS は省略も可能ですが、書いた方が読みやすいので慣れるまでは明示するのがおすすめです。
計算式にも名前を付けられます:
SELECT product_name, price * stock_quantity AS 在庫評価額
FROM products;
「価格 × 在庫数」を計算して、「在庫評価額」という列名で返してくれます。
5. DISTINCTで重複を除く
employees の department_id 列を見ると、1や2が何回も出てきます。「で、結局どの部署IDが存在するの?」を知りたいとき、DISTINCT を使います。
コード例・実例
SELECT DISTINCT department_id FROM employees;
これで「重複を除いた一覧」が返ります。サンドボックスでは 1, 2, 3, 4, 5 が1回ずつ。
ordersのステータスを調べるなら:
SELECT DISTINCT status FROM orders;
completed、shipped、processing、pending の4種類が返ります。ステータス管理の現状把握によく使う技です。
コラム
実はSELECT文の中で、サーバーはこの順番で処理しているといわれています:
FROM → WHERE → GROUP BY → HAVING → SELECT → ORDER BY → LIMIT
書く順番(SELECT, FROM, WHERE...)と実行順序が違うのが面白いところです。これは「英語の語順をなるべく自然にしたかった」設計だと言われています。「Select these columns from this table where conditions hold」と読み下すと、ほぼ英文として通ります。SQLは「人間が読みやすい」を結構頑張った言語なのです。
💬 AIに聞いてみよう
- 「
SELECT * FROM ...ではなく必要な列だけ書くべき理由を3つ整理して」 - 「
SELECT first_name = 'taro' FROM employees;を実行したらエラーが出た。何が間違ってる?」(実は実行できてしまうがWHEREとの違いを聞くと深まる) - 「射影と選択って、英語で何ていうの?由来は?」
まとめ(5分)
今回学んだことを一言でまとめると「SELECTは列を選ぶ(射影)、WHEREは行を絞る(選択)、FROMは元のテーブル。この3点セットで、データの取り出しは自由自在」です。
書く順は SELECT → FROM → WHERE、考える順は FROM → WHERE → SELECT。これを覚えると、複雑なクエリでも迷子になりません。
次のセッションは実習です。employees や products に対して、皆さんが今日学んだ SELECT・WHERE を駆使して、「条件にあう人を探す」クエリを5本書きます。ここからは「読む人」から「書く人」へのステップアップです。
🔄 振り返りチェック
- 射影と選択を、自分の言葉で1文ずつ説明できますか?
SELECT first_name FROM employees WHERE salary >= 500000;は、どのような結果を返すでしょうか?- DISTINCTを使うのはどんなときですか?
補足資料
- 参考リンク: PostgreSQL公式: SELECT文
- 発展課題: products テーブルに対して、「カテゴリID=1(電子機器)の商品の名前と価格だけ取り出す」SELECT文を、紙に手書きで書いてみる
学習ガイド
想定される質問と回答例
| 質問 | ヒント |
|---|---|
| WHEREは省略してもいい? | 可。省略すると全行返る。SELECT * FROM employees; のように |
| 列の順番を入れ替えたい | SELECT salary, first_name, last_name FROM employees; のように、SELECT の中で書いた順で返る |
| 大文字小文字は区別される? | SQLキーワード(SELECT, FROMなど)は区別なし。文字列の中身は区別あり('ABC' ≠ 'abc') |
| 数値の比較演算子はどんなのがある? | =, <>, <, >, <=, >=。!= も多くのDBで使えるが、標準は <> |
つまずきやすいポイント
| つまずきポイント | ヒント |
|---|---|
| 文字列をダブルクォートで囲んでしまう | 'シングル' が正解。ダブルクォートは識別子用(列名や表名)として別の意味を持つ |
WHERE name = NULL と書いてしまう |
NULLとの比較は IS NULL を使う(Day2で詳しく扱う) |
SELECT * の癖が抜けない |
実務では遅さ・分かりにくさ・将来の壊れやすさの原因に。「必要な列だけ書く」を意識的に練習 |
等価を == と書いてしまう |
SQLは =。プログラミング言語の == とは違う |