助け合いフォーラム

Oracle DB

Oracle Master Silver SQL 2019(1Z0-071)
問題ID : 26910
問題を開く
次のSQL文のうち、正常に実行されるものはどれですか(3つ選択して下さい)。
ただし、データベースの実行環境は日本語環境とします。

正解

SELECT employee_name "社員名" FROM employees ORDER BY 社員名;

SELECT employee_name AS "EMPNAME" FROM employees ORDER BY empname;

SELECT employee_name emp#name FROM employees ORDER BY emp#name;

解説

SQL文の実行結果に表示される列見出しには、列別名を指定できます。
列別名はオブジェクトのネーミング規則に従い命名しなければなりませんが、列別名を二重引用符(") で囲むことで、大文字と小文字を区別したり、スペースを含めるなどネーミング規則に反する列別名を使用できます。列別名の指定時に、ネーミング規則に反する列別名を使用するために二重引用符(")で囲んだ場合は、ORDER BY句でも同様に列別名を二重引用符(")で囲む必要があります。

選択肢を1つずつ確認してみましょう。

・SELECT employee_name "社員名" FROM employees ORDER BY 社員名;
日本語環境では列別名に漢字、ひらがな、カタカナも使用できます。「社員名」という列別名を二重引用符(")で囲む必要はないため、ORDER BY句では列別名を二重引用符(")で囲んでいなくても正常に実行できます。正しいSQL文です。


SQLを表示
SELECT employee_name "社員名" FROM employees ORDER BY 社員名;


・SELECT employee_name AS "EMPNAME" FROM employees ORDER BY empname;
SELECT句の二重引用符(")で囲んでいる「EMPNAME」は全て大文字で、ORDER BY句の「empname」も二重引用符(")がなくてもデフォルトで大文字の「EMPNAME」と認識されるため、正常に実行できます。正しいSQL文です。


SQLを表示
SELECT employee_name AS "EMPNAME" FROM employees ORDER BY empname;


・SELECT employee_name "EMPLOYEE NAME" FROM employees ORDER BY EMPLOYEE NAME;
スペースを含んだ列別名のため、ORDER BY句でも「EMPLOYEE NAME」を二重引用符(")で囲む必要があります。エラーとなり、誤ったSQL文です。

・SELECT employee_name emp#name FROM employees ORDER BY emp#name;
特殊文字(#,$,_)はオブジェクト名として使用できるため、列別名を二重引用符(")で囲む必要はありません。正常に実行でき、正しいSQL文です。
※但し、特殊文字を列別名の先頭や単独で使用する場合は、列別名を二重引用符(")で囲む必要があります。


SQLを表示
SELECT employee_name emp#name FROM employees ORDER BY emp#name;


・SELECT employee_name AS Employee_Name FROM employees ORDER BY "Employee_Name";
SELECT句の「Employee_Name」は二重引用符(")で囲んでいないため大文字として認識されますが、ORDER BY句では二重引用符(")で囲んで大文字小文字を区別しています。エラーとなり、誤ったSQL文です。

・SELECT employee_name "empname" FROM employees ORDER BY empname;
SELECT句の「empname」は二重引用符(")で囲まれているので小文字として認識されますが、ORDER BY句では二重引用符(")で囲んでいないため、デフォルトで大文字の「EMPNAME」と認識されます。エラーとなり、誤ったSQL文です。


SQLを表示
SELECT employee_name "empname" FROM employees ORDER BY empname;

SELECT employee_name "empname" FROM employees ORDER BY "empname";


以上より、
・SELECT employee_name "社員名" FROM employees ORDER BY 社員名;
・SELECT employee_name AS "EMPNAME" FROM employees ORDER BY empname;
・SELECT employee_name emp#name FROM employees ORDER BY emp#name;
が正解となります。

参考

SQL文の実行結果に表示される列見出しは、SELECT句に指定した列名や算術式が大文字で表示されます。

 
 
SQLを表示
SELECT employee_id, employee_name, salary * 12
FROM employees;


ですが、算術式の列見出しでは見にくい場合や、大文字,小文字を区別した列見出しに変更したほうが良い場合もあります。そのような場合には列別名を指定して、列見出しを任意の文字列で置き換えることができます。

列別名を指定するには、以下の2つの方法があります。

 [項目と列別名をスペースで区切る]

  SELECT 項目1 列別名1, [項目2 列別名2 ...]

  
  
SQLを表示
SELECT employee_id 社員No, employee_name 社員名,
salary * 12 年収 FROM employees;


 [ASキーワードを使用する]

  SELECT 項目1 AS 列別名1, [項目2 AS 列別名2 ...]

  
  
SQLを表示
SELECT employee_id AS 社員No, employee_name AS 社員名,
salary * 12 AS 年収 FROM employees;


列別名はオブジェクトのネーミング規則に従い命名しなければなりません。
ネーミング規則は以下のとおりです。

 ・30バイト以下であること(12c R2以降は128バイト以下)
 ・SQLの予約語は使用不可
 ・英数字、特殊文字(#,$,_)が使用可
 ・日本語環境では、漢字、ひらがな、カタカナも使用可
 ・数字、特殊文字(#,$,_)は名前の先頭に使用不可
 ・スペースは使用不可

また、列別名は大文字と小文字が区別されません。
大文字と小文字を区別したり、スペースを含めるなどネーミング規則に反する列別名を使用する場合は、列別名を 二重引用符(") で囲まなければなりませんので注意しましょう。

 
 
SQLを表示
SELECT employee_id 社員No, employee_name 社員名,
salary * 12 給与(年収) FROM employees;


 
 
SQLを表示
SELECT employee_id "社員No", employee_name 社員名,
salary * 12 "給与(年収)" FROM employees;


なお、予約語とは、SQLの仕様で定められた表名や列名として使用することのできない単語のことです。(「SELECT」や「FROM」など)。
例えば「SELECT」が表名や列名として自由に使用できてしまうと、実際にSELECT文を実行しようとした際にSQLを正しく解釈できなくなるため、予約語として定義されています。
但し予約語も、二重引用符(")で囲む事で列別名として使用できます。以下は日付型を意味するDATEという予約語を使用しています。

 
 
SQLを表示
SELECT hiredate DATE FROM employees;


 
 
SQLを表示
SELECT hiredate "DATE" FROM employees;


また、別名に関する注意点として、「算術式の中で列別名を使うことはできない」というルールがあります。間違い易い点ですので、併せて覚えて下さい。

 
 
SQLを表示
SELECT salary * 12 AS "Sal",
Sal + commission AS "Total"
FROM employees;
上に戻る

列別名について

投稿日 2025/05/26

選択肢Aについてですが解説には,二重引用符を使って別名を指定した際にはorder byでも二重引用符を使って指定する。
とあるのですがA単体の解説には指定する必要が無いと書いてあります,どちらが正しいのでしょうか?

2025/05/26 20:24

列別名を二重引用符(")で囲んだ場合は、ORDER BY句でも同様に列別名を二重引用符(")で囲む必要があります。

解説にあるこの文章は、「(ネーミング規則に反する)列別名を二重引用符(")で囲んだ場合は、」ということを意味しているのだと思います。

つまり、正答の選択肢の一つである「SELECT employee_name "社員名" FROM employees ORDER BY 社員名;」については、

  • 「社員名」は漢字を使用しているだけなのでそもそも(")で囲まなくても良い
  • そもそも(")で囲まなくても良いものについては、ORDER BY句で(")で囲まずに使用できる
  • だから、列別名では「"社員名"」と(")で囲まれていてORDER BY句では「社員名」と(")で囲まれていないが、正常に実行できる

ということだと思います。


コメント

P Plunus

2025/05/26 22:54

なるほど、返信ありがとうございます!とても分かりやすかったです!

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

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