助け合いフォーラム
Oracle Master Silver SQL 2019(1Z0-071)
問題ID : 26724
問題を開く
複数行副問合せに関する説明として、正しいものはどれですか(該当するものを全て選択して下さい)。
正解
複数行副問合せは複数件のデータも返す
複数行副問合せをネストすることができる
複数の列を返すこともできる
解説
複数行副問合せとは、複数件のデータを返す副問合せです。単一行副問合せと同じようにGROUP BY句を指定したり、副問合せをネストしたりすることができます。
また、複数列のデータを返すこともできます。
以上より、
・複数行副問合せは複数件のデータも返す
・複数行副問合せをネストすることができる
・複数の列を返すこともできる
が正解となります。
その他の選択肢については次のとおりです。
・複数行副問合せは1件のデータを返す
1件のデータを返す副問合せは単一行副問合せといいます。複数行副問合せは複数件のデータを返します。
・複数行副問合せではGROUP BY句を指定することはできない
・複数行副問合せではグループ関数をネストすることができない
副問合せでは、グループ関数を使用したりGROUP BY句を指定することができます。
また、複数列のデータを返すこともできます。
以上より、
・複数行副問合せは複数件のデータも返す
・複数行副問合せをネストすることができる
・複数の列を返すこともできる
が正解となります。
その他の選択肢については次のとおりです。
・複数行副問合せは1件のデータを返す
1件のデータを返す副問合せは単一行副問合せといいます。複数行副問合せは複数件のデータを返します。
・複数行副問合せではGROUP BY句を指定することはできない
・複数行副問合せではグループ関数をネストすることができない
副問合せでは、グループ関数を使用したりGROUP BY句を指定することができます。
参考
Oracle DatabaseではSQL文の中に別のSQL文を入れ子にして実行することができ、入れ子の内側の問合せのことを副問合せといいます(副問合せに対し、外側の問合せを主問合せといいます)。
副問合せは次のように記述します。
SELECT 列名[, 列名 ...]
FROM 表名
WHERE 列名 比較演算子 (SELECT 列名 FROM 表名 [WHERE 条件]);
副問合せの部分は()括弧で囲みます。(INSERT文で副問合せを使用してデータの追加を行う場合は、()は必須ではありません。分野「DML文」のINSERT文の参考をご参照ください。)
上記では比較演算子の右辺に副問合せを記述していますが、副問合せを左辺に定義してもかまいません。
通常の副問合せを使用したSQL文ではまず副問合せが実行され、副問合せの実行結果をもとに主問合せが実行されます。

副問合せからNULL値が戻された場合、主問合せの実行結果は0件となります(エラーとはなりません)。
次のような場合に、副問合せは主問合せにNULL値を返します。
[副問合せの結果、データが1件も取り出されない場合]

[副問合せの結果がNULL値である場合]

副問合せには、次のようにいろいろな使用方法があります。
・SELECT文のSELECT句、FROM句、WHERE句、HAVING句、ORDER BY句や、INSERT文、UPDATE文等のDML文で使用できる
・主問合せと副問合せで異なる表にアクセスできる
・1つの主問合せに対し、複数の副問合せを指定できる
・副問合せをネストできる(WHERE句に指定した副問合せでは255レベルのネストが可能)
・副問合せの中でGROUP BY句やHAVIMG句、ORDER BY句を使用できる
なお、副問合せは主問合せに戻すデータの件数により、単一行副問合せと複数行副問合せに分類されます。

※複数行副問合せは結果として1件のデータを戻す場合もあります。
副問合せがWHERE句などに指定する条件の一部として使用される場合、単一行副問合せでは単一行演算子を、複数行副問合せでは複数行演算子を使用して条件の判定を行います。


[単一行副問合せ]

[複数行副問合せ]

なお、単一行副問合せの場合、比較演算子に複数行演算子を使用してもエラーにならず正常に実行されます。しかし、複数行副問合せに単一行演算子を使用するとエラーとなります。


また、副問合せでは複数の列を返し、その値の組合せで比較する事もできます。複数の列を返す副問合せを、複数列副問合せといいます。
複数列副問合せは、単一行副問合せ、複数行副問合せのどちらとも組合せて使用できます。

副問合せは次のように記述します。
SELECT 列名[, 列名 ...]
FROM 表名
WHERE 列名 比較演算子 (SELECT 列名 FROM 表名 [WHERE 条件]);
副問合せの部分は()括弧で囲みます。(INSERT文で副問合せを使用してデータの追加を行う場合は、()は必須ではありません。分野「DML文」のINSERT文の参考をご参照ください。)
上記では比較演算子の右辺に副問合せを記述していますが、副問合せを左辺に定義してもかまいません。
通常の副問合せを使用したSQL文ではまず副問合せが実行され、副問合せの実行結果をもとに主問合せが実行されます。

