
図書館に行って「SF小説で、2020年以降に出版された本を、著者名の50音順で全部出してください」と司書さんに頼んだとしよう。
司書さんはその条件で本棚を探して、条件に合う本を持ってきてくれる。
SQLはまさにこれだ。データベースという「本棚」に向かって、「この条件で、このデータを、この順番で出してください」と指示する言葉——それがSQL(Structured Query Language)だ。
プログラミング経験がなくても、SQLは「人間が読んでほぼ意味がわかる」書き方になっている。SELECT name FROM books WHERE genre = 'SF' は「本テーブルからジャンルがSFのものの名前を取ってきて」と読める。英語が少しわかれば、何となく意味が推測できる。
この記事でわかること
- データベースの基本構造(テーブル・行・列)
- SELECT・FROM・WHERE・ORDER BYの基本的な書き方
- 複数のテーブルを結合するJOINの考え方
- GROUP BYで集計する方法
- 高校情報Ⅰ・ITパスポートでよく出る問題パターン
データベースの基本構造:本棚・棚・本の関係
📌 要点:データベースはテーブル(表)の集まり。テーブルは行(レコード)と列(カラム/フィールド)で構成される。Excelの表と同じイメージだが、データベースは大量のデータを高速に検索・更新できる仕組みになっている。

データベースの構造を図書館に例えると:
| 図書館 | データベース |
|---|---|
| 図書館全体 | データベース |
| 「SF小説コーナー」など棚の区分 | テーブル(表) |
| 1冊の本 | 行(レコード) |
| タイトル・著者名などの情報項目 | 列(カラム/フィールド) |
例えば「本」テーブルはこんな構造だ。
booksテーブル:
| id | title | author | genre | year |
|---|---|---|---|---|
| 1 | 銀河鉄道の夜 | 宮沢賢治 | SF | 1934 |
| 2 | ノルウェイの森 | 村上春樹 | 小説 | 1987 |
| 3 | 三体 | 劉慈欣 | SF | 2008 |
| 4 | 1984年 | ジョージ・オーウェル | SF | 1949 |
この表から「SFだけを取り出す」「出版年が新しい順に並べる」「著者ごとに何冊あるか数える」——そういった操作をSQLで行う。
SELECT・FROM・WHERE:「何を」「どこから」「条件は」
📌 要点:SQLの最も基本的な形は「SELECT(何を) FROM(どのテーブルから) WHERE(どんな条件で)」の3点セット。英語の語順そのままで「○○テーブルから、条件が△△のもの、□□列を取ってきて」と読める。
全件取得:SELECT * FROM
SELECT * FROM books;
「books テーブルの全列(*)・全行を取ってきて」——一番シンプルな形だ。図書館で「本棚の本を全部見せて」と頼むようなもの。
列を指定する:SELECT 列名
SELECT title, author FROM books;
「books テーブルから title(タイトル)と author(著者)だけ取ってきて」。必要な列だけを指定する。
条件を絞る:WHERE
SELECT title, author FROM books WHERE genre = 'SF';
「books テーブルから genre が SF の行の title と author を取ってきて」。
WHERE句でよく使う条件の書き方:
| やりたいこと | 書き方 | 例 |
|---|---|---|
| 等しい | = | WHERE genre = 'SF' |
| 等しくない | <> または != | WHERE genre <> 'SF' |
| 以上・以下・より大きい・より小さい | >= <= > < | WHERE year >= 2000 |
| 複数条件(両方) | AND | WHERE genre = 'SF' AND year >= 2000 |
| 複数条件(どちらか) | OR | WHERE genre = 'SF' OR genre = '小説' |
| 含む(部分一致) | LIKE | WHERE title LIKE '%の夜%' |
| リストのどれか | IN | WHERE genre IN ('SF', 'ミステリ') |
LIKE の % は「何でもいい文字列」を意味する。'%の夜%' は「〜の夜〜」という文字が含まれるものを全部マッチさせる。
並び替える:ORDER BY
SELECT title, year FROM books ORDER BY year DESC;
「year の降順(DESC = 大きい順)で並べて」。昇順は ASC(小さい順)で、省略すると昇順になる。
-- 先ほどの条件と組み合わせる
SELECT title, author, year
FROM books
WHERE genre = 'SF'
ORDER BY year DESC;
図書館の司書に「SF本を出版年の新しい順で出して」と頼んだ状態だ。
2つのテーブルをつなぐ:JOINの仕組み
📌 要点:JOINは複数のテーブルを共通の列(主キー・外部キー)で結合して、1つの結果として取得する操作。「本テーブルと著者テーブルを著者IDでつないで、著者の詳細情報も一緒に取得する」といった使い方をする。

