MySQLのLIKE句を2回組み合わせて、姓名が1つのカラムに格納されたテーブルから特定の名前を抽出する方法
MySQLでは、姓名が「FirstName LastName」の形式で1つのカラムにまとめて格納されているテーブルから、名と姓の両方が一致するレコードを抽出したいケースがあります。そんなときに役立つのが、LIKE句を2回使用してAND条件で組み合わせる方法です。本記事では、実際のサンプルコードを使いながら、その手順をわかりやすく解説します。
1. サンプルテーブルの作成
まず、CREATE TABLE文でサンプル用のテーブルを作成します。
mysql> create table DemoTable
(
StudentId int NOT NULL AUTO_INCREMENT PRIMARY KEY,
StudentName varchar(30)
);
Query OK, 0 rows affected (0.70 sec)
このテーブルには、自動採番される「StudentId」と、氏名を格納する「StudentName」の2つのカラムを用意しました。
2. テストデータの挿入
続いて、INSERT文を使って複数のレコードを挿入します。ここでは、名が「John」の人物と姓が「Doe」の人物を意図的に混ぜて登録しています。
mysql> insert into DemoTable(StudentName) values('John Smith');
Query OK, 1 row affected (0.13 sec)
mysql> insert into DemoTable(StudentName) values('David Miller');
Query OK, 1 row affected (0.12 sec)
mysql> insert into DemoTable(StudentName) values('Carol Taylor');
Query OK, 1 row affected (0.12 sec)
mysql> insert into DemoTable(StudentName) values('John Doe');
Query OK, 1 row affected (0.13 sec)
mysql> insert into DemoTable(StudentName) values('Chris Brown');
Query OK, 1 row affected (0.15 sec)
mysql> insert into DemoTable(StudentName) values('Adam Doe');
Query OK, 1 row affected (0.11 sec)
3. 登録済みレコードの確認
SELECT文でテーブル内の全レコードを表示し、データが正しく登録されているかを確認しましょう。
mysql> select *from DemoTable;
実行結果は以下のとおりです。
+-----------+---------------+ | StudentId | StudentName | +-----------+---------------+ | 1 | John Smith | | 2 | David Miller | | 3 | Carol Taylor | | 4 | John Doe | | 5 | Chris Brown | | 6 | Adam Doe | +-----------+---------------+ 6 rows in set (0.00 sec)
6件のレコードが登録されていることが確認できます。ここから、「名がJohn」かつ「姓がDoe」であるレコードだけを取り出すのが目標です。
4. LIKE句を2回使った特定の名前の検索
氏名が1つのカラムにまとめられている場合、単純な完全一致検索は使えません。そこで、LIKE句を2回記述し、AND演算子で結合します。これにより、「文字列の中に『John』を含み、かつ『Doe』も含む」レコードだけを絞り込めます。
mysql> select *from DemoTable
where StudentName LIKE '%John%' and StudentName LIKE '%Doe%';
実行結果は以下のとおりです。
+-----------+-------------+ | StudentId | StudentName | +-----------+-------------+ | 4 | John Doe | +-----------+-------------+ 1 row in set (0.00 sec)
5. クエリのポイント解説
このクエリが正しく機能する仕組みを整理しておきましょう。
- LIKE '%John%':文字列の任意の位置に「John」が含まれているレコードにマッチします。ワイルドカード「%」は0文字以上の任意の文字列を表します。
- LIKE '%Doe%':同様に、文字列の任意の位置に「Doe」が含まれているレコードにマッチします。
- AND条件:両方の条件を同時に満たすレコードのみが結果として返されます。
そのため、「John Smith」(Johnは含むがDoeは含まない)や「Adam Doe」(Doeは含むがJohnは含まない)は除外され、「John Doe」だけが抽出されます。このように、LIKE句を複数回組み合わせるテクニックを使えば、姓名が1つのカラムに格納されたテーブルでも柔軟に部分一致検索が可能になります。
なお、大量のデータを扱う場合はLIKE検索がインデックスを活用しにくいため、パフォーマンスが気になる場合は氏名を別カラムに分割して保存することも検討するとよいでしょう。
-
MySQLで現在の年から動的なテーブル名を作成する方法(例:2019)
「2019」のように現在の年をテーブル名として作成したい場合は、PREPAREステートメントを使用します。本記事では、現在の年から動的にテーブル名を生成し、データをコピーする手順を具体的なサンプルコードとともに解説します。1. 元となるテーブルを作成するまず、データのコピー元となるサンプルテーブルを作成します。mysql> create table DemoTable1959 ( UserName varchar(20) ); Query OK, 0 rows affected (0.00 sec)2. テーブルにレコードを挿入するINSERTコマンドを使って、い
-
MySQLクエリでLIKE句を2回使う方法|OR条件で複数パターンを検索する
MySQLでは、LIKE句を1つのクエリ内で2回以上使用することで、複数のパターンに一致するレコードを柔軟に抽出できます。この記事では、実際にテーブルを作成し、LIKE句を2回組み合わせた検索クエリの書き方を手順を追って解説します。 1. サンプルテーブルを作成する まず、検索対象となるテーブルを作成します。 mysql> create table DemoTable2009 ( Name varchar(20) ); Query OK, 0 rows affected (0.51 sec) 2. テーブルにレコードを挿入する INSERT文を使って、いくつかの名前データを登録し