Oracle WHERE句を徹底解説!

Oracle Master Silver

SQLでデータを抽出する際に欠かせないのがWHERE句です。条件に基づいて必要なデータだけを取得することで、効率的なデータ管理が可能になります。本記事では、WHERE句の基本から応用、さらにはパフォーマンスの改善方法までを詳しく解説します。

本記事ではSCOTTサンプルスキーマを使用した例で解説します。
SCOTTサンプルスキーマは以下を実行することでインポートおよび使用が可能です。

$ sqlplus / as sysdba
SQL> @?/rdbms/admin/utlsampl.sql
$ sqlplus scott/tiger

💰 【PR】Oracleエンジニアの市場価値、調べてみませんか?

Oracleのスキルは需要が高く、特定の資格や経験を持っていると年収が大幅にアップするケースがあります。まずはIT専門のエージェントで非公開求人をチェックしてみませんか?


1. WHERE句とは?

WHERE句は、SQLのSELECT文において、条件を指定するために使用します。この条件によって、必要なデータのみを効率よく抽出することが可能になります。

基本構文は以下の通りです:

SELECT 列名1, 列名2, ...
FROM テーブル名
WHERE 条件;

使用例:

以下のクエリは、給与(SAL)が3000を超える従業員を抽出します。

SELECT empno, ename, sal
FROM emp
WHERE sal > 2500;

結果:

SQL> SELECT empno, ename, sal
2 FROM emp;

EMPNO ENAME SAL
---------- ---------- ----------
7369 SMITH 800
7499 ALLEN 1600
7521 WARD 1250
7566 JONES 2975
7654 MARTIN 1250
7698 BLAKE 2850
7782 CLARK 2450
7788 SCOTT 3000
7839 KING 5000
7844 TURNER 1500
7876 ADAMS 1100
7900 JAMES 950
7902 FORD 3000
7934 MILLER 1300

14 rows selected.

SQL> SELECT empno, ename, sal
2 FROM emp
3 WHERE sal > 2500;

EMPNO ENAME SAL
---------- ---------- ----------
7566 JONES 2975
7698 BLAKE 2850
7788 SCOTT 3000
7839 KING 5000
7902 FORD 3000

2. 基本的な演算子を使った条件指定

WHERE句で使用できる基本的な演算子を以下にまとめます。

演算子説明使用例
=等しいsal = 3000
!= または <>等しくないsal <> 3000
>より大きいsal > 3000
<より小さいsal < 3000
>=以上sal >= 3000
<=以下sal <= 3000

実践例:

給与が2500以上3000以下の従業員を抽出するクエリ:

SELECT empno, ename, sal
FROM emp
WHERE sal BETWEEN 2500 AND 3000;

結果:

SQL> SELECT empno, ename, sal
2 FROM emp
3 WHERE sal BETWEEN 2500 AND 3000;

EMPNO ENAME SAL
---------- ---------- ----------
7566 JONES 2975
7698 BLAKE 2850
7788 SCOTT 3000
7902 FORD 3000

3. 複数条件を組み合わせる方法

複数の条件を指定する場合は、論理演算子を使用します。

論理演算子説明使用例
ANDすべての条件を満たすsal > 2000 AND deptno = 10
ORいずれかの条件を満たすsal > 2000 OR deptno = 20
NOT条件を満たさないNOT (deptno = 10)

実践例:

部門番号が10または20で、給与が2500以上の従業員を取得:

SELECT empno, ename, deptno, sal
FROM emp
WHERE (deptno = 10 OR deptno = 20) AND sal >= 2500;

結果:

SQL> SELECT empno, ename, deptno, sal
2 FROM emp
3 WHERE (deptno = 10 OR deptno = 20) AND sal >= 2500;

EMPNO ENAME DEPTNO SAL
---------- ---------- ---------- ----------
7566 JONES 20 2975
7788 SCOTT 20 3000
7839 KING 10 5000
7902 FORD 20 3000

4. 特殊条件の指定方法

NULL値の確認

NULL値はIS NULLまたはIS NOT NULLで確認します。

SELECT empno, ename, comm
FROM emp
WHERE comm IS NULL;


SELECT empno, ename, comm
FROM emp
WHERE comm IS NOT NULL;

結果:

SQL> SELECT empno, ename, comm
2 FROM emp;

EMPNO ENAME COMM
---------- ---------- ----------
7369 SMITH
7499 ALLEN 300
7521 WARD 500
7566 JONES
7654 MARTIN 1400
7698 BLAKE
7782 CLARK
7788 SCOTT
7839 KING
7844 TURNER 0
7876 ADAMS
7900 JAMES
7902 FORD
7934 MILLER

14 rows selected.

SQL> SELECT empno, ename, comm
2 FROM emp
3 WHERE comm IS NULL;

EMPNO ENAME COMM
---------- ---------- ----------
7369 SMITH
7566 JONES
7698 BLAKE
7782 CLARK
7788 SCOTT
7839 KING
7876 ADAMS
7900 JAMES
7902 FORD
7934 MILLER

10 rows selected.

SQL> SELECT empno, ename, comm
2 FROM emp
3 WHERE comm IS NOT NULL;

EMPNO ENAME COMM
---------- ---------- ----------
7499 ALLEN 300
7521 WARD 500
7654 MARTIN 1400
7844 TURNER 0

💰 【PR】Oracleエンジニアの市場価値、調べてみませんか?

Oracleのスキルは需要が高く、特定の資格や経験を持っていると年収が大幅にアップするケースがあります。まずはIT専門のエージェントで非公開求人をチェックしてみませんか?


LIKE演算子を使ったパターンマッチング

LIKE演算子とワイルドカードを使用することで、部分一致検索が可能です。

