【MySQL】比較演算 - 値の比較と演算子

【MySQL】比較演算 - 値の比較と演算子

MySQLは値の関係性について真偽を判定できます。

ここでは、その処理である比較演算を解説します。

検証環境

比較演算

比較演算は“値の関係性の真偽を判定する演算”です。

演算結果として、関係性が正しい場合はTRUE1)、正しくない場合はFALSE0)を算出します。

例えば、“3と8は等しい”という関係性について、3と8は等しくないため、FALSEになります。

比較演算子

比較演算子は比較演算の種類を表す記号です。

次の表のように比較演算は様々な種類があり、各比較演算に対応した演算子があります。

演算子(A,Bは値)
演算 演算子 構文
AとBは『等しい』 =, <=> A = B, A <=> B
AとBは『等しくない』 <>, != A <> B, A != B
AはB『よりも小さい』 < A < B
AはB『以下』 <= A <= B
AはB『よりも大きい』 > A > B
AはB『以上』 >= A >= B
Aは『NULLである』 IS NULL A IS NULL
Aは『NULLではない』 IS NOT NULL A IS NOT NULL
Aは『TRUE/FALSEである』 IS A IS TRUE, A IS FALSE
Aは『TRUE/FALSEではない』 IS NOT A IS NOT TRUE, A IS NOT FALSE
Aは『value1以上、value2以下の値である』 BETWEEN AND A BETWEEN value1 AND value2
Aは『value1以上、value2以下の値ではない』 NOT BETWEEN AND A NOT BETWEEN value1 AND value2
Aは『いずれかの値に等しい』 IN A IN (value, value...)
Aは『いずれの値とも等しくない』 NOT IN A NOT IN (value, value...)
Aは『パターンにマッチする』 LINKE A LINKE pattern
Aは『パターンにマッチしない』 NOT LIKE A NOT LIKE pattern

また、演算結果は1(TRUE)または0(FALSE)になります。

