今回は、SQLのLIKE句を使ったデータのあいまい検索の方法について説明します。
データベースに格納された大量のデータから任意のデータを抽出するためには、主キーを使った完全一致検索のみではなく、ある文字列を含んだデータを抽出するなど、あいまい検索も必要になってきます。
SQLでは、前方一致や中間一致、後方一致などの検索に、[LIKE句]を使います。
この記事では、SQLのLIKE句の基本的な概念から使い方、実例について説明します。
当サイトにアクセスいただいているユーザー層は、あいまい検索についてご存じかと思いますが、まずは基本から説明します。
あいまい検索とは、検索ワードに完全に一致するデータではなく、部分的に一致するデータも検索対象にする検索方法のことをいいます。これは、SQLに限った考え方ではなく、一般的に使われる概念です。
たとえば、インターネットで情報を調べる際に使われる検索エンジンにもあいまい検索が使われています。
SQLや汎用的なプログラミング言語であいまい検索を実行するには、「ワイルドカード」と呼ばれるそれぞれの言語で定められた記号を使います。
ワイルドカード(%)を記述した箇所は、「ここに何らかの文字が入る」ことが明示されその部分に限り、あいまい検索が実行されます。
例:秋田県%
上記の例では、ワイルドカード(%)を記述した箇所があいまい検索の対象となりますので、秋田県から始まるすべての文字列が検索結果に表示されるようになります。
通常、ワイルドカードには2つの記号が使われます。1つめは「任意のひと文字のワイルドカード」で、2つめは「任意の0文字以上の文字列のワイルドカード」です。
前節で紹介した[秋田県%]の%については、SQLで使われる任意の0文字以上の文字列のワイルドカードとなりますので、秋田県に続く文字数の制限はありません。
結果として、秋田県から始まるすべての文字列が検索結果に表示される訳です。
あいまい検索では、そのコード内のワイルドカードの記述箇所によって「前方一致」「中間一致」「後方一致」の3つのパターンがあります。
たとえば、『秋田県秋田市旭川南町』という文字列を例にすると、それぞれ下記のようになります。
あいまい検索の詳細とSQLのLIKE句を使った実例については、次の章で実際のRDBMSとテーブルを用いながら説明します。
この記事では、秋田県の郵便番号・住所テーブルを使って、SQLのLIKE句の具体的かつ様々な検索方法について説明します。
使用するテーブルには、秋田県の郵便番号[010-0000]から[011-0949]までの50件の住所が登録されています。
SQLのLIKE句を学習する際には、当記事で使っているような「郵便番号テーブル」が効果的です。
一般に、郵便番号に紐づく地域名には「町」や「川」等の共通文字が多く、あいまい検索を実行する環境として申し分ありません。
なお、csvデータは日本郵便の公式サイトで提供されていますので、ご希望であればぜひご利用ください。
SQLで使われるワイルドカードは「_」(アンダーバー)と「%」(パーセント)です。これらの記号とLIKE句を組み合わせて、あいまい検索を実行することができます。
_ | 任意の1文字 |
% | 任意の0文字以上の文字列 |
「_」は続けて記述することも可能です。たとえば、「__」のように2つ続けて記述すれば『任意の2文字』というように、文字数を指定することができます。
早速、SQLでLIKE句を使ってあいまい検索を実行してみます。Zipcodeテーブルを対象に、「旭川」から始まる町名(town_kanji)を検索します。
SELECT * FROM Zipcode WHERE town_kanji LIKE '旭川%';
SELECT * FROM Zipcode WHERE town_kanji LIKE '旭川__';
上記SQLでは、旭川の後に続くワイルドカードに「_」(アンダーバー)を2つ記述しています。つまり、「旭川〇〇」というように文字数を指定して、2文字分に対してあいまい検索が実行されています。
次に、Zipcodeテーブルを対象に、「松美」を中間に含む町名(town_kanji)を検索します。
SELECT * FROM Zipcode WHERE town_kanji LIKE '%松美%';
町名(town_kanji)の中間に「松美」を含み、かつ、松美の後は1文字のみの町名を検索してみます。
SELECT * FROM Zipcode WHERE town_kanji LIKE '%松美_';
次に、Zipcodeテーブルを対象に、「東町」で終わる町名(town_kanji)を検索します。
SELECT * FROM Zipcode WHERE town_kanji LIKE '%東町';
町名(town_kanji)が「南町」で終わり、かつ、南町の前は2文字のみの町名を検索してみます。
SELECT * FROM Zipcode WHERE town_kanji LIKE '__南町';
前章では、SQLのLIKE句を使ったあいまい検索、前方一致・中間一致・後方一致について、実例を用いて説明しましたが、LIKE句は完全一致で検索することも可能です。
Zipcodeテーブルを対象に、郵便番号(postcode)「0101641」の情報を検索します。
SELECT * FROM Zipcode WHERE postcode LIKE '0101641';
このように、SQLのLIKE句はワイルドカードを使わなければ、完全一致の検索としても機能します。ただし、完全一致の用途であれば、比較演算子の「=」(イコール)を使うことが一般的なため、実用性はありません。
下記のSQL文は同じ結果を返す
SELECT * FROM Zipcode WHERE postcode = ‘0101641’;
SELECT * FROM Zipcode WHERE postcode LIKE ‘0101641’;
今回は、SQLのあいまい検索(部分一致)で使うLIKE句をテーマに、あいまい検索の概念やSQLのLIKE句の実例を記事にしました。
あいまい検索やワイルドカードは、SQLのみならず、汎用的なプログラミング言語でも通ずる概念であり、使用頻度も含めて、習得する価値は高いです。
SQLを学習している方であれば、ぜひ当記事で紹介した日本郵便の公式ページから、住所データをダウンロードしてご自身の手で実際に試してみてください。