LIKEとBETWEENで柔軟に検索しよう
ストーリー
「名前に"藤"がつく社員を探したいんだけど...」
「完全一致じゃなくて、部分一致で検索したいんだね。LIKE を使えばパターン検索ができるよ」
「あと、給料が30万から35万の範囲の人も調べたいんですが...」
「それなら BETWEEN が便利だよ。範囲指定が簡単にできるんだ」
LIKE(パターン検索)
LIKE は 文字列のパターンに一致するデータを検索します。
ワイルドカード
| 記号 | 意味 | 例 |
|---|---|---|
% | 0文字以上 の任意の文字列 | '%藤%' → 藤を含む |
_ | 1文字の任意の文字 | '田_' → 田+1文字 |
%(パーセント)の使い方
「含む」検索
sql
-- 名前に「藤」を含む社員
SELECT * FROM employees WHERE name LIKE '%藤%';実行結果:
id | name | department | salary
---+----------+------------+-------
2 | 佐藤花子 | 営業部 | 320000
5 | 伊藤健太 | 営業部 | 280000
%藤%は「前に何があっても、後ろに何があっても、"藤"を含む」を意味します。
「で始まる」検索
sql
-- 名前が「田」で始まる社員
SELECT * FROM employees WHERE name LIKE '田%';実行結果:
id | name | department | salary
---+----------+------------+-------
1 | 田中太郎 | 開発部 | 350000
田%は「"田"で始まり、後ろは何でもOK」を意味します。
「で終わる」検索
sql
-- 名前が「郎」で終わる社員
SELECT * FROM employees WHERE name LIKE '%郎';実行結果:
id | name | department | salary
---+----------+------------+-------
1 | 田中太郎 | 開発部 | 350000
3 | 鈴木一郎 | 開発部 | 400000
%郎は「前は何でもOKで、"郎"で終わる」を意味します。
パターンまとめ
| パターン | 意味 | マッチ例 |
|---|---|---|
'%藤%' | 「藤」を含む | 佐藤花子、伊藤健太 |
'田%' | 「田」で始まる | 田中太郎 |
'%郎' | 「郎」で終わる | 田中太郎、鈴木一郎 |
'%ート%' | 「ート」を含む | ノートPC、ヘッドセット |
_(アンダ ースコア)の使い方
_ は ちょうど1文字に対応します。
sql
-- 名前が「田中」+2文字の社員
SELECT * FROM employees WHERE name LIKE '田中__';実行結果:
id | name | department | salary
---+----------+------------+-------
1 | 田中太郎 | 開発部 | 350000
_1つが1文字に対応するので、__(2つ)は2文字に対応します。
NOT LIKE
パターンに一致 しない データを取り出します。
sql
-- 名前に「藤」を含まない社員
SELECT * FROM employees WHERE name NOT LIKE '%藤%';実行結果:
id | name | department | salary
---+----------+------------+-------
1 | 田中太郎 | 開発部 | 350000
3 | 鈴木一郎 | 開発部 | 400000
4 | 高橋美咲 | 人事部 | 300000
BETWEEN(範囲指定)
BETWEEN は 指定した範囲内のデータを検索します。
構文
sql
SELECT * FROM テーブル WHERE カラム BETWEEN 最小値 AND 最大値;給料が30万以上35万以下の社員
sql
SELECT * FROM employees WHERE salary BETWEEN 300000 AND 350000;実行結果:
id | name | department | salary
---+----------+------------+-------
1 | 田中太郎 | 開発部 | 350000
2 | 佐藤花子 | 営業部 | 320000
4 | 高橋美咲 | 人事部 | 300000
BETWEENのポイント
- 両端を含む(30万 <= salary <= 35万)
- 以下の書き方と同じ意味:
sql
-- BETWEENを使わない場合
SELECT * FROM employees WHERE salary >= 300000 AND salary <= 350000;
-- BETWEENを使う場合(同じ結果、読みやすい)
SELECT * FROM employees WHERE salary BETWEEN 300000 AND 350000;価格の範囲で検索
1万円以上5万円以下の商品
sql
SELECT * FROM products WHERE price BETWEEN 10000 AND 50000;実行結果:
id | name | category | price | stock
---+----------------+----------+-------+------
3 | デスク | 家具 | 35000 | 8
4 | チェア | 家具 | 45000 | 12
5 | モニター | 電子機器 | 32000 | 20
7 | ヘッドセット | 電子機器 | 12000 | 30
8 | ブックシェルフ | 家具 | 18000 | 5
在庫が10個以上30個以下の商品
sql
SELECT name, stock FROM products WHERE stock BETWEEN 10 AND 30;実行結果:
name | stock
---------------+------
ノートPC | 15
チェア | 12
モニター | 20
ヘッドセット | 30
NOT BETWEEN
範囲 外 のデータを取り出します。
sql
-- 価格が1万円未満または5万円を超える商品
SELECT * FROM products WHERE price NOT BETWEEN 10000 AND 50000;実行結果:
id | name | category | price | stock
---+----------+----------+-------+------
1 | ノートPC | 電子機器 | 89000 | 15
2 | マウス | 電子機器 | 2500 | 100
6 | キーボード | 電子機器 | 8000 | 50
LIKEとBETWEENを他の条件と組み合わせる
電子機器カテゴリで、価格が1万円以上の商品
sql
SELECT * FROM products
WHERE category = '電子機器' AND price BETWEEN 10000 AND 50000;実行結果:
id | name | category | price | stock
---+--------------+----------+-------+------
5 | モニター | 電子機器 | 32000 | 20
7 | ヘッドセット | 電子機器 | 12000 | 30
名前に「藤」を含む営業部の社員
sql
SELECT * FROM employees
WHERE name LIKE '%藤%' AND department = '営業部';