SQLite | ゼロからはじめるSQL、30日で習得するSQLite:基礎理解 - Day6 データ取得②

SQLite
スポンサーリンク

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 / ORLIKE を組み合わせた、より実践的な検索例
メールアドレスやドメインでのあいまい検索
「結果が多すぎる・少なすぎる」ときに条件を見直す思考法
などを扱って、Day6 の内容を「実務レベルに近い感覚」まで引き上げていきます。

タイトルとURLをコピーしました