データベースでは文字列操作を必要とするケースは比較的多く、中でも文字列の検索においては全てのシステムにおいて必要となります。
この文字列操作には様々なものがありますが、今回はその文字列操作の中でも「LIKE句を否定使用する」方法について解説してみたいと思います。
データベースではこのLIKE句やNOT LIKE句を使う頻度が最も多いと思いますので、一緒に学習していきましょう。
NOT LIKE句とは
NOT LIKE句はLIKE句と対を成す命令句であり、指定した文字列を含まないデータを取得したい場合に使用する命令句です。
等号否定(!=)を使えばいいだけでは?と思った方もいらっしゃると思いますが、それで解決するケースばかりではないため、やはり覚えておいた方が良いでしょう。
また若干話はそれますが、もし等号否定で全て解決できるようであれば、そもそもLIKE句やNOT LIKE句というものは存在していないはずですので、やはり必要なケースがあるということになります。
NOT LIKE句の使い方
LIKE句の使い方とほぼ一緒ですが、この記事ではLIKE句の使用方法については触れていないため、ここでは一から解説していきます。
NOT LIKE句にはLIKE句同様に前方一致、後方一致、完全一致という三つの検索方法があります。
どの方法についても、基本的には「検索条件の前後または両方にワイルドカードを記述する」ことで曖昧検索を実行します。
ワイルドカードとは?
ワイルドカードとは、文字列の指定や比較・検索などを行う際に、任意または特定のパターンに一致する文字列の代わりとなる特殊な記号や記法を指します。
例えば以下のコードでは「%(パーセント)」が使用されていますが、これは「0文字以上の任意の文字列」という意味を指します。
他にも「_(アンダーバー)」などがありますが、これは「任意の1文字」を指すワイルドカードとなっています。
前方一致検索(曖昧検索)
SELECT [項目名], ... FROM [テーブル名] WHERE [項目名] NOT LIKE '[検索条件]%';
前方一致検索は、検索条件の後に○○○というような任意の文字を含まないレコードの検索を行いたい場合に使用します。
例えば、検索条件に「sample」を指定し前方一致検索をかけると「○○○sample」の条件に引っ掛かるレコードを全て取得することが出来ます。
※NOT LIKE句で前方一致検索を指定した場合の説明のため、LIKE句とは逆の作用となりますので注意してください。
後方一致検索(曖昧検索)
SELECT [項目名], ... FROM [テーブル名] WHERE [項目名] NOT LIKE '%[検索条件]';
後方一致検索は、検索条件の前に○○○というような任意の文字を含まないレコードの検索を行いたい場合に使用します。
例えば、検索条件に「sample」を指定し後方一致検索をかけると「sample○○○」の条件に引っ掛かるレコードを全て取得することが出来ます。
※NOT LIKE句で後方一致検索を指定した場合の説明のため、LIKE句とは逆の作用となりますので注意してください。
完全一致検索
SELECT [項目名], ... FROM [テーブル名] WHERE [項目名] NOT LIKE '%[検索条件]%';
完全一致検索はその名の通り、検索条件だけで曖昧検索はされません。
検索条件に「sample」と指定した場合、指定カラム内の文字列に”sample”を含むレコードが全て除外されます。
※NOT LIKE句で完全一致検索を指定した場合の説明のため、LIKE句とは逆の作用となりますので注意してください。
NOT LIKE句の具体例
説明だけでは解り難いと思いますので、実際にサンプルコードを使って見てみましょう。
サンプルコードに使用するテーブルは以下のようになっています。
MariaDB [sample]> SELECT * FROM sample_table; +----+-------------+ | id | name | +----+-------------+ | 1 | sample | | 2 | Sample | | 3 | SAMPLE | | 4 | Sample Blog | | 5 | Blog Sample | | 6 | SampleBlog | | 7 | BlogSample | +----+-------------+ 7 rows in set (0.000 sec)
前方一致検索(曖昧検索)
MariaDB [sample]> SELECT * FROM sample_table WHERE name NOT LIKE 'sample%'; +----+-------------+ | id | name | +----+-------------+ | 5 | Blog Sample | | 7 | BlogSample | +----+-------------+ 2 rows in set (0.000 sec)
NOT LIKE句で前方一致検索をかけた場合、「sample○○○でないもの」が取得されていることが確認できます。
後方一致検索(曖昧検索)
MariaDB [sample]> SELECT * FROM sample_table WHERE name NOT LIKE '%sample'; +----+-------------+ | id | name | +----+-------------+ | 4 | Sample Blog | | 6 | SampleBlog | +----+-------------+ 2 rows in set (0.000 sec)
NOT LIKE句で後方一致検索をかけた場合、こちらも前方一致検索と同様に「○○○sampleでないもの」が取得されていることが確認できます。
完全一致検索
MariaDB [sample]> SELECT * FROM sample_table WHERE name NOT LIKE '%sample%'; Empty set (0.000 sec)
NOT LIKE句で完全一致検索をかけた場合、「sample」が含まれているレコードが全て除外されて取得されるため、”Empty”が表示されていることが確認できます。
大文字と小文字について
上で記述している結果で既に気づいた人もいらっしゃると思いますが、LIKE句やNOT LIKE句は検索結果に大文字小文字の区別がありません。
要するに「sample」という条件で検索をした場合には「Sample」も「sample」も「SAMPLE」も全て条件に当てはまることになります。
これを回避する方法は、環境毎に若干異なってきますが、MySQLではLIKE句を「LIKE BINARY」NOT LIKE句を「NOT LIKE BINARY」とすることで区別することが出来ます。
MariaDB [sample]> SELECT * FROM sample_table WHERE name NOT LIKE BINARY '%Sample%'; +----+--------+ | id | name | +----+--------+ | 1 | sample | | 3 | SAMPLE | +----+--------+ 2 rows in set (0.001 sec)
まとめ
今回はNOT LIKE句についてコードを交えながら解説してみましたが、ご理解していただけましたか?
否定形の命令句は使っているとわけがわからなくなってしまうこともありますので、基本をしっかりとマスターしておくことを強くお勧めします。
またこれ以外でも、正規表現などを使って曖昧検索をかけることも出来ますので、色々と試してみましょう。