表 12.4 「比較演算子」
名前 | 説明 |
---|---|
> |
右不等 (より多い) 演算子 |
>= |
以上 (より多いか等しい) 演算子 |
< |
左不等 (より少ない) 演算子 |
<> , != |
不等価 (等しくない) 演算子 |
<= |
以下 (より少ないか等しい) 演算子 |
<= |
NULL 安全等価演算子 |
= |
等価 (等しい) 演算子 |
BETWEEN ... AND ... |
値が値の範囲内にあるかどうか |
COALESCE() |
NULL 以外の最初の引数を返します |
GREATEST() |
最大の引数を返します |
IN() |
値が値セット内にあるかどうか |
INTERVAL() |
第 1 引数より小さい引数のインデックスを返します |
IS |
ブーリアンに対して値をテストします |
IS NOT |
ブーリアンに対して値をテストします |
IS NOT NULL |
NOT NULL 値テスト |
IS NULL |
NULL 値テスト |
ISNULL() |
引数が NULL かどうかをテストします |
LEAST() |
最小の引数を返します |
LIKE |
単純なパターン一致 |
NOT BETWEEN ... AND ... |
値が値の範囲内にないかどうか |
NOT IN() |
値が値セット内にないかどうか |
NOT LIKE |
単純なパターン一致の否定 |
STRCMP() |
2 つの文字列を比較します |
比較演算の結果は、1
(TRUE
)、0
(FALSE
)、または NULL
の値になります。 これらの演算は、数字と文字列の両方で機能します。 必要に応じて、文字列は数字に、数字は文字列に自動的に変換されます。
次の関係比較演算子を使用すれば、スカラーオペランドだけでなく行オペランドも比較できます。
= > < >= <= <> !=
これらの演算子の詳細は、このセクションの後半で説明します。 行サブクエリーのコンテキストにおける行比較のその他の例は、セクション13.2.11.5「行サブクエリー」 を参照してください。
このセクションで示す関数の一部では、1
(TRUE
)、0
(FALSE
)、または NULL
以外の値が返されます。 LEAST()
および GREATEST()
はこのような関数の例です。セクション12.3「式評価での型変換」 では、これらの関数と同様の関数によって実行される、戻り値を決定するための比較操作のルールについて説明しています。
以前のバージョンの MySQL では、LEAST()
または GREATEST()
を含む式を評価するときに、サーバーは関数が使用されたコンテキストを推測し、関数の引数を式全体のデータ型に強制変換しようとしました。 たとえば、LEAST("11", "45", "2")
の引数は文字列として評価およびソートされるため、この式は"11"
を返します。 MySQL 8.0.3 以前では、式 LEAST("11", "45", "2") + 0
を評価する際に、サーバーは引数をソートする前に整数に変換し (結果に整数 0 を追加することが予想されます)、2 を返します。
MySQL 8.0.4 以降、サーバーはこの方法でコンテキストの推測を試行しなくなりました。 かわりに、関数は指定された引数を使用して実行され、すべて同じ型でない場合にのみ、1 つ以上の引数へのデータ型変換が実行されます。 戻り値を使用する式によって強制される型強制は、関数の実行後に実行されるようになりました。 つまり、MySQl 8.0.4 以降では、LEAST("11", "45", "2") + 0
は"11" + 0
と評価されるため、整数 11 になります。 (Bug #83895、Bug #25123839)
CAST()
関数を使用すると、比較目的で値を特定の型に変換できます。 CONVERT()
を使用すると、文字列値を別の文字セットに変換できます。 セクション12.11「キャスト関数と演算子」を参照してください。
デフォルトでは、文字列比較では大/小文字は区別されず、現在の文字セットが使用されます。 デフォルトは utf8mb4
です。
-
=
等しい:
mysql> SELECT 1 = 0; -> 0 mysql> SELECT '0' = 0; -> 1 mysql> SELECT '0.0' = 0; -> 1 mysql> SELECT '0.01' = 0; -> 0 mysql> SELECT '.01' = 0.01; -> 1
行の比較では、
(a, b) = (x, y)
は次と同等です:(a = x) AND (b = y)
-
<=>
NULL
- 安全等価。 この演算子では、=
演算子のように等価比較が実行されますが、両方のオペランドがNULL
であれば、NULL
でなく1
が返され、一方のオペランドがNULL
の場合は、NULL
でなく0
が返されます。<=>
演算子は、標準の SQLIS NOT DISTINCT FROM
演算子と同等です。mysql> SELECT 1 <=> 1, NULL <=> NULL, 1 <=> NULL; -> 1, 1, 0 mysql> SELECT 1 = 1, NULL = NULL, 1 = NULL; -> 1, NULL, NULL
行の比較では、
(a, b) <=> (x, y)
は次と同等です:(a <=> x) AND (b <=> y)
-
<>
,!=
等しくない:
mysql> SELECT '.01' <> '0.01'; -> 1 mysql> SELECT .01 <> '0.01'; -> 0 mysql> SELECT 'zapp' <> 'zappp'; -> 1
行の比較では、
(a, b) <> (x, y)
と(a, b) != (x, y)
は次と同等です:(a <> x) OR (b <> y)
-
<=
より少ないか等しい:
mysql> SELECT 0.1 <= 2; -> 1
行の比較では、
(a, b) <= (x, y)
は次と同等です:(a < x) OR ((a = x) AND (b <= y))
-
<
より少ない:
mysql> SELECT 2 < 2; -> 0
行の比較では、
(a, b) < (x, y)
は次と同等です:(a < x) OR ((a = x) AND (b < y))
-
>=
より多いか等しい:
mysql> SELECT 2 >= 2; -> 1
行の比較では、
(a, b) >= (x, y)
は次と同等です:(a > x) OR ((a = x) AND (b >= y))
-
>
より多い:
mysql> SELECT 2 > 2; -> 0
行の比較では、
(a, b) > (x, y)
は次と同等です:(a > x) OR ((a = x) AND (b > y))
-
expr
BETWEENmin
ANDmax
expr
がmin
より多いか等しく、expr
がmax
より少ないか等しい場合、BETWEEN
は1
を返し、それ以外では0
を返します。 すべての引数の型が同じであれば、これは式(
と同等です。 それ以外の場合は、セクション12.3「式評価での型変換」に記載したルールに従って型変換が実行されますが、3 つのすべての引数に適用されます。min
<=expr
ANDexpr
<=max
)mysql> SELECT 2 BETWEEN 1 AND 3, 2 BETWEEN 3 and 1; -> 1, 0 mysql> SELECT 1 BETWEEN 2 AND 3; -> 0 mysql> SELECT 'b' BETWEEN 'a' AND 'c'; -> 1 mysql> SELECT 2 BETWEEN 2 AND '3'; -> 1 mysql> SELECT 2 BETWEEN 2 AND 'x-3'; -> 0
日付または時間の値とともに
BETWEEN
を使用したときの結果を最適にするには、CAST()
を使用して明示的に値を目的のデータ型に変換します。 例 :DATETIME
を 2 つのDATE
値と比較する場合は、DATE
値をDATETIME
値に変換します。DATE
との比較で'2001-1-1'
などの文字列定数を使用する場合は、文字列をDATE
にキャストします。 -
expr
NOT BETWEENmin
ANDmax
これは、
NOT (
と同じです。expr
BETWEENmin
ANDmax
) -
COALESCE(
value
,...)リストの最初の非
NULL
値を返します。非NULL
値がない場合は、NULL
を返します。COALESCE()
の戻り型は、引数型の集計型です。mysql> SELECT COALESCE(NULL,1); -> 1 mysql> SELECT COALESCE(NULL,NULL,NULL); -> NULL
-
GREATEST(
value1
,value2
,...)2 つ以上の引数がある場合は、最大の (最大値の) 引数を返します。 引数は、
LEAST()
のルールと同じルールを使用して比較されます。mysql> SELECT GREATEST(2,0); -> 2 mysql> SELECT GREATEST(34.0,3.0,5.0,767.0); -> 767.0 mysql> SELECT GREATEST('B','A','C'); -> 'C'
引数のいずれかが
NULL
である場合、GREATEST()
はNULL
を返します。 -
expr
IN (value
,...)expr
がIN()
リストのいずれかの値と等しい場合は1
(true) を返し、それ以外の場合は0
(false) を返します。型変換は、セクション12.3「式評価での型変換」 で説明されているルールに従って行われ、すべての引数に適用されます。
IN()
リストの値に型変換が必要ない場合、それらはすべて同じ型のJSON
以外の定数であり、expr
を同じ型の値として比較できます (型変換後の場合もあります)。 リストがソートされ、バイナリ検索を使用してexpr
の検索が実行されるため、IN()
操作が非常に迅速になります。mysql> SELECT 2 IN (0,3,5,7); -> 0 mysql> SELECT 'wefwf' IN ('wee','wefwf','weg'); -> 1
IN()
を使用して、行コンストラクタを比較できます:mysql> SELECT (3,4) IN ((1,2), (3,4)); -> 1 mysql> SELECT (3,4) IN ((1,2), (3,5)); -> 0
引用符で囲まれた値 (文字列など) と囲まれていない値 (数字など) の比較ルールは異なるため、
IN()
リストの引用符で囲まれた値と囲まれていない値を決して混同しないでください。 したがって、型を混同すると、整合性のない結果になる可能性があります。 たとえば、IN()
式を次のように記述しないでください。SELECT val1 FROM tbl1 WHERE val1 IN (1,2,'a');
代わりに、次のように記述してください。
SELECT val1 FROM tbl1 WHERE val1 IN ('1','2','a');
暗黙的な型変換では、直感的でない結果が生成される場合があります:
mysql> SELECT 'a' IN (0), 0 IN ('b'); -> 1, 1
どちらの場合も、比較値は浮動小数点値に変換され、それぞれの場合に 0.0 が生成され、比較結果は 1 (true) になります。
IN()
リストの値の数は、max_allowed_packet
値によってのみ制限されます。SQL の標準に準拠するために、左側の式が
NULL
である場合だけでなく、リストに一致が見つからない場合やリストの式のいずれかがNULL
である場合にも、IN()
はNULL
を返します。IN()
構文は、特定のタイプのサブクエリーを作成する際にも使用できます。 セクション13.2.11.3「ANY、IN、または SOME を使用したサブクエリー」を参照してください。 -
expr
NOT IN (value
,...)これは、
NOT (
と同じです。expr
IN (value
,...)) -
INTERVAL(
N
,N1
,N2
,N3
,...)N
<N1
の場合は0
を返し、N
<N2
などの場合は1
を返し、N
がNULL
の場合は-1
を返します。 すべての引数は整数として処理されます。 この関数が正しく機能するには、N1
<N2
<N3
<...
<Nn
とする必要があります。 これは、バイナリ検索が使用されていることが理由です (非常に高速)。mysql> SELECT INTERVAL(23, 1, 15, 17, 30, 44, 200); -> 3 mysql> SELECT INTERVAL(10, 1, 10, 100, 1000); -> 2 mysql> SELECT INTERVAL(22, 23, 30, 44, 200); -> 0
-
IS
boolean_value
boolean_value
をTRUE
、FALSE
、またはUNKNOWN
にすることができるブール値に対して値をテストします。mysql> SELECT 1 IS TRUE, 0 IS FALSE, NULL IS UNKNOWN; -> 1, 1, 1
-
IS NOT
boolean_value
boolean_value
をTRUE
、FALSE
、またはUNKNOWN
にすることができるブール値に対して値をテストします。mysql> SELECT 1 IS NOT UNKNOWN, 0 IS NOT UNKNOWN, NULL IS NOT UNKNOWN; -> 1, 1, 0
-
IS NULL
値が
NULL
かどうかをテストします。mysql> SELECT 1 IS NULL, 0 IS NULL, NULL IS NULL; -> 0, 0, 1
ODBC プログラムを適切に使用するために、MySQL では、
IS NULL
の使用時に次の追加機能がサポートされています:-
sql_auto_is_null
変数が 1 に設定されている場合は、自動的に生成されたAUTO_INCREMENT
値を正常に挿入するステートメントのあとに、次の形式のステートメントを発行すれば、その値を検索できます。SELECT * FROM tbl_name WHERE auto_col IS NULL
ステートメントが行を返す場合、返される値は
LAST_INSERT_ID()
関数を呼び出した場合と同じです。 複数行の挿入後の戻り値などについての詳細は、セクション12.16「情報関数」を参照してください。AUTO_INCREMENT
値を正常に挿入できなかった場合、SELECT
ステートメントは行を返しません。IS NULL
の比較を使用してAUTO_INCREMENT
値を取得する動作は、sql_auto_is_null = 0
を設定すると無効にできます。 セクション5.1.8「サーバーシステム変数」を参照してください。sql_auto_is_null
のデフォルト値は 0 です。 -
NOT NULL
として宣言されたDATE
およびDATETIME
カラムでは、次のようなステートメントを使用することで、特殊な日付'0000-00-00'
を検索できます。SELECT * FROM tbl_name WHERE date_column IS NULL
ODBC では
'0000-00-00'
日付値がサポートされていないため、一部の ODBC アプリケーションを取得する際に、これが必要になります。Obtaining Auto-Increment Values、およびConnector/ODBC Connection Parametersの
FLAG_AUTO_IS_NULL
オプションについての説明を参照してください。
-
-
IS NOT NULL
値が
NULL
でないかどうかをテストします。mysql> SELECT 1 IS NOT NULL, 0 IS NOT NULL, NULL IS NOT NULL; -> 1, 1, 0
-
ISNULL(
expr
)expr
がNULL
の場合、ISNULL()
は1
を返し、それ以外の場合は0
を返します。mysql> SELECT ISNULL(1+1); -> 0 mysql> SELECT ISNULL(1/0); -> 1
=
の代わりにISNULL()
を使用すると、値がNULL
であるかどうかをテストできます。 (=
を使用して値をNULL
と比較すると、常にNULL
が生成されます。)ISNULL()
関数はIS NULL
比較演算子と、いくつかの特殊な動作を共有します。IS NULL
の説明を参照してください。 -
LEAST(
value1
,value2
,...)2 つ以上の引数がある場合は、最小の (最小値の) 引数を返します。 引数は、次のルールを使用して比較されます。
引数が
NULL
である場合、結果はNULL
になります。 比較は必要ありません。すべての引数が整数値の場合、整数として比較されます。
少なくとも 1 つの引数が倍精度の場合は、倍精度の値として比較されます。 それ以外の場合、少なくとも 1 つの引数が
DECIMAL
値であれば、DECIMAL
値として比較されます。引数が数値と文字列の組合せで構成されている場合、それらは文字列として比較されます。
引数が非バイナリ (文字) 文字列の場合は、非バイナリ文字列として比較されます。
ほかのすべてのケースでは、引数はバイナリ文字列として比較されます。
LEAST()
の戻り型は、比較引数型の集計型です。mysql> SELECT LEAST(2,0); -> 0 mysql> SELECT LEAST(34.0,3.0,5.0,767.0); -> 3.0 mysql> SELECT LEAST('B','A','C'); -> 'A'