SQL│LIKE句でデータをあいまい検索する実例(部分一致)

今回は、SQLのLIKE句を使ったデータのあいまい検索の方法について説明します。

データベースに格納された大量のデータから任意のデータを抽出するためには、主キーを使った完全一致検索のみではなく、ある文字列を含んだデータを抽出するなど、あいまい検索も必要になってきます。

SQLでは、前方一致や中間一致、後方一致などの検索に、[LIKE句]を使います。

この記事では、SQLのLIKE句の基本的な概念から使い方、実例について説明します。

目次

あいまい検索とは(前方一致・中間一致・後方一致)

当サイトにアクセスいただいているユーザー層は、あいまい検索についてご存じかと思いますが、まずは基本から説明します。

あいまい検索とは、検索ワードに完全に一致するデータではなく、部分的に一致するデータも検索対象にする検索方法のことをいいます。これは、SQLに限った考え方ではなく、一般的に使われる概念です。

たとえば、インターネットで情報を調べる際に使われる検索エンジンにもあいまい検索が使われています。

ワイルドカードとは

SQLや汎用的なプログラミング言語であいまい検索を実行するには、「ワイルドカード」と呼ばれるそれぞれの言語で定められた記号を使います。

ワイルドカード(%)を記述した箇所は、「ここに何らかの文字が入る」ことが明示されその部分に限り、あいまい検索が実行されます。

例:秋田県%

上記の例では、ワイルドカード(%)を記述した箇所があいまい検索の対象となりますので、秋田県から始まるすべての文字列が検索結果に表示されるようになります。

ワイルドカードの有効文字数

通常、ワイルドカードには2つの記号が使われます。1つめは「任意のひと文字のワイルドカード」で、2つめは「任意の0文字以上の文字列のワイルドカード」です。

前節で紹介した[秋田県%]の%については、SQLで使われる任意の0文字以上の文字列のワイルドカードとなりますので、秋田県に続く文字数の制限はありません。

結果として、秋田県から始まるすべての文字列が検索結果に表示される訳です。

前方・中間・後方一致

あいまい検索では、そのコード内のワイルドカードの記述箇所によって「前方一致」「中間一致」「後方一致」の3つのパターンがあります。

たとえば、『秋田県秋田市旭川南町』という文字列を例にすると、それぞれ下記のようになります。

  • 前方一致・・秋田県%
  • 中間一致・・%秋田市%
  • 後方一致・・%旭川南町

あいまい検索の詳細とSQLのLIKE句を使った実例については、次の章で実際のRDBMSとテーブルを用いながら説明します。

SQL_データのあいまい検索(LIKE句)

この記事では、秋田県の郵便番号・住所テーブルを使って、SQLのLIKE句の具体的かつ様々な検索方法について説明します。

使用するテーブル

使用するテーブルには、秋田県の郵便番号[010-0000]から[011-0949]までの50件の住所が登録されています。

テーブル名:Zipcode
郵便番号テーブルの有用性

SQLのLIKE句を学習する際には、当記事で使っているような「郵便番号テーブル」が効果的です。

一般に、郵便番号に紐づく地域名には「町」や「川」等の共通文字が多く、あいまい検索を実行する環境として申し分ありません。

なお、csvデータは日本郵便の公式サイトで提供されていますので、ご希望であればぜひご利用ください。

SQLのワイルドカード

SQLで使われるワイルドカードは「_」(アンダーバー)と「%」(パーセント)です。これらの記号とLIKE句を組み合わせて、あいまい検索を実行することができます。

_任意の1文字
%任意の0文字以上の文字列
LIKE区のワイルドカード

「_」は続けて記述することも可能です。たとえば、「__」のように2つ続けて記述すれば『任意の2文字』というように、文字数を指定することができます。

前方一致のLIKE句の実例(MySQL)

早速、SQLでLIKE句を使ってあいまい検索を実行してみます。Zipcodeテーブルを対象に、「旭川」から始まる町名(town_kanji)を検索します。

%を使った前方一致

SELECT * FROM Zipcode WHERE town_kanji LIKE '旭川%';
SELECT * FROM Zipcode WHERE town_kanji LIKE ‘旭川%’;

_を使った前方一致

SELECT * FROM Zipcode WHERE town_kanji LIKE '旭川__';
SELECT * FROM Zipcode WHERE town_kanji LIKE ‘旭川__’;
解説

上記SQLでは、旭川の後に続くワイルドカードに「_」(アンダーバー)を2つ記述しています。つまり、「旭川〇〇」というように文字数を指定して、2文字分に対してあいまい検索が実行されています。

中間一致のLIKE句の実例(MySQL)

次に、Zipcodeテーブルを対象に、「松美」を中間に含む町名(town_kanji)を検索します。

%を使った中間一致

SELECT * FROM Zipcode WHERE town_kanji LIKE '%松美%';
SELECT * FROM Zipcode WHERE town_kanji LIKE ‘%松美%’;

_を使った中間一致

町名(town_kanji)の中間に「松美」を含み、かつ、松美の後は1文字のみの町名を検索してみます。

SELECT * FROM Zipcode WHERE town_kanji LIKE '%松美_';
SELECT * FROM Zipcode WHERE town_kanji LIKE ‘%松美_’;

後方一致のLIKE句の実例(MySQL)

次に、Zipcodeテーブルを対象に、「東町」で終わる町名(town_kanji)を検索します。

%を使った後方一致

SELECT * FROM Zipcode WHERE town_kanji LIKE '%東町';
SELECT * FROM Zipcode WHERE town_kanji LIKE ‘%東町’;

_を使った後方一致

町名(town_kanji)が「南町」で終わり、かつ、南町の前は2文字のみの町名を検索してみます。

SELECT * FROM Zipcode WHERE town_kanji LIKE '__南町';
SELECT * FROM Zipcode WHERE town_kanji LIKE ‘__南町’;

LIKE句の完全一致

前章では、SQLのLIKE句を使ったあいまい検索、前方一致・中間一致・後方一致について、実例を用いて説明しましたが、LIKE句は完全一致で検索することも可能です。

ワイルドカードを使わないLIKE句

Zipcodeテーブルを対象に、郵便番号(postcode)「0101641」の情報を検索します。

SELECT * FROM Zipcode WHERE postcode LIKE '0101641';
SELECT * FROM Zipcode WHERE postcode LIKE ‘0101641’;

このように、SQLのLIKE句はワイルドカードを使わなければ、完全一致の検索としても機能します。ただし、完全一致の用途であれば、比較演算子の「=」(イコール)を使うことが一般的なため、実用性はありません。

下記のSQL文は同じ結果を返す
SELECT * FROM Zipcode WHERE postcode = ‘0101641’;
SELECT * FROM Zipcode WHERE postcode LIKE ‘0101641’;

=とLIKEは同じ結果を返す

あとがき

今回は、SQLのあいまい検索(部分一致)で使うLIKE句をテーマに、あいまい検索の概念やSQLのLIKE句の実例を記事にしました。

あいまい検索やワイルドカードは、SQLのみならず、汎用的なプログラミング言語でも通ずる概念であり、使用頻度も含めて、習得する価値は高いです。

SQLを学習している方であれば、ぜひ当記事で紹介した日本郵便の公式ページから、住所データをダウンロードしてご自身の手で実際に試してみてください。

目次