※上記の広告は60日以上更新のないWIKIに表示されています。更新することで広告が下部へ移動します。

  • 7.1 副問合せの使用可能な句
◆副問合せは次の句の中で使用できる。
  1. FROM句
  2. WHERE句
  3. HAVING句


  • 7.2 副問合せ使用のガイドライン
  1. 副問合せはカッコで囲む。
  2. 副問合せは比較条件の右側に置く(読みやすいようにするため。左側においても問題はない)
  3. 単一行比較条件と複数行比較条件の2種類の比較条件を使用できる。


  • 7.4 副問合せについて
①単一行比較条件と複数行比較条件
比較条件には、比較できる行数の観点から、単一行比較条件と複数行比較条件がある。
【単一行比較条件(<, <=, >, >=, <>, = )】
◆副問合せの結果、データが1件だけ戻される場合に比較できる。
◆副問合せの結果としてデータが複数戻されるとエラーになる。
(例)JONESという名前の社員が2人以上いる場合にエラーになる
SELECT ename FROM emp WHERE deptno=(SELECT deptno FROM emp WHERE ename='JONES');

【複数行比較条件(IN, ALL, ANY)】
◆副問合せの結果、データが1件あるいは複数戻される場合に比較できる。
 (上のエラー例の比較演算子=をINにすると、エラーにならず正しく実行できる)

②単一行副問合せと複数行副問合せ
副問合せには、単一行を戻す問合せと複数行を戻す問合せがある。
【単一行副問合せ】
◆問合せの結果、データが1件だけ戻される。
◆単一行比較条件、複数行比較条件のどちらでも使える。
(例)単一GY方比較条件を使った単一行副問合せ
SELECT ename FROM emp WHERE deptno=(SELECT deptno FROM emp WHERE empno=12345);

【複数行副問合せ】
◆問合せの結果、データが複数行戻される。
◆複数行副問合せの中で単一行比較条件を使うとエラーになる。
 そのため、必ず複数行比較条件を使わなければならない。
(例)複数行比較条件を使った複数行副問合せ
SELECT ename FROM emp WHERE deptno IN (SELECT deptno FROM emp WHERE sal > 3000);


  • 7.8 複数行比較条件ALL, ANY
  1. =ANY(値のリスト)・・・リスト内のいずれかと一致する(INと同じ意味)
  2. >ANY(値のリスト)・・・リストの最小値より大きい。
  3. <ANY(値のリスト)・・・リストの最大値より小さい。
  4. >ALL(値のリスト)・・・リストの最大値より大きい。
  5. <ALL(値のリスト)・・・リストの最小値より小さい。

sal > ANY(2000, 1000, 3000)はsal > 1000 と同じ。


  • 7.11 副問合せにNULLが戻される場合の比較条件
副問合せからNULLが戻されるとき、NOT IN句や<>ALLの比較条件に注意する。

empno NOT IN(mgr1, mgr2, ..., NULL)となった場合、empno <> mgr1 AND empno <> mgr2 AND ... AND empno <> NULLと同じである。この条件の中ではNULLと比較するので結果はNULLである。また、ANDによって条件を結び付けているので、一つでもNULLがあれば条件全体がNULLになる。
IS NOT NULLを追加してNULLを戻さないようにすればデータは戻される。


  • 7.18 副問合せの使用法
副問合せはFROM句、WHERE句、HAVING句以外に、次のようなSQL文でも使える。
【UPDATE文 SET句】
以下の文は、社員番号1010の社員のsalを社員番号1020のsalに更新する。
UPDATE emp SET sal=(SELECT sal FROM emp WHERE empno=1020) WHERE empno=1010;

【CREATE TABLE ~AS SELECT構文】
以下の文は、emp表から部門番号30に所属する社員だけのemp30表を作成する。
CREATE TABLE emp30 AS SELECT empno, ename, sal FROM emp WHERE deptno=30;

【INSERT ~ SELECT文】
以下の文は、emp表の社員番号1010の社員データをemp30表へコピーする。
INSERT INTO emp30 SELECT empno, ename, sal FROM emp WHERE empno=1010;

【ビューを作成するCREATE VIEW ~ AS SELECT】
以下の文は、emp表から部門番号30に所属する社員だけのempview30ビューを作成する。
CREATE VIEW empview30 AS SELECT * FROM emp WHERE deptno=30;