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行が選択されました。