このページは機械翻訳したものです。
表 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)) -
exprBETWEENminANDmaxexprがminより多いか等しく、exprがmaxより少ないか等しい場合、BETWEENは1を返し、それ以外では0を返します。 すべての引数の型が同じであれば、これは式(と同等です。 それ以外の場合は、セクション12.3「式評価での型変換」に記載したルールに従って型変換が実行されますが、3 つのすべての引数に適用されます。min<=exprANDexpr<=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にキャストします。 -
exprNOT BETWEENminANDmaxこれは、
NOT (と同じです。exprBETWEENminANDmax) -
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を返します。 -
exprIN (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'); -> 1IN()を使用して、行コンストラクタを比較できます: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 を使用したサブクエリー」を参照してください。 -
exprNOT IN (value,...)これは、
NOT (と同じです。exprIN (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 -
ISboolean_valueboolean_valueをTRUE、FALSE、またはUNKNOWNにすることができるブール値に対して値をテストします。mysql> SELECT 1 IS TRUE, 0 IS FALSE, NULL IS UNKNOWN; -> 1, 1, 1 -
IS NOTboolean_valueboolean_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, 1ODBC プログラムを適切に使用するために、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 NULLODBC では
'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'