MySQL 8.0 リファレンスマニュアル


MySQL 8.0 リファレンスマニュアル  /  ...  /  比較関数と演算子

12.4.2 比較関数と演算子

表 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 が返されます。

    <=> 演算子は、標準の SQL IS 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 BETWEEN min AND max

    exprmin より多いか等しく、exprmax より少ないか等しい場合、BETWEEN1 を返し、それ以外では 0 を返します。 すべての引数の型が同じであれば、これは式 (min <= expr AND expr <= max) と同等です。 それ以外の場合は、セクション12.3「式評価での型変換」に記載したルールに従って型変換が実行されますが、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 にキャストします。

  • expr NOT BETWEEN min AND max

    これは、NOT (expr BETWEEN min AND max) と同じです。

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

    exprIN() リストのいずれかの値と等しい場合は 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 を返し、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
  • IS boolean_value

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

    mysql> SELECT 1 IS TRUE, 0 IS FALSE, NULL IS UNKNOWN;
            -> 1, 1, 1
  • IS NOT boolean_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 * 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 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
  • ISNULL(expr)

    exprNULL の場合、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'

関連キーワード:  関数, 比較, IN, NOT, expr, BETWEEN, LEAST, 空間, テスト, リファレンス