助け合いフォーラム

Oracle DB

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つにまとめて表示する問合せを複合問合せといいます。
複合問合せは次のように記述します。

 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;


集合演算子を用いて複合問合せを行うには、いくつかのガイドラインがあります。

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


 
SQLを表示
SELECT department_id, manager_id
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;


 
SQLを表示
SELECT department_id, manager_id
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;


 
SQLを表示
SELECT department_id dept, manager_id mgr
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;


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


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


 
SQLを表示
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;



 
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);
上に戻る

問の選択肢の表現について

投稿日 2025/08/15

複合問合せに関する問題で、
選択肢の1つに「1つ目の問合せと2つ目の問合せで、SELECT句に指定した列のデータ型が同じであれば、列のサイズが異なっていても良い」とありますが、
「データ」のサイズのことを「列」のサイズという表現をするのは一般的なのでしょうか。
それとも表現ミスでしょうか。

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

腑に落ちました。 ありがとうございます。

この返信に対して
コメントを記入できます

スタッフからの返信

s staff_ishii

2025/08/19 16:12

Chiffonnu さん、rink_rew さん、 ご指摘の点を修正いたしました。 ご報告、誠にありがとうございました。

この投稿に対して返信しませんか?