「副問合せ」(2006/02/05 (日) 04:15:24) の最新版変更点
追加された行は緑色になります。
削除された行は赤色になります。
-7.1 副問合せの使用可能な句
◆副問合せは次の句の中で使用できる。
+FROM句
+WHERE句
+HAVING句
----
-7.2 副問合せ使用のガイドライン
+副問合せはカッコで囲む。
+副問合せは比較条件の右側に置く(読みやすいようにするため。左側においても問題はない)
+単一行比較条件と複数行比較条件の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
+=ANY(値のリスト)・・・リスト内のいずれかと一致する(INと同じ意味)
+>ANY(値のリスト)・・・リストの最小値より大きい。
+<ANY(値のリスト)・・・リストの最大値より小さい。
+>ALL(値のリスト)・・・リストの最大値より大きい。
+<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 empno, ename, sal FROM emp WHERE deptno=30;
-7.1 副問合せの使用可能な句
◆副問合せは次の句の中で使用できる。
+FROM句
+WHERE句
+HAVING句
----
-7.2 副問合せ使用のガイドライン
+副問合せはカッコで囲む。
+副問合せは比較条件の右側に置く(読みやすいようにするため。左側においても問題はない)
+単一行比較条件と複数行比較条件の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
+=ANY(値のリスト)・・・リスト内のいずれかと一致する(INと同じ意味)
+>ANY(値のリスト)・・・リストの最小値より大きい。
+<ANY(値のリスト)・・・リストの最大値より小さい。
+>ALL(値のリスト)・・・リストの最大値より大きい。
+<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;
表示オプション
横に並べて表示:
変化行の前後のみ表示: