SQLite 演算子

SQLite 演算子とは?

演算子は予約語または文字であり、主に SQLite 文の WHERE 句で比較や算術演算などの操作を実行するために使用されます。

演算子は SQLite 文内の条件を指定し、文内の複数の条件を結合するために使用されます。

  • 算術演算子

  • 比較演算子

  • 論理演算子

  • ビット演算子

SQLite 算術演算子

変数 a=10、変数 b=20 と仮定すると、次のようになります:

演算子説明例
+加算 - 演算子の両側の値を加算しますa + b は 30 になります
-減算 - 左のオペランドから右のオペランドを減算しますa - b は -10 になります
*乗算 - 演算子の両側の値を乗算しますa * b は 200 になります
/除算 - 左のオペランドを右のオペランドで除算しますb / a は 2 になります
%剰余 - 左のオペランドを右のオペランドで除算した後の余りb % a は 0 になります

例

以下は SQLite 算術演算子の簡単な例です:

sqlite> .mode line
sqlite> select 10 + 20;
10 + 20 = 30


sqlite> select 10 - 20;
10 - 20 = -10


sqlite> select 10 * 20;
10 * 20 = 200


sqlite> select 10 / 5;
10 / 5 = 2


sqlite> select 12 %  5;
12 %  5 = 2

SQLite 比較演算子

変数 a=10、変数 b=20 と仮定すると、次のようになります:

演算子説明例
==2つのオペランドの値が等しいかどうかを確認し、等しい場合は条件が真になります。(a == b) は真ではありません。
=2つのオペランドの値が等しいかどうかを確認し、等しい場合は条件が真になります。(a = b) は真ではありません。
!=2つのオペランドの値が等しいかどうかを確認し、等しくない場合は条件が真になります。(a != b) は真です。
<>2つのオペランドの値が等しいかどうかを確認し、等しくない場合は条件が真になります。(a <> b) は真です。
>左のオペランドの値が右のオペランドの値より大きいかどうかを確認し、大きい場合は条件が真になります。(a > b) は真ではありません。
<左のオペランドの値が右のオペランドの値より小さいかどうかを確認し、小さい場合は条件が真になります。(a < b) は真です。
>=左のオペランドの値が右のオペランドの値以上かどうかを確認し、そうであれば条件が真になります。(a >= b) は真ではありません。
<=左のオペランドの値が右のオペランドの値以下かどうかを確認し、そうであれば条件が真になります。(a <= b) は真です。
!<左のオペランドの値が右のオペランドの値より小さくないかどうかを確認し、小さくなければ条件が真になります。(a !< b) は偽です。
!>左のオペランドの値が右のオペランドの値より大きくないかどうかを確認し、大きくなければ条件が真になります。(a !> b) は真です。

例

COMPANY テーブルに次のレコードがあると仮定します:

ID          NAME        AGE         ADDRESS     SALARY
----------  ----------  ----------  ----------  ----------
1           Paul        32          California  20000.0
2           Allen       25          Texas       15000.0
3           Teddy       23          Norway      20000.0
4           Mark        25          Rich-Mond   65000.0
5           David       27          Texas       85000.0
6           Kim         22          South-Hall  45000.0
7           James       24          Houston     10000.0

以下の例では、さまざまな SQLite 比較演算子の使い方を示します。

ここでは、次を使用しますWHERE WHERE 句については、後の章で個別に説明しますが、ここでは、WHERE 句が SELECT 文の条件を設定するために使用されることを理解しておく必要があります。

次の SELECT 文は、SALARY が 50,000.00 より大きいすべてのレコードをリストします:

sqlite> SELECT * FROM COMPANY WHERE SALARY > 50000;
ID          NAME        AGE         ADDRESS     SALARY
----------  ----------  ----------  ----------  ----------
4           Mark        25          Rich-Mond   65000.0
5           David       27          Texas       85000.0

次の SELECT 文は、SALARY が 20,000.00 に等しいすべてのレコードをリストします:

sqlite>  SELECT * FROM COMPANY WHERE SALARY = 20000;
ID          NAME        AGE         ADDRESS     SALARY
----------  ----------  ----------  ----------  ----------
1           Paul        32          California  20000.0
3           Teddy       23          Norway      20000.0

次の SELECT 文は、SALARY が 20,000.00 に等しくないすべてのレコードをリストします:

sqlite>  SELECT * FROM COMPANY WHERE SALARY != 20000;
ID          NAME        AGE         ADDRESS     SALARY
----------  ----------  ----------  ----------  ----------
2           Allen       25          Texas       15000.0
4           Mark        25          Rich-Mond   65000.0
5           David       27          Texas       85000.0
6           Kim         22          South-Hall  45000.0
7           James       24          Houston     10000.0

次の SELECT 文は、SALARY が 20,000.00 に等しくないすべてのレコードをリストします:

