助け合いフォーラム

Oracle DB

Oracle Master Silver SQL 2019(1Z0-071)
問題ID : 26483
問題を開く
EMPLOYEES表の構造を確認して下さい。



EMPLOYEES表に登録されている従業員のうち、2003年4月1日から2012年4月1日の間に入社した従業員を、入社日が新しい順で表示し、さらに入社日が同じ従業員同士は従業員番号が小さい順で表示するには、どの問い合わせを実行しますか(該当するものを全て選択して下さい)。
ただし、日付書式は「RR-MM-DD」とします。

正解

SELECT employee_id, employee_name, hiredate FROM employees WHERE hiredate >= '03-04-01' AND hiredate <= '12-04-01' ORDER BY 3 DESC, 1;

SELECT employee_id, employee_name, hiredate FROM employees WHERE hiredate BETWEEN '03-04-01' AND '12-04-01' ORDER BY hiredate DESC, employee_id;

解説

日付の範囲を指定してデータを検索するには比較演算子の「>=(以上)」と「<=(以下)」で範囲を指定するか、BETWEEN演算子を使用します。

また、SELECT文の実行結果をソートして表示する場合は、ORDER BY句を指定します。ORDER BY句に複数の項目を指定した場合は、指定した順番でソート処理が行われます。また、項目ごとに昇順、降順どちらでソートするかを指定することができます。

ORDER BY句で指定できる項目は列名の他、SELECT句に指定されている項目の順番(数値)などがあります。

以上より、
・SELECT employee_id, employee_name, hiredate FROM employees WHERE hiredate >= '03-04-01' AND hiredate <= '12-04-01' ORDER BY 3 DESC, 1;
・SELECT employee_id, employee_name, hiredate FROM employees WHERE hiredate BETWEEN '03-04-01' AND '12-04-01' ORDER BY hiredate DESC, employee_id;
が正解となります。

選択肢のSQL文の実行結果は次のようになります。


 
SQLを表示
SELECT employee_id, employee_name, hiredate
FROM employees
WHERE hiredate >= '03-04-01' AND hiredate <= '12-04-01'
ORDER BY 3 DESC, 1;


以下も同様です。

 
SQLを表示
SELECT employee_id, employee_name, hiredate
FROM employees
WHERE hiredate BETWEEN '03-04-01' AND '12-04-01'
ORDER BY hiredate DESC, employee_id;


その他の選択肢については以下のとおりです。

・SELECT employee_id, employee_name, hiredate FROM employees WHERE hiredate >= '03-04-01' AND hiredate <= '12-04-01' ORDER BY hiredate DESC ORDER BY employee_id;
ORDER BY句に複数の項目を指定する場合は、項目をカンマで区切って指定します。
例) ORDER BY hiredate DESC, employee_id

・SELECT employee_id, employee_name, hiredate FROM employees WHERE hiredate >= '03-04-01' AND hiredate <= '12-04-01' ORDER BY employee_id, hiredate DESC;
ORDER BY句にemployee_id, hiredateの順で指定しているので、従業員番号の昇順でソートしてから入社日の降順でソートされ、期待する結果にはなりません。

・SELECT employee_id, employee_name, hiredate FROM employees WHERE hiredate BETWEEN '12-04-01' AND '03-04-01' ORDER BY hiredate DESC, employee_id;
BETWEEN演算子では古い日付を下限値にしなければなりません。このSQL文では検索結果は1件も表示されません。

・SELECT employee_id, employee_name, hiredate FROM employees WHERE hiredate BETWEEN '03-04-01' AND '12-04-01' ORDER BY hiredate ASC, employee_id DESC;
ASCは昇順(小さい順)、DESCは降順(大きい順)ソートを意味します。日付が小さい順とは、古い順という事です。これでは入社日が古い順、従業員番号が大きい順で表示されてしまいますので、誤りです。

参考:
SELECT文の検索結果はどのような順番で表示されるか保証されていません。そのため、何らかの値によってソートされた検索結果が必要な場合はORDER BY句を指定します。
ORDER BY句はWHERE句など他の句と同時に指定できますが、必ずSELECT文の最後に記述する必要があります。

ORDER BY句の指定方法は次のとおりです。

 ORDER BY 項目1 [ASC | DESC], [項目2 [ASC | DESC], ... ]

 
 
SQLを表示
SELECT employee_id, employee_name, salary
FROM employees
ORDER BY salary;


ORDER BY句の項目には「列名」の他、以下を指定できます。どれも重要です。
・列別名(*WHERE句では指定不可)
・算術式
・SELECT句に指定されている項目の順番(数値)

ASCとDESCは昇順/降順を指定するキーワードです。ASCで昇順(小さい順)、DESCで降順(大きい順)にソートします。省略するとASCが指定されたものとみなされます。
ORDER BY句では複数の項目を指定できますが、ASC/DESCも項目ごとに指定できます。

 
 
SQLを表示
SELECT employee_id, employee_name, department_id, salary
FROM employees
ORDER BY department_id ASC, salary DESC;


上記の例では、まず「department_id」列で昇順ソート(ASC 省略可)し、「department_id」が同じ値の行では「salary」列で降順ソート(DESC)しています。

なお、以下の例のように、SELECT句で指定されていない列名をORDER BY句で指定することも可能です。

 
 
SQLを表示
SELECT employee_id, employee_name, salary
FROM employees
ORDER BY department_id;


ソートの順序はソートする項目のデータ型によって次のようになります。


上表のように、NULL値は最も大きい値として扱われます。そのため、ソート項目にNULL値が含まれる行は、昇順ソートの場合は最後に、降順ソートの場合は先頭に表示されることになります。
そこでORDER BY句では、次のキーワードで、昇順、降順にかかわらずNULL値が含まれる行を先頭もしくは最後に表示するように指定できます。

 ORDER BY 項目 [NULLS FIRST | NULLS LAST]

NULLS FIRSTはソート順にかかわらずNULL値が含まれる行を先頭に表示し、NULLS LASTは最後に表示します。
上に戻る

解説間違い

投稿日 2025/04/28

その他の選択肢についての解説の文章に間違いがありましたので共有します。
「・SELECT employee_id, employee_name, hiredate FROM employees WHERE hiredate BETWEEN '03-04-01' AND '12-04-01' ORDER BY hiredate ASC, employee_id DESC;
ASCは降順(小さい順)、DESCは昇順(大きい順)ソートを意味します。日付が小さい順とは、古い順という事です。これでは入社日が古い順、従業員番号が大きい順で表示されてしまいますので、誤りです。」
とありますが、「ASCは昇順(小さい順)、DESCは降順(大きい順)」になります。

スタッフからの返信

s staff_ishii

2025/04/28 18:05

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

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