はじめに
前回、WHERE句を使った条件検索では比較演算子を使ったデータの検索を学習しました。
今回は、もう少し条件を絞った検索の仕方を学習します!
範囲検索
BETWEEN AND
-
BETWEEN ANDを使えば、指定した範囲内のデータを検索することができます! -
BETWEENは指定した値を含んで検索します
例)usersテーブルから10代の人を確認したい時
SELECT * FROM users
WHERE age BETWEEN 10 AND 19;
ちなみに、以下のようにANDのみを使った式でも同じ検索ができます。
SELECT * FROM users
WHERE age >= 10 AND age <= 19;
BETWEENには指定した値も含むので10代の人を確認したい時は10歳~19歳を対象にします!
-
BETWEENでは、idやageなどの数値の検索だけでなく、nameなどの文字列の範囲検索もできます
例)クラスの出席番号でKenからTaroの間にいる生徒を確認したい時
SELECT * FROM users
WHERE name BETWEEN 'Kenji' AND 'Taro'
上記の例では、ORDER BYを使わなくてもアルファベットの並びで抽出されますが、名前の順に正しく出力されるとは限らず、idの順に出力される可能性もあります。
名前順にデータを確認したい場合は、ORDER BYを使うことで整理できます。
NOT BETWEEN AND
- 特定の範囲外のデータを確認したい時は
BETWEENの直前にNOTをつければ検索できます
例)10代ではない人を確認したい時
SELECT * FROM users
WHERE age NOT BETWEEN 10 AND 19;
NOT BETWEENも、ORに置き換えた以下のような式でも同じ検索ができます
SELECT * FROM users
WHERE age < 10 OR age > 19;
リスト検索
IN
- カラムと取得したい値を指定することで実際にDBに保存されてる該当のレコードのみを以下のように取得できます!
例)複数のname候補の中から一致するレコードを検索したい時
SELECT * FROM users
WHERE name IN ('Kenji', 'Taro', 'Sota')
=> nameカラムがKenji・Taro・Sotaのうち、実際にDBに保存されてるレコードを以下のように取得できます!
+----+--------+-----+--------+
| id | name | age | gender |
+----+--------+-----+--------+
| 1 | Kenji | 18 | male |
| 2 | Taro | 25 | male |
| 4 | Sota | 30 | male |
+----+--------+-----+--------+
もしSotaという人物がDBにない場合は、KenjiとTaroのレコードのみを取得します。
NOT IN
-
INにもBETWEEN同様に、NOTをつけることで指定した対象以外のレコードを取得することができます
SELECT * FROM users
WHERE name NOT IN ('Kenji', 'Taro', 'Sota')
この場合、nameカラムがKenji・Taro・Sota以外の人物のレコードを取得します。
+----+----------+-----+----------+
| id | name | age | gender |
+----+----------+-----+----------+
| 3 | Hanako | 23 | female |
| 5 | Yuki | 20 | female |
| 6 | Satoshi | 30 | male |
+----+----------+-----+----------+
パターン検索
文字数指定しない検索 - 「LIKE + %」
- 部分的に一致するレコードを取得したい時に、
%(ワイルドカード)を使って指定した一部が一致していれば結果に含まれるように検索することができます
前方一致
例)nameカラムが「Ken」から始まる人物のレコードを取得したい時
SELECT * FROM users
WHERE name LIKE 'Ken%'
=> Ken・Kenji・Kentaroなどのレコードを取得
後方一致
例)nameカラムが「ko」で終わる人物のレコードを取得したい時
SELECT * FROM users
WHERE name LIKE '%ko'
=> Hanako・Naoko・Yukoなどのレコードを取得
※ 前方一致同様、koという名前のレコードも取得できます
部分一致
例)nameカラムの一部に「ta」が入る人物のレコードを取得したい時
SELECT * FROM users
WHERE name LIKE '%ta%'
=> Kotaro・Sota・taroなどのレコードを取得できます
- また、間に
%を入れても検索できます!
例)「a」で始まり、「s」で終わるスポーツブランドを取得したい時
SELECT * FROM brands
WHERE name LIKE 'a%s'
=> adidas・asicsなどのレコードがヒットします
※ 今回の例だけテーブル名が違いますが、人名の例が思い浮かびませんでした(^^;;
- LIKEを使って完全一致検索も可能です!
SELECT * FROM users
WHERE name LIKE 'Ken'
LIKEを使った完全一致の検索は、
SELECT * FROM users
WHERE name = 'Ken'
と全く同じ意味なので、単純な条件検索ではあまり意味がありません。
むしろ比較演算子の=を使った検索の方が、目的が明確でわかりやすいでしょう。
文字数指定検索 - _(アンダースコア)
- 限定的ですが、
_を使うことで一文字分を埋めることができます
SELECT * FROM users
WHERE name = 'Sh_ta'
=> Shota・Shutaがヒットします
-
_を2連続使った検索もできます!
SELECT * FROM users
WHERE name = 'S__ta'
=> Shota・Shutaに加えて、Syota・Syutaもヒットします