オーロラさんの勉強帳

SESのロースキル客先常駐勤務。データベース、Excel、Excel VBA、ネットワーク、LinuxなどIT関連のことを主に書いていきます。

【SQL】列別名(列見出し)の指定方法 (ORACLE DATABASE 12C SQL基礎)

ORACLE DATABASE 12c SQL基礎(1Z0-061)の試験範囲でもある、
列別名(列見出し)の指定方法を紹介します。


目次

デフォルトの列名

OracleのSELECT文で抽出した列名は、デフォルトでは以下のように表示されます。

  • 列名を大文字で表示する
  • 指定した式をそのまま表示する

SQLで列名の表示を確認してみます。

SELECT employee_id,name,salary * 12,salary + 10000 FROM test5;

f:id:auroralights:20210719213642p:plain


列別名の指定方法

列別名は以下の2つの方法で指定することができます。

  • 列名と列別名をスペースで区切る方法
  • 列名と列別名をASキーワードで区切る方法
<半角スペースで区切る方法>
SELECT 列名 列別名 FROM テーブル名;

<ASキーワードで列別名を指定する方法>
SELECT 列名 AS 列別名 FROM テーブル名;


実際に半角スペース、ASキーワードで区切って列別名を指定してみよう。

SELECT
  employee_id 社員番号
  , name Name
  , salary * 12 AS 年間給与
  , salary + 10000 AS Bonus
FROM
  test5;

f:id:auroralights:20210719214658p:plain

上記の場合だと「Name」、「Bonus」を指定したにもかかわらず、「NAME」、「BONUS」とすべて大文字で表示されてしまいました。
これはデフォルトの列の表示規則によるものです。

列別名で「大文字・小文字」を区別させたり、「スペース」を含む列別名を指定したりするには「二重引用符」で列別名を囲む必要があります。

列別名の命名規則

列別名はオブジェクトの命名規則に従う必要があります。

