式と演算子
算術演算
SQL の文には、式を記述することができます
コンピュータの世界の式とは、数学の世界の式と多少異なりますが
加算や減算などの算術演算に関しては、数学と同じです
式は、オペランドと演算子によって構成されます
演算子とは + や - などの計算記号のことで、数学と互換しています
ただし、乗算は *、除算は /、剰余は % 記号で表します
計算を行うには、この演算子に計算対象の値を指定しなければなりません
これをオペランド、または項と呼びます
算術演算の場合、演算子の左右にオペランドを指定する2項演算子となります
例えば、次の式を文中に指定することは可能です
(10 + 25) * 2
計算順序も数学と同様なので、加算よりも乗算が優先されます
そこで、加算を優先したい場合は括弧を用いて先に計算させます
優先順位が同じ場合は、左から評価されます
算術演算子
演算子 | 解説 | 例 |
+ | 加算 | A + B |
- | 減算 | A - B |
* | 乗算 | A * B |
/ | 除算 | A / B |
% | 剰余 | A % B |
リテラルの計算式を文中に記述することに大きな意味はありません
対話型の SQL ならば、1 + 1 という値は 2 であることをその時点で計算できます
SQL サーバーの負荷を軽減させるためにも、無意味な式は避けましょう
しかし、自分で計算するのが面倒ならば便利かもしれません
>CREATE TABLE Test (Value INT)
>INSERT INTO Test VALUES(500*2)
>SELECT * FROM Test
+-------+
| Value |
+-------+
| 1000 |
+-------+
この SQL 文の集合は、Test 表を作成して計算式の実験を行っています
INSERT INTO 文で Value 列に数値を追加しますが、このとき式を使います
文では 500 * 2 という式を指定し、データベースに追加しています
その結果、指定した式の算術結果である 1000 が表示されました
式が正しく計算され、データベースに追加された証拠です
比較演算子
数千人の社員をデータベースで管理している状態を想定してください
新しいプロジェクトを遂行するための人事を任されたとします
適任者を数千人分の社員が登録された表から、あなたは探すでしょうか
優秀な利用者であれば、データベースから必要なデータだけを抽出します
例えば、特定の資格保有者、年齢、類似プロジェクトの経験者などです
これらの条件に合致する社員だけを問い合わせれば
プロジェクトに必要な人材をスマートに探し出すことができるかもしれません
このような作業を実現するためには、データの比較が必要になります
比較は、「年齢が30歳以上」とか「入社2年以上」というような条件指定を実現します
比較を行うには、比較演算子を用いて計算を行います
比較演算子
演算子 | 解説 | 例 |
= | 等しい | A = B |
> | より大きい | A > B |
< | より小さい | A < B |
>= | より大きいか等しい | A >= B |
<= | より小さいか等しい | A <= B |
<> | 等しくない | A <> B |
比較演算子の結果は常に boolean 型のデータとなります
比較演算子のとおりであれば TRUE、そうでなければ FALSE となります
例えば 10 = 10 は等しいので TRUE となりますが 10 = 1 は FALSE です
>CREATE TABLE Test (Value boolean)
>INSERT INTO Test VALUES(10 = 10)
>INSERT INTO Test VALUES(10 = 1)
>INSERT INTO Test VALUES(10 < 50)
>INSERT INTO Test VALUES(10 > 50)
>SELECT * FROM Test
+-------+
| Value |
+-------+
| true|
| false|
| true|
| false|
+-------+
この SQL 文は、真偽値を格納する列 Value を持つ Test 表を作成し
行を追加するときに比較演算子を用いて Value 列の値を指定しています
実装のよっては真偽値を特別な数値で表そうとするものもあります
例えば 0 ならば FALSE、そうでなければ TRUE という具合です
比較演算は、データベースへの問い合わせで多用することになるでしょう
比較結果が false の行を無視すれば、条件に合致したデータを参照できます
単項演算子
数値データに対して、符号を反転させる目的などに単項演算子を使うことがあります
単項演算子、その名のとおりオペランドを1つしか受け取らない演算子のことです
オペランドをひとつしか受け取らない単項演算子は
指定するオペランドよりも手前に演算子を配置しなければなりません
単項演算子
演算子 | 解説 | 例 |
+ | 数値は正(プラス)である | +A |
- | 数値は負(マイナス)である | -A |
~ | ビットをすべて反転させる | ~A |
~ 演算子は、数値を2進数として解釈し、すべてのビットを反転させます
つまり、0 の桁は 1 に、1 の桁は 0 に変換するのです
11001100 という2進数の列は 00110011 になります
+ と - 演算子は、加算、減算演算子と混同しないでください
2項演算子であれば加減算、単項演算子であれば符号であると解釈します
>CREATE TABLE Test (Value INT)
>INSERT INTO Test VALUES(+100)
>INSERT INTO Test VALUES(-100)
>INSERT INTO Test VALUES(~100)
>INSERT INTO Test VALUES(-(-100))
>SELECT * FROM Test
+-------+
| Value |
+-------+
| 100 |
| -100 |
| -101 |
| 100 |
+-------+
INSERT INTO 文の最初の2つはうなずけると思います
+100 は通常の正数、-100 は負数、結果はそのままですね
~100 は2進数 1100100 を反転させています
ところが、反転した結果 0011011 すなわち10進数の 27 になるはずですが
表を問い合わせると -101 という値が保存されています
実は、これは2進数で負数を表現する方法に秘密があります
コンピュータの世界では、最上位ビットが 1 の場合は負数という決まりがあるのです
さらに、アーキテクチャによって2の補数が絶対値となります
0011011 の2の補数は 1100101 となるため、10進数の 101 が絶対値となるのです
この考え方は、プログラミング言語の経験や情報科学を知らないと難しいでしょう
最後の -(-100) という表記もやや特別です
これは、負数を負数にすると正数になるという性質を証明しています
- 演算子は符号を反転させるため、負数の値に - を与えれば正数になります
表を見ると、確かに正数 100 になっていることが確認できます