実際のデータベースでは、情報をテーブルに分けて管理する。たとえば「本の情報」と「著者の詳細情報」を分けるとこうなる。
booksテーブル(著者IDだけ持つ):
| id | title | author_id | genre |
|---|---|---|---|
| 1 | 銀河鉄道の夜 | 101 | SF |
| 3 | 三体 | 102 | SF |
authorsテーブル(著者の詳細):
| id | name | country |
|---|---|---|
| 101 | 宮沢賢治 | 日本 |
| 102 | 劉慈欣 | 中国 |
この2つを結合して「本のタイトル・著者名・著者の国」を一度に取得するには:
SELECT books.title, authors.name, authors.country
FROM books
JOIN authors ON books.author_id = authors.id;
結果:
| title | name | country |
|---|---|---|
| 銀河鉄道の夜 | 宮沢賢治 | 日本 |
| 三体 | 劉慈欣 | 中国 |
JOIN ... ON 条件 は「この条件が一致する行同士をつなぐ」という指示だ。books.author_id = authors.id は「本テーブルの author_id と著者テーブルの id が一致する行でつなぐ」という意味だ。
GROUP BY:ジャンルごとに何冊あるか数える
📌 要点:GROUP BYは指定した列の値でまとめてグループを作り、集計関数(COUNT・SUM・AVGなど)で各グループの集計値を計算する。「ジャンル別の冊数」「年別の売上合計」など、分類してから集計したい場合に使う。
SELECT genre, COUNT(*) AS 冊数
FROM books
GROUP BY genre;
結果:
| genre | 冊数 |
|---|---|
| SF | 3 |
| 小説 | 1 |
COUNT(*) は「行の数を数える」集計関数だ。AS 冊数 は「この列の名前を冊数と表示する」という意味だ(エイリアスと呼ぶ)。
よく使う集計関数:
| 関数 | 意味 | 使用例 |
|---|---|---|
COUNT(*) | 行の数を数える | 本の冊数 |
SUM(列名) | 合計を計算する | 売上の合計 |
AVG(列名) | 平均を計算する | 評価点の平均 |
MAX(列名) | 最大値を取得する | 最も高い価格 |
MIN(列名) | 最小値を取得する | 最も古い出版年 |
GROUP BYした後に条件をつけたいときは WHERE ではなく HAVING を使う。
-- 2冊以上あるジャンルだけ表示
SELECT genre, COUNT(*) AS 冊数
FROM books
GROUP BY genre
HAVING COUNT(*) >= 2;
SQLの基本構文をまとめると
📌 要点:SELECTから始まる基本クエリはFROM・WHERE・GROUP BY・HAVING・ORDER BYの順番で書く。この順番は固定されているため、順番を間違えるとエラーになる。書く順番と実行される順番が異なる点にも注意。
SELECT 列名(または * または集計関数)
FROM テーブル名
JOIN 結合するテーブル名 ON 結合条件 -- 必要な場合
WHERE 絞り込み条件 -- 必要な場合
GROUP BY グループ化する列名 -- 必要な場合
HAVING グループ化後の絞り込み条件 -- 必要な場合
ORDER BY 並び替えの列名 ASC/DESC -- 必要な場合
LIMIT 取得する最大行数 -- 必要な場合
書く順番と実行順番は違う:
SQLは「書いた順番」で実行されるわけではない。
実際の実行順: FROM → JOIN → WHERE → GROUP BY → HAVING → SELECT → ORDER BY → LIMIT
WHERE より SELECT が先に書かれているが、実行は WHERE が先だ。これを知っておくと「なぜこのエラーが出るか」が理解しやすくなる。
高校情報Ⅰ・ITパスポートでよく出る問題パターン
📌 要点:試験では「SQLの結果として何行・何列返るか」「WHEREの条件式が正しく書けるか」「JOINで結合した結果がどうなるか」「集計関数の使い方」が頻出。実際に手を動かして書くより、結果を読む問題が多い。
頻出パターン①:SELECTの結果を答える
SELECT title FROM books WHERE genre = 'SF' AND year >= 2000;
上記のクエリを books テーブルに対して実行したとき返ってくる結果は何か。
(booksテーブルから、SFでかつ2000年以降の本のタイトルだけが返ってくる)
頻出パターン②:集計結果を答える
SELECT COUNT(*) FROM books WHERE genre = 'SF';
→ books テーブルにSFが3行あれば「3」が返ってくる。
頻出パターン③:ORDER BYの並び順
SELECT title, year FROM books ORDER BY year ASC;
→ 出版年の昇順(古い順)に全本のタイトルと出版年が返ってくる。
頻出パターン④:LIKEの使い方
Q. 「タイトルに"鉄道"が含まれる本を検索するSQL」として正しいものは?
A. WHERE title LIKE '%鉄道%'
FAQ
- QSQLはプログラミング言語ですか?
- A
厳密には「クエリ言語(問い合わせ言語)」です。PythonやJavaのような汎用プログラミング言語とは異なり、データベースへの問い合わせ(検索・追加・更新・削除)に特化しています。ただし「SQLを書ける」はITの基礎スキルとして広く求められるため、プログラミングと並んで重要な技術です。
- QSELECT以外にどんな命令がありますか?
- A
SQLの主な命令はSELECT(検索)・INSERT(追加)・UPDATE(更新)・DELETE(削除)の4種類です。これをCRUD(Create/Read/Update/Delete)と呼びます。試験ではSELECTが最も多く出題されますが、INSERT・UPDATE・DELETEの基本的な書き方も覚えておくと安心です。
- QMySQLとPostgreSQLとSQLiteは何が違いますか?
- A
すべてSQLを使うデータベース管理システム(DBMS)です。SQLの基本構文はほぼ共通ですが、一部の関数名や高度な機能に差があります。MySQLはWebシステムで最もよく使われ、PostgreSQLは高機能・大規模向け、SQLiteはファイル1つで動くため組み込み・スマホアプリに使われます。
- QJOINの種類(INNER JOIN・LEFT JOINなど)が複数あります。違いは何ですか?
- A
INNER JOIN(内部結合)は両方のテーブルに一致する行だけ返します。LEFT JOIN(左外部結合)は左のテーブルの全行を返し、右のテーブルに一致する行がなければNULL(空欄)になります。試験ではINNER JOINが基本ですが、「片方にしか存在しないデータを含めたい」場合にLEFT JOINを使います。
- QNULL(ヌル)とは何ですか?
- A
NULLは「値が存在しない・不明・未設定」を表す特別な状態です。0でも空文字でもなく「そもそも値がない」という意味です。NULLの比較は
= NULLではなくIS NULLと書く必要があります。WHERE age = NULLはNULLを正しく検索できず、WHERE age IS NULLと書かなければなりません。
- Qデータベースの「主キー」と「外部キー」とは何ですか?
- A
主キー(Primary Key)はテーブルの各行を一意に識別するための列です。
id列がよく使われます。重複は許されません。外部キー(Foreign Key)は別のテーブルの主キーを参照する列です。booksテーブルのauthor_idがauthorsテーブルのid(主キー)を参照する場合、author_idが外部キーです。JOINはこの関係を使って2つのテーブルをつなぎます。
まとめ
- SQLはデータベースへの「問い合わせ言語」。図書館の司書に条件を伝えて本を出してもらう感覚
- 基本構文は
SELECT 列 FROM テーブル WHERE 条件の3点セット ORDER BYで並び替え、GROUP BYでグループ集計、JOINで複数テーブルを結合するCOUNT・SUM・AVG・MAX・MINの集計関数で「数える・合計・平均・最大・最小」ができる- 書く順番(SELECT→FROM→WHERE…)と実行順番(FROM→WHERE→SELECT…)は異なる
「SF小説で2020年以降のものを著者名順で全部出して」——これが日本語で言えるなら、SQLでも書ける。条件を一つずつ WHERE に、並び順を ORDER BY に書くだけだ。最初は難しく見えるが、英語の語順と意味を素直に読めば、すぐに「書ける言語」になる。
関連記事
データベースの設計思想(なぜテーブルを分けるか)を理解したい方はこちら。
→ Notionの破綻はコッドで防げる:関係データベースの思想
データベースの正規化(なぜ表を分割するか)を詳しく知りたい方はこちら。
→ 完璧な表はなぜゴミになるのか?第5正規形まで解説
“`

