述部は、条件を構成して、 それらの条件を満たす行だけが処理されるようにするために使います。 基本的な述部については、行の選択で説明されています。 ここでは、IN、BETWEEN、LIKE、EXISTS、 および比較述部について説明します。
IN 述部は、ある値を他のいくつかの値と比較するのに使います。 たとえば、
SELECT NAME FROM STAFF WHERE DEPT IN (20, 15)
この例は、次のものと同じです。
SELECT NAME FROM STAFF WHERE DEPT = 20 OR DEPT = 15
副照会が値の集合を戻す場合には、IN および NOT IN 演算子を使えます。 たとえば、次の照会では、 プロジェクト MA2100 と OP2012 を担当する従業員の姓を出力します。
SELECT LASTNAME FROM EMPLOYEE WHERE EMPNO IN (SELECT RESPEMP FROM PROJECT WHERE PROJNO = 'MA2100' OR PROJNO = 'OP2012')
副照会は一度評価され、 外側の照会の対応する位置がその結果によって置き換えられます。 たとえば、上記の副照会で、従業員番号が 10 と 330 の従業員が選択されると、 外側の照会は WHERE 文節が次のものになったかのようにして評価されます。
WHERE EMPNO IN (10, 330)
副照会から戻される値のリストには、0 個、1 個、 あるいは複数個の値が含まれる可能性があります。
BETWEEN 述部は、 1 つの値と一定範囲の値 (BETWEEN 述部で指定) を比較します。
次の例では、 給与が $10, 000 以上、 $20, 000 以下の従業員について調べています。
SELECT LASTNAME FROM EMPLOYEE WHERE SALARY BETWEEN 10000 AND 20000
これは、次のものと同じです。
SELECT LASTNAME FROM EMPLOYEE WHERE SALARY >= 10000 AND SALARY <= 20000
次の例では、 給与が $10, 000 未満か、 または $20, 000 を超える従業員について調べています。
SELECT LASTNAME FROM EMPLOYEE WHERE SALARY NOT BETWEEN 10000 AND 20000
LIKE 述部は、 特定のパターンにマッチするストリングを検索するのに使います。 パターンは、パーセント記号と下線記号を使って指定します。
次の例では、 文字 'S' で始まる長さが 7 文字の従業員名を選択しています。
SELECT NAME FROM STAFF WHERE NAME LIKE 'S _ _ _ _ _ _'
次の例では、最初の文字が文字 'S' ではない従業員名を選択しています。
SELECT NAME FROM STAFF WHERE NAME NOT LIKE 'S%'
副照会を使うことによって、なんらかの条件を満たす行の存在 を検査することができます。 その場合、その副照会は EXISTS または NOT EXISTS 述部によって外側レベルの照会に結び付けられます。
EXISTS 述部によって副照会を外側照会に結び付ける場合、 その副照会から値は戻されません。 この場合、副照会の結果セットに 1 行以上の行が 含まれているなら EXISTS 述部は真になり、行が含まれていないなら偽になります。
EXISTS 述部は、相関副照会で使われることがよくあります。 下の例は、現在、PROJECT 表の中に項目がない部署のリストを出力します。
SELECT DEPTNO, DEPTNAME FROM DEPARTMENT X WHERE NOT EXISTS (SELECT * FROM PROJECT WHERE DEPTNO = X.DEPTNO) ORDER BY DEPTNO
EXISTS および NOT EXISTS 述部を他の述部と結合するには、 外側レベルの照会の WHERE 文節の中で AND や OR を使います。
比較述部は、ある値を値の集合と比較します。 全選択が複数の値を戻す場合、 述部の中の比較演算子に接尾部 ALL、ANY、または SOME を付けるよう変更する必要があります。 それらの接尾部は、 戻される値セットが外側レベルの述部の中でどのように処理されるかを決めるものです。 ここでは、一例として > 比較演算子を使っています (以下の説明はその他の演算子にも適用されます)。
次の例は、副照会と > ALL 比較を使って、 どの管理職よりも給与の多い従業員の姓 (LASTNAME) とその肩書き (JOB) を出力します。
SELECT LASTNAME, JOB FROM EMPLOYEE WHERE SALARY > ALL (SELECT SALARY FROM EMPLOYEE WHERE JOB='MANAGER')
述部と演算子については、 SQL 解説書 を参照してください。