メインコンテンツへスキップ

VillageSQL is a drop-in replacement for MySQL with extensions.

All examples on this page work on VillageSQL. Install Now →
演算子は値を組み合わせて新しい値を作ります。1 つは既に使いました。 rental_rate * 1.1 の * です。このレッスンでは日常的に使う一式と、全員が つまずく 1 つの振る舞い、つまり NULL が現れたときに何が起きるかを扱います。 始める前に mysql -u root -p sakila でクライアントを開いてください。

演算子の仕組み

LEFT_VALUE と RIGHT_VALUE を値に、OPERATOR を下の記号のいずれかに 置き換えます。値は列でもよく、リテラル、つまり文に直接書いた数値や テキストでも構いません。 FROM のない SELECT は式を評価して 1 行を返すので、演算子を試す最も 手早い方法になります。

例

  1. 比較は 1 か 0 を返す

MySQL には独立したブール型がありません。成り立つ比較は整数の 1 を返し、 成り立たない比較は 0 を返します。TRUE と FALSE という語は、この 2 つの 整数の別表記です。
等価は = 1 つであり、多くのプログラミング言語が使う == の 2 つ重ねでは ありません。<> と != はどちらも「等しくない」を意味し、まったく同じに 振る舞います。このチュートリアルでは <> と書きます。

  1. 算術と、どの演算子がより強く結合するか

2 + 3 * 4 は 14 なので、乗算が先に行われました。括弧はそれを上書きして 20 にします。/ は 2 つの整数の間でも小数の結果を返し、DIV は小数部分を 捨て、% は余りを返します。

  1. DIV と % は除算と同じ強さで結合する

3 つとも、除算や余りを先に計算したときの答えになります。- が / より 強く結合するなら、最初の列は 8 ではなく 3 になるはずです。

  1. 演算子は列にも使える

リテラルにできることは、列にもできます。
比較は 1 と 0 の列になり、エイリアスがそれに名前を付けます。

NULL は NULL を含め何とも等しくない

NULL には、一度も記録されなかった値を示す印としてソートのレッスンで 出会いました。ここでは、どの実際の値とも違う振る舞いをします。
記録されていない値が別の記録されていない値と等しいかという問いには答え られないので、NULL = NULL は 1 でも 0 でもなく NULL を返します。 NULL <> NULL も同様です。例 1 のすべての演算子は、NULL に対してそのように 振る舞います。 <=> が例外です。2 つの値を比較して常に 1 か 0 を返し、決して NULL を 返さず、NULL を自分自身と等しいものとして扱います。 その帰結として、= NULL は決して何にも一致しません。値が存在しない行を 見つける必要があるときは、IS NULL がそのテストであり、 普通の比較と同じように 1 か 0 を返します。

まとめ

  • 比較からは true や false ではなく 1 か 0 が返ります。
  • 等価には = を、不等には <> を使います。
  • *、/、DIV、% は + と - より強く結合することを覚えておきます。
  • 整数除算には DIV を、余りには % を使います。
  • NULL を含む普通の比較からは NULL が返るので、代わりに <=> か IS NULL を使います。

関連項目