Oracle オブジェクトの命名規則

  • 長さは30バイト以下
  • 英数字(AからZ、aからz、0から9)を使用可能
    (日本語環境では、漢字、ひらがな、カタカナも使用可能)
  • 特殊記号(#,$,_)が使用可能
  • 名前は文字で開始する必要がある
    (数字、特殊記号は名前の先頭に使用不可 例:1EMP、#EMP 等)
  • スペースは使用不可
  • Oracleの予約語は使用不可
    予約語はORACLEですでに予約されている、つまり使用用途が定義されている単語です。TABLE、USER、SELECT 等
  • 同じユーザが所有する別のオブジェクトと重複する名前は使用不可



二重引用符(ダブルクォーテーション)を使った列別名の指定方法

「大文字・小文字」を区別した列別名や、Oracleの命名規則に反した列別名を指定するためには、列別名を「二重引用符(")」で囲んで指定する必要があります。


列別名を二重引用符で囲む必要があるケース

  • 列別名にスペースを含む
  • 大文字・小文字を区別する
  • 数字や記号で始まる
<列別名 二重引用符>
SELECT 列名 "列別名" FROM テーブル名;
SELECT 列名 AS "列別名" FROM テーブル名;


二重引用符を使って大文字・小文字を区別して列別名を指定します。
「Name」、「Bonus」とすべて大文字ではなく、大文字と小文字を区別した列別名で指定ができます。

SELECT
  employee_id 社員番号
  , name "Name"
  , salary * 12 AS 年間給与
  , salary + 10000 AS "Bonus"
FROM
  test5;

f:id:auroralights:20210719221322p:plain


Oracleの命名規則に反するため、二重引用符で囲まないとエラーになる列別名を試してみましょう。

SELECT
  employee_id "社員 番号"
  , name "123"
  , salary * 12 AS "#a"
  , salary + 10000 AS "TABLE"
  , salary + 20000 AS "/+"
FROM
  test5;

f:id:auroralights:20210719222123p:plain

各列別名を二重引用符で囲まないと、以下のような理由からエラーとなります。

  • 「社員 番号」はスペースを含んでいるため
  • 「123」は数字から始まる名前のため
  • 「#a」は特殊記号から始まっているため
  • 「TABLE」はORACLEの予約語のため
  • 「/*」は記号のため

注意

列別名は一重引用符(シングルクォーテーション)では囲むことはできませんので注意しましょう。
大文字・小文字を区別したり、命名規則に反する列別名を囲む場合は、「二重引用符」で囲うことを覚えておきましょう。


以下のようなSQLは、一重引用符で列別名を囲んでいるのでエラーとなります。

SELECT
  employee_id '社員番号'
FROM
  test5;

【SQL】LISTAGG関数 (ORACLE DATABASE 12C SQL基礎)

ORACLE DATABASE 12c SQL基礎(1Z0-061)の試験範囲でもある、
LISTAGG(リスタッグ)関数の使用方法を紹介します。


目次

LISTAGG(リスタッグ)関数とは

LISTAGG関数を使うと、指定した列の複数行の値を連結して1行にまとめることができます。
デリミタ(区切り記号)を指定することで、カンマ区切りなどでまとめることが可能です。
戻り値は文字型です。

LISTAGG関数の書式

LISTAGG(連結したい列, 'デリミタ') WITHIN GROUP (ORDER BY 連結順の基準列)

引数 説明
連結したい列 連結にしたい列名を指定します。
デリミタ 連結にする際の区切り記号を指定します。
連結順の基準列 連結するときの順番を決める基準列を指定します。


LISTAGG関数では、指定した列の複数行の値をORDER BYで指定した基準で並び替えて、連結します。


LISTAGG関数の使用例

以下のテーブルを使って「LIATAGG関数」の動作を確認してみましょう。

f:id:auroralights:20210629230739p:plain



NAME列の値をID列の順番で連結するSQLを試してみましょう。

SELECT LISTAGG(NAME,',') WITHIN GROUP (ORDER BY ID)
FROM TEST6;

SQLの結果
f:id:auroralights:20210629230914p:plain



NAME列の値をDEPARTMENT_ID列の順番で連結するSQLを試してみましょう。

SELECT LISTAGG(NAME,',') WITHIN GROUP (ORDER BY DEPARTMENT_ID)
FROM TEST6;

SQLの結果
f:id:auroralights:20210629231035p:plain



COUNTRY_CDごとのNAME列の値を連結するSQLを試してみましょう。

SELECT LISTAGG(NAME,',') WITHIN GROUP (ORDER BY ID)
FROM TEST6
GROUP BY COUNTRY_CD;

SQLの結果
f:id:auroralights:20210629231611p:plain

SELECT COUNTRY_CD,LISTAGG(NAME,',') WITHIN GROUP (ORDER BY ID)
FROM TEST6
GROUP BY COUNTRY_CD;

SQLの結果
f:id:auroralights:20210629231743p:plain

【SQL】単純CASE式・検索CASE式の使い方 (ORACLE DATABASE 12C SQL基礎)

ORACLE DATABASE 12c SQL基礎(1Z0-061)の試験範囲でもある、
単純CASE式・検索CASE式の使用方法を紹介します。


目次


単純CASE式・検索CASE式の使用例は以下のようなテーブルを使っています。

EMPLOYEE_ID DEPARTMENT_ID NAME PHONE SALARY MANAGER_ID
1 10 山田 00000000000 500000 « NULL »
2 10 佐藤 00000000001 450000 1
3 10 鈴木 00000000002 450000 1
4 10 田中 00000000003 300000 1
5 10 山本 00000000004 220000 1
6 20 00000000005 470000 « NULL »
7 20 中村 00000000006 250000 6
8 20 松本 00000000007 220000 6
9 30 井上 00000000008 210000 10
10 30 木村 00000000009 300000 « NULL »



単純CASE式について

単純CASE式は条件分岐をするときに使います。
順番に列と条件値と比較して、列が条件値に一致する場合に対象の値を返します。
条件に一致するものが見つかると後続の条件との比較はしません。
いずれの条件値にも合致しない場合はデフォルト値を返します。(デフォルト値を指定しない場合はNULLを返します)



<単純CASE式の書式>

CASE 列 WHEN 条件値1 THEN 値1
        [WHEN 条件値2 THEN 値2
        ・・・・・
        WHEN 条件値n THEN 値
        ELSE デフォルト値]
END


単純CASE式のメモ
列に対してWHEN句で指定した条件に合致する場合THEN句で指定した値を返す。
WHEN句の条件に合致するものがなければELSE句のデフォルト値を返す。デフォルト値がない場合はNULLを返す。


単純CASE式の使用例

単純CASE式を使ってDEPARTMENT_IDが10の場合は経営管理部、20の場合は営業部、それ以外はその他と返すSQLを考えます。

select
  employee_id AS 従業員番号,
  case department_id when 10 then '経営管理部'
                     when 20 then '営業部'
                     else 'その他'
  end AS 部署,
  NAME AS 名前
from test5;


SQLの結果
f:id:auroralights:20210619012006p:plain


検索CASE式について

検索CASE式も条件分岐をするときに使います。
単純CASE式とは違い条件の対象列を指定しません。
検索CASE式では条件式に「列名 演算子 値」の形式で指定ができます。
単純CASE式では対象の列に対して条件と=(等価)のものに対して値を返していましたが、検索CASE式では等価条件以外を指定できます。

CASE WHEN 条件式1 THEN 戻り式1
    [WHEN 条件式2 THEN 戻り式2
     WHEN 条件式n THEN 戻り式n
     ELSE デフォルト値]
END



検索CASE式の使用例

salaryの値ごとにランクをつける場合を考えてみます。
salaryが250000未満はD、300000未満はC、350000未満はB、350000以上はAを返すSQLを試してみます。

select
  employee_id AS 従業員番号,
  case when salary < 250000 then 'D'
       when salary < 300000 then 'C'
	   when salary < 350000 then 'B'
	   else 'A'
  end AS 給与ランク,
  NAME AS 名前
from test5;


SQLの結果
f:id:auroralights:20210619014427p:plain