OracleデータベースのSQLで使える比較演算子、論理演算子、算術演算子などの使い方について解説します。
Oracleデータベースの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 | ✓ | ✓ | ✓ | ✓ |
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
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句を使用します。
expr1 [NOT] IN (value [, value ...])
expr1 [NOT] IN (subquery)
expr1 [, expr2 ...] [NOT] IN ((value [, value ...])[,(value [, value ...])...])
expr1 [, expr2 ...] [NOT] IN (subquery)
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
IN句に副問い合わせを指定する例
SQL> SELECT customer.name FROM customer
WHERE customer.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)
演算子 | MySQL | Oracle | PostgreSQL | SQL Server |
---|---|---|---|---|
AND |
✓ | ✓ | ✓ | ✓ |
OR |
✓ | ✓ | ✓ | ✓ |
NOT |
✓ | ✓ | ✓ | ✓ |
SQL における「AND」は論理積を表す論理演算子である。構文的には、2つの被演算子を取る2項演算子である。
expr1 AND expr2
多くのプログラミング言語では、ブーリアン型の真理値は真 (TRUE) と偽 (FALSE) の2値である。しかし、SQL の真理値は真 (TRUE)、偽 (FALSE) 及び NULL の3値である。
SQLにおけるANDの真理値表を示す。
AND | TRUE | FALSE | NULL |
---|---|---|---|
TRUE | TRUE | FALSE | NULL |
FALSE | FALSE | FALSE | FALSE |
NULL | NULL | FALSE | NULL |
SQL における「OR」は論理和を表す論理演算子である。構文的には、2つの被演算子を取る2項演算子である。
expr1 OR expr2
多くのプログラミング言語では、ブーリアン型の真理値は真 (TRUE) と偽 (FALSE) の2値である。しかし、SQL の真理値は真 (TRUE)、偽 (FALSE) 及び NULL の3値である。
SQLにおけるORの真理値表を示す。
OR | TRUE | FALSE | NULL |
---|---|---|---|
TRUE | TRUE | TRUE | TRUE |
FALSE | TRUE | FALSE | NULL |
NULL | TRUE | NULL | NULL |
SQL における「NOT」は否定を表す論理演算子である。構文的には、ひとつの被演算子を取る単項演算子である。
NOT expr
多くのプログラミング言語では、ブーリアン型の真理値は真 (TRUE) と偽 (FALSE) の2値である。しかし、SQL の真理値は真 (TRUE)、偽 (FALSE) 及び NULL の3値である。
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
演算子 | 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は和集合を求める演算子である。
MINUSは差集合を求める演算子である。
オラクルデータベースでビット演算子はサポートされていない。
演算子 | MySQL | Oracle | PostgreSQL | SQL Server |
---|---|---|---|---|
& |
✓ | ✗ | ✓ | ✓ |
| |
✓ | ✗ | ✓ | ✓ |
^ |
✓ | ✗ | ✗ | ✓ |
# |
✗ | ✗ | ✓ | ✗ |
~ |
✓ | ✗ | ✓ | ✓ |