SQLを表示
SELECT employee_name, salary
FROM employees
WHERE salary > (SELECT AVG(NVL(salary, 0)) FROM employees);
FROM employees
WHERE salary > (SELECT AVG(NVL(salary, 0)) FROM employees);
副問合せからNULL値が戻された場合、主問合せの実行結果は0件となります(エラーとはなりません)。
次のような場合に、副問合せは主問合せにNULL値を返します。
[副問合せの結果、データが1件も取り出されない場合]

SQLを表示
SELECT * FROM employees WHERE employee_id = 1;
SELECT employee_name, hiredate, salary
FROM employees
WHERE salary >
(SELECT salary FROM employees WHERE employee_id = 1);
SELECT employee_name, hiredate, salary
FROM employees
WHERE salary >
(SELECT salary FROM employees WHERE employee_id = 1);
[副問合せの結果がNULL値である場合]

SQLを表示
SELECT employee_id FROM employees
WHERE salary IS NULL;
SELECT employee_name, hiredate, salary
FROM employees
WHERE salary >
(SELECT salary FROM employees
WHERE employee_id = 1017);
WHERE salary IS NULL;
SELECT employee_name, hiredate, salary
FROM employees
WHERE salary >
(SELECT salary FROM employees
WHERE employee_id = 1017);
副問合せには、次のようにいろいろな使用方法があります。
・SELECT文のSELECT句、FROM句、WHERE句、HAVING句、ORDER BY句や、INSERT文、UPDATE文等のDML文で使用できる
・主問合せと副問合せで異なる表にアクセスできる
・1つの主問合せに対し、複数の副問合せを指定できる
・副問合せをネストできる(WHERE句に指定した副問合せでは255レベルのネストが可能)
・副問合せの中でGROUP BY句やHAVIMG句、ORDER BY句を使用できる
なお、副問合せは主問合せに戻すデータの件数により、単一行副問合せと複数行副問合せに分類されます。

※複数行副問合せは結果として1件のデータを戻す場合もあります。
副問合せがWHERE句などに指定する条件の一部として使用される場合、単一行副問合せでは単一行演算子を、複数行副問合せでは複数行演算子を使用して条件の判定を行います。


[単一行副問合せ]

SQLを表示
SELECT AVG(salary) FROM employees;
SELECT employee_name, hiredate, salary
FROM employees
WHERE salary >
(SELECT AVG(salary) FROM employees);
SELECT employee_name, hiredate, salary
FROM employees
WHERE salary >
(SELECT AVG(salary) FROM employees);
[複数行副問合せ]

SQLを表示
SELECT MIN(salary) FROM employees
GROUP BY department_id;
SELECT employee_name, hiredate, salary
FROM employees
WHERE salary =ANY
(SELECT MIN(salary) FROM employees
GROUP BY department_id);
GROUP BY department_id;
SELECT employee_name, hiredate, salary
FROM employees
WHERE salary =ANY
(SELECT MIN(salary) FROM employees
GROUP BY department_id);
なお、単一行副問合せの場合、比較演算子に複数行演算子を使用してもエラーにならず正常に実行されます。しかし、複数行副問合せに単一行演算子を使用するとエラーとなります。

SQLを表示
SELECT AVG(salary) FROM employees;
SELECT employee_name, hiredate, salary
FROM employees
WHERE salary >ANY
(SELECT AVG(salary) FROM employees);
SELECT employee_name, hiredate, salary
FROM employees
WHERE salary >ANY
(SELECT AVG(salary) FROM employees);

SQLを表示
SELECT AVG(salary) FROM employees
GROUP BY department_id;
SELECT employee_name, hiredate, salary
FROM employees
WHERE salary >
(SELECT AVG(salary) FROM employees
GROUP BY department_id);
GROUP BY department_id;
SELECT employee_name, hiredate, salary
FROM employees
WHERE salary >
(SELECT AVG(salary) FROM employees
GROUP BY department_id);
また、副問合せでは複数の列を返し、その値の組合せで比較する事もできます。複数の列を返す副問合せを、複数列副問合せといいます。
複数列副問合せは、単一行副問合せ、複数行副問合せのどちらとも組合せて使用できます。

SQLを表示
SELECT employee_id, employee_name
FROM employees
WHERE (department_id, employee_id) IN
(SELECT department_id, manager_id
FROM departments);
FROM employees
WHERE (department_id, employee_id) IN
(SELECT department_id, manager_id
FROM departments);
日本語としての「を」と「も」の違い
投稿日 2024/12/21
初投稿失礼いたします。
問題文の選択肢は
複数行副問合せは複数件のデータ「を」返す
ですが、複数行副問合せは複数件のデータも単数のデータも返すので、
複数行副問合せは複数件のデータ「も」返すことかできる
が正しいのではないでしょうか。
複数件のデータ「を」返すと断言してしまうと、いかにも「複数件のデータしか返さない」という意味になってしまう気がします。場合によっては単数を返すこともあるので、言い切りの形でいいのか疑問がのこります。
スタッフからの返信
この投稿に対して返信しませんか?
s staff_ishii
2024/12/23 18:04
urutomomo さん ご指摘の点について、加筆・修正を行いました。 ご報告、誠にありがとうございました。