MySQLでテーブル内の単語をテキストから検索・抽出する方法
MySQLでは、テーブルに保存されている単語が、任意のテキスト文字列の中に含まれているかどうかを確認し、一致する単語だけを抽出することができます。本記事では、LIKE演算子とCONCAT関数を組み合わせたシンプルな手法を、具体的なサンプルコードとともに解説します。
1. サンプルテーブルを作成する
まず、単語を格納するためのテーブルを作成します。ここでは「Value」というカラムを持つ「DemoTable1316」テーブルを使用します。
mysql> create table DemoTable1316 -> ( -> Value varchar(40) -> ); Query OK, 0 rows affected (0.47 sec)
2. テストデータを挿入する
INSERT文を使って、いくつかのレコードを登録しましょう。
mysql> insert into DemoTable1316 values('MySQL');
Query OK, 1 row affected (0.16 sec)
mysql> insert into DemoTable1316 values('Java');
Query OK, 1 row affected (0.11 sec)
mysql> insert into DemoTable1316 values('MongoDB');
Query OK, 1 row affected (0.21 sec)
mysql> insert into DemoTable1316 values('C++');
Query OK, 1 row affected (0.13 sec)
3. 登録したデータを確認する
SELECT文ですべてのレコードを表示して、内容を確認します。
mysql> select *from DemoTable1316;
実行結果は以下の通りです。これらの単語が、後ほどテキスト内から検索・選択する対象となります。
+---------+ | Value | +---------+ | MySQL | | Java | | MongoDB | | C++ | +---------+ 4 rows in set (0.00 sec)
4. テキストから該当する単語を選択する
それでは本題です。次のテキストから、テーブル内の単語と一致するものを抽出してみましょう。
対象テキスト: 「Deep Dive using Java is good for advanced knowledge, but not MySQL」(Javaを使ったDeep Diveは高度な知識の習得に良いが、MySQLはそうではない)
ポイントは、LIKE演算子とCONCAT関数を組み合わせることです。CONCAT関数でワイルドカード「%」を単語の前後に付けることで、「テキストの中にその単語が含まれているか」を部分一致で判定できます。
mysql> select Value
-> from DemoTable1316
-> where ( 'Deep Dive using Java is good for advanced knowledge, but not MySQL') like concat('%',Value,'%');
実行結果
テキスト内に実際に含まれていたのは「MySQL」と「Java」の2つの単語だったため、以下のように該当レコードのみが出力されます。
+-------+ | Value | +-------+ | MySQL | | Java | +-------+ 2 rows in set (0.05 sec)
解説のポイント
- concat('%', Value, '%'): 単語の前後に「%」を連結することで、「〜単語〜」というパターン(部分一致)を作り出しています。
- WHERE句での判定: 固定の文字列リテラルに対してLIKEマッチングを行うことで、各レコードのValueがテキスト内に存在するかを1行ずつ評価します。
- テキスト内に存在しない「MongoDB」「C++」は結果から除外されるため、これが単語のフィルタリングとして機能します。
このテクニックは、キーワード辞書テーブルと文章のマッチングなど、簡易的なテキスト照合処理に活用できます。なお、大量データや日本語のようなマルチバイト文字列を扱う場合は、フルテキストインデックス(FULLTEXT INDEX)や正規表現(REGEXP)の利用も検討するとよいでしょう。
-
MySQLのSELECTクエリで別テーブルに存在しない行を抽出する方法(NATURAL LEFT JOIN活用)
MySQLのSELECTクエリで別テーブルに存在しない行を抽出する方法データベースの運用では、「片方のテーブルには存在するが、もう片方のテーブルには存在しないレコード」を抽出したい場面がよくあります。この記事では、2つのテーブルを作成し、NATURAL LEFT JOINを活用して差分の行を取得する方法を、実際のサンプルコードとともにわかりやすく解説します。1. 最初のテーブルを作成するまずは比較元となる最初のテーブルを作成します。 mysql> create table FirstTableDemo -> ( -> id int, -> name v
-
MySQLでテーブルの最後の10件のレコードを取得する方法
MySQLでテーブルの末尾にある10行(最新の10件)を取得したい場合は、SELECT文とLIMIT句を組み合わせたサブクエリを利用します。この記事では、実際にテーブルを作成し、データを挿入しながら、最後の10件を取得するクエリの手順を具体的に解説します。 1. サンプルテーブルの作成 まず、動作確認用のテーブルを作成します。 mysql> create table Last10RecordsDemo -> ( -> id int, -> name varchar(100) -> ); Query OK, 0 rows affected