📖 テーマ設定
🔊 音声設定
1.2
1.0
1.0
▶️ 再生コントロール
🎵 BGM設定
0.3
🔔 効果音設定
0.3

並び替えとパターン検索(ORDER BY/LIKE/IN/BETWEEN)

概要

  • 日程: Day 1 / セッション 8
  • 時間: 14:25-14:55
  • 形式: 座学
  • ゴール: ORDER BY、LIKE、IN、BETWEEN それぞれの使いどころを使い分けの観点で説明できる
  • 学習形式: 対話型解説

導入(5分)

前のセッション7で、= < >= などの比較演算子で行を絞り込む練習をしました。「営業部の人」「給与50万円以上の人」までは書けるようになりましたね。

でも、実際の業務ではこんな注文が来ます。「給与の高い順で並べてほしい」「名字が『山』で始まる人」「営業部か開発部の人」「給与が40〜50万円の人」。1個ずつ OR で繋いだり、>=<= を両方書くのは大変です。

このセッションでは、SQL に最初から備わっている便利な「並べる道具・絞り込む道具」を4つ覚えます。ORDER BY LIKE IN BETWEEN の4兄弟です。

本編(20分)

1. ORDER BY:並び替えの基本

ORDER BY は結果を並び替える句です。SELECT ... FROM ... WHERE ... ORDER BY 列名; の位置に書きます。

-- 給与の安い順(昇順、ASC)
SELECT first_name, last_name, salary
FROM employees
ORDER BY salary ASC;

-- 給与の高い順(降順、DESC)
SELECT first_name, last_name, salary
FROM employees
ORDER BY salary DESC;

ASC(ascending=昇順)は省略可能でデフォルトです。DESC(descending=降順)は明示が必要です。

複数列でも並べられます。たとえば「部署ID昇順、その中で給与降順」なら:

SELECT department_id, last_name, salary
FROM employees
ORDER BY department_id ASC, salary DESC;

