文系出身がゼロからSQLを学んでみた 〜全体像編〜

文系出身がゼロからSQLを学んでみた 〜全体像編〜

2026.04.30

はじめに

SQLを学び始めたとき、最初に感じたのは、「覚えることが多くて、全部バラバラに見える」ということでした。
ですが、一通り触ってみると、SQLは実はとてもシンプルで、「データを作る・見る・変える・消す」という基本の流れで成り立っていると分かりました。

この記事では、SQLの基本と私自身がつまづいたポイントをまとめます。

カレントディレクトリとは

SQLそのものの用語ではありませんが、開発学習の中でよく出てくる言葉です。
カレントディレクトリとは今、自分が作業しているフォルダ(場所)のことです。
ファイルやデータベースを扱うときの基準になるため、SQL学習とあわせて覚えておくと理解しやすくなります。

SQLの基本操作(CRUD)

SQLは主に、次の4つの操作で成り立っています。

Create:作る
→ データやテーブルを作成する

Read:読む
→ データを取得して確認する

Update:更新する
→ 既存のデータを書き換える

Delete:削除する
→ データを削除する

この4つを意識すると、SQL全体の整理がしやすくなります。

データの取得(SELECT)

SELECT drink FROM cafe_orders;

データを取り出す基本の命令です。

最低限必要なのは、次の2つです。

  • SELECT:どのデータを取り出すか
  • FROM:どのテーブルから取り出すか

以下のように書くと、複数カラムを取得することができます。

SELECT id, drink FROM cafe_orders;

すべてのカラムを取得したい場合は、次のように書きます。

SELECT * FROM cafe_orders;

データの更新(UPDATE)

UPDATE cafe_orders
SET drink = 'cocoa';

既存のデータを書き換える操作です。
計算を使った更新もできます。

UPDATE cafe_orders
SET id = id + 1;
# 通常の書き方
id = id + 1

# 省略記法
id += 1

Pythonではこのように省略して書くことができますが、SQLでは省略できません。
また、WHEREを付けないとテーブル内の全データが更新されるため注意が必要です。

条件で絞る(WHERE)

SELECT * FROM cafe_orders
WHERE id = 1;

WHEREは、条件に合うデータだけを取り出したいときに使います。
ポイントは、グループ化する前のデータに対して条件を付けることです。

HAVING(グループ化した後の条件)

SELECT drink, COUNT(*)
FROM cafe_orders
GROUP BY drink
HAVING COUNT(*) > 10;

HAVINGは、グループ化した後の結果に条件を付けるときに使います。

WHEREとHAVINGの違い

WHEREとHAVINGは似ていますが、

  • WHERE:グループ化前に条件を付ける
  • HAVING:グループ化後に条件を付ける

という違いがあります。
私はここで躓いたのですが、例えばWHEREの場合

SELECT drink, COUNT(*)
FROM cafe_orders
WHERE drink != 'water'  # 集計前に除外
GROUP BY drink

このように集計前のデータからwaterを除外し、残ったデータを集計します。

しかし、HAVINGの場合は、

SELECT drink, COUNT(*)
FROM cafe_orders
GROUP BY drink
HAVING COUNT(*) >= 3  # 集計後に絞り込む

このように集計後に絞り込むため、全データを集計したのちにCOUNT(*)が3以上のものだけ残します。
使い分けとしては、特定の行を除外したい時はWHERE、集計結果を絞り込みたい時にはHAVINGを用いるというように理解しました。

集計とグループ化(GROUP BY)

SELECT drink, COUNT(*)
FROM cafe_orders
GROUP BY drink;

GROUP BYは、同じ値ごとにデータをまとめるために使います。
この例では、カフェの注文データ(cafe_orders)から、何の飲み物が何杯注文されたかを数えています。

NULLの扱い

NULLとは「値が存在しない」ことを表す特別な値です。
イメージとしては以下のように捉えるとわかりやすかったです。

0 → ゼロという値がある
"" → 空文字という値がある
NULL → 値自体が存在しない(空欄)

id  drink      price
1   coffee     500
2   cocoa      NULL   # 金額が不明・未入力
3   apple      400
SELECT *
FROM cafe_orders
WHERE price IS NULL

上記の場合は、priceがNULLの行だけを取得します。
また、NULLを条件に使うときは、= ではなく IS NULLを使います。
これはSQLの中でも最初に少し戸惑いやすいポイントでした。

SELECT *
FROM cafe_orders
WHERE price IS NOT NULL

そして、IS NOT NULL を使うと、priceがNULLではない行だけ取得することができます。

また、計算の中でNULLを使用しても、計算結果はすべてNULLとなります。

NULL + 1NULL
NULL * 100NULL