ワイルドカード説明
%任意の文字列(0文字以上)
_任意の1文字

実践例:

名前が「S」で始まる従業員を取得:

SELECT empno, ename
FROM emp
WHERE ename LIKE 'S%';

結果:

SQL> SELECT empno, ename
2 FROM emp
3 WHERE ename LIKE 'S%';

EMPNO ENAME
---------- ----------
7369 SMITH
7788 SCOTT

IN演算子で複数の値を指定

複数の値を簡潔に指定するには、IN演算子を使用します。

SELECT empno, ename, deptno
FROM emp
WHERE deptno IN (10, 20);

結果:

SQL> SELECT empno, ename, deptno
2 FROM emp;

EMPNO ENAME DEPTNO
---------- ---------- ----------
7369 SMITH 20
7499 ALLEN 30
7521 WARD 30
7566 JONES 20
7654 MARTIN 30
7698 BLAKE 30
7782 CLARK 10
7788 SCOTT 20
7839 KING 10
7844 TURNER 30
7876 ADAMS 20
7900 JAMES 30
7902 FORD 20
7934 MILLER 10

14 rows selected.

SQL> SELECT empno, ename, deptno
2 FROM emp
3 WHERE deptno IN (10, 20);

EMPNO ENAME DEPTNO
---------- ---------- ----------
7369 SMITH 20
7566 JONES 20
7782 CLARK 10
7788 SCOTT 20
7839 KING 10
7876 ADAMS 20
7902 FORD 20
7934 MILLER 10

8 rows selected.

BETWEEN演算子で範囲指定

範囲を指定する場合は、BETWEENを使用します。

SELECT empno, ename, sal
FROM emp
WHERE sal BETWEEN 2000 AND 3000;

結果:

SQL> SELECT empno, ename, sal
2 FROM emp;

EMPNO ENAME SAL
---------- ---------- ----------
7369 SMITH 800
7499 ALLEN 1600
7521 WARD 1250
7566 JONES 2975
7654 MARTIN 1250
7698 BLAKE 2850
7782 CLARK 2450
7788 SCOTT 3000
7839 KING 5000
7844 TURNER 1500
7876 ADAMS 1100
7900 JAMES 950
7902 FORD 3000
7934 MILLER 1300

14 rows selected.

SQL> SELECT empno, ename, sal
2 FROM emp
3 WHERE sal BETWEEN 2000 AND 3000;

EMPNO ENAME SAL
---------- ---------- ----------
7566 JONES 2975
7698 BLAKE 2850
7782 CLARK 2450
7788 SCOTT 3000
7902 FORD 3000

5. 実践例:よくある利用シナリオ

日付データを条件に指定

OracleのDATE型を使った日付条件の指定方法:

SELECT empno, ename, hiredate
FROM emp
WHERE hiredate BETWEEN TO_DATE('1981-01-01', 'YYYY-MM-DD')
AND TO_DATE('1982-12-31', 'YYYY-MM-DD');

結果:

SQL> SELECT empno, ename, hiredate
2 FROM emp
3 WHERE hiredate BETWEEN TO_DATE('1981-01-01', 'YYYY-MM-DD')
4 AND TO_DATE('1982-12-31', 'YYYY-MM-DD');

EMPNO ENAME HIREDATE
---------- ---------- ---------
7499 ALLEN 20-FEB-81
7521 WARD 22-FEB-81
7566 JONES 02-APR-81
7654 MARTIN 28-SEP-81
7698 BLAKE 01-MAY-81
7782 CLARK 09-JUN-81
7839 KING 17-NOV-81
7844 TURNER 08-SEP-81
7900 JAMES 03-DEC-81
7902 FORD 03-DEC-81
7934 MILLER 23-JAN-82

11 rows selected.

サブクエリとの組み合わせ

サブクエリを使用して、他のテーブルのデータを条件に含めます。

SELECT empno, ename, sal
FROM emp
WHERE deptno = (
SELECT deptno
FROM dept
WHERE dname = 'SALES'
);

結果:

SQL> SELECT empno, ename, sal
2 FROM emp
3 WHERE deptno = (
4 SELECT deptno
5 FROM dept
6 WHERE dname = 'SALES'
7 );

EMPNO ENAME SAL
---------- ---------- ----------
7499 ALLEN 1600
7521 WARD 1250
7654 MARTIN 1250
7698 BLAKE 2850
7844 TURNER 1500
7900 JAMES 950

6 rows selected.

6. パフォーマンスを意識したWHERE句の書き方

WHERE句を効率的に書くことで、クエリの速度を改善できます。

1. インデックスを活用する

インデックスが設定されている列を条件に指定することで、検索速度が向上します。

2. 計算式を避ける

条件内で列に計算式を適用すると、インデックスが利用されない可能性があります。

悪い例:

WHERE TO_CHAR(hiredate, 'YYYY') = '1982';

良い例:

WHERE hiredate BETWEEN TO_DATE('1982-01-01', 'YYYY-MM-DD') 
AND TO_DATE('1982-12-31', 'YYYY-MM-DD');

3. 不要な条件を省く

不要な条件を追加するとクエリが複雑になり、パフォーマンスが低下します。


7. まとめ

WHERE句を理解し使いこなすことで、効率的なデータ抽出が可能になります。基本的な演算子から複雑な条件指定、パフォーマンスの改善までを網羅的に解説しました。これらを活用して、必要なデータを迅速に取得しましょう!

[参考]
Oracle Database SQL言語リファレンス 19c

💰 【PR】Oracleエンジニアの市場価値、調べてみませんか?

Oracleのスキルは需要が高く、特定の資格や経験を持っていると年収が大幅にアップするケースがあります。まずはIT専門のエージェントで非公開求人をチェックしてみませんか?

コメント

タイトルとURLをコピーしました