「nameの値が頭文字がAで始まる行を抽出する」
「priceの値が0で終わる行を抽出する」
僕
どちらも↑のようなことができるってわかるけど、いまいち違いが分からない。
そう感じている人に向けて、SQLにおける「%」と「_」の違いについて解説します。
%(パーセント)と_(アンダーバー)の違い
シンプルに違いを説明すると次のようになります。
% → 文字数は何文字でもいいから、頭文字や語尾だけ指定して抽出する
_ → 文字数も指定して抽出する
どのように摘出されるかを見る
「%」と「_」を使うと、それぞれどのようにデータが抽出されるのかを実際に見てみましょう。
例えば、次のような「アルファベット」というテーブルがあったとします。
id | name | price |
---|---|---|
1 | ABC | 100 |
2 | CBA | 200 |
3 | AB | 300 |
4 | BC | 400 |
このときに「%」と「*」をそれぞれ使って、一番最初の文字がAであるデータという条件でデータを抽出してみます。
%を使って抽出
抽出するためのSQL文は次のようになります。
SELECT * FROM WHERE name LIKE 'A%'
抽出されるデータはこちらです。
id | name | price |
---|---|---|
1 | ABC | 100 |
3 | AB | 300 |
_を使って抽出
抽出するためのSQL文は次のようになります。
SELECT * FROM WHERE name LIKE 'A_'
抽出されるデータはこちらです。
id | name | price |
---|---|---|
3 | AB | 300 |
どうでしょう?違いはわかったでしょうか?
「%」を使って抽出されたデータが2行なのに対し、「_」を使って摘出されたデータは1行になりました。
抽出できたデータの行が変わった理由
なぜ、抽出できたデータの行が変わったのかというと、それは_を使って抽出した方のSQL文には次の意味が込められていたためです。
SELECT * FROM WHERE name LIKE 'A_'
nameの列において、一番最初が文字がAでありかつAの後ろの文字が1文字である行を抽出する。
Aの右横にある「_」の個数がAの後ろの文字数を指定していたんです。
そのため、次のように2つの「_」を使って抽出しようとすると、
SELECT * FROM WHERE name LIKE 'A__'
抽出されるデータは、こちらに変わります。
id | name | price |
---|---|---|
1 | ABC | 100 |
まとめ
「%」と「_」のどちらとも、次のようなときに使うということに変わりありません。
- 特定の文字から始まる行を抽出したいとき
- 特定の文字で終わる行を抽出したいとき
違うのは、
% → 後ろまたは前の文字数が何文字でも抽出する。
_ → 後ろまたは前の文字数が_の個数の場合のみ抽出する。
という部分でした。
コメント