ORDER BYの指定
集合演算子に関して多く出題されるのは、実はORDER BYにまつわる問題です。やはり、設問を解きながら解説しましょう。
問2
集合演算子について正しい記述はどれですか。
- a. 各SELECT文にGROUP BYを記述できる
- b. 各SELECT文にORDER BYを記述できる
- c. 最初のSELECT文の末尾にのみORDER BYを記述できる
- d. 最初のSELECT文に指定した列名をORDER BYに記述する
- e. 最後のSELECT文に指定した列名をORDER BYに記述する
次の実行例が示すとおり、各SELECT文にGROUP BYを記述することができます(選択肢aは正解)。
SQL> SELECT COUNT(*) FROM employees GROUP BY department_id
2 UNION
3 SELECT COUNT(*) FROM employees GROUP BY manager_id;
COUNT(*)
----------
1
2
4
5
6
8
14
34
45
9行が選択されました。
しかし、次の実行例が示すとおり、各SELECT文にORDER BYを記述することはできません(選択肢bは不正解)。
SQL> SELECT LAST_NAME FROM employees ORDER BY LAST_NAME 2 UNION 3 SELECT FIRST_NAME FROM employees ORDER BY FIRST_NAME; UNION * 行2でエラーが発生しました。: ORA-00933: SQLコマンドが正しく終了されていません。
また、ORDER BYは、問合せ全体に対して1つしか指定できません。最後のSELECT文の後に記述します(選択肢cは不正解)。さらに、次の実行例が示すとおり、ORDER BYで指定できる列は、最初のSELECT文に指定した列名だけです(選択肢dは正解、選択肢eは不正解)。
SQL> --最後のSELECT文に指定した列名
SQL> SELECT LAST_NAME FROM employees
2 UNION
3 SELECT FIRST_NAME FROM employees ORDER BY FIRST_NAME;
SELECT FIRST_NAME FROM employees ORDER BY FIRST_NAME
*
行3でエラーが発生しました。:
ORA-00904: "FIRST_NAME": 無効な識別子です。
SQL> --最初のSELECT文に指定した列名
SQL> SELECT LAST_NAME FROM employees
2 UNION
3 SELECT FIRST_NAME FROM employees ORDER BY LAST_NAME;
LAST_NAME
---------------
Abel
Adam
……(途中省略)……
Winston
Zlotkey
195行が選択されました。
そういえば、ORDER BYって副問合せの中でも指定できませんでしたよね(前回学習したばかりです。覚えていますか?!)。
どちらも「途中の処理でソートしたって意味ないじゃん! ORDER BYはSQL文実行者の手元に渡すデータを並べ替えるために使うもの。だから、最後に1つだけ記述するんだよ!」と頭に入れておけば、間違えないはずです。
では、もう1問解きながら、決まり事を確認します。
問3
集合演算子について正しい記述はどれですか。
- a. 出力結果の列名は、最初のSELECT文の列名が使用される
- b. 出力結果の列名は、最後のSELECT文の列名が使用される
- c. ORDER BYでは、列位置を使用できる
- d. ORDER BYでは、最初のSELECT文で指定した列別名を使用できる
問2の解説を注意深く読んだ人は正解できたはずです。出力結果の列名には、最初のSELECT文の列名が使用されます(選択肢aは正解、選択肢bは不正解)。
また、次の実行例のとおり、ORDER BYでは列位置および最初のSELECT文の列別名を使用できます(選択肢c、dは正解)。
SQL> SELECT department_id,employee_id AS empno FROM employees
2 UNION
3 SELECT department_id,manager_id AS mgrno FROM departments ORDER BY 1,empno DESC;
DEPARTMENT_ID EMPNO
------------- ----------
10 200
20 202
20 201
……(途中省略)……
260
270
178
124行が選択されました。

