SQL演算子

OracleデータベースのSQLで使える比較演算子、論理演算子、算術演算子などの使い方について解説します。

OracleデータベースのSQL演算子一覧

OracleデータベースのSQLでは、次の演算子を使うことができる。

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;

BETWEEN

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')

IS NULL

値が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

複数の候補のうちいずれかに一致する行を問い合わせるには、IN句を使用します。

expr1 [NOT] IN (value [, value ...])
expr1 [NOT] IN (subquery)
expr1 [, expr2 ...] [NOT] IN ((value [, value ...])[,(value [, value ...])...])
expr1 [, expr2 ...] [NOT] IN (subquery)
value
値の候補を指定する。
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

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

ANDは論理積を表すSQL演算子である。構文的には2つの被演算子を取る2項演算子である。

expr1 AND expr2

SQLにおけるANDの真理値表を示す。

ANDの真理値表
AND TRUE FALSE NULL
TRUE TRUE FALSE NULL
FALSE FALSE FALSE FALSE
NULL NULL FALSE NULL

OR

ORは論理和を表すSQL演算子である。構文的には2つの被演算子を取る2項演算子である。

expr1 OR expr2

SQLにおけるORの真理値表を示す。

ORの真理値表
OR TRUE FALSE NULL
TRUE TRUE TRUE TRUE
FALSE TRUE FALSE NULL
NULL TRUE NULL NULL

NOT

NOTは否定を表すSQL演算子である。構文的にはひとつの被演算子を取る単項演算子である。

NOT expr

SQLにおけるNOTの真理値表を示す。

NOTの真理値表
NOT 結果
TRUE FALSE
FALSE TRUE
NULL NULL

代入演算子

代入演算子とは、変数に値を代入する演算子であり、PL/SQLで用いられる。

var := expr;
var

PL/SQLの変数

expr

変数に代入する式

文字列の連結

連結演算子とは、文字列を連結する演算子である。

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;