助け合いフォーラム
Oracle Master Silver SQL 2019(1Z0-071)
問題ID : 26521
問題を開く
複合問合せに関する説明として、正しいものはどれですか(該当するものを全て選択して下さい)。
正解
1つ目の問合せと2つ目の問合せで、SELECT句に指定する列や式を同じ数にしなければならない
1つ目の問合せと2つ目の問合せで、SELECT句に指定する列のデータ型を同じデータ型(もしくは同じデータ型グループ)にしなければならない
1つ目の問合せと2つ目の問合せで、SELECT句に指定した列のデータ型が同じであれば、列のサイズが異なっていても良い
解説
集合演算子を用いて複合問合せを行う場合、SELECT句に指定する列や式は次のガイドラインに従います。
・複合問合せの列見出しは1つ目の問合せに指定された列名が使用される(それぞれの問合せで指定される列名が異なっていても良い)
・2つの問合せでSELECT句に指定する列や式の数を同数にしなければならない
・2つの問合せでSELECT句に指定する列や式のデータ型を同じ、もしくは同じデータ型グループにしなければならない(ただし、サイズは異なっていても良い)
以上より、
・1つ目の問合せと2つ目の問合せで、SELECT句に指定する列や式を同じ数にしなければならない
・1つ目の問合せと2つ目の問合せで、SELECT句に指定する列のデータ型を同じデータ型(もしくは同じデータ型グループ)にしなければならない
・1つ目の問合せと2つ目の問合せで、SELECT句に指定した列のデータ型が同じであれば、列のサイズが異なっていても良い
が正解となります。
なお、同じデータ型グループとは同じデータを扱うデータ型をグループ化したものです。
例えば、CHAR型とVARCHAR2型はどちらも文字列を扱いますので、同じデータ型グループに分類されます。
その他の選択肢については次のとおりです。
・1つ目の問合せと2つ目の問合せで、SELECT句に指定する列名を同じ列名にしなければならない
SELECT句に指定する列数が同じであれば、列名は異なっていても構いません。
・1つ目の問合せと2つ目の問合せで、SELECT句に指定する列名が異なっている場合、2つ目の問合せの列名が列見出しに使用される
複合問合せの列見出しは1つ目の問合せに指定された列名が使用されます。
・複合問合せの列見出しは1つ目の問合せに指定された列名が使用される(それぞれの問合せで指定される列名が異なっていても良い)
・2つの問合せでSELECT句に指定する列や式の数を同数にしなければならない
・2つの問合せでSELECT句に指定する列や式のデータ型を同じ、もしくは同じデータ型グループにしなければならない(ただし、サイズは異なっていても良い)
以上より、
・1つ目の問合せと2つ目の問合せで、SELECT句に指定する列や式を同じ数にしなければならない
・1つ目の問合せと2つ目の問合せで、SELECT句に指定する列のデータ型を同じデータ型(もしくは同じデータ型グループ)にしなければならない
・1つ目の問合せと2つ目の問合せで、SELECT句に指定した列のデータ型が同じであれば、列のサイズが異なっていても良い
が正解となります。
なお、同じデータ型グループとは同じデータを扱うデータ型をグループ化したものです。
例えば、CHAR型とVARCHAR2型はどちらも文字列を扱いますので、同じデータ型グループに分類されます。
その他の選択肢については次のとおりです。
・1つ目の問合せと2つ目の問合せで、SELECT句に指定する列名を同じ列名にしなければならない
SELECT句に指定する列数が同じであれば、列名は異なっていても構いません。
・1つ目の問合せと2つ目の問合せで、SELECT句に指定する列名が異なっている場合、2つ目の問合せの列名が列見出しに使用される
複合問合せの列見出しは1つ目の問合せに指定された列名が使用されます。
参考
集合演算子を用いて、複数の問合せの結果を1つにまとめて表示する問合せを複合問合せといいます。
複合問合せは次のように記述します。
SELECT文 1
{UNION | UNION ALL | INTERSECT | MINUS}
SELECT文 2
複合問合せで使用する集合演算子は次の通りです。

4つの演算子のうち、UNION ALL演算子以外の演算子を使用した複合問合せでは、問合せの結果がSELECT句の1番目に指定されている列で昇順にソートされます。

集合演算子を用いて複合問合せを行うには、いくつかのガイドラインがあります。
[SELECT句の指定]
・複合問合せの列見出しは1つ目の問合せに指定された列名が使用される(それぞれの問合せで指定される列名が異なっていても良い)
・2つの問合せでSELECT句に指定する列や式の数を同数にしなければならない
・2つの問合せでSELECT句に指定する列や式のデータ型を同じ、もしくは同じデータ型グループにしなければならない(ただし、サイズは異なっていても良い)



[ORDER BY句の使用]
・ORDER BY句は複合問合せの最後の問合せに指定する
・ORDER BY句には最初の問合せに指定されている列名や列別名を指定する



[NULL値の扱い]
・NULL値は無視されない
・UNION ALL演算子以外の演算子を使用した複合問合せでは、重複したNULL値は排除される


[集合演算子の優先順位]
・集合演算子には優先順位はない
・1つのSQL文に複数の集合演算子が使用されている場合は、SQL文の先頭から順番に複合問合せが実行される
・優先順位を明示的に指定したい場合は、()括弧を用いて優先順位を指定する


複合問合せは次のように記述します。
SELECT文 1
{UNION | UNION ALL | INTERSECT | MINUS}
SELECT文 2
複合問合せで使用する集合演算子は次の通りです。

4つの演算子のうち、UNION ALL演算子以外の演算子を使用した複合問合せでは、問合せの結果がSELECT句の1番目に指定されている列で昇順にソートされます。

