並び替えとパターン検索(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 のほうが読みやすく、メンテナンスも楽です。要するに IN は OR の省略形だと考えてください。
文字列でも使えます。
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 Bは A も 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)は、なぜOR3つ書くより便利だと言われますか?BETWEEN 100 AND 200で、100 と 200 は結果に含まれますか?
補足資料
- 参考リンク: PostgreSQL: パターンマッチ
- 発展課題: メールアドレスが
@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 BY を WHERE の前に書く |
文法エラーになる。順序は WHERE → ORDER BY 固定 |
IN () を空にする |
空のリストは PostgreSQL でエラー。1つ以上の値が必要 |