文字列比較で使用する演算子
文字列を比較する際には「比較演算子」を使います。
比較演算子自体はSQL以外でも使われますが、SQLで利用可能な比較演算子は次の通りです。
演算子 | 機能 | 使用例 |
---|---|---|
= | ○ と △ は等しい | ○ = △ |
<=> | ○ と △ は等しい ※NULLにも対応 | ○ <=> △ |
<> | ○ と △ は等しくない | ○ <> △ |
!= | ○ と △ は等しくない | ○ != △ |
< | ○ は △ よりも小さい | ○ < △ |
<= | ○ は △ 以下( ○ は △よりも小さいか等しい) | ○ <= △ |
> | ○ は △ よりも大きい | ○ > △ |
>= | ○ は △ 以上( ○ は △よりも大きいか等しい) | ○ >= △ |
比較演算子で比較した結果は、 1(=TRUE) 、 0(=FALSE) 、もしくは NULLを返します。
TRUEとFALSEには、それぞれ定数で1と0が割り当てられています。
上記以外にも次のような演算子が用意されています。
演算子 | 機能 | 使用例 |
---|---|---|
IS | ○ は △である | ○ IS △ |
IS NOT | ○ は △ではない | ○ IS NOT △ |
IS NULL | ○ は NULLである | ○ IS NULL |
IS NOT NULL | ○ は NULLではない | ○ IS NOT NULL |
BETWEEN AND | ○ は minより大きいか等しくmaxより小さいか等しい | ○ BETWEEN min AND max |
NOT BETWEEN AND | ○ は minより大きくも等しくもなく、maxより小さくも等しくもない | ○ NOT BETWEEN min AND max |
IN | ○ は カッコ内のいずれかの値に等しい | ○ IN (△, △△, …) |
NOT IN | ○ は 括弧内のいずれの値とも等しくない | ○ NOT IN (△, △△, …) |
ANY | ○ は カッコ内のいずれかの値に等しい | ○ ANY (△, △△, …) |
LIKE | 正規表現を使用した文字列検索 | ○ LIKE △ |
NOT LIKE | LIKEの結果を反転させたもの | ○ NOT LIKE △ |
REGEXP(RLIKE) | 正規表現を使用した文字列検索(RLIKEはシノニム) | ○ REGEXP △ |
NOT REGEXP(RLIKE) | REGEXPの結果を反転させたもの | ○ NOT REGEXP △ |
では、それぞれの使い方を見ていきましょう。
= / <=> / <> / !=
指定した文字列と等しいか等しくないかを判定するには、「=」「<=>」「<>」「!=」の4つが使えます。
サンプルコードでそれぞれの使い方を確認しましょう。
mysql> SELECT * FROM my_table; +------+-------+ | id | name | +------+-------+ | 1 | Abe | | 2 | Satou | | 3 | Ide | +------+-------+ 3 rows in set (0.00 sec) mysql> SELECT * FROM my_table WHERE name = 'Ide'; +------+------+ | id | name | +------+------+ | 3 | Ide | +------+------+ 1 row in set (0.00 sec) mysql> SELECT * FROM my_table WHERE name <=> 'Ide'; +------+------+ | id | name | +------+------+ | 3 | Ide | +------+------+ 1 row in set (0.00 sec) mysql> SELECT * FROM my_table WHERE name <> 'Ide'; +------+-------+ | id | name | +------+-------+ | 1 | Abe | | 2 | Satou | +------+-------+ 2 rows in set (0.00 sec) mysql> SELECT * FROM my_table WHERE name != 'Ide'; +------+-------+ | id | name | +------+-------+ | 1 | Abe | | 2 | Satou | +------+-------+ 2 rows in set (0.00 sec)
それぞれ想定した動作になっていることがわかります。
ここでは確認していませんが、「<=>」はNULLの比較にも対応しています。
< / <= / > / >=
SQLでは文字列の大小(アルファベット順)を比較可能です。
比較には「<」「<=」「>」「>=」の4つが使えます。
使い方や演算子の意味は、数学などで使われるものと基本的に同じです。
こちらもサンプルコードで確認しましょう。
mysql> SELECT * FROM my_table WHERE name < 'i'; +------+------+ | id | name | +------+------+ | 1 | Abe | +------+------+ 1 rows in set (0.00 sec) mysql> SELECT * FROM my_table WHERE name <= 'i'; +------+------+ | id | name | +------+------+ | 1 | Abe | +------+------+ 1 rows in set (0.00 sec) mysql> SELECT * FROM my_table WHERE name <= 'idea'; +------+------+ | id | name | +------+------+ | 1 | Abe | | 3 | Ide | +------+------+ 2 rows in set (0.00 sec) mysql> SELECT * FROM my_table WHERE name > 'i'; +------+-------+ | id | name | +------+-------+ | 2 | Satou | | 3 | Ide | +------+-------+ 2 rows in set (0.00 sec) mysql> SELECT * FROM my_table WHERE name >= 'i'; +------+-------+ | id | name | +------+-------+ | 2 | Satou | | 3 | Ide | +------+-------+ 2 rows in set (0.00 sec)
IS NULL / IS NOT NULL
IS NULLは、値がNULLであるかを判定する演算子です。値がNULLの場合に1を返します。
IS NOT NULLは、逆に値がNULLでないかを判定します。値がNULL以外の場合に1を返します。
こちらもサンプルで動きを確認しましょう。
mysql> SELECT * FROM my_table; +------+-------+ | id | name | +------+-------+ | 1 | Abe | | 2 | Satou | | 3 | Ide | | 4 | | | 5 | NULL | +------+-------+ 5 rows in set (0.00 sec) mysql> SELECT * FROM my_table WHERE name IS NULL; +------+------+ | id | name | +------+------+ | 5 | NULL | +------+------+ 1 row in set (0.00 sec) mysql> SELECT * FROM my_table WHERE name IS NOT NULL; +------+-------+ | id | name | +------+-------+ | 1 | Abe | | 2 | Satou | | 3 | Ide | | 4 | | +------+-------+ 4 rows in set (0.01 sec)
空白(空)はNULL扱いにはなりません。
あくまでNULLかNULLではないかを判定します。
BETWEEN AND / NOT BETWEEN AND
値が最小値よりも大きいか等しいかつ、最大値よりも小さいか等しいかを判定する演算子です。
文字列比較で使われることはあまりありませんが、日付で検索する場合などに使われることがあります。
mysql> SELECT * FROM my_table2; +------+-------+------------+ | id | name | date | +------+-------+------------+ | 1 | Abe | 2020-07-12 | | 2 | Abe | 2020-07-23 | | 3 | Satou | 2020-08-04 | +------+-------+------------+ 3 rows in set (0.02 sec) mysql> SELECT * FROM my_table2 WHERE date BETWEEN '2020-07-01' AND '2020-07-31'; +------+------+------------+ | id | name | date | +------+------+------------+ | 1 | Abe | 2020-07-12 | | 2 | Abe | 2020-07-23 | +------+------+------------+ 2 rows in set (0.01 sec) mysql> SELECT * FROM my_table2 WHERE date NOT BETWEEN '2020-07-01' AND '2020-07-31'; +------+-------+------------+ | id | name | date | +------+-------+------------+ | 3 | Satou | 2020-08-04 | +------+-------+------------+ 1 row in set (0.00 sec)
指定した期間に当てはまるデータだけを取得したい場合などに有効です。
IN / NOT IN
値がリストに記述した値の中のいずれかに等しいかを判定する演算子です。
キーワードに一致するデータだけを取得したい場合などに使います。
サンプルコードを見てみましょう。
mysql> SELECT * FROM my_table WHERE name IN ('Abe', 'Tanaka'); +------+------+ | id | name | +------+------+ | 1 | Abe | +------+------+ 1 row in set (0.01 sec) mysql> SELECT * FROM my_table WHERE name NOT IN ('Abe', 'Tanaka'); +------+-------+ | id | name | +------+-------+ | 2 | Satou | | 3 | Ide | | 4 | | +------+-------+ 3 rows in set (0.00 sec)
LIKE / NOT LIKE
値に対して特殊な文字を使い、パターンマッチングを行う演算子です。
特殊な文字とは「%」と「_」になります。
%は任意の0文字以上の文字列を、_は任意の1文字を意味します。
サンプルコードで確認してみましょう。
mysql> SELECT * FROM my_table3; +------+-------+-----------------+ | id | name | address | +------+-------+-----------------+ | 1 | Abe | Tokyo Shinjuku | | 2 | Satou | Tokyo Shibuya | | 3 | kasai | Saitama Saitama | +------+-------+-----------------+ 3 rows in set (0.01 sec) mysql> SELECT * FROM my_table3 WHERE address LIKE 'Tokyo%'; +------+-------+----------------+ | id | name | address | +------+-------+----------------+ | 1 | Abe | Tokyo Shinjuku | | 2 | Satou | Tokyo Shibuya | +------+-------+----------------+ 2 rows in set (0.00 sec) mysql> SELECT * FROM my_table3 WHERE address NOT LIKE 'Tokyo%'; +------+-------+-----------------+ | id | name | address | +------+-------+-----------------+ | 3 | kasai | Saitama Saitama | +------+-------+-----------------+ 1 row in set (0.00 sec) mysql> SELECT * FROM my_table3 WHERE name LIKE '_____'; +------+-------+-----------------+ | id | name | address | +------+-------+-----------------+ | 2 | Satou | Tokyo Shibuya | | 3 | kasai | Saitama Saitama | +------+-------+-----------------+ 2 rows in set (0.00 sec) mysql> SELECT * FROM my_table3 WHERE name NOT LIKE '_____'; +------+------+----------------+ | id | name | address | +------+------+----------------+ | 1 | Abe | Tokyo Shinjuku | +------+------+----------------+ 1 row in set (0.00 sec)
それどれ指定した通りにデータが取得できています。
REGEXP(RLIKE) / NOT REGEXP(RLIKE)
値と文字列が一致するかを比較する演算子です。
LIKE演算子と使い方は似ています。
mysql> SELECT * FROM my_table WHERE name REGEXP '^S'; +------+-------+ | id | name | +------+-------+ | 2 | Satou | +------+-------+ 1 row in set (0.02 sec) mysql> SELECT * FROM my_table WHERE name NOT REGEXP '^S'; +------+------+ | id | name | +------+------+ | 1 | Abe | | 3 | Ide | | 4 | | +------+------+ 3 rows in set (0.00 sec)
「^S」で先頭がSから始まる値を判定しています。
その他にも使用できる正規表現はさまざまです。
正規表現については、以下のページを参考にしてみてください。
参考:MySQL :: MySQL 5.6 リファレンスマニュアル :: 12.5.2 正規表現
STRCMP
比較する文字列が同じである場合は0を返し、第1引数がソート順で小さければ -1、第2引数がソート順で小さければ1を返す演算子です。
ここでは、「potepan」と「potepan2」という文字列を比較してみます。
mysql> SELECT STRCMP ('potepan', 'potepan') AS STRCMP01, STRCMP('potepan', 'potepan2') AS STRCMP02, STRCMP ('potepan2', 'potepan') AS STRCMP03; +----------+----------+----------+ | STRCMP01 | STRCMP02 | STRCMP03 | +----------+----------+----------+ | 0 | -1 | 1 | +----------+----------+----------+ 1 row in set (0.00 sec)
まとめ
文字列比較を比較する演算子について解説しました。
文字列比較にはさまざまな演算子が使えますが、ぜひこの記事を参考に目的にあった比較方法を行ってみてください。