ここがポイント

  • 並びの優先順位は「左から右」。最初の列で並べ、同じ値があれば次の列で並べる
  • 数値も文字列も日付も並べられる
  • WHEREの後に書く(順序:SELECT → FROM → WHERE → ORDER BY

コラム

文字列の並び替えは、実は奥が深い世界です。'A' < 'B' < 'C' は当然として、'a''A' のどちらが先か、'あ''ア' の順序、'あ''い' のどちらが先か——これらは「照合順序(collation)」というデータベースの設定で決まります。日本語の50音順が正しく出てくるのは、データベースが「日本語の並び順を知っている」からです。あなたがこの研修中に sandbox で出会う日本語の並び順は、Linux のデフォルト照合順序による結果。気が向いたら ORDER BY last_name で並びを観察してみてください。

2. LIKE:パターン検索の魔法

LIKE は「曖昧な文字列マッチング」を実現する演算子です。2つのワイルドカードを使います。

記号 意味
% 0文字以上の任意の文字列
_ ちょうど1文字の任意の文字
-- 名字が「山」で始まる(前方一致)
SELECT * FROM employees WHERE last_name LIKE '山%';

-- 名前のどこかに「田」を含む(部分一致)
SELECT * FROM employees WHERE last_name LIKE '%田%';

-- 名字が「藤」で終わる(後方一致)
SELECT * FROM employees WHERE last_name LIKE '%藤';

-- 名字がちょうど2文字で2文字目が「田」
SELECT * FROM employees WHERE last_name LIKE '_田';

ここで少し考えてみてください。LIKE '田%'LIKE '%田%' 、それぞれどんな名前にマッチするでしょうか?前者は「田中」「田村」など田で始まる人。後者は「田中」「山田」「藤田」など田を含む人すべて。% の位置で意味が大きく変わります。

ここがポイント

  • % は「何でも何文字でもOK(0文字含む)」
  • _ は「何でもいいけどちょうど1文字」
  • 大文字小文字を区別したくない場合は ILIKE(PostgreSQL拡張)が使える

3. IN:「いずれかに一致」を短く書く

複数の値のうち、どれかに一致する行を選びたいときに使います。

-- 営業部または開発部または人事部
SELECT * FROM employees
WHERE department_id IN (1, 2, 3);

-- OR で書くと長い
SELECT * FROM employees
WHERE department_id = 1
   OR department_id = 2
   OR department_id = 3;

意味は同じですが、IN のほうが読みやすく、メンテナンスも楽です。要するに INOR の省略形だと考えてください。

文字列でも使えます。

SELECT * FROM products
WHERE product_name IN ('USBメモリ 64GB', 'ホチキス', '付箋メモ');

ここがポイント

  • 値のリストは (値1, 値2, ...) の形でカッコ内にカンマ区切り
  • 文字列も数値もOK
  • NOT IN で「いずれにも一致しない」も書ける

4. BETWEEN:範囲指定の便利屋

「○○以上××以下」のような連続した範囲を絞り込むときに使います。

-- 給与が40万〜50万の社員
SELECT * FROM employees
WHERE salary BETWEEN 400000 AND 500000;

-- 上は >= AND <= と同じ
SELECT * FROM employees
WHERE salary >= 400000 AND salary <= 500000;

ここで重要なのは、BETWEEN A AND B は「A以上 B以下」、両端を含むということ。「400000 を含むのか含まないのか」で迷ったら、「以上 & 以下」と暗唱してください。

日付にも使えます。

-- 2020年に入社した社員
SELECT * FROM employees
WHERE hire_date BETWEEN '2020-01-01' AND '2020-12-31';

ここがポイント

  • BETWEEN A AND BA も B も含む(境界値を含む)
  • 数値、文字列、日付に使える
  • NOT BETWEEN で「範囲外」も書ける

💬 AIに聞いてみよう

  • 「LIKE と IN ってどう使い分けたらいい?場面の例を3つ教えてください」
  • 「ORDER BYで日本語の名前を50音順に並べたいのですが、ちゃんと並ばないことがあると聞きました。どう対処すれば?」
  • 「BETWEENで BETWEEN 100 AND 200 と書いたとき、100や200の扱いって製品で違ったりする?」

まとめ(5分)

一言でまとめると「ORDER BY で並べる、LIKE で曖昧に探す、IN で複数候補から選ぶ、BETWEEN で範囲を絞る」。この4つを覚えておけば、現実のデータ抽出シーンの8割はカバーできます。

それぞれの「使い分け」を整理すると:

  • 並び替えたい → ORDER BY
  • 文字列のパターン → LIKE% _
  • 飛び飛びの複数値 → IN
  • 連続した範囲 → BETWEEN

次のセッションでは、これらと AND OR を組み合わせた「複合条件」の演習をします。「給与40万以上の営業部社員を給与降順」のような、現実的な問いに答えるSQLを書いていきましょう。

🔄 振り返りチェック

  • LIKE '田%'LIKE '%田' の違いを、1文で説明できますか?
  • IN (1, 2, 3) は、なぜ OR 3つ書くより便利だと言われますか?
  • BETWEEN 100 AND 200 で、100 と 200 は結果に含まれますか?

補足資料

  • 発展課題: メールアドレスが @example.com で終わる社員を LIKE を使って抽出するSQLを書く。さらに「名字が山か田中の社員」を IN で書く

学習ガイド

想定される質問と回答例

質問 ヒント
LIKE% 自体を検索したい場合は? エスケープを使う。LIKE '50\%引き' のように \% で文字としての % を表現できる(ESCAPE指定)
ORDER BY 列を SELECT に含めなくていい? 含めなくても動く。ただし結果から並び順の理由が見えないので、初学のうちは含めるのが無難
IN (NULL, 1, 2) と書くと何が起きる? NULLは特別。= NULL が常に未知になるため、NULL を IN に入れても期待通り動かないことがある(Day2の NULL の回で詳説)
日本語の LIKE は遅くないか? データ量が少なければ気にならない。大量データではインデックスが効くか・効かないかで速度差が出る(Day2のインデックス回で扱う)

つまずきやすいポイント

つまずきポイント ヒント
% を「1文字以上」と勘違い %0文字も含むLIKE '%山%' は「山」単体にもマッチする
_ をアンダースコアでなく - で書いてしまう ハイフンはただの文字。アンダーバーが正しい
BETWEEN の境界を「未満/超」だと思い込む 必ず 以上以下(境界を含む)。覚え方は「BETWEENは両端を抱きしめる」
ORDER BYWHERE の前に書く 文法エラーになる。順序は WHERE → ORDER BY 固定
IN () を空にする 空のリストは PostgreSQL でエラー。1つ以上の値が必要
読み上げを開始します...

AIに質問する