SQL演算子

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

目次

  1. 算術演算子
    1. +
    2. -
    3. *
    4. /
  2. 比較演算子
    1. =
    2. <>
    3. !=
    4. ~=
    5. ^=
    6. <
    7. <=
    8. >
    9. >=
    10. IS NULL
    11. LIKE
    12. BETWEEN
    13. IN
    14. EXISTS
  3. 論理演算子
    1. AND
    2. OR
    3. NOT
  4. 集合演算子
    1. MINUS
    2. UNION
    3. UNION ALL

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

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

SQLの演算子
分類 演算子 説明
比較演算子 = 等しい(NULLと等しいかを調べる場合は=ではなくIS NULLを使う)
<> 等しくない
!=
~=
^=
< 小さい
> 大きい
<= 大きいか、等しい
>= 小さいか、等しい
IS NULL NULLである
LIKE 文字値がパターンに一致する
BETWEEN 下限値から上限値の範囲に含まれる
IN 集合のいずれかのメンバーと等しい
集合演算子 MINUS 2つの問い合わせで、最初の問い合わせで選択された行のうち、2つ目の問い合わせに含まれない行を返す。
UNION 2つの問い合わせで選択された重複していない行を返す。
UNION ALL 2つの問い合わせで選択された行をすべて返す。
その他の演算子 := 代入演算子
|| 文字列の連結
(+) 外部結合演算子

四則演算子

四則演算子
演算子 MySQL Oracle PostgreSQL SQL Server
+
-
*
/
%

+

SQL における「+」は、数値又は日付を加算する算術演算子である。構文的には、2つの被演算子を取る2項演算子である。

被演算子の中に NULL が含まれていると、演算結果は NULL になる。

SQL> SELECT ename, sal, comm, sal + comm FROM emp;

ENAME   SAL    COMM   SAL+COMM
------- ------ ------ --------
SMITH      800
ALLEN     1600    300     1900
WARD      1250    500     1750
JONES     2975
MARTIN    1250   1400     2650
BLAKE     2850
CLARK     2450
SCOTT     3000
KING      5000
TURNER    1500
ADAMS     1100
JAMES      950
FORD      3000
MILLER    1300

-

SQL における「-」は、数値又は日付を減算する算術演算子である。構文的には、2つの被演算子を取る2項演算子である。

*

SQL における「*」は、数値を乗算する算術演算子である。

/

SQL における「/」は、数値又は日付を除算する算術演算子である。

なお、SQL に剰余を求める演算子は無い。割り算の余りを求める場合は、SQL関数の MOD を使う。

比較演算子

比較演算子は、比較の結果をTRUE、FALSE又はUNKNOWNで返す。

SELECT * FROM 生徒名簿 WHERE 年齢 >= 13;

Oracleで取得するレコード件数に上限値の制限を設けたい場合、WHERE条件句にROWNUM疑似列の条件をつける。SQLは次のようになる。

SELECT * FROM emp WHERE ROWNUM <= 10;
比較演算子
演算子 MySQL Oracle PostgreSQL SQL Server
=
>
<
>=
<=
<>
!=
BETWEEN
IS NULL
IN
EXISTS

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

comm(歩合給)が NULL のレコードを問い合わせる例を示す。

SQL> SELECT * FROM emp WHERE comm IS NULL;

EMPNO ENAME   JOB       MGR    HIREDATE  SAL    COMM   DEPTNO
----- ------- --------- ------ --------- ------ ------ -------
 7369 SMITH   CLERK       7902 17-DEC-80    800             20
 7566 JONES   MANAGER     7839 02-APR-81   2975             20
 7698 BLAKE   MANAGER     7839 01-MAY-81   2850             30
 7782 CLARK   MANAGER     7839 09-JUN-81   2450             10
 7788 SCOTT   ANALYST     7566 19-APR-87   3000             20
 7839 KING    PRESIDENT        17-NOV-81   5000             10
 7844 TURNER  SALESMAN    7698 08-SEP-81   1500             30
 7876 ADAMS   CLERK       7788 23-MAY-87   1100             20
 7900 JAMES   CLERK       7698 03-DEC-81    950             30
 7902 FORD    ANALYST     7566 03-DEC-81   3000             20
 7934 MILLER  CLERK       7782 23-JAN-82   1300             10

comm(歩合給)が NULL でないレコードを問い合わせる例を以下に示す。

SQL> SELECT * FROM emp WHERE comm IS NOT NULL;

EMPNO ENAME   JOB       MGR    HIREDATE  SAL    COMM   DEPTNO
----- ------- --------- ------ --------- ------ ------ -------
 7499 ALLEN   SALESMAN    7698 20-FEB-81   1600    300      30
 7521 WARD    SALESMAN    7698 22-FEB-81   1250    500      30
 7654 MARTIN  SALESMAN    7698 28-SEP-81   1250   1400      30

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
値の候補を指定する。
SQL> SELECT * FROM emp WHERE deptno IN (10, 20);

EMPNO ENAME   JOB       MGR    HIREDATE  SAL    COMM   DEPTNO
----- ------- --------- ------ --------- ------ ------ -------
 7369 SMITH   CLERK       7902 17-DEC-80    800             20
 7566 JONES   MANAGER     7839 02-APR-81   2975             20
 7782 CLARK   MANAGER     7839 09-JUN-81   2450             10
 7788 SCOTT   ANALYST     7566 19-APR-87   3000             20
 7839 KING    PRESIDENT        17-NOV-81   5000             10
 7876 ADAMS   CLERK       7788 23-MAY-87   1100             20
 7902 FORD    ANALYST     7566 03-DEC-81   3000             20
 7934 MILLER  CLERK       7782 23-JAN-82   1300             10
subquery
副問合せ文を指定する。

IN句に副問い合わせを指定する例

SQL> SELECT customer.name FROM customer
     WHERE customer.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)

論理演算子

論理演算子
演算子 MySQL Oracle PostgreSQL SQL Server
AND
OR
NOT

AND

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

expr1 AND expr2

多くのプログラミング言語では、ブーリアン型の真理値は真 (TRUE) と偽 (FALSE) の2値である。しかし、SQL の真理値は真 (TRUE)、偽 (FALSE) 及び NULL の3値である。

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

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

OR

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

expr1 OR expr2

多くのプログラミング言語では、ブーリアン型の真理値は真 (TRUE) と偽 (FALSE) の2値である。しかし、SQL の真理値は真 (TRUE)、偽 (FALSE) 及び NULL の3値である。

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

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

NOT

SQL における「NOT」は否定を表す論理演算子である。構文的には、ひとつの被演算子を取る単項演算子である。

NOT expr

多くのプログラミング言語では、ブーリアン型の真理値は真 (TRUE) と偽 (FALSE) の2値である。しかし、SQL の真理値は真 (TRUE)、偽 (FALSE) 及び NULL の3値である。

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
文字列連結演算子
演算子 MySQL Oracle PostgreSQL SQL Server
||
+

外部結合演算子

外部結合演算子は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;

集合演算子

集合演算子
演算子 MySQL Oracle PostgreSQL SQL Server
UNION
MINUS
EXCEPT

UNION

UNIONは和集合を求める演算子である。

MINUS

MINUSは差集合を求める演算子である。

ビット演算子

オラクルデータベースでビット演算子はサポートされていない。

ビット演算子
演算子 MySQL Oracle PostgreSQL SQL Server
&
|
^
#
~