Day6 前半
「条件を組み合わせる」と「ざっくり探す」を覚える日
Day5 では、WHERE で「1つの条件」を使って絞り込むことをやりました。
Day6 では、そこから一歩進んで
- 条件を組み合わせる
AND/OR - 部分一致で探す
LIKE(あいまい検索)
を扱います。
ここを越えると、SQL が一気に「検索っぽく」なります。
現実のシステムでよくある「この条件とこの条件、両方満たす人だけ」「名前に『田』が含まれる人だけ」といった検索が書けるようになります。
AND / OR のイメージ
「かつ」と「または」をそのままSQLにする
まずは、日本語の感覚から整理します。
「20歳以上 かつ 30歳未満」
「東京都 在住 かつ 会員ステータスが有効」
この「かつ」が AND です。
「20歳未満 または 60歳以上」
「東京都 在住 または 神奈川県 在住」
この「または」が OR です。
SQL では、WHERE の中で条件をつなぐときに、この AND / OR を使います。
例題の準備:usersテーブルをもう一度確認する
Day5 までで使ってきた users テーブルを、少しだけ行を増やしておきます。
id | name | age | email
---+------------+-----+----------------------
1 | 山田太郎 | 25 | taro@example.com
2 | 佐藤花子 | 19 | hanako@example.com
3 | 鈴木一郎 | 30 | ichiro@example.com
4 | 高橋健 | 22 | ken@example.com
5 | 田中花子 | 28 | hanako.t@example.com
このテーブルを使って、AND / OR の感覚をつかんでいきます。
AND(かつ)で条件を絞る
「両方の条件を満たす行だけ欲しい」
たとえば、次のような条件を考えます。
「20歳以上 かつ 30歳未満のユーザーだけ欲しい」
これは、年齢が 20 より大きく、かつ 30 より小さい、という意味です。
SQL にするとこうなります。
SELECT * FROM users
WHERE age > 20
AND age < 30;
SQLここでのポイントは、「WHERE の中に条件を2つ書き、それを AND でつないでいる」という形です。
この条件を満たすのは誰か、テーブルを見ながら考えてみると、
山田太郎(25) → 20より大きく、30より小さい → 該当
佐藤花子(19) → 20より大きくない → 不該当
鈴木一郎(30) → 30より小さくない → 不該当
高橋健(22) → 該当
田中花子(28) → 該当
結果はこうなります。
id | name | age | email
---+------------+-----+----------------------
1 | 山田太郎 | 25 | taro@example.com
4 | 高橋健 | 22 | ken@example.com
5 | 田中花子 | 28 | hanako.t@example.com
AND は「両方の条件を満たす行だけ通すフィルター」だ、とイメージしてください。
OR(または)で条件を広げる
「どちらか一方でも満たせばOK」
次に、こういう条件を考えます。
「20歳未満 または 30歳以上のユーザーだけ欲しい」
これは、年齢が 20 より小さいか、30 以上か、どちらかを満たせばよい、という意味です。
SQL にするとこうなります。
SELECT * FROM users
WHERE age < 20
OR age >= 30;
SQLこの条件を満たすのは誰か、同じように考えてみます。
山田太郎(25) → 20未満でも30以上でもない → 不該当
佐藤花子(19) → 20未満 → 該当
鈴木一郎(30) → 30以上 → 該当
高橋健(22) → どちらでもない → 不該当
田中花子(28) → どちらでもない → 不該当
結果はこうなります。
id | name | age | email
---+------------+-----+----------------------
2 | 佐藤花子 | 19 | hanako@example.com
3 | 鈴木一郎 | 30 | ichiro@example.com
OR は「どちらか一方でも条件を満たせば通すフィルター」です。AND と逆で、「条件を増やすほど結果が減る」のが AND、「条件を増やすほど結果が増えやすい」のが OR という感覚も持っておくとよいです。
AND / OR を使うときの注意点
「頭の中の日本語」と「SQLの条件」がズレていないかを常に確認する
たとえば、こういう日本語を考えます。
「20歳以上 かつ 名前に『田』が含まれるユーザー」
これは、「年齢の条件」と「名前の条件」の両方を満たす必要があります。
だから AND です。
SELECT * FROM users
WHERE age >= 20
AND name LIKE '%田%';
SQL一方で、
「20歳未満 または 30歳以上のユーザー」
は、どちらか一方でよいので OR です。
SELECT * FROM users
WHERE age < 20
OR age >= 30;
SQLこの「日本語で一度言い直してから SQL にする」という癖をつけると、AND / OR の取り違えが減ります。
取り違えると、結果が「多すぎる」「少なすぎる」状態になり、セキュリティ的にも危険です(本来見せてはいけないデータまで取ってしまう可能性があるため)。
LIKE(あいまい検索)の入り口
「完全一致じゃなくて、『含まれていればOK』で探したい」
ここから、LIKE の話に入ります。= は「完全に一致しているかどうか」を見る演算子でした。
WHERE name = '山田太郎';
SQLこれは、「名前がぴったり ‘山田太郎’ の人だけ」を探します。
しかし現実には、
「名前に『田』が含まれる人」
「メールアドレスに ‘example.com’ が含まれる人」
のように、「部分的に一致していればOK」という検索をしたいことがよくあります。
このときに使うのが LIKE です。
LIKE とワイルドカード % の基本
「% は“何文字でもいい”という穴あき記号」
LIKE は、次のように使います。
WHERE 列名 LIKE 'パターン';
SQLここで出てくる 'パターン' の中に、% という特別な記号を使います。% は「0文字以上、何文字でもよい」という意味のワイルドカードです。
たとえば、
'田%' は「田で始まる任意の文字列」'%田' は「田で終わる任意の文字列」'%田%' は「どこかに田を含む任意の文字列」
という意味になります。
例題:名前に「田」を含むユーザーを探す
先ほどの users テーブルで、「名前に『田』が含まれるユーザー」を探してみます。
SELECT * FROM users
WHERE name LIKE '%田%';
SQL'%田%' は、「前に何文字あってもよいし、後ろに何文字あってもよい。そのどこかに『田』が入っていればOK」という意味です。
テーブルを見てみると、
山田太郎 → 「田」を含む → 該当
佐藤花子 → 含まない → 不該当
鈴木一郎 → 含まない → 不該当
高橋健 → 含まない → 不該当
田中花子 → 「田」を含む → 該当
結果はこうなります。
id | name | age | email
---+------------+-----+----------------------
1 | 山田太郎 | 25 | taro@example.com
5 | 田中花子 | 28 | hanako.t@example.com
LIKE '%田%' は、「名前に田が含まれている人をざっくり探す」という、まさに“あいまい検索”です。
Day6 前半のまとめ
AND は「かつ」、OR は「または」。AND は条件を厳しくし、OR は条件を広げる。LIKE は「完全一致ではなく、パターンで探す」ための演算子。% は「何文字でもよい」というワイルドカードで、'%田%' のように使うと「どこかに田を含む」検索になる。
後半では、AND / OR と LIKE を組み合わせた、より実践的な検索例
メールアドレスやドメインでのあいまい検索
「結果が多すぎる・少なすぎる」ときに条件を見直す思考法
などを扱って、Day6 の内容を「実務レベルに近い感覚」まで引き上げていきます。
