PostgreSQL 演算子
演算子は、コンパイラに特定の数学的または論理的操作を実行するように指示する記号です。
PostgreSQL 演算子は予約済みキーワードまたは文字であり、通常 WHERE 文でフィルタ条件として使用されます。
一般的な演算子は次のとおりです:
- 算術演算子
- 比較演算子
- 論理演算子
- ビット演算子
算術演算子
変数 a が 2、変数 b が 3 の場合、次のようになります:
| 演算子 | 説明 | 例 |
|---|---|---|
| + | 加 | a + b の結果は 5 |
| - | 减 | a - b の結果は -1 |
| * | 乘 | a * b の結果は 6 |
| / | 除 | b / a の結果は 1 |
| % | 剰余 (mod) | b % a の結果は 1 |
| ^ | 指数 | a ^ b の結果は 8 |
| |/ | 平方根 | |/ 25.0 の結果は 5 |
| ||/ | 立方根 | ||/ 27.0 の結果は 3 |
| ! | 階乗 | 5 ! の結果は 120 |
| !! | 階乗(前置演算子) | !! 5 の結果は 120 |
例
サンプルdb=# select 2+3;
?column?
----------
5
(1 row)
サンプルdb=# select 2*3;
?column?
----------
6
(1 row)
サンプルdb=# select 10/5;
?column?
----------
2
(1 row)
サンプルdb=# select 12%5;
?column?
----------
2
(1 row)
サンプルdb=# select 2^3;
?column?
----------
8
(1 row)
サンプルdb=# select |/ 25.0;
?column?
----------
5
(1 row)
サンプルdb=# select ||/ 27.0;
?column?
----------
3
(1 row)
サンプルdb=# select 5 !;
?column?
----------
120
(1 row)
サンプルdb=# select !!5;
?column?
----------
120
(1 row)
比較演算子
変数 a が 10、変数 b が 20 の場合、次のようになります:
| 演算子 | 説明 | 例 |
|---|---|---|
| = | 等しい | (a = b) は false。 |
| != | 等しくない | (a != b) は true。 |
| <> | 等しくない | (a <> b) は true。 |
| > | より大きい | (a > b) は false。 |
| < | より小さい | (a < b) は true。 |
| >= | 以上 | (a >= b) は false。 |
| <= | 以下 | (a <= b) は true。 |
例
COMPANY テーブルを作成(COMPANY SQL ファイルをダウンロード)、データ内容は次のとおりです:
サンプルdb=# select * from COMPANY; id | name | age | address | salary ----+-------+-----+-----------+-------- 1 | Paul | 32 | California| 20000 2 | Allen | 25 | Texas | 15000 3 | Teddy | 23 | Norway | 20000 4 | Mark | 25 | Rich-Mond | 65000 5 | David | 27 | Texas | 85000 6 | Kim | 22 | South-Hall| 45000 7 | James | 24 | Houston | 10000 (7 rows)
SALARY フィールドが 50000 より大きいデータを読み取る:
サンプルdb=# SELECT * FROM COMPANY WHERE SALARY > 50000; id | name | age |address | salary ----+-------+-----+-----------+-------- 4 | Mark | 25 | Rich-Mond | 65000 5 | David | 27 | Texas | 85000 (2 rows)
SALARY フィールドが 20000 に等しいデータを読み取る:
サンプルdb=# SELECT * FROM COMPANY WHERE SALARY = 20000; id | name | age | address | salary ----+-------+-----+-------------+-------- 1 | Paul | 32 | California | 20000 3 | Teddy | 23 | Norway | 20000 (2 rows)
SALARY フィールドが 20000 に等しくないデータを読み取る:
サンプルdb=# SELECT * FROM COMPANY WHERE SALARY != 20000; id | name | age | address | salary ----+-------+-----+-------------+-------- 2 | Allen | 25 | Texas | 15000 4 | Mark | 25 | Rich-Mond | 65000 5 | David | 27 | Texas | 85000 6 | Kim | 22 | South-Hall | 45000 7 | James | 24 | Houston | 10000 (5 rows) サンプルdb=# SELECT * FROM COMPANY WHERE SALARY <> 20000; id | name | age | address | salary ----+-------+-----+------------+-------- 2 | Allen | 25 | Texas | 15000 4 | Mark | 25 | Rich-Mond | 65000 5 | David | 27 | Texas | 85000 6 | Kim | 22 | South-Hall | 45000 7 | James | 24 | Houston | 10000 (5 rows)
SALARY フィールドが 65000 以上のデータを読み取る:
サンプルdb=# SELECT * FROM COMPANY WHERE SALARY >= 65000; id | name | age | address | salary ----+-------+-----+-----------+-------- 4 | Mark | 25 | Rich-Mond | 65000 5 | David | 27 | Texas | 85000 (2 rows)
論理演算子
PostgreSQL の論理演算子には次の種類があります:
| 番号 | 演算子 & 説明 |
|---|---|
| 1 | AND 論理積演算子。2 つのオペランドが両方とも非ゼロの場合、条件は真です。 PostgresSQL の WHERE 文では、AND を使用して複数のフィルタ条件を含めることができます。 |
| 2 | NOT 論理否定演算子。オペランドの論理状態を反転させるために使用します。条件が真の場合、論理否定演算子はそれを偽にします。 PostgresSQL には NOT EXISTS、NOT BETWEEN、NOT IN などの演算子があります。 |
| 3 | OR 論理和演算子。2 つのオペランドのいずれかが非ゼロの場合、条件は真です。 PostgresSQL の WHERE 文では、OR を使用して複数のフィルタ条件を含めることができます。 |
SQL は true、false、null を含む 3 値論理システムを使用します。null は「不明」を表します。
a | b | a AND b | a OR b |
|---|---|---|---|
| TRUE | TRUE | TRUE | TRUE |
| TRUE | FALSE | FALSE | TRUE |
| TRUE | NULL | NULL | TRUE |
| FALSE | FALSE | FALSE | FALSE |
| FALSE | NULL | FALSE | NULL |
| NULL | NULL | NULL | NULL |
a | NOT a |
|---|---|
| TRUE | FALSE |
| FALSE | TRUE |
| NULL | NULL |
例
COMPANY テーブルを作成(COMPANY SQL ファイルをダウンロード)、データ内容は次のとおりです:
サンプルdb=# select * from COMPANY; id | name | age | address | salary ----+-------+-----+-----------+-------- 1 | Paul | 32 | California| 20000 2 | Allen | 25 | Texas | 15000 3 | Teddy | 23 | Norway | 20000 4 | Mark | 25 | Rich-Mond | 65000 5 | David | 27 | Texas | 85000 6 | Kim | 22 | South-Hall| 45000 7 | James | 24 | Houston | 10000 (7 rows)
AGE フィールドが 25 以上かつ SALARY フィールドが 6500 以上のデータを読み取る:
サンプルdb=# SELECT * FROM COMPANY WHERE AGE >= 25 AND SALARY >= 6500; id | name | age | address | salary ----+-------+-----+-----------------------------------------------+-------- 1 | Paul | 32 | California | 20000 2 | Allen | 25 | Texas | 15000 4 | Mark | 25 | Rich-Mond | 65000 5 | David | 27 | Texas | 85000 (4 rows)
AGE フィールドが 25 以上、または SALARY フィールドが 6500 より大きいデータを読み取る:
サンプルdb=# SELECT * FROM COMPANY WHERE AGE >= 25 OR SALARY >= 6500; id | name | age | address | salary ----+-------+-----+-------------+-------- 1 | Paul | 32 | California | 20000 2 | Allen | 25 | Texas | 15000 3 | Teddy | 23 | Norway | 20000 4 | Mark | 25 | Rich-Mond | 65000 5 | David | 27 | Texas | 85000 6 | Kim | 22 | South-Hall | 45000 7 | James | 24 | Houston | 10000 8 | Paul | 24 | Houston | 20000 9 | James | 44 | Norway | 5000 10 | James | 45 | Texas | 5000 (10 rows)
SALARY フィールドが NULL ではないデータを読み取る:
サンプルdb=# SELECT * FROM COMPANY WHERE SALARY IS NOT NULL; id | name | age | address | salary ----+-------+-----+-------------+-------- 1 | Paul | 32 | California | 20000 2 | Allen | 25 | Texas | 15000 3 | Teddy | 23 | Norway | 20000 4 | Mark | 25 | Rich-Mond | 65000 5 | David | 27 | Texas | 85000 6 | Kim | 22 | South-Hall | 45000 7 | James | 24 | Houston | 10000 8 | Paul | 24 | Houston | 20000 9 | James | 44 | Norway | 5000 10 | James | 45 | Texas | 5000 (10 rows)
ビット演算子
ビット演算子はビットに対して作用し、ビットごとに操作を実行します。&、|、^ の真理値表は次のとおりです:
| p | q | p & q | p | q |
|---|---|---|---|
| 0 | 0 | 0 | 0 |
| 0 | 1 | 0 | 1 |
| 1 | 1 | 1 | 1 |
| 1 | 0 | 0 | 1 |
仮に A = 60、B = 13 とすると、バイナリ形式で表すと次のようになります:
A = 0011 1100
B = 0000 1101
-----------------
A&B = 0000 1100
A|B = 0011 1101
A^B = 0011 0001
~A = 1100 0011
次の表は、PostgreSQL がサポートするビット演算子を示しています。変数Aの値が 60、変数Bの値が 13 の場合、次のようになります:
| 演算子 | 説明 | 例 |
|---|---|---|
| & | ビットごとの AND 操作で、バイナリビットごとに「論理積」演算を行います。演算規則: 0&0=0; 0&1=0; 1&0=0; 1&1=1; | (A & B) は 12 になります。すなわち 0000 1100 です。 |
| | | ビットごとの OR 演算子で、バイナリビットごとに「論理和」演算を行います。演算規則: 0|0=0; 0|1=1; 1|0=1; 1|1=1; | (A | B) は 61 になります。すなわち 0011 1101 です。 |
| # | 排他的論理和演算子で、バイナリビットごとに「XOR」演算を行います。演算規則: 0#0=0; 0#1=1; 1#0=1; 1#1=0; | (A # B) は 49 になります。すなわち 0011 0001 です。 |
| ~ | 否定演算子で、バイナリビットごとに「否定」演算を行います。演算規則: ~1=0; ~0=1; | (~A) は -61 になります。すなわち 1100 0011 で、符号付きバイナリ数の2の補数形式です。 |
| << | バイナリ左シフト演算子。オペランドの各バイナリビットを左に指定ビット数だけシフトします(左のビットは捨てられ、右に 0 が補充されます)。 | A << 2 は 240 になります。すなわち 1111 0000 です。 |
| >> | バイナリ右シフト演算子。数値の各バイナリビットを右に指定ビット数だけシフトします。正の数は左に 0 を補充し、負の数は左に 1 を補充し、右のビットは捨てられます。 | A >> 2 は 15 になります。すなわち 0000 1111 です。 |
例
サンプルdb=# select 60 | 13;
?column?
----------
61
(1 row)
サンプルdb=# select 60 & 13;
?column?
----------
12
(1 row)
サンプルdb=# select (~60);
?column?
----------
-61
(1 row)
サンプルdb=# select (60 << 2);
?column?
----------
240
(1 row)
サンプルdb=# select (60 >> 2);
?column?
----------
15
(1 row)
サンプルdb=# select 60 # 13;
?column?
----------
49
(1 row) その他の拡張