等しい(=, <=>

2値の関係性が『等しい』の演算は=演算子を使います。

mysql> SELECT 8 = 8 , 0 = 0, 3 = 8;
+-------+-------+-------+
| 8 = 8 | 0 = 0 | 3 = 8 |
+-------+-------+-------+
|     1 |     1 |     0 |
+-------+-------+-------+
1 row in set (0.00 sec)

また、値のNULLについて、=演算子は対応していません。

mysql> SELECT NULL = NULL, 8 = NULL;
+-------------+----------+
| NULL = NULL | 8 = NULL |
+-------------+----------+
|        NULL |     NULL |
+-------------+----------+
1 row in set (0.00 sec)

この結果から分かるように=演算子でNULLを使うと、期待する演算になりません。(結果がNULLになる)

NULLを含む場合は<=>演算子を使用します。

mysql> SELECT NULL <=> NULL, 8 <=> NULL, 8 <=> 8, 3 <=> 8;
+---------------+------------+---------+---------+
| NULL <=> NULL | 8 <=> NULL | 8 <=> 8 | 3 <=> 8 |
+---------------+------------+---------+---------+
|             1 |          0 |       1 |       0 |
+---------------+------------+---------+---------+
1 row in set (0.00 sec)

等しくない(<>, !=

2値の関係性が『等しくない』の演算は<>演算子を使います。

mysql> SELECT 8 <> 3, 8 <> 8;
+--------+--------+
| 8 <> 3 | 8 <> 8 |
+--------+--------+
|      1 |      0 |
+--------+--------+
1 row in set (0.00 sec)

また、!=演算子でも同様の演算を行えます。

mysql> SELECT 8 != 3, 8 != 8;
+--------+--------+
| 8 != 3 | 8 != 8 |
+--------+--------+
|      1 |      0 |
+--------+--------+
1 row in set (0.00 sec)

よりも小さい(<

2値の関係性が『よりも小さい』の演算は<演算子を使います。

mysql> SELECT 3 < 8, 8 < 3, 8 < 8;
+-------+-------+-------+
| 3 < 8 | 8 < 3 | 8 < 8 |
+-------+-------+-------+
|     1 |     0 |     0 |
+-------+-------+-------+
1 row in set (0.00 sec)

mysql>

以下(<=

2値の関係性が『以下』の演算は<=演算子を使います。

mysql> SELECT 3 <= 8, 8 <= 3, 8 <= 8;
+--------+--------+--------+
| 3 <= 8 | 8 <= 3 | 8 <= 8 |
+--------+--------+--------+
|      1 |      0 |      1 |
+--------+--------+--------+
1 row in set (0.00 sec)

よりも大きい(>

2値の関係性が『よりも大きい』の演算は>演算子を使います。

mysql> SELECT 8 > 3, 3 > 8, 8 > 8;
+-------+-------+-------+
| 8 > 3 | 3 > 8 | 8 > 8 |
+-------+-------+-------+
|     1 |     0 |     0 |
+-------+-------+-------+
1 row in set (0.00 sec)

以上(>=

2値の関係性が『以上』の演算は>=演算子を使います。

mysql> SELECT 8 >= 3, 3 >= 8, 8 >= 8;
+--------+--------+--------+
| 8 >= 3 | 3 >= 8 | 8 >= 8 |
+--------+--------+--------+
|      1 |      0 |      1 |
+--------+--------+--------+
1 row in set (0.00 sec)

NULLである(IS NULL

ある値が『NULLである』の演算はIS NULL演算子を使います。

mysql> SELECT NULL IS NULL, 8 IS NULL;
+--------------+-----------+
| NULL IS NULL | 8 IS NULL |
+--------------+-----------+
|            1 |         0 |
+--------------+-----------+
1 row in set (0.00 sec)

NULLではない(IS NOT NULL

ある値が『NULLではない』の演算はIS NOT NULL演算子を使います。

mysql> SELECT NULL IS NOT NULL, 8 IS NOT NULL;
+------------------+---------------+
| NULL IS NOT NULL | 8 IS NOT NULL |
+------------------+---------------+
|                0 |             1 |
+------------------+---------------+
1 row in set (0.00 sec)

TRUE/FALSEである(IS

ある値が『TRUE/FALSEである』の演算はIS演算子を使います。

mysql> SELECT 1 IS TRUE, 0 IS FALSE, 88 IS TRUE, 88 IS FALSE;
+-----------+------------+------------+-------------+
| 1 IS TRUE | 0 IS FALSE | 88 IS TRUE | 88 IS FALSE |
+-----------+------------+------------+-------------+
|         1 |          1 |          1 |           0 |
+-----------+------------+------------+-------------+
1 row in set (0.00 sec)

TRUE/FALSEではない(IS NOT

ある値が『TRUE/FALSEではない』の演算はIS NOT演算子を使います。

mysql> SELECT 0 IS NOT TRUE, 1 IS NOT FALSE, 88 IS NOT TRUE, 88 IS NOT FALSE;
+---------------+----------------+----------------+-----------------+
| 0 IS NOT TRUE | 1 IS NOT FALSE | 88 IS NOT TRUE | 88 IS NOT FALSE |
+---------------+----------------+----------------+-----------------+
|             1 |              1 |              0 |               1 |
+---------------+----------------+----------------+-----------------+
1 row in set (0.00 sec)

value1以上、value2以下の値である(BETWEEN AND

ある値が『value1以上、value2以下の値である』の演算はBETWEEN AND演算子を使います。

mysql> SELECT 8 BETWEEN 3 AND 10, 8 BETWEEN 11 AND 17, 8 BETWEEN 8 AND 10, 8 BETWEEN 3 AND 8;
+--------------------+---------------------+--------------------+-------------------+
| 8 BETWEEN 3 AND 10 | 8 BETWEEN 11 AND 17 | 8 BETWEEN 8 AND 10 | 8 BETWEEN 3 AND 8 |
+--------------------+---------------------+--------------------+-------------------+
|                  1 |                   0 |                  1 |                 1 |
+--------------------+---------------------+--------------------+-------------------+
1 row in set (0.00 sec)

value1以上、value2以下の値ではない(NOT BETWEEN AND

ある値が『value1以上、value2以下の値ではない』の演算はNOT BETWEEN AND演算子を使います。

mysql> SELECT 8 NOT BETWEEN 3 AND 5, 8 NOT BETWEEN 5 AND 10, 8 NOT BETWEEN 8 AND 10, 8 NOT BETWEEN 3 AND 8;
+-----------------------+------------------------+------------------------+-----------------------+
| 8 NOT BETWEEN 3 AND 5 | 8 NOT BETWEEN 5 AND 10 | 8 NOT BETWEEN 8 AND 10 | 8 NOT BETWEEN 3 AND 8 |
+-----------------------+------------------------+------------------------+-----------------------+
|                     1 |                      0 |                      0 |                     0 |
+-----------------------+------------------------+------------------------+-----------------------+
1 row in set (0.00 sec)

実行結果から分かるように2つの値も含みます

いずれかの値に等しい(IN

ある値が『いずれかの値に等しい』の演算はIN演算子を使います。

mysql> SELECT 8 IN (7, 8, 9) , 8 IN (1, 2, 3);
+----------------+----------------+
| 8 IN (7, 8, 9) | 8 IN (1, 2, 3) |
+----------------+----------------+
|              1 |              0 |
+----------------+----------------+
1 row in set (0.01 sec)

いずれの値とも等しくない(NOT IN

ある値が『いずれの値とも等しくない』の演算はNOT IN演算子を使います。

mysql> SELECT 8 NOT IN (1, 2, 3), 8 NOT IN (7, 8, 9);
+--------------------+--------------------+
| 8 NOT IN (1, 2, 3) | 8 NOT IN (7, 8, 9) |
+--------------------+--------------------+
|                  1 |                  0 |
+--------------------+--------------------+
1 row in set (0.00 sec)

パターンにマッチする(LIKE

ある値が『パターンにマッチする』の演算はLIKE演算子を使います。

mysql> SELECT 'Hello World' LIKE '%Hello%', 'Hello World' LIKE '%Good%';
+------------------------------+-----------------------------+
| 'Hello World' LIKE '%Hello%' | 'Hello World' LIKE '%Good%' |
+------------------------------+-----------------------------+
|                            1 |                           0 |
+------------------------------+-----------------------------+
1 row in set (0.01 sec)

パターン

パターンは文字列と%_で表現します。
%は任意の0文字以上の文字列、_は任意の1文字を表わします。

パターンにマッチしない(NOT LIKE

ある値が『パターンにマッチしない』の演算はNOT LIKE演算子を使います。

mysql> SELECT 'Hello World' NOT LIKE '%Good%', 'Hello World' NOT LIKE '%Hello%';
+---------------------------------+----------------------------------+
| 'Hello World' NOT LIKE '%Good%' | 'Hello World' NOT LIKE '%Hello%' |
+---------------------------------+----------------------------------+
|                               1 |                                0 |
+---------------------------------+----------------------------------+
1 row in set (0.00 sec)

パターン

パターンはLIKEと同じで文字列と%_で表現します。
%は任意の0文字以上の文字列、_は任意の1文字を表わします。