SQLを学び始めたステップではなかなか使用することがないMySQLのWHERE LIKE句。少し余裕が出てきたタイミングでぜひ使用してみることをおすすめします。今回の記事では、MySQL WHERE LIKE句の主な機能をご紹介しつつ、実際に使用する方法をハンズオンで体験していきましょう。
- MySQL WHERE LIKE句はパターンマッチに利用できる
- MySQLを使ったWHERE LIKE句のハンズオン
MySQL WHERE LIKE句とは
MySQL WHERE LIKE句には、以下2つの機能があります。
- WHERE LIKE句で指定する文字列を含むレコードを出力する
- WHERE LIKE句で指定する文字数と合致するレコードを出力する
重要なのは、MySQLのWHERE LIKE句に「パターンマッチ」機能があるということ。パターンマッチとは、特定のパターンが出現するかどうかを確かめることです。MySQL WHERE LIKE句の構文を見てみましょう。
SELECT カラム名 FROM テーブル名 WHERE カラム名 LIKE 指定するパターン;
指定するパターンの部分には、「%」と「_」(アンダーバー)の2つを用いることができます。使い分けは以下の通りです。
- 「%」 → WHERE LIKE句で指定する文字列を含むレコードを出力する
- 「_」 → WHERE LIKE句で指定する文字数と合致するレコードを出力する
パターンの指定には慣れが必要ですが、すでにSELECTステートメントの構文を知っている方であればWHERE LIKE句の加わる構文も難しくはないはず。実際にMySQLのWHERE LIKE句が使用されている構文を見て、さらに認識を深めましょう。
以下のようなテーブルがあることを前提とします。
foodsテーブル
+--------+-------+ | name | price | +--------+-------+ | Banana | 100 | | Apple | 200 | | Bread | 400 | | Cookie | 240 | | Beef | 1000 | | Onion | 300 | +--------+-------+
上記のテーブルからnameカラムに「A」または「a」を含むレコードを出力してみましょう。
WHERE LIKEを含むSELECTステートメント
SELECT * FROM foods WHERE name LIKE '%a%';
出力結果
+--------+-------+ | name | price | +--------+-------+ | Banana | 100 | | Apple | 200 | | Bread | 400 | +--------+-------+ 3 rows in set (0.00 sec)
WHERE LIKE句のパターンに「%a%」と指定することで、nameカラムに「A」もしくは「a」が入っているレコードを出力できました。
次に「_」を使用して5文字の文字列を出力してみましょう。
WHERE LIKEを含むSELECTステートメント
SELECT * FROM foods WHERE name LIKE '_____';
出力結果
+-------+-------+ | name | price | +-------+-------+ | Apple | 200 | | Bread | 400 | | Onion | 300 | +-------+-------+ 3 rows in set (0.00 sec)
WHERE LIKE句のパターンに「_____」(アンダーバー5個)と指定することで、nameカラムの値が5文字のレコードを出力できました。ちなみに以下のような使い方もできます。
WHERE LIKEを含むSELECTステートメント
SELECT * FROM foods WHERE name LIKE 'B_____';
出力結果
+--------+-------+ | name | price | +--------+-------+ | Banana | 100 | +--------+-------+ 1 row in set (0.00 sec)
「B_____」(Bとアンダーバー5個)と指定することで、「Bから始まり、その後に5文つ文字列が続くレコードの出力」ができました。
「_」には、「任意の1文字」という意味があります。「%」の場合は「0文字以上の任意文字列」でしたが、「_」を使用すると厳密な文字数を指定することが可能です。
【関連記事】
▶︎MySQLのUPDATEの基本とデータベースに格納された値を効率よく変更する方法
▶︎MySQLのlimitのサンプルコード集 offset指定や効率的な件数取得方法は?
MySQLでWHERE LIKE句ハンズオンにトライ
こちらでは、実際にMySQLというデータベースを使用してWHERE LIKE句を使ってみましょう。
準備
まずはMySQLを使用するための準備をしていきます。
MySQLのインストール・接続
まだMySQLをインストールしていない場合は、インストールしましょう。
$ brew install mysql
MySQLのインストールが終了したら、接続します。
$ sudo mysql -u root -p
データベースの作成
次にデータベースをMySQL上に作成し、使用するデータベースを指定しましょう。
mysql> CREATE DATABASE potepan; Query OK, 1 row affected (0.00 sec) mysql> USE potepan;
これでMySQLを使用する準備は完了しました。
ベースとなるテーブルの作成
次にベースとなるテーブルを作成しましょう。
Mysql> CREATE TABLE vegetables(name VARCHAR(50), price INT); Query OK, 0 rows affected (0.02 sec) mysql> INSERT INTO vegetables VALUES('Apricot', 200),('Strawberry', 500),('Persimmon', 250),('Kiwi fruit', 100),('Kumquat',300),('Cherry',700),('Watermelon',500),('Pear',150); Query OK, 8 rows affected (0.01 sec)
テーブルの状態
mysql> SELECT * FROM vegetables; +------------+-------+ | name | price | +------------+-------+ | Apricot | 200 | | Strawberry | 500 | | Persimmon | 250 | | Kiwi fruit | 100 | | Kumquat | 300 | | Cherry | 700 | | Watermelon | 500 | | Pear | 150 | +------------+-------+ 8 rows in set (0.00 sec)
MySQL WHERE LIKE句を使って簡単なパターンマッチ
それでは、最初に見た例のようなパターンマッチを体験してみましょう。vegetablesテーブルのnameカラムに「o」が含まれるレコードを抽出します。
WHERE LIKEを含むSELECTステートメント
mysql> SELECT * FROM vegetables WHERE name LIKE '%o%';
出力結果
+------------+-------+ | name | price | +------------+-------+ | Apricot | 200 | | Persimmon | 250 | | Watermelon | 500 | +------------+-------+ 3 rows in set (0.00 sec)
LIKE以降のパターンに「%o%」を指定することで、「前後に任意の0文字が付いたoを含むレコード」の出力ができました。
MySQL WHERE LIKE句を使って簡単なパターンマッチ2
次も同様にパターンを指定していきますが、今度はnameカラムが7文字のレコードのみを取得してみましょう。
WHERE LIKEを含むSELECTステートメント
mysql> SELECT * FROM vegetables WHERE name LIKE '_______';
出力結果
+---------+-------+ | name | price | +---------+-------+ | Apricot | 200 | | Kumquat | 300 | +---------+-------+ 2 rows in set (0.00 sec)
LIKE以降のパターンに「_______」(アンダーバー7個)を指定することで、「7文字の値のレコード」のみを出力できました。
MySQL WHERE LIKE句を使って簡単なパターンマッチ2
次も同様にパターンを指定していきますが、今度はnameカラムが7文字のレコードのみを取得してみましょう。
WHERE LIKEを含むSELECTステートメント
mysql> SELECT * FROM vegetables WHERE name LIKE '_______';
出力結果
+---------+-------+ | name | price | +---------+-------+ | Apricot | 200 | | Kumquat | 300 | +---------+-------+ 2 rows in set (0.00 sec)
LIKE以降のパターンに「_______」(アンダーバー7個)を指定することで、「7文字の値のレコード」のみを出力できました。
「%」と「_」を組み合わせたパターンマッチ
「%」と「_」を組み合わせてパターンマッチを行うことも可能です。実際に体験してみましょう。
WHERE LIKEを含むSELECTステートメント
mysql> SELECT * FROM vegetables WHERE name LIKE '%o_';
出力結果
+------------+-------+ | name | price | +------------+-------+ | Apricot | 200 | | Persimmon | 250 | | Watermelon | 500 | +------------+-------+ 3 rows in set (0.00 sec)
「%o_」と指定することで「前に0文字以上の文字と後に1文字が付くoを含んだレコードが出力可能です。このように「%」と「_」を組み合わせることで、より複雑なパターンマッチが行えるようになります。
まとめ
今回の記事では、MySQLのWHERE LIKE句の主な機能をご紹介しつつ、実際に使用する方法をハンズオンで体験していきました。使ってみると非常に簡単なWHERE LIKE句ですが、複雑なパターンマッチが行えるため便利です。ぜひ、検索機能をアップデートする際に利用してみましょう。
【関連記事】
▶︎MySQLのleft joinサンプルコード onとusingの結合条件指定の違いは?
▶︎MySQLのcreate tableサンプルコード集 カラム定義を自動出力する方法は?
「%」には、「0文字以上の任意の文字列」という意味があります。先ほどのSELCTステートメントの場合「前後に0文字以上の文字列が付いた『A』または『a』を含むパターン」という指定を行っています。