OracleデータベースのSQLで使える比較演算子、論理演算子、算術演算子などの使い方について解説します。
OracleデータベースのSQLでは、次の演算子を使うことができる。
分類 | 演算子 | 説明 |
---|---|---|
算術演算子 | + | 加算(数値及び日付) |
- | 減算(数値及び日付) | |
* | 乗算 | |
/ | 除算(数値及び日付) | |
比較演算子 | = | 等しい(NULLと等しいかを調べる場合は= ではなくIS NULL を使う) |
<> | 等しくない | |
!= | ||
~= | ||
^= | ||
< | 小さい | |
> | 大きい | |
<= | 大きいか、等しい | |
>= | 小さいか、等しい | |
IS NULL | NULLである | |
LIKE | 文字値がパターンに一致する | |
BETWEEN | 下限値から上限値の範囲に含まれる | |
IN | 集合のいずれかのメンバーと等しい | |
論理演算子 | AND | 論理積 |
OR | 論理和 | |
NOT | 否定 | |
集合演算子 | MINUS | 2つの問い合わせで、最初の問い合わせで選択された行のうち、2つ目の問い合わせに含まれない行を返す。 |
UNION | 2つの問い合わせで選択された重複していない行を返す。 | |
UNION ALL | 2つの問い合わせで選択された行をすべて返す。 | |
その他の演算子 | := | 代入演算子 |
|| | 文字列の連結 | |
(+) | 外部結合演算子 |
SQLに剰余を求める演算子は無い。割り算の余りを求める場合は、SQL関数のMODを使う。
比較演算子は、比較の結果をTRUE、FALSE又はUNKNOWNで返す。
SELECT * FROM 生徒名簿 WHERE 年齢 >= 13;
Oracleで取得するレコード件数に上限値の制限を設けたい場合、WHERE条件句にROWNUM疑似列の条件をつける。SQLは次のようになる。
SELECT * FROM emp WHERE ROWNUM <= 10;
expr1 BETWEEN expr2 AND expr3
expr1が下限値(expr2)から上限値(expr3)までの範囲内であればTRUE、範囲外であればFALSEと評価される。上記式は次の式と同等である。
expr1 >= expr2 AND expr1 <= expr3
NOT演算子を指定すると、評価値が逆になる。
expr1 NOT BETWEEN expr2 AND expr3
expr1が下限値(expr2)から上限値(expr3)までの範囲外であればTRUE、範囲内であればFALSEと評価される。上記式は次の式と同等である。
expr1 < expr2 AND expr1 > expr3
BETWEEN演算子を使用したSQL文の例を示す。
SELECT * FROM employee WHERE salary BETWEEN 200000 AND 300000
BETWEEN演算子はDATE型に対して使用することもできる。
SELECT *
FROM employee
WHERE hiredate BETWEEN TO_DATE('2014/01/01 00:00:00', 'YYYY/MM/DD HH24:MI:SS') AND TO_DATE('2014/12/31 23:59:59', 'YYYY/MM/DD HH24:MI:SS')
値がNULLかどうかを評価する場合、expr = NULL
とすることはできない。NULLかどうかを評価する場合は、IS NULL
演算子を使用する。
Oracleデータベースの場合、長さが0の文字列(空文字)はNULLと見なされる。これはOracleデータベースの独自仕様であり、他のRDBMSでは異なることが多い。
NULLである。
expr IS NULL
NULLでない。
expr IS NOT NULL
IS NULL演算子を使用して、comm(歩合給)がNULLのレコードを問い合わせる例を示す。
SELECT * FROM emp WHERE comm IS NULL;
IS NULL演算子を使用して、mgr(上司)がNULLでないレコードを問い合わせる例を示す。
SELECT * FROM emp WHERE mgr IS NOT NULL;
複数の候補のうちいずれかに一致する行を問い合わせるには、IN句を使用します。
expr1 [NOT] IN (value [, value ...])
expr1 [NOT] IN (subquery)
expr1 [, expr2 ...] [NOT] IN ((value [, value ...])[,(value [, value ...])...])
expr1 [, expr2 ...] [NOT] IN (subquery)
IN句に値のリストを指定する例
SELECT * FROM employee WHERE dept_id IN (6, 9);
IN句に副問い合わせを指定する例
SELECT customer.name FROM customer
WHERE costomer.customer_id IN (SELECT order.customer_id FROM order WHERE order.status = '未発送');
EXISTS (subquery)
EXISTS条件は、SELECT文による副問い合わせ(サブクエリー)の結果、行が1行以上戻される場合はTRUE、1行も戻されない場合はFALSEと評価されます。
SELECT 顧客表.氏名 FROM 顧客表 WHERE EXISTS (SELECT 1 FROM 注文表 WHERE 顧客表.ID = 注文表.ID AND 注文表.状態 = '未発送');
片方のテーブルにのみ存在するレコードを抽出する例を示す。
SELECT * FROM t1 WHERE NOT EXISTS (SELECT 1 FROM t2 WHERE t1.no = t2.no)
多くのプログラミング言語では、ブーリアン型の真理値は真(TRUE)と偽(FALSE)の2値である。しかし、SQLの真理値は真(TRUE)、偽(FALSE)及びNULLの3値である。
ANDは論理積を表すSQL演算子である。構文的には2つの被演算子を取る2項演算子である。
expr1 AND expr2
SQLにおけるANDの真理値表を示す。
AND | TRUE | FALSE | NULL |
---|---|---|---|
TRUE | TRUE | FALSE | NULL |
FALSE | FALSE | FALSE | FALSE |
NULL | NULL | FALSE | NULL |
ORは論理和を表すSQL演算子である。構文的には2つの被演算子を取る2項演算子である。
expr1 OR expr2
SQLにおけるORの真理値表を示す。
OR | TRUE | FALSE | NULL |
---|---|---|---|
TRUE | TRUE | TRUE | TRUE |
FALSE | TRUE | FALSE | NULL |
NULL | TRUE | NULL | NULL |
NOTは否定を表すSQL演算子である。構文的にはひとつの被演算子を取る単項演算子である。
NOT expr
SQLにおけるNOTの真理値表を示す。
NOT | 結果 |
---|---|
TRUE | FALSE |
FALSE | TRUE |
NULL | NULL |
代入演算子とは、変数に値を代入する演算子であり、PL/SQLで用いられる。
var := expr;
PL/SQLの変数
変数に代入する式
連結演算子とは、文字列を連結する演算子である。
str1 || str2
たとえば、'pl' || 'sql'
という演算式は'plsql'
と評価される。
SELECT family_name || given_name FROM employee
外部結合演算子はOracleデータベース固有の演算子であり、外部結合条件を指定するときに用いる。外部結合演算子は標準SQLではないため、OUTER JOIN節を用いる方が望ましい。
標準SQLでは外部結合を次のように記述する。
SELECT * FROM emp LEFT OUTER JOIN dept ON emp.deptno = dept.deptno;
Oracleデータベースでは上記のSQLを次のように記述できる。
SELECT * FROM emp, dept WHERE emp.deptno = dept.deptno(+);
同様に、次の2つのSQLは同じ意味である。
SELECT * FROM emp RIGHT OUTER JOIN emp ON emp.deptno = dept.deptno;
SELECT * FROM emp, dept WHERE emp.deptno(+) = dept.deptno;