0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【SilverSQL】第2章

0
Last updated at Posted at 2025-05-04

第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;

--私の月給はです。
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?