sqlite> SELECT * FROM COMPANY WHERE SALARY <> 20000;
ID          NAME        AGE         ADDRESS     SALARY
----------  ----------  ----------  ----------  ----------
2           Allen       25          Texas       15000.0
4           Mark        25          Rich-Mond   65000.0
5           David       27          Texas       85000.0
6           Kim         22          South-Hall  45000.0
7           James       24          Houston     10000.0

次の SELECT 文は、SALARY が 65,000.00 以上であるすべてのレコードをリストします:

sqlite> SELECT * FROM COMPANY WHERE SALARY >= 65000;
ID          NAME        AGE         ADDRESS     SALARY
----------  ----------  ----------  ----------  ----------
4           Mark        25          Rich-Mond   65000.0
5           David       27          Texas       85000.0

SQLite 論理演算子

以下は SQLite のすべての論理演算子のリストです。

演算子説明
ANDAND 演算子は、SQL 文の WHERE 句内で複数の条件を存在させることを許可します。
BETWEENBETWEEN 演算子は、指定された最小値と最大値の範囲内の一連の値から値を検索するために使用されます。
EXISTSEXISTS 演算子は、特定の条件を満たす指定されたテーブル内に行が存在するかを検索するために使用されます。
ININ 演算子は、ある値を指定された一連のリストの値と比較するために使用されます。
NOT ININ 演算子の反対で、ある値を指定されたリストの値のいずれとも一致しない値と比較するために使用されます。
LIKELIKE 演算子は、ワイルドカード演算子を使用した類似の値と、ある値を比較するために使用されます。
GLOBGLOB 演算子は、ワイルドカード演算子を使用した類似の値と、ある値を比較するために使用されます。GLOB は LIKE と異なり、大文字と小文字を区別します。
NOTNOT 演算子は、使用された論理演算子の反対です。例:NOT EXISTS、NOT BETWEEN、NOT IN など。これは否定演算子です。
OROR 演算子は、SQL 文の WHERE 句内の複数の条件を結合するために使用されます。
IS NULLNULL 演算子は、ある値を NULL 値と比較するために使用されます。
ISIS 演算子は = に似ています。
IS NOTIS NOT 演算子は != に似ています。
||2つの異なる文字列を連結して、新しい文字列を取得します。
UNIQUEUNIQUE 演算子は、指定されたテーブルの各行を検索して、一意性(重複がないこと)を保証します。

例

COMPANY テーブルに次のレコードがあると仮定します:

ID          NAME        AGE         ADDRESS     SALARY
----------  ----------  ----------  ----------  ----------
1           Paul        32          California  20000.0
2           Allen       25          Texas       15000.0
3           Teddy       23          Norway      20000.0
4           Mark        25          Rich-Mond   65000.0
5           David       27          Texas       85000.0
6           Kim         22          South-Hall  45000.0
7           James       24          Houston     10000.0

以下の例では、SQLite 論理演算子の使い方を示します。

次の SELECT 文は、AGE が 25 以上で、且給与が 65000.00 以上であるすべてのレコードをリストします:

sqlite> SELECT * FROM COMPANY WHERE AGE >= 25 AND SALARY >= 65000;
ID          NAME        AGE         ADDRESS     SALARY
----------  ----------  ----------  ----------  ----------
4           Mark        25          Rich-Mond   65000.0
5           David       27          Texas       85000.0

次の SELECT 文は、AGE が 25 以上で、或給与が 65000.00 以上であるすべてのレコードをリストします:

sqlite> SELECT * FROM COMPANY WHERE AGE >= 25 OR SALARY >= 65000;
ID          NAME        AGE         ADDRESS     SALARY
----------  ----------  ----------  ----------  ----------
1           Paul        32          California  20000.0
2           Allen       25          Texas       15000.0
4           Mark        25          Rich-Mond   65000.0
5           David       27          Texas       85000.0

次の SELECT 文は、AGE が NULL ではないすべてのレコードをリストします。結果はすべてのレコードを示し、AGE が NULL に等しいレコードは1つもないことを意味します。

sqlite>  SELECT * FROM COMPANY WHERE AGE IS NOT NULL;
ID          NAME        AGE         ADDRESS     SALARY
----------  ----------  ----------  ----------  ----------
1           Paul        32          California  20000.0
2           Allen       25          Texas       15000.0
3           Teddy       23          Norway      20000.0
4           Mark        25          Rich-Mond   65000.0
5           David       27          Texas       85000.0
6           Kim         22          South-Hall  45000.0
7           James       24          Houston     10000.0

次の SELECT 文は、NAME が 'Ki' で始まるすべてのレコードをリストします。'Ki' の後の文字は制限されません:

sqlite> SELECT * FROM COMPANY WHERE NAME LIKE 'Ki%';
ID          NAME        AGE         ADDRESS     SALARY
----------  ----------  ----------  ----------  ----------
6           Kim         22          South-Hall  45000.0

次の SELECT 文は、NAME が 'Ki' で始まるすべてのレコードをリストします。'Ki' の後の文字は制限されません:

sqlite> SELECT * FROM COMPANY WHERE NAME GLOB 'Ki*';
ID          NAME        AGE         ADDRESS     SALARY
----------  ----------  ----------  ----------  ----------
6           Kim         22          South-Hall  45000.0

次の SELECT 文は、AGE の値が 25 または 27 であるすべてのレコードをリストします:

sqlite> SELECT * FROM COMPANY WHERE AGE IN ( 25, 27 );
ID          NAME        AGE         ADDRESS     SALARY
----------  ----------  ----------  ----------  ----------
2           Allen       25          Texas       15000.0
4           Mark        25          Rich-Mond   65000.0
5           David       27          Texas       85000.0

次の SELECT 文は、AGE の値が 25 でも 27 でもないすべてのレコードをリストします:

sqlite> SELECT * FROM COMPANY WHERE AGE NOT IN ( 25, 27 );
ID          NAME        AGE         ADDRESS     SALARY
----------  ----------  ----------  ----------  ----------
1           Paul        32          California  20000.0
3           Teddy       23          Norway      20000.0
6           Kim         22          South-Hall  45000.0
7           James       24          Houston     10000.0

次の SELECT 文は、AGE の値が 25 と 27 の間にあるすべてのレコードをリストします:

sqlite> SELECT * FROM COMPANY WHERE AGE BETWEEN 25 AND 27;
ID          NAME        AGE         ADDRESS     SALARY
----------  ----------  ----------  ----------  ----------
2           Allen       25          Texas       15000.0
4           Mark        25          Rich-Mond   65000.0
5           David       27          Texas       85000.0

次の SELECT 文は SQL サブクエリを使用します。サブクエリは SALARY > 65000 の AGE フィールドを持つすべてのレコードを検索し、後続の WHERE 句は EXISTS 演算子とともに使用され、外部クエリの AGE がサブクエリが返す結果に存在するすべてのレコードをリストします:

sqlite> SELECT AGE FROM COMPANY 
        WHERE EXISTS (SELECT AGE FROM COMPANY WHERE SALARY > 65000);
AGE
----------
32
25
23
25
27
22
24

次の SELECT 文は SQL サブクエリを使用します。サブクエリは SALARY > 65000 の AGE フィールドを持つすべてのレコードを検索し、後続の WHERE 句は > 演算子とともに使用され、外部クエリの AGE がサブクエリが返す結果内の年齢より大きいすべてのレコードをリストします:

sqlite> SELECT * FROM COMPANY 
        WHERE AGE > (SELECT AGE FROM COMPANY WHERE SALARY > 65000);
ID          NAME        AGE         ADDRESS     SALARY
----------  ----------  ----------  ----------  ----------
1           Paul        32          California  20000.0

SQLite ビット演算子

ビット演算子はビットに作用し、ビット単位で操作を実行します。真理値表 & と | は次のとおりです:

pqp & qp | q
0000
0101
1111
1001

A = 60、B = 13 と仮定すると、2進数形式では次のようになります:

A = 0011 1100

B = 0000 1101

-----------------

A&B = 0000 1100

A|B = 0011 1101

~A  = 1100 0011

次の表に、SQLite 言語がサポートするビット演算子を示します。変数 A=60、変数 B=13 と仮定すると、次のようになります:

演算子説明例
&両方のオペランドに存在する場合、2進AND演算子は1ビットを結果にコピーします。(A & B) は 12、つまり 0000 1100 になります。
|いずれかのオペランドに存在する場合、2進OR演算子は1ビットを結果にコピーします。(A | B) は 61、つまり 0011 1101 になります。
~2進補数演算子は単項演算子で、ビットを「反転」する効果があります。つまり、0は1に、1は0になります。(~A ) は -61、すなわち 1100 0011 となり、符号付き2進数の2の補数形式です。
<<2進左シフト演算子。左オペランドの値を右オペランドで指定されたビット数だけ左に移動します。A << 2 は 240、すなわち 1111 0000 になります。
>>2進右シフト演算子。左オペランドの値を右オペランドで指定されたビット数だけ右に移動します。A >> 2 は 15、すなわち 0000 1111 になります。

例

以下の例は、SQLite ビット演算子の使い方を示しています:

sqlite> .mode line
sqlite> select 60 | 13;
60 | 13 = 61

sqlite> select 60 & 13;
60 & 13 = 12

sqlite>  select  (~60);
(~60) = -61

sqlite>  select  (60 << 2);
(60 << 2) = 240

sqlite>  select  (60 >> 2);
(60 >> 2) = 15
その他の拡張