10bet网址
MySQL 5.6 リファレンスマニュアル
Download this Manual
PDF (US Ltr)- 26.8Mb
PDF (A4)- 26.8Mb


12.3.2 比較関数と演算子

表 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
  • ISboolean_value

    boolean_valueTRUEFALSE、またはUNKNOWNにすることができるブール値に対して値をテストします。

    mysql> SELECT 1 IS TRUE, 0 IS FALSE, NULL IS UNKNOWN; -> 1, 1, 1
  • IS NOTboolean_value

    boolean_valueTRUEFALSE、または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 * 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 ParametersFLAG_AUTO_IS_NULLオプションについての説明を参照してください。

  • IS NOT NULL

    値がNULLでないかどうかをテストします。

    mysql> SELECT 1 IS NOT NULL, 0 IS NOT NULL, NULL IS NOT NULL; -> 1, 1, 0
  • exprBETWEENminANDmax

    exprminより多いか等しく、exprmaxより少ないか等しい場合、BETWEEN1を返し、それ以外では0を返します。すべての引数の型が同じであれば、これは式(min<=exprANDexpr<=max)と同等です。それ以外の場合は、セクション12.2「式評価での型変換」に記載したルールに従って型変換が実行されますが、3 つのすべての引数に適用されます。

    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を返します。

    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,...)

    exprINリストのいずれかの値と等しい場合は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である場合にも、INNULLを返します。

    IN()構文は、特定のタイプのサブクエリーを作成する際にも使用できます。セクション13.2.10.3「ANY、IN、または SOME を使用したサブクエリー」を参照してください。

  • exprNOT IN (value,...)

    これは、NOT (exprIN (value,...))と同じです。

  • ISNULL(expr)

    exprNULLの場合、ISNULL()1を返し、それ以外の場合は0を返します。

    mysql> SELECT ISNULL(1+1); -> 0 mysql> SELECT ISNULL(1/0); -> 1

    =の代わりにISNULL()を使用すると、値がNULLであるかどうかをテストできます。(=を使用して値をNULLと比較すると、常に false が発生します。)

    ISNULL()関数はIS NULL比較演算子と、いくつかの特殊な動作を共有します。IS NULLの説明を参照してください。

  • INTERVAL(N,N1,N2,N3,...)

    N<N1の場合は0を返し、N<N2などの場合は1を返し、NNULLの場合は-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
  • LEAST(value1,value2,...)

    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を整数のコンテキストで読み取ることが原因で発生します。整数表記では値を保持するのに十分でないため、符号付き整数にラップします。