第2章
列別名
列別名はオブジェクトのネーミング規則に従い命名しなければならない。
ネーミング規則は以下のとおり。
- 30バイト以下であること(12c R2以降は128バイト以下)
- SQLの予約語は使用不可
- 英数字、特殊文字(#、$、_)が使用可
- 数字、特殊文字(#、$、_)は名前の先頭に使用不可
- 日本語環境では、漢字、ひらがな、カタカナも使用可
- スペースは使用不可
列別名を二重引用符「"」で囲むケース
- スペース(空白文字)を含む
- 「$」「_」「#」以外の記号を含む
- 大文字/小文字を区別する
- 最初の文字が数字または記号
- Oracleの予約語
SQLの識別子ルール
- ダブルクォートなしのエイリアス
→ 自動的に 大文字に変換される(Oracleの場合)。
SELECT employee_name AS Employee_Name
→ 実際のエイリアス名は EMPLOYEE_NAME になります。
- ダブルクォート付きのエイリアス
→ 書いた通りの大文字小文字が保持される。
SELECT employee_name AS "Employee_Name"
→ 実際のエイリアス名は Employee_Name (大文字小文字そのまま)になります。
SELECT
employee_name emp#name
FROM
employees
ORDER BY
emp#name
;
特殊文字(#,$,_)はオブジェクト名として使用できるため、列別名を二重引用符(")で囲む必要はありません。正常に実行でき、正しいSQL文です。
SELECT
-
SELECT文では「射影(投影)」、「選択」、「結合」の3つの機能を使用して表からデータを取得。
射影(投影):表から特定の列を取得します。
選択:表から特定の行を取得します。
結合:複数の表のデータを関連付けて取得します。 -
SELECT句に指定された算術式に列別名を指定することはできるが、算術式の中で列別名を使用することはできない。
算術式を指定できる句
SELECT句、WHERE句、GROUP BY句、HAVING句、ORDER BY句
SELECT salary * 12 AS "Yearly Income" FROM employees;
- SQL文の実行結果に表示される列見出しを変更したい場合は、SELECT句に列別名を指定。
- 列別名は項目名と列別名をスペースで区切るか、明示的にASキーワードで指定。
- SELECT句に指定された算術式に列別名を指定することはできるが、算術式の中で列別名を使用することはできない。
1. 列別名は算術式の結果に名前をつけることはできる
SELECT salary * 12 AS annual_salary FROM employees;
この場合、salary * 12 という算術式の結果に annual_salary という名前をつけられます。
→ 結果セットの列名として表示される。
2. でも算術式の中では列別名を使えない
SELECT
salary * 12 AS annual_salary
, annual_salary + 1000 -- ❌ ここで別名は使えない
FROM
employees;
これを実行するとエラーになります。
なぜかというと、列別名が有効になるのは SELECT の結果セットを作るときだからです。
まだ計算途中の「SELECT文の中の算術式」では、別名は認識されません。
3. もし別名を式の中で使いたいときは?
サブクエリを使う
SELECT
annual_salary
,annual_salary + 1000 AS bonus_salary
FROM
(
SELECT
salary * 12 AS annual_salary
FROM
employees
) t;
こうすると annual_salary が一度確定した名前として扱えるので、別の計算に使えます。
- 列別名はオブジェクトのネーミング規則に従って命名されるが、大文字と小文字を区別したり、ネーミング規則に反する列別名(スペースを使用するなど)を使用する場合は、列別名を二重引用符(")で囲まなければならない。
- 列別名の指定時に、ネーミング規則に反する列別名を使用するために二重引用符(")で囲んだ場合は、ORDER BY句でも同様に列別名を二重引用符(")で囲む必要がある。
-- エラー
SELECT
hiredate || employee_name "date"
FROM
employees
ORDER BY
date
;
-- エラーにならない
SELECT
hiredate || employee_name "date"
FROM
employees
ORDER BY
"date"
;
DISTINCT
-- DISTINCTキーワードの後の項目を()括弧で囲むとエラーになる
SELECT DISTINCT(*) FROM sales;
SELECT DISTINCT (prod_id, cust_id) FROM sales;
DUAL
1つの列と1行のデータを持ち、計算や関数の値を確認する場合などに使用する表
連結演算子 ||
文字リテラルは、一重引用符「'」で囲む
SELECT ename || 'さんの職種は' || job || 'です' FROM emp;
代用引用メカニズム
- 初めの囲み文字:「q'」と任意の文字
- q演算子の引用符デリミタに使用できる文字は、任意の文字(大文字と小文字は区別されます)か、[],<>,(),{}の組合せ
- 終わりの囲み文字:任意の文字と「'」
SELECT employee_name || '''s salary is ' || salary FROM employees;
SELECT employee_name || q'{'s salary is }' || salary FROM employees;
- 引用符デリミタとして英文字を使用する場合、大文字と小文字は区別されるため、どちらか1つに統一しなければならない。
SELECT q'XI'm fine.x' FROM dual;
- 文字リテラルの一部に一重引用符(')を使用する場合は、代替引用符q演算子を使用するか、一重引用符を2つ続けて記述します。
-- 正常
SELECT employee_name || '''s salary is ' || salary FROM employees;
SELECT 'It''s Monday today.' FROM dual;
SELECT q'(It's Monday today.)' FROM dual;
-- エラー
SELECT 'It's Monday today.' FROM dual;
日付値の特徴
- 日付値は世紀、年、月、日、時、分、秒を表す内部的な数値形式で格納されている。
- 日付値のデフォルトの表示書式は言語環境により異なるが、変更することができる。
- 日付値に対して数値(日数)の加算、減算を行える。また日付値-日付値で2つの日付値間の日数を求める事もできる。ただし、日付値+日付値の演算はできません。
英語環境で、日付の表示書式のデフォルトは「DD-MON-RR」になるので、「29-FEB-12」が返される。
問題
-- EMPLOYEES表のSALARY列がNULL値だった場合、次のSELECT文の実行結果として正しい記述はどれか。
SELECT '私の月給は' || salary || 'です。' FROM employees;
--私の月給はです。