SQLを表示
SELECT department_id, manager_id
FROM departments
INTERSECT
SELECT department_id, employee_id
FROM employees;
SELECT department_id, manager_id
FROM departments
UNION ALL
SELECT department_id, employee_id
FROM employees;
FROM departments
INTERSECT
SELECT department_id, employee_id
FROM employees;
SELECT department_id, manager_id
FROM departments
UNION ALL
SELECT department_id, employee_id
FROM employees;
集合演算子を用いて複合問合せを行うには、いくつかのガイドラインがあります。
[SELECT句の指定]
・複合問合せの列見出しは1つ目の問合せに指定された列名が使用される(それぞれの問合せで指定される列名が異なっていても良い)
・2つの問合せでSELECT句に指定する列や式の数を同数にしなければならない
・2つの問合せでSELECT句に指定する列や式のデータ型を同じ、もしくは同じデータ型グループにしなければならない(ただし、サイズは異なっていても良い)

SQLを表示
SELECT department_id, manager_id
FROM departments
INTERSECT
SELECT department_id, employee_id
FROM employees;
FROM departments
INTERSECT
SELECT department_id, employee_id
FROM employees;

SQLを表示
SELECT department_id, manager_id
FROM departments
INTERSECT
SELECT department_id, employee_id, employee_name
FROM employees;
FROM departments
INTERSECT
SELECT department_id, employee_id, employee_name
FROM employees;

SQLを表示
SELECT department_id, manager_id
FROM departments
INTERSECT
SELECT department_id, employee_name
FROM employees;
FROM departments
INTERSECT
SELECT department_id, employee_name
FROM employees;
[ORDER BY句の使用]
・ORDER BY句は複合問合せの最後の問合せに指定する
・ORDER BY句には最初の問合せに指定されている列名や列別名を指定する

SQLを表示
SELECT department_id dept, manager_id mgr
FROM departments
INTERSECT
SELECT department_id, employee_id
FROM employees
ORDER BY dept DESC;
FROM departments
INTERSECT
SELECT department_id, employee_id
FROM employees
ORDER BY dept DESC;

SQLを表示
SELECT department_id dept, manager_id mgr
FROM departments
ORDER BY dept DESC
INTERSECT
SELECT department_id, employee_name
FROM employees;
FROM departments
ORDER BY dept DESC
INTERSECT
SELECT department_id, employee_name
FROM employees;

SQLを表示
SELECT department_id dept, manager_id mgr
FROM departments
INTERSECT
SELECT department_id dept2, employee_id emp
FROM employees
ORDER BY employee_id;
FROM departments
INTERSECT
SELECT department_id dept2, employee_id emp
FROM employees
ORDER BY employee_id;
[NULL値の扱い]
・NULL値は無視されない
・UNION ALL演算子以外の演算子を使用した複合問合せでは、重複したNULL値は排除される

SQLを表示
SELECT salary FROM employees
UNION
SELECT salary FROM employees;
UNION
SELECT salary FROM employees;

SQLを表示
SELECT salary FROM employees
UNION ALL
SELECT salary FROM employees;
UNION ALL
SELECT salary FROM employees;
[集合演算子の優先順位]
・集合演算子には優先順位はない
・1つのSQL文に複数の集合演算子が使用されている場合は、SQL文の先頭から順番に複合問合せが実行される
・優先順位を明示的に指定したい場合は、()括弧を用いて優先順位を指定する

SQLを表示
SELECT department_id, manager_id
FROM departments
UNION ALL
SELECT department_id, employee_id
FROM employees
MINUS
SELECT department_id, employee_id
FROM employees;
FROM departments
UNION ALL
SELECT department_id, employee_id
FROM employees
MINUS
SELECT department_id, employee_id
FROM employees;

SQLを表示
SELECT department_id, manager_id
FROM departments
UNION ALL
(SELECT department_id, employee_id
FROM employees
MINUS
SELECT department_id, employee_id
FROM employees);
FROM departments
UNION ALL
(SELECT department_id, employee_id
FROM employees
MINUS
SELECT department_id, employee_id
FROM employees);
問の選択肢の表現について
投稿日 2025/08/15
複合問合せに関する問題で、
選択肢の1つに「1つ目の問合せと2つ目の問合せで、SELECT句に指定した列のデータ型が同じであれば、列のサイズが異なっていても良い」とありますが、
「データ」のサイズのことを「列」のサイズという表現をするのは一般的なのでしょうか。
それとも表現ミスでしょうか。
r
rink_rew
2025/08/19 14:56
その選択肢で言いたい話は、こういうことですよね?
列定義のサイズ(長さ)を指しているので、「列のサイズ」のほうがしっくりくるかなと思いました。
逆に「データのサイズ」だと、実際に格納されているデータのサイズを指しているように感じられました。
SQL> desc tbl_a
名前 NULL? 型
----------------------------------------- -------- ----------------------------
ID NUMBER
NAME VARCHAR2(10)
SQL> desc tbl_b
名前 NULL? 型
----------------------------------------- -------- ----------------------------
ID NUMBER
NAME VARCHAR2(20) <--- サイズが異なる
SQL> select * from tbl_a;
ID NAME
---------- ----------
1 AAA
2 BBB
SQL> select * from tbl_b;
ID NAME
---------- --------------------
1 AAA
3 CCC
SQL> select id, name from tbl_a
2 union
3 select id, name from tbl_b;
ID NAME
---------- --------------------
1 AAA
2 BBB
3 CCC <--- 正常に実行できる
SQL>
コメント
スタッフからの返信
この投稿に対して返信しませんか?
C Chiffonnu
2025/08/25 18:28
腑に落ちました。 ありがとうございます。