COUNTでの挙動は以下のようになります。

COUNT(*)      # NULLも数える
COUNT(price)    # NULLは数えない

COUNT(*)行が存在するかどうかだけを数えるため、NULLも数えます。
しかし、COUNT(price)は、その列に値があるかどうかを数えるため、NULLは除外されます。
使い分けとしては、全行数を知りたいときはCOUNT(*) 、値が入っている行を知りたいときは、COUNT(price)というように書くと理解しました。

件数制限(LIMIT / OFFSET)

SELECT * FROM users
LIMIT 20 OFFSET 10;

これは、10件分スキップして、その後の20件を取得するという意味です。
LIMITで取得する件数を制限し、OFFSETでどこから取得するかを指定します。
この場合、最初の10件分をスキップするので11件目から30件目までの計20件のデータを取得することになります。

SQLの実行順序

SQLは、書く順番と実際に処理される順番が違うという特徴があります。

書く順番は次の通りです。

SELECT
FROM
WHERE
GROUP BY
HAVING
ORDER BY

ただし、処理の流れを理解するときは、次の順番で考えると整理しやすいです。

  1. FROM
  2. WHERE
  3. GROUP BY
  4. HAVING
  5. SELECT
  6. ORDER BY

この違いは、最初につまずきやすいポイントのひとつでした。

JOIN(テーブル結合)

SELECT *
FROM users
JOIN drink
ON drink.id = users.drink_id

JOINは、複数のテーブルをつなげて扱うための機能です。
たとえば、usersテーブルとdrinkテーブルを結び付けることで、ユーザー情報とドリンク情報を一緒に取得できます。

サブクエリ

サブクエリは、SQLの中にSQLを書く方法です。

SELECT *
FROM users
WHERE drink_id = (
    SELECT id
    FROM drink
    WHERE name = 'coffee'
)

処理の順番は先に内側のクエリが実行され、次に外側のクエリが実行されます。
この例では、まず内側のクエリでcoffeeのidは何番か調べ、内側のクエリで返ってきたdrink_idのユーザ全員を外側のクエリで取得します。

JOINとサブクエリの違い

JOINとサブクエリは、どちらも複数テーブルを使う場面で登場するため、最初は混乱しやすい部分でした。
ざっくり次のように考えると分かりやすいです。

JOIN
→ テーブルをくっつけることが目的
→ 結果に両方のテーブルの列が出せる

サブクエリ
→ 条件を調べることが目的
→ 結果には1つのテーブルの列しか出ない

両方のテーブルの情報を表示したいならJOIN、条件だけに使いたいならサブクエリというように、用途で考えると整理しやすくなります。

EXISTS

EXISTSは、条件に合うデータが存在するかどうかを確認するものです。
ポイントは、値そのものを取り出したいのではなく、「あるか・ないか」を判定したいときに向いていることです。

SELECT name
FROM users
WHERE EXISTS (
    SELECT *
    FROM orders
    WHERE orders.user_id = users.id
)
);

上記の場合は、内側のクエリでordersのuser_idとusersのidが一致する行を探し、usersテーブルからnameの列だけを内側のクエリの結果が存在する場合のみ表示します。
つまり、注文したことがあるユーザーの名前だけ取得するクエリとなります。

まとめ

SQLは一見難しく見えますが、「データをどう扱うか」を決めるルールです。

基本となるのは、次の4つです。

  • SELECT:見る
  • INSERT:追加する
  • UPDATE:変更する
  • DELETE:削除する

この軸が分かると、SQL全体がかなり理解しやすくなります。
最初は用語や文法を暗記しようとして詰まりましたが、「何をしたいのか」で考えることが大切だと気づいてから、かなり楽になりました。
SQLは細かいルールが多く見えますが、やりたいことに沿って整理すると、少しずつつながって見えてきます。
これから学ぶ人にとっても、まずは全体像をざっくりつかんでから一つずつ理解していくことが、学びやすさにつながると感じています。

クラスメソッドオペレーションズ株式会社について

クラスメソッドグループのオペレーション企業です。
運用・保守開発・サポート・情シス・バックオフィスの専門チームが、IT・AIをフル活用した「しくみ」を通じて、お客様の業務代行から課題解決や高付加価値サービスまでを提供するエキスパート集団です。
当社は様々な職種でメンバーを募集しています。
「オペレーション・エクセレンス」と「らしく働く、らしく生きる」を共に実現するカルチャー・しくみ・働き方にご興味がある方は、クラスメソッドオペレーションズ株式会社 コーポレートサイトをぜひご覧ください。
※2026年1月 アノテーション㈱から社名変更しました。

この記事をシェアする

関連記事