表 12.3 比較演算子
名前 | 説明 |
---|---|
BETWEEN ... AND ... |
値が値の範囲内に含まれているかどうかを確認します |
COALESCE() |
NULL 以外の最初の引数を返します |
= |
等価 (等しい) 演算子 |
<=> |
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.10.5「行サブクエリー」を参照してください。
このセクションで示す関数の一部では、1
(TRUE
)、0
(FALSE
)、またはNULL
以外の値が返されます。たとえば、LEAST()
やGREATEST()
です。ただし、返される値は、セクション12.2「式評価での型変換」で説明したルールに従って実行された比較演算に基づきます。
CAST()
関数を使用すると、比較目的で値を特定の型に変換できます。CONVERT()
を使用すると、文字列値を別の文字セットに変換できます。セクション12.10「キャスト関数と演算子」を参照してください。
デフォルトでは、文字列の比較では大文字と小文字が区別されず、現在の文字セットが使用されます。デフォルトはlatin1
(cp1252 西ヨーロッパ言語) であり、英語でも正常に機能します。
等しい:
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
NULL
- 安全等価。この演算子では、=
演算子のように等価比較が実行されますが、両方のオペランドがNULL
であれば、NULL
でなく1
が返され、一方のオペランドがNULL
の場合は、NULL
でなく0
が返されます。mysql> SELECT 1 <=> 1, NULL <=> NULL, 1 <=> NULL; -> 1, 1, 0 mysql> SELECT 1 = 1, NULL = NULL, 1 = NULL; -> 1, NULL, NULL
等しくない:
mysql> SELECT '.01' <> '0.01'; -> 1 mysql> SELECT .01 <> '0.01'; -> 0 mysql> SELECT 'zapp' <> 'zappp'; -> 1
より少ないか等しい:
mysql> SELECT 0.1 <= 2; -> 1
より少ない:
mysql> SELECT 2 < 2; -> 0
より多いか等しい:
mysql> SELECT 2 >= 2; -> 1
より多い:
mysql> SELECT 2 > 2; -> 0
boolean_value
をTRUE
、FALSE
、またはUNKNOWN
にすることができるブール値に対して値をテストします。mysql> SELECT 1 IS TRUE, 0 IS FALSE, NULL IS UNKNOWN; -> 1, 1, 1
boolean_value
をTRUE
、FALSE
、またはUNKNOWN
にすることができるブール値に対して値をテストします。mysql> SELECT 1 IS NOT UNKNOWN, 0 IS NOT UNKNOWN, NULL IS NOT UNKNOWN; -> 1, 1, 0
値が
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 * FROMtbl_nameWHEREauto_colIS NULL
ステートメントが行を返す場合、返される値は
LAST_INSERT_ID()
関数を呼び出した場合と同じです。複数行の挿入後の戻り値などについての詳細は、セクション12.14「情報関数」を参照してください。AUTO_INCREMENT
値を正常に挿入できなかった場合、SELECT
ステートメントは行を返しません。IS NULL
の比較を使用してAUTO_INCREMENT
値を取得する動作は、sql_auto_is_null = 0
を設定すると無効にできます。セクション5.1.4「サーバーシステム変数」を参照してください。MySQL 5.6 では
sql_auto_is_null
のデフォルト値は 0 です。NOT NULL
として宣言されたDATE
およびDATETIME
カラムでは、次のようなステートメントを使用することで、特殊な日付'0000-00-00'
を検索できます。SELECT * FROMtbl_nameWHEREdate_columnIS NULL
ODBC では
'0000-00-00'
日付値がサポートされていないため、一部の ODBC アプリケーションを取得する際に、これが必要になります。Obtaining Auto-Increment Values、およびConnector/ODBC Connection Parametersの
FLAG_AUTO_IS_NULL
オプションについての説明を参照してください。
値が
NULL
でないかどうかをテストします。mysql> SELECT 1 IS NOT NULL, 0 IS NOT NULL, NULL IS NOT NULL; -> 1, 1, 0
expr
がmin
より多いか等しく、expr
がmax
より少ないか等しい場合、BETWEEN
は1
を返し、それ以外では0
を返します。すべての引数の型が同じであれば、これは式(
と同等です。それ以外の場合は、セクション12.2「式評価での型変換」に記載したルールに従って型変換が実行されますが、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
にキャストします。これは、
NOT (
と同じです。expr
BETWEENmin
ANDmax
)リストの最初の非
NULL
値を返します。非NULL
値がない場合は、NULL
を返します。mysql> SELECT COALESCE(NULL,1); -> 1 mysql> SELECT COALESCE(NULL,NULL,NULL); -> NULL
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
リストのいずれかの値と等しい場合は1
を返し、それ以外の場合は0
を返します。すべての値が定数の場合は、expr
の型に従って評価され,ソートされます。その際の項目の検索は、バイナリ検索を使って行われます。つまり、IN
値のリストがすべて定数で構成されている場合、IN
は非常に高速です。それ以外の場合は、セクション12.2「式評価での型変換」で説明したルールに従って型変換が実行されますが、すべての引数に適用されます。mysql> SELECT 2 IN (0,3,5,7); -> 0 mysql> SELECT 'wefwf' IN ('wee','wefwf','weg'); -> 1
引用符で囲まれた値 (文字列など) と囲まれていない値 (数字など) の比較ルールは異なるため、
IN
リストの引用符で囲まれた値と囲まれていない値を決して混同しないでください。したがって、型を混同すると、整合性のない結果になる可能性があります。たとえば、IN
式を次のように記述しないでください。SELECT val1 FROM tbl1 WHERE val1 IN (1,2,'a');
代わりに、次のように記述してください。
SELECT val1 FROM tbl1 WHERE val1 IN ('1','2','a');
IN
リストの値の数は、max_allowed_packet
値によってのみ制限されます。SQL の標準に準拠するために、左側の式が
NULL
である場合だけでなく、リストに一致が見つからない場合やリストの式のいずれかがNULL
である場合にも、IN
はNULL
を返します。IN()
構文は、特定のタイプのサブクエリーを作成する際にも使用できます。セクション13.2.10.3「ANY、IN、または SOME を使用したサブクエリー」を参照してください。これは、
NOT (
と同じです。expr
IN (value
,...))expr
がNULL
の場合、ISNULL()
は1
を返し、それ以外の場合は0
を返します。mysql> SELECT ISNULL(1+1); -> 0 mysql> SELECT ISNULL(1/0); -> 1
=
の代わりにISNULL()
を使用すると、値がNULL
であるかどうかをテストできます。(=
を使用して値をNULL
と比較すると、常に false が発生します。)ISNULL()
関数はIS NULL
比較演算子と、いくつかの特殊な動作を共有します。IS NULL
の説明を参照してください。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
2 つ以上の引数がある場合は、最小の (最小値の) 引数を返します。引数は、次のルールを使用して比較されます。
引数が
NULL
である場合、結果はNULL
になります。比較は必要ありません。戻り値が
INTEGER
コンテキストで使用されている場合、またはすべての引数が整数値である場合は、整数として比較されます。戻り値が
REAL
コンテキストで使用されている場合、またはすべての引数が実数値である場合は、実数として比較されます。引数が数字と文字列が混在して構成されている場合は、数字として比較されます。
引数が非バイナリ (文字) 文字列の場合は、非バイナリ文字列として比較されます。
ほかのすべてのケースでは、引数はバイナリ文字列として比較されます。
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'
一部のボーダーラインケースでは、前述の変換ルールで異常な結果が生成される可能性があります。
mysql> SELECT CAST(LEAST(3600, 9223372036854775808.0) as SIGNED); -> -9223372036854775808
これは、MySQL が
9223372036854775808.0
を整数のコンテキストで読み取ることが原因で発生します。整数表記では値を保持するのに十分でないため、符号付き整数にラップします。