2 Oracle Databaseへの接続および検索

Oracle Databaseへは、SQL*PlusやSQL Developerなどのクライアント・プログラムからのみ接続できます。データベースに接続すると、スキーマ・オブジェクトを表示したり、Oracle Databaseの表のプロパティとデータを表示したり、問合せを使用してOracle Databaseの表からデータを取得できます。

クライアント・プログラムを使用してOracle Databaseに接続した後、そのクライアント・プログラムのコマンドを入力して実行します。詳細は、クライアント・プログラムのマニュアルを参照してください。

2.1 SQL*PlusからOracle Databaseへの接続

SQL*Plusは、Oracle Databaseにアクセスできるクライアント・プログラムです。このトピックでは、SQL*Plusを起動し、Oracle Databaseに接続する方法を示します。

注意:

次の手順の34では、ユーザー名とパスワードが必要です。

SQL*PlusからOracle Databaseへ接続するには、次の手順を実行します。

  1. Windowsシステムで行う場合は、Windowsのコマンド・プロンプトを表示します。

  2. コマンド・プロンプトで、sqlplusと入力してから[Enter]キーを押します。

  3. ユーザー名のプロンプトで、ユーザー名を入力してから[Enter]キーを押します。

  4. パスワードのプロンプトで、パスワードを入力してから[Enter]キーを押します。

    注意:

    セキュリティのため、パスワードは画面上に表示されません。

    Oracle Databaseインスタンスに接続されます。

    SQL*Plus環境に入っています。 SQL>プロンプトで、SQL*Plusコマンド、SQL文、PL/SQL文およびオペレーティング・システムのコマンドを入力して実行できます。

    SQL*Plusを終了するには、exitと入力して[Enter]キーを押します。

    注意:

    SQL*Plusを終了するとSQL*Plusセッションは終了されますが、Oracle Databaseインスタンスは停止されません。

    例2-1では、SQL*Plusを起動し、Oracle Databaseに接続し、SQLのSELECT文を実行して、SQL*Plusを終了します。ユーザーの入力は太字になっています。

例2-1 SQL*PlusからOracle Databaseへの接続

> sqlplus
SQL*Plus: Release 12.1.0.1.0 Production on Thu Dec 27 07:43:41 2012
 
Copyright (c) 1982, 2012, Oracle.  All rights reserved.
 
Enter user-name: your_user_name
Enter password: your_password
 
Connected to:
Oracle Database 12c Enterprise Edition Release - 12.1.0.1.0 64bit Production
 
SQL> select count(*) from employees;
 
  COUNT(*)
----------
       107
 
SQL> exit
 
Disconnected from Oracle Database 12c Enterprise Edition Release - 12.1.0.1.0 64bit Production
> 

関連項目:

2.2 SQL DeveloperからOracle Databaseへの接続

SQL Developerは、Oracle Databaseにアクセス可能なクライアント・プログラムです。

現在利用可能なリリースのSQL Developerを次のサイトからダウンロードして使用できます。

http://www.oracle.com/technetwork/developer-tools/sql-developer/downloads/

この項では、SQL Developerがシステムにインストールされていることを前提として、SQL Developerを起動し、Oracle Databaseに接続する方法を示します。SQL Developerがインストールされていないシステムの場合、インストール手順の詳細は、『Oracle SQL Developerユーザーズ・ガイド』を参照してください。

注意:

この後の手順は、次のようになっています。

  • JDKを含まないSQL Developerキットを使用しており、それを初めてシステムで起動するときには、Java Development Kitへのパスを指定する必要があります。

  • パスワードの名前とパスワードの入力を求められた場合は、入力する必要があります。

SQL DeveloperからOracle Databaseに接続するには、次の手順を実行します。

  1. SQL Developerを起動します。

    手順は、『Oracle SQL Developerユーザーズ・ガイド』を参照してください。

    システムでSQL Developerを最初に起動する場合、Java Development Kit (JDK)インストールへのパスを入力するよう求められます(例: C:\Program Files\Java\jdk1.8.0_65)。プロンプトに続けてパスを入力するか、または参照を行い、[Enter]キーを押します。

  2. 「接続」フレームで、「接続の作成」アイコンをクリックします。

  3. 「データベース接続の作成/選択」ウィンドウで、次の手順を実行します。

    1. 「接続名」「ユーザー名」および「パスワード」の各フィールドに適切な値を入力します。

      セキュリティのため、入力したパスワードの文字はアスタリスクで表示されます。

      「パスワード」フィールドの近くに「パスワードの保存」チェック・ボックスがあります。デフォルトでは、選択解除されています。デフォルトを受け入れることをお薦めします。

    2. 「Oracle」ペインが表示されない場合は、「Oracle」タブをクリックします。

    3. 「Oracle」ペインでデフォルト値を受け入れます。

      (デフォルト値は、接続タイプ: 基本、ロール: デフォルト、ホスト名: localhost、ポート: 1521、SIDオプション: 選択、SIDフィールド: xeです。)

    4. 「テスト」ボタンをクリックします。

      接続がテストされます。接続が成功すると、「ステータス」インジケータが空白から「成功」に変わります。

    5. テストが成功したら、「接続」をクリックします。

      「データベース接続の作成/選択」ウィンドウが閉じます。「接続」フレームに、手順3「接続名」フィールドに入力した名前の接続が表示されます。

SQL Developer環境に入っています。

SQL Developerを終了するには、「ファイル」メニューから「終了」を選択します。

注意:

SQL Developerを終了するとSQL Developerセッションは終了されますが、Oracle Databaseインスタンスは停止されません。次回SQL Developerを起動するときには、これまでの手順で作成した接続が残っています。SQL Developerでは、手順3で入力したパスワードを要求されます(「パスワードの保存」チェック・ボックスを選択していない場合のみ)。

関連項目:

2.3 ユーザーHRとしてのOracle Databaseへの接続

このドキュメントのチュートリアルと例を実行するには、ユーザーHRとしてOracle Databaseに接続する必要があります。

ユーザーHRは、このマニュアルの例とチュートリアルで使用されるHRサンプル・スキーマを所有します。

2.3.1 HRアカウントのロック解除

ユーザーHRとしてOracle Databaseに接続するには、その前にHRアカウントのロックを解除し、パスワードをリセットする必要があります。

デフォルトでは、HRスキーマがインストールされた際にHRアカウントがロックされ、パスワードが期限切れになります。

注意:

次の手順では、ALTER USERシステム権限を持つユーザーの名前とパスワードが必要です。

hrアカウントをロック解除し、パスワードをリセットするには、次の手順を実行します。

  1. SQL*Plusを使用して、ALTER USERのシステム権限があるユーザーとしてOracle Databaseに接続します。

  2. SQL>プロンプトで、HRアカウントをロック解除し、パスワードをリセットします。

    注意:

    安全なパスワードを選択してください。セキュアなパスワードの詳細は、『Oracle Databaseセキュリティ・ガイド』を参照してください。

    ALTER USER HR ACCOUNT UNLOCK IDENTIFIED BY password;
    

    システムは次のように応答します。

    User altered.
    

    HRアカウントがロック解除され、パスワードがpasswordになりました。

これでユーザーHRとして、パスワードpasswordを使用して、Oracle Databaseに接続できます。

関連項目:

2.3.2 ユーザーHRとしてのSQL*PlusからOracle Databaseへの接続

SQL*Plusを使用してHRユーザーとしてOracle Databaseに接続できます。

注意:

HRアカウントがロックされている場合は、「HRアカウントのロック解除」を参照してから、この項に戻ってください。

ユーザーHRとして、SQL*PlusからOracle Databaseへ接続するには、次の手順を実行します。

注意:

この作業では、HRアカウントのパスワードが必要です。

  1. Oracle Databaseに接続している場合は、現在の接続をクローズします。

  2. 「SQL*PlusからOracle Databaseへの接続」の指示に従って、手順3でユーザー名HRを入力し、手順4でHRアカウントのパスワードを入力します。

    これで、ユーザーHRとしてOracle Databaseに接続しました。

関連項目:

SQL*Plusを使用したHRの接続の作成例は、『SQL*Plusユーザーズ・ガイドおよびリファレンス』を参照してください。

2.3.3 ユーザーHRとしてのSQL DeveloperからOracle Databaseへの接続

SQL Developerを使用してHRユーザーとしてOracle Databaseに接続できます。

注意:

HRアカウントがロックされている場合は、「HRアカウントのロック解除」を参照してから、この項に戻ってください。

ユーザーHRとしてSQL DeveloperからOracle Databaseに接続するには、次の手順を実行します。

注意:

この作業では、HRアカウントのパスワードが必要です。

「SQL DeveloperからOracle Databaseへの接続」の指示に従って、手順3で次の値を入力します。

  • 「接続名」には、hr_connと入力します。

    (異なる名前を入力できますが、このマニュアルのチュートリアルでは、接続にhr_connという名前を付けたと想定します。)

  • 「ユーザー名」には、HRと入力します。

  • 「パスワード」には、HRアカウントのパスワードを入力します。

これで、ユーザーHRとしてOracle Databaseに接続しました。

2.4 SQL*PlusによるOracle Databaseの検索

ユーザーHRとしてSQL*PlusからOracle Databaseに接続する場合、HRスキーマ・オブジェクトとEMPLOYEES表のプロパティを表示できます。

注意:

HRとしてSQL*PlusからOracle Databaseに接続していない場合、「ユーザーHRとしてSQL*PlusからOracle Databaseへの接続」を参照してから、この項に戻ってください。

2.4.1 SQL*PlusによるHRスキーマ・オブジェクトの表示

SQL*Plusを使用して、静的データ・ディクショナリ・ビューUSER_OBJECTSに問い合せ、HRスキーマに属するオブジェクトを表示できます。

例2-2では、HRスキーマに属するオブジェクトの名前およびデータ型を表示する方法を示しています。

例2-2 SQL*PlusによるHRスキーマ・オブジェクトの表示

COLUMN OBJECT_NAME FORMAT A25
COLUMN OBJECT_TYPE FORMAT A25

SELECT OBJECT_NAME, OBJECT_TYPE FROM USER_OBJECTS
ORDER BY OBJECT_TYPE, OBJECT_NAME;

結果は次のようになります。

OBJECT_NAME               OBJECT_TYPE
------------------------- -------------------------
COUNTRY_C_ID_PK           INDEX
DEPT_ID_PK                INDEX
DEPT_LOCATION_IX          INDEX
EMP_DEPARTMENT_IX         INDEX
EMP_EMAIL_UK              INDEX
EMP_EMP_ID_PK             INDEX
EMP_JOB_IX                INDEX
EMP_MANAGER_IX            INDEX
EMP_NAME_IX               INDEX
JHIST_DEPARTMENT_IX       INDEX
JHIST_EMPLOYEE_IX         INDEX
JHIST_EMP_ID_ST_DATE_PK   INDEX
JHIST_JOB_IX              INDEX
JOB_ID_PK                 INDEX
LOC_CITY_IX               INDEX
LOC_COUNTRY_IX            INDEX
LOC_ID_PK                 INDEX
LOC_STATE_PROVINCE_IX     INDEX
REG_ID_PK                 INDEX
ADD_JOB_HISTORY           PROCEDURE
SECURE_DML                PROCEDURE
DEPARTMENTS_SEQ           SEQUENCE
EMPLOYEES_SEQ             SEQUENCE
LOCATIONS_SEQ             SEQUENCE
COUNTRIES                 TABLE
DEPARTMENTS               TABLE
EMPLOYEES                 TABLE
JOBS                      TABLE
JOB_HISTORY               TABLE
LOCATIONS                 TABLE
REGIONS                   TABLE
SECURE_EMPLOYEES          TRIGGER
UPDATE_JOB_HISTORY        TRIGGER
EMP_DETAILS_VIEW          VIEW
 
34 rows selected.

関連項目:

2.4.2 SQL*PlusによるEMPLOYEES表のプロパティとデータの表示

SQL*Plusコマンド、SQL SELECT文および静的データ・ディクショナリ・ビューを使用してHR.EMPLOYEES表のプロパティとデータを表示できます。

SQL*PlusコマンドDESCRIBEを使用してHRスキーマのEMPLOYEES表の列のプロパティを表示したり、SQL文SELECTを使用してデータを表示したりできます。表の別のプロパティを表示するには、静的データ・ディクショナリ・ビュー(USER_CONSTRAINTSUSER_INDEXESUSER_TRIGGERSなど)を使用します。

例2-3では、HRスキーマのEMPLOYEES表のプロパティを表示する方法を示しています。

例2-3 SQL*PlusによるEMPLOYEES表のプロパティの表示

DESCRIBE EMPLOYEES

結果:

 Name                                      Null?    Type
 ----------------------------------------- -------- -------------
 
 EMPLOYEE_ID                               NOT NULL NUMBER(6)
 FIRST_NAME                                         VARCHAR2(20)
 LAST_NAME                                 NOT NULL VARCHAR2(25)
 EMAIL                                     NOT NULL VARCHAR2(25)
 PHONE_NUMBER                                       VARCHAR2(20)
 HIRE_DATE                                 NOT NULL DATE
 JOB_ID                                    NOT NULL VARCHAR2(10)
 SALARY                                             NUMBER(8,2)
 COMMISSION_PCT                                     NUMBER(2,2)
 MANAGER_ID                                         NUMBER(6)
 DEPARTMENT_ID                                      NUMBER(4)

例2-4では、HRスキーマのEMPLOYEES表のデータの一部を表示する方法を示しています。

例2-4 SQL*PlusによるEMPLOYEES表のデータの表示

COLUMN FIRST_NAME FORMAT A20
COLUMN LAST_NAME FORMAT A25
COLUMN PHONE_NUMBER FORMAT A20

SELECT LAST_NAME, FIRST_NAME, PHONE_NUMBER FROM EMPLOYEES
ORDER BY LAST_NAME;

結果は次のようになります。

LAST_NAME                 FIRST_NAME           PHONE_NUMBER
------------------------- -------------------- --------------------
Abel                      Ellen                011.44.1644.429267
Ande                      Sundar               011.44.1346.629268
Atkinson                  Mozhe                650.124.6234
Austin                    David                590.423.4569
Baer                      Hermann              515.123.8888
Baida                     Shelli               515.127.4563
Banda                     Amit                 011.44.1346.729268
Bates                     Elizabeth            011.44.1343.529268
...
Urman                     Jose Manuel          515.124.4469
Vargas                    Peter                650.121.2004
Vishney                   Clara                011.44.1346.129268
Vollman                   Shanta               650.123.4234
Walsh                     Alana                650.507.9811
Weiss                     Matthew              650.123.1234
Whalen                    Jennifer             515.123.4444
Zlotkey                   Eleni                011.44.1344.429018
 
107 rows selected.

関連項目:

2.5 SQL DeveloperによるOracle Databaseの参照

ユーザーHRとしてSQL DeveloperからOracle Databaseに接続する場合、HRスキーマ・オブジェクトとEMPLOYEES表のプロパティを表示できます。

2.5.1 チュートリアル: SQL DeveloperによるHRスキーマ・オブジェクトの表示

このチュートリアルではSQL Developerを使用してHRスキーマに属するオブジェクトを表示する方法(つまり、HRスキーマを参照する方法)を説明します。

注意:

ユーザーHRとしてSQL DeveloperからOracle Databaseに接続していない場合、「ユーザーHRとしてのSQL DeveloperからOracle Databaseへの接続」を参照してから、このチュートリアルに戻ってください。

HRスキーマを参照するには、次の手順を実行します。

  1. 「接続」フレームで、hr_connアイコンの左にあるプラス記号(+)をクリックします。

    データベースに接続していない場合は、「接続情報」ウィンドウが開きます。データベースに接続している場合は、hr_connの情報が展開されます(手順2の「「OK」をクリックします」の後の情報を参照)。

  2. 「接続情報」ウィンドウが開かれた場合は、次のようにします。

    1. 「ユーザー名」フィールドに、hrと入力します。

    2. 「パスワード」フィールドに、ユーザーHRのパスワードを入力します。

    3. 「OK」をクリックします。

    hr_connの情報を展開します。プラス記号がマイナス記号(-)に変わり、hr_connアイコンの下に「表」、「ビュー」、「索引」などの項目があるスキーマ・オブジェクト・タイプのリストが表示されます(マイナス記号をクリックすると、hr_connの情報が閉じます。マイナス記号はプラス記号に変わり、リストは非表示になります)。

関連項目:

2.5.2 チュートリアル: SQL DeveloperによるEMPLOYEES表のプロパティとデータの表示

このチュートリアルでは、SQL Developerを使用してHRスキーマのEMPLOYEES表のプロパティとデータを確認する方法を説明します。

注意:

HRスキーマを参照していない場合、「チュートリアル: SQL DeveloperによるHRスキーマ・オブジェクトの表示」の手順を実行してから、このチュートリアルに戻ってください。

EMPLOYEES表のプロパティとデータを表示するには、次の手順を実行します。

  1. 「接続情報」フレームで、「表」を展開します。

    「表」,の下に、HRスキーマにある表のリストが表示されます。

  2. EMPLOYEESを選択します。

    Oracle SQL Developerウィンドウの右側フレームの「列」ペインに、この表にあるすべての列のリストが表示されます。各列の右側に、名前やデータ型などのプロパティがあります。(列のすべてのプロパティを参照するには、水平スクロール・バーを右に動かします。)

  3. 右側のフレームで、「データ」タブをクリックします。

    「データ」ペインが表示され、この表にあるすべてのレコードの番号付きリストが表示されます。(さらにレコードを参照するには、垂直スクロール・バーを下へ移動します。さらにレコードの列を参照するには、水平スクロール・バーを右へ移動します。)

  4. 右側のフレームで、「制約」タブをクリックします。

    「制約」ペインが表示され、この表に対するすべての制約のリストが表示されます。各制約の右側には、名前、型、検索条件などのプロパティがあります。(制約のすべてのプロパティを参照するには、水平スクロール・バーを右へ動かします。)

  5. 適切なタブをクリックして、他のプロパティを参照します。

    EMPLOYEES表を作成するためのSQL文を確認するには、「SQL」タブをクリックします。SQL文は、EMPLOYEESという名前のペインに表示されます。このペインを閉じるには、名前EMPLOYEESの右のxをクリックします。

関連項目:

SQL Developerユーザー・インタフェースの詳細は、『Oracle SQL Developerユーザーズ・ガイド』を参照してください

2.6 表データの選択

注意:

この項のチュートリアルおよび例を実行するには、ユーザーHRとしてSQL DeveloperからOracle Databaseに接続する必要があります。手順は、「ユーザーHRとしてのSQL DeveloperからOracle Databaseへの接続」を参照してください。

2.6.1 問合せについて

問合せ、つまりSQLのSELECT文は、1つ以上の表またはビューからデータを選択します。

最も単純な形式の問合せは、次のような構文を持ちます。

SELECT select_list FROM source_list

select_listは、データが選択される列を指定し、source_listは、それらの列を含む表またはビューを指定します。

別のSQL文内にネストされた問合せは、副問合せと呼ばれます。

SQL*Plus環境では、SQL>プロンプトで問合せ(またはその他の任意のSQL文)を入力できます。

SQL Developer環境では、ワークシートで問合せ(またはその他の任意のSQL文)を入力できます。

注意:

問合せ結果が表示されるとき、ORDER BY句で順序を指定しないかぎり、レコードを任意の順序で表示できます。詳細は、「選択されたデータのソート」を参照してください。

関連項目:

2.6.2 SQL Developerにおける問合せの実行

この項では、ワークシートを使用してSQL Developerで問合せを実行する方法を説明します。

注意:

ワークシートは問合せに限定されておらず、任意のSQL文の実行に使用できます。

SQL Developerにおいて問合せを実行するには、次の手順を実行します。

  1. SQL Developerの右側のフレームに、hr_connペインが表示されます。

    1. 「ワークシート」サブペインが表示されない場合は、「ワークシート」タブをクリックします。

    2. 手順4に進みます。

  2. 「SQLワークシート」アイコンをクリックします。

  3. 「接続の選択」ウィンドウが開かれた場合は、次のようにします。

    1. 「接続」 フィールドの値がhr_connではない場合は、メニューからその値を選択します。

    2. 「OK」をクリックします。

    ペインに、hr_connというラベルのタブと、「ワークシート」および「クエリー・ビルダー」という2つのサブペインが表示されます。ワークシートにはSQL文を入力できます。

  4. ワークシートに問合せ(SELECT文)を入力します。

  5. 「文の実行」アイコンをクリックします。

    問合せが実行されます。ワークシートの下に「問合せ結果」 ペインが表示され、問合せの結果が表示されます。

  6. 「hr_conn」タブの下で、「クリア」アイコンをクリックします。

    問合せが消去され、ワークシートに別のSQL文を入力できます。別のSQL文を実行すると、その結果が前に実行したSQL文の結果のかわりに「問合せ結果」ペインに表示されます。

関連項目:

SQL Developerでのワークシートの使用の詳細は、『Oracle SQL Developerユーザーズ・ガイド』を参照してください。

2.6.3 チュートリアル: 表のすべての列の選択

このチュートリアルは、EMPLOYEES表の列を選択する方法を示します。

EMPLOYEES表のすべての列を選択するには、次の手順を実行します。

  1. hr_connというタブが含まれるペインがあれば、それを選択します。そうでない場合は、「SQL Developerにおける問合せの実行」にあるように、「SQLワークシート」アイコンをクリックします。
  2. ワークシートに、次の問合せを入力します。
    SELECT * FROM EMPLOYEES;
  3. 「文の実行」アイコンをクリックします。

    問合せが実行されます。ワークシートの下に「問合せ結果」ペインが表示され、EMPLOYEES表のすべての列が表示されます。

注意:

パスワードやクレジット・カード情報などの機密データを保存する列が含まれる表でSELECT *を使用する場合は十分に注意してください。

関連項目:

SQL Developerで表データを表示する他の方法の詳細は、「チュートリアル: SQL DeveloperによるEMPLOYEES表のプロパティとデータの表示」を参照してください。

2.6.4 チュートリアル: 表の特定の列の選択

このチュートリアルでは、EMPLOYEES表のFIRST_NAME列、LAST_NAME列およびDEPARTMENT_ID列のみを選択する方法を示します。

FIRST_NAME、LAST_NAMEおよびDEPARTMENT_IDのみを選択するには、次の手順を実行します。

  1. hr_connというタブが含まれるペインがあれば、それを選択します。そうでない場合は、「SQL Developerにおける問合せの実行」にあるように、「SQLワークシート」アイコンをクリックします。
  2. 「ワークシート」ペインに問合せが含まれている場合、「クリア」アイコンをクリックして問合せを消去します。
  3. ワークシートに、次の問合せを入力します。
    SELECT FIRST_NAME, LAST_NAME, DEPARTMENT_ID FROM EMPLOYEES;
  4. 「文の実行」アイコンをクリックします。

    問合せが実行されます。ワークシートの下に「問合せ結果」ペインが表示され、次のような問合せの結果が表示されます。

    FIRST_NAME           LAST_NAME                 DEPARTMENT_ID
    -------------------- ------------------------- -------------
    Donald               OConnell                             50
    Douglas              Grant                                50
    Jennifer             Whalen                               10
    Michael              Hartstein                            20
    Pat                  Fay                                  20
    Susan                Mavris                               40
    Hermann              Baer                                 70
    Shelley              Higgins                             110
    William              Gietz                               110
    Steven               King                                 90
    Neena                Kochhar                              90
     
    FIRST_NAME           LAST_NAME                 DEPARTMENT_ID
    -------------------- ------------------------- -------------
    Lex                  De Haan                              90
    ...
    Kevin                Feeney                               50
     
    107 rows selected.

2.6.5 新規のヘッダーの下での選択された列の表示

問合せ結果を表示する際のデフォルトの列ヘッダーは、列の名前です。新規のヘッダーの下に列が表示されるようにするには、列名の直後に新規のヘッダー(別名)を指定します。別名により、問合せの期間に対する列名が変更されますが、データベース内の対応する名前は変更されません。

例2-5の問合せは、「チュートリアル: 表の特定の列の選択」の問合せと同じ列を選択しますが、列の別名も指定します。別名が二重引用符で囲まれていないので、大文字で表示されます。

列の別名を二重引用符で囲むと、例2-6のように、大/小文字の区別が保持され、別名に空白を使用することも可能です。

関連項目:

列の別名(c_alias)を含むSELECT文の詳細は、『Oracle Database SQL言語リファレンス』を参照してください。

例2-5 新規のヘッダーの下での選択された列の表示

SELECT FIRST_NAME First, LAST_NAME last, DEPARTMENT_ID DepT
FROM EMPLOYEES;

結果は次のようになります。

FIRST                LAST                            DEPT
-------------------- ------------------------- ----------
Donald               OConnell                          50
Douglas              Grant                             50
Jennifer             Whalen                            10
Michael              Hartstein                         20
Pat                  Fay                               20
Susan                Mavris                            40
Hermann              Baer                              70
Shelley              Higgins                          110
William              Gietz                            110
Steven               King                              90
Neena                Kochhar                           90
 
FIRST                LAST                            DEPT
-------------------- ------------------------- ----------
Lex                  De Haan                           90
...
Kevin                Feeney                            50
 
107 rows selected.

例2-6 列の別名における大/小文字の区別の保持および空白の使用

SELECT FIRST_NAME "Given Name", LAST_NAME "Family Name"
FROM EMPLOYEES;

結果は次のようになります。

Given Name           Family Name
-------------------- -------------------------
Donald               OConnell
Douglas              Grant
Jennifer             Whalen
Michael              Hartstein
Pat                  Fay
Susan                Mavris
Hermann              Baer
Shelley              Higgins
William              Gietz
Steven               King
Neena                Kochhar
 
Given Name           Family Name
-------------------- -------------------------
Lex                  De Haan
...
Kevin                Feeney
 
107 rows selected.

2.6.6 指定された条件を満たすデータの選択

指定された条件に一致するデータのみを選択するには、SELECT文にWHERE句を含めます。

WHERE句には、任意のSQL条件を使用できます(SQL条件の詳細は、『Oracle Database SQL言語リファレンス』を参照してください)。

例2-7の問合せは、部門90に所属する従業員のデータのみを選択します。

部門100、110および120の従業員のデータのみを選択する場合は、このWHERE句を使用します。

WHERE DEPARTMENT_ID IN (100, 110, 120);

例2-8の問合せは、姓が「Ma」で始まる従業員のデータのみを選択します。

姓にmaが含まれる従業員のデータのみを選択する場合は、このWHERE句を使用します。

WHERE LAST_NAME LIKE '%ma%';

例2-9の問合せは、給与が少なくとも11000であり、かつ歩合率がNULLではないという2つの条件をテストします。

関連項目:

例2-7 1つの部門からのデータの選択

SELECT FIRST_NAME, LAST_NAME, DEPARTMENT_ID
FROM EMPLOYEES
WHERE DEPARTMENT_ID = 90;

結果は次のようになります。

FIRST_NAME           LAST_NAME                 DEPARTMENT_ID
-------------------- ------------------------- -------------
Steven               King                                 90
Neena                Kochhar                              90
Lex                  De Haan                              90
3 rows selected.

例2-8 同じ部分文字列で始まる姓を持つデータの選択

SELECT FIRST_NAME, LAST_NAME
FROM EMPLOYEES
WHERE LAST_NAME LIKE 'Ma%';

結果は次のようになります。

FIRST_NAME           LAST_NAME
-------------------- -------------------------
Jason                Mallin
Steven               Markle
James                Marlow
Mattea               Marvins
Randall              Matos
Susan                Mavris
 
6 rows selected.

例2-9 2つの条件を満たすデータの選択

SELECT FIRST_NAME, LAST_NAME, SALARY, COMMISSION_PCT "%"
FROM EMPLOYEES
WHERE (SALARY >= 11000) AND (COMMISSION_PCT IS NOT NULL);

結果は次のようになります。

FIRST_NAME           LAST_NAME                     SALARY          %
-------------------- ------------------------- ---------- ----------
John                 Russell                        14000         .4
Karen                Partners                       13500         .3
Alberto              Errazuriz                      12000         .3
Gerald               Cambrault                      11000         .3
Lisa                 Ozer                           11500        .25
Ellen                Abel                           11000         .3
 
6 rows selected.

2.6.7 選択されたデータのソート

問合せの結果を表示する場合に、ORDER BY句で順序を指定しないと、レコードは任意の順序になります。

例2-10の問合せの結果は、LAST_NAMEを基準に昇順(デフォルト)でソートされます。

また、SQL Developerでは、ORDER BY句を省略し、列の名前をダブルクリックしてソートすることもできます。

例2-11に示すように、ソート基準を選択リストに含める必要はありません。

関連項目:

ORDER BY句を含むSELECT文の詳細は、『Oracle Database SQL言語リファレンス』を参照してください。

例2-10 LAST_NAMEによる選択されたデータのソート

SELECT FIRST_NAME, LAST_NAME, HIRE_DATE
FROM EMPLOYEES
ORDER BY LAST_NAME;

結果:

FIRST_NAME           LAST_NAME                 HIRE_DATE
-------------------- ------------------------- ---------
Ellen                Abel                      11-MAY-04
Sundar               Ande                      24-MAR-08
Mozhe                Atkinson                  30-OCT-05
David                Austin                    25-JUN-05
Hermann              Baer                      07-JUN-02
Shelli               Baida                     24-DEC-05
Amit                 Banda                     21-APR-08
Elizabeth            Bates                     24-MAR-07
...
FIRST_NAME           LAST_NAME                 HIRE_DATE
-------------------- ------------------------- ---------
Jose Manuel          Urman                     07-MAR-06
Peter                Vargas                    09-JUL-06
Clara                Vishney                   11-NOV-05
Shanta               Vollman                   10-OCT-05
Alana                Walsh                     24-APR-06
Matthew              Weiss                     18-JUL-04
Jennifer             Whalen                    17-SEP-03
Eleni                Zlotkey                   29-JAN-08

107 rows selected

例2-11 選択対象ではない列による選択されたデータのソート

SELECT FIRST_NAME, HIRE_DATE
FROM EMPLOYEES
ORDER BY LAST_NAME;

結果:

FIRST_NAME           HIRE_DATE
-------------------- ---------
Ellen                11-MAY-04
Sundar               24-MAR-08
Mozhe                30-OCT-05
David                25-JUN-05
Hermann              07-JUN-02
Shelli               24-DEC-05
Amit                 21-APR-08
Elizabeth            24-MAR-07
...
FIRST_NAME           HIRE_DATE
-------------------- ---------
Jose Manuel          07-MAR-06
Peter                09-JUL-06
Clara                11-NOV-05
Shanta               10-OCT-05
Alana                24-APR-06
Matthew              18-JUL-04
Jennifer             17-SEP-03
Eleni                29-JAN-08
 
107 rows selected.

2.6.8 複数の表からのデータの選択

複数の表からデータを選択するには、結合と呼ばれる問合せを使用します。結合の表は少なくとも1つの列名を共有している必要があります。

すべての従業員のFIRST_NAME、LAST_NAMEおよびDEPARTMENT_NAMEを選択する場合を考えます。FIRST_NAMEおよびLAST_NAMEはEMPLOYEES表にあり、DEPARTMENT_NAMEはDEPARTMENTS表にあります。どちらの表にもDEPARTMENT_IDがあります。この場合、例2-12の問合せを使用できます。

表名の修飾子は、結合の一方の表にしかない列名ではオプションですが、両方の表にある列名では必須です。次の問合せは、例2-12の問合せと同等です。

SELECT FIRST_NAME "First",
LAST_NAME "Last",
DEPARTMENT_NAME "Dept. Name"
FROM EMPLOYEES, DEPARTMENTS
WHERE EMPLOYEES.DEPARTMENT_ID = DEPARTMENTS.DEPARTMENT_ID
ORDER BY DEPARTMENT_NAME, LAST_NAME;

修飾子付きの列名を使用する問合せをより読みやすくするには、次の例に示すように表の別名を使用します。

SELECT FIRST_NAME "First",
LAST_NAME "Last",
DEPARTMENT_NAME "Dept. Name"
FROM EMPLOYEES e, DEPARTMENTS d
WHERE e.DEPARTMENT_ID = d.DEPARTMENT_ID
ORDER BY d.DEPARTMENT_NAME, e.LAST_NAME;

FROM句で別名を作成するのではなく、次の例のように、問合せの中で先に作成することも可能です。

SELECT e.FIRST_NAME "First",
e.LAST_NAME "Last",
d.DEPARTMENT_NAME "Dept. Name"
FROM EMPLOYEES e, DEPARTMENTS d
WHERE e.DEPARTMENT_ID = d.DEPARTMENT_ID
ORDER BY d.DEPARTMENT_NAME, e.LAST_NAME;

関連項目:

結合の詳細は、『Oracle Database SQL言語リファレンス』を参照してください。

例2-12 2つの表からのデータの選択(2つの表の結合)

SELECT EMPLOYEES.FIRST_NAME "First",
EMPLOYEES.LAST_NAME "Last",
DEPARTMENTS.DEPARTMENT_NAME "Dept. Name"
FROM EMPLOYEES, DEPARTMENTS
WHERE EMPLOYEES.DEPARTMENT_ID = DEPARTMENTS.DEPARTMENT_ID
ORDER BY DEPARTMENTS.DEPARTMENT_NAME, EMPLOYEES.LAST_NAME;
 

結果:

First                Last                      Dept. Name                       
-------------------- ------------------------- ------------------------------   
William              Gietz                     Accounting                       
Shelley              Higgins                   Accounting                       
Jennifer             Whalen                    Administration                   
Lex                  De Haan                   Executive                        
Steven               King                      Executive                        
Neena                Kochhar                   Executive                        
John                 Chen                      Finance                          
...
Jose Manuel          Urman                     Finance                          
Susan                Mavris                    Human Resources                  
David                Austin                    IT                               
...
Valli                Pataballa                 IT                               
Pat                  Fay                       Marketing                        
Michael              Hartstein                 Marketing                        
Hermann              Baer                      Public Relations                 
Shelli               Baida                     Purchasing                       
...
Sigal                Tobias                    Purchasing                       
Ellen                Abel                      Sales                            
...
Eleni                Zlotkey                   Sales                            
Mozhe                Atkinson                  Shipping                         
...
Matthew              Weiss                     Shipping                         
 
106 rows selected.

2.6.9 問合せにおける演算子およびファンクションの使用

問合せのselect_listには、SQL演算子およびSQLファンクションを含むSQL式が含まれます。これらの演算子およびファンクションは、オペランドおよび引数として表データを持つことが可能です。SQL式を評価して、得られた値が問合せの結果に表示されます。

関連項目:

2.6.9.1 問合せにおける算術演算子の使用

基本的な算術演算子として+(加算)、-(減算)、*(乗算)および/(除算)を列値で操作します。

例2-13の問合せは、部門90に所属する各従業員のLAST_NAME、SALARY(月給)および年間賃金をSALARYの降順で表示します。

例2-13 問合せにおける演算式の使用

SELECT LAST_NAME,
SALARY "Monthly Pay",
SALARY * 12 "Annual Pay"
FROM EMPLOYEES
WHERE DEPARTMENT_ID = 90
ORDER BY SALARY DESC;

結果:

LAST_NAME                 Monthly Pay Annual Pay
------------------------- ----------- ----------
King                            24000     288000
De Haan                         17000     204000
Kochhar                         17000     204000
2.6.9.2 問合せにおける数値ファンクションの使用

数値ファンクションは入力として数値を受け取り、結果として数値を戻します。各数値ファンクションは、評価される各行に対し、値を1つ返します。

SQLでサポートされる数値ファンクションのリストと説明は、Oracle Database SQL言語リファレンスに記載されています。

例2-14の問合せは、数値ファンクションROUNDを使用して、部門100の各従業員の日給を1セント未満は四捨五入して表示します。

例2-15の問合せは、数値ファンクションTRUNCを使用して、部門100の各従業員の日給を1ドル未満は切り捨てて表示します。

関連項目:

SQL数値ファンクションの詳細は、『Oracle Database SQL言語リファレンス』を参照してください。

例2-14 数値データの四捨五入

SELECT LAST_NAME,
ROUND (((SALARY * 12)/365), 2) "Daily Pay"
FROM EMPLOYEES
WHERE DEPARTMENT_ID = 100
ORDER BY LAST_NAME;

結果:

LAST_NAME                  Daily Pay
------------------------- ----------
Chen                          269.59
Faviet                        295.89
Greenberg                     394.52
Popp                          226.85
Sciarra                       253.15
Urman                         256.44
 
6 rows selected.

例2-15 数値データの切捨て

SELECT LAST_NAME,
TRUNC ((SALARY * 12)/365) "Daily Pay"
FROM EMPLOYEES
WHERE DEPARTMENT_ID = 100
ORDER BY LAST_NAME;

結果:

LAST_NAME                  Daily Pay
------------------------- ----------
Chen                             269
Faviet                           295
Greenberg                        394
Popp                             226
Sciarra                          253
Urman                            256
 
6 rows selected.
2.6.9.3 問合せにおける連結演算子の使用

連結演算子(||)は、1番目の文字列に2番目の文字列を追加することによって、2つの文字列を1つに結合します。たとえば、'a'||'b'='ab'となります。この演算子を使用すると、2つの列または式の情報を問合せ結果の同じ列の中に結合できます。

例2-16の問合せでは、選択した各従業員の名、スペースおよび姓を連結します。

関連項目:

連結演算子の詳細は、『Oracle Database SQL言語リファレンス』を参照してください。

例2-16 文字データの連結

SELECT FIRST_NAME || ' ' || LAST_NAME "Name"
FROM EMPLOYEES
WHERE DEPARTMENT_ID = 100
ORDER BY LAST_NAME;

結果:

Name
----------------------------------------------
John Chen
Daniel Faviet
Nancy Greenberg
Luis Popp
Ismael Sciarra
Jose Manuel Urman
 
6 rows selected.
2.6.9.4 問合せにおける文字ファンクションの使用

文字ファンクションは、文字の入力を受け取ります。多くは文字の値を返しますが、数値を返すものもあります。各文字ファンクションは、評価される各行に対し、値を1つ返します。

SQLでサポートされる文字ファンクションのリストと説明は、Oracle Database SQL言語リファレンスに記載されています。

UPPERINITCAPおよびLOWERファンクションは文字引数をそれぞれ、すべて大文字、頭文字のみ大文字および、すべて小文字で表示します。

例2-17の問合せは、LAST_NAMEを大文字で、FIRST_NAMEは頭文字を大文字で他は小文字で、EMAILを小文字で表示します。

関連項目:

SQL文字ファンクションの詳細は、『Oracle Database SQL言語リファレンス』を参照してください。

例2-17 文字データの大/小文字の変更

SELECT UPPER(LAST_NAME) "Last",
INITCAP(FIRST_NAME) "First",
LOWER(EMAIL) "E-Mail"
FROM EMPLOYEES
WHERE DEPARTMENT_ID = 100
ORDER BY EMAIL;

結果:

Last                      First                E-Mail
------------------------- -------------------- -------------------------
FAVIET                    Daniel               dfaviet
SCIARRA                   Ismael               isciarra
CHEN                      John                 jchen
URMAN                     Jose Manuel          jmurman
POPP                      Luis                 lpopp
GREENBERG                 Nancy                ngreenbe
 
6 rows selected.
2.6.9.5 問合せにおける日付ファンクションの使用

日時ファンクションは、DATE、タイムスタンプ、間隔の値を操作します。各日付ファンクションは、評価される各行に対し、値を1つ返します。

SQLでサポートされる日付ファンクションのリストと説明は、Oracle Database SQL言語リファレンスに記載されています。

DATEおよびタイムスタンプの値として、Oracle Databaseには、次の情報が格納されています。

  • Year

  • Month

  • Date

  • Hour

  • Minute

  • Second

    タイムスタンプの値として、Oracle Databaseには、指定した精度の秒の小数部分も格納されます。また、タイムゾーンを格納するには、データ型TIMESTAMP WITH TIME ZONEまたはTIMESTAMP WITH LOCAL TIME ZONEを使用します。

DATEデータ型の詳細は、『Oracle Database SQL言語リファレンス』を参照してください。

TIMESTAMPデータ型の詳細は、『Oracle Database SQL言語リファレンス』を参照してください。

その他のタイムスタンプ・データ型および間隔データ型の詳細は、『Oracle Database SQL言語リファレンス』を参照してください。

例2-18の問合せは、EXTRACTおよびSYSDATEファンクションを使用して、部門100の各従業員が何年間雇用されているかを表示します。SYSDATEファンクションは、システム・クロックの現在日時をDATE値として返します。SYSDATEファンクションの詳細は、『Oracle Database SQL言語リファレンス』を参照してください。EXTRACTファンクションの詳細は、『Oracle Database SQL言語リファレンス』を参照してください。

例2-19の問合せは、SYSTIMESTAMPファンクションを使用して、現在のシステム日付と時間を表示します。SYSTIMESTAMPファンクションは、TIMESTAMP値を返します。SYSTIMESTAMPファンクションの詳細は、『Oracle Database SQL言語リファレンス』を参照してください。

問合せのFROM句内のDUAL表は、Oracle Databaseがデータ・ディクショナリとともに自動的に作成する1行の表です。 SELECT文を使用して定数式を計算する場合は、DUALから選択します。 DUALには行が1つしかないため、定数が返されるのは1回のみです。DUALからの選択の詳細は、『Oracle Database SQL言語リファレンス』を参照してください。

関連項目:

SQL日付ファンクションの詳細は、『Oracle Database SQL言語リファレンス』を参照してください。

例2-18 日付間の年数の表示

SELECT LAST_NAME,
(EXTRACT(YEAR FROM SYSDATE) - EXTRACT(YEAR FROM HIRE_DATE)) "Years Employed"
FROM EMPLOYEES
WHERE DEPARTMENT_ID = 100
ORDER BY "Years Employed";

結果:

LAST_NAME                 Years Employed
------------------------- --------------
Popp                                   5
Urman                                  6
Chen                                   7
Sciarra                                7
Greenberg                             10
Faviet                                10
 
6 rows selected.

例2-19 システム日付および時間の表示

SELECT EXTRACT(HOUR FROM SYSTIMESTAMP) || ':' ||
EXTRACT(MINUTE FROM SYSTIMESTAMP) || ':' ||
ROUND(EXTRACT(SECOND FROM SYSTIMESTAMP), 0) || ', ' ||
EXTRACT(MONTH FROM SYSTIMESTAMP) || '/' ||
EXTRACT(DAY FROM SYSTIMESTAMP) || '/' ||
EXTRACT(YEAR FROM SYSTIMESTAMP) "System Time and Date"
FROM DUAL;

結果は、現在のSYSTIMESTAMPの値に依存しますが、次の形式で表示されます。

System Time and Date
-------------------------------------------------------------------
18:17:53, 12/27/2012
2.6.9.6 問合せにおける変換ファンクションの使用

変換ファンクションは、あるデータ型を別のデータ型に変換します。

SQLでサポートされる変換ファンクションのリストと説明は、Oracle Database SQL言語リファレンスに記載されています。

例2-20の問合せは、TO_CHARファンクションを使用して、HIRE_DATE値(DATE型)をFMMonth DD YYYY 書式の文字値に変換します。 FMは、月名から先頭と末尾の空白を削除します。FMMonth DD YYYYは、日付時間書式モデルの一例です。日付時間書式モデルの詳細は、『Oracle Database SQL言語リファレンス』を参照してください。

例2-21の問合せは、TO_NUMBERファンクションを使用して、POSTAL_CODE値(VARCHAR2型)を、計算で使用するNUMBER型の値に変換します。

関連項目:

例2-20 日付から文字列への書式テンプレートを使用した変換

SELECT LAST_NAME,
HIRE_DATE,
TO_CHAR(HIRE_DATE, 'FMMonth DD YYYY') "Date Started"
FROM EMPLOYEES
WHERE DEPARTMENT_ID = 100
ORDER BY LAST_NAME;

結果:

LAST_NAME                 HIRE_DATE Date Started
------------------------- --------- -----------------
Chen                      28-SEP-05 September 28 2005
Faviet                    16-AUG-02 August 16 2002
Greenberg                 17-AUG-02 August 17 2002
Popp                      07-DEC-07 December 7 2007
Sciarra                   30-SEP-05 September 30 2005
Urman                     07-MAR-06 March 7 2006
 
6 rows selected.

例2-21 文字列から数値への変換

SELECT CITY,
POSTAL_CODE "Old Code",
TO_NUMBER(POSTAL_CODE) + 1 "New Code"
FROM LOCATIONS
WHERE COUNTRY_ID = 'US'
ORDER BY POSTAL_CODE;

結果:

CITY                           Old Code       New Code
------------------------------ ------------ ----------
Southlake                      26192             26193
South Brunswick                50090             50091
Seattle                        98199             98200
South San Francisco            99236             99237
 
4 rows selected.
2.6.9.7 問合せにおける集計ファンクションの使用

集計ファンクションは、行のグループを取得し、単一の結果行を返します。行のグループは表またはビュー全体です。

SQLでサポートされる集計ファンクションのリストと説明は、Oracle Database SQL言語リファレンスに記載されています。

集計ファンクションは、1つまたは複数の列ごとに問合せ結果をグループ化するGROUP BY句を各グループの結果ともに使用する場合に、特に有効です。

例2-22の問合せは、COUNTファンクションおよびGROUP BY句を使用して、各マネージャに対してレポートする人数を表示します。ワイルドカード文字*は、レコード全体を表します。

例2-22は、従業員の1人がマネージャにレポートしないことを示しています。次の問合せは、その従業員の名、姓および役職を選択します。

COLUMN FIRST_NAME FORMAT A10;
COLUMN LAST_NAME FORMAT A10;
COLUMN JOB_TITLE FORMAT A10;
 
SELECT e.FIRST_NAME,
e.LAST_NAME,
j.JOB_TITLE
FROM EMPLOYEES e, JOBS j
WHERE e.JOB_ID = j.JOB_ID
AND MANAGER_ID IS NULL;

結果:

FIRST_NAME LAST_NAME  JOB_TITLE
---------- ---------- ----------
Steven     King       President

問合せで、集計値が指定された条件を満たす行のみを返すには、問合せのHAVING句で集計ファンクションを使用します。

例2-23の問合せは、毎年給与に$1,000,000を超える額を費やしている部門の部門と給与額を表示します。

例2-24の問合せは、複数の集計ファンクションを使用して、各JOB_IDの給与の統計を表示します。

関連項目:

SQL集計ファンクションの詳細は、『Oracle Database SQL言語リファレンス』を参照してください。

例2-22 各グループの行数のカウント

SELECT MANAGER_ID "Manager",
COUNT(*) "Number of Reports"
FROM EMPLOYEES
GROUP BY MANAGER_ID
ORDER BY MANAGER_ID;

結果:

   Manager Number of Reports
---------- -----------------
       100                14
       101                 5
       102                 1
       103                 4
       108                 5
       114                 5
       120                 8
       121                 8
       122                 8
       123                 8
       124                 8
       145                 6
       146                 6
       147                 6
       148                 6
       149                 6
       201                 1
       205                 1
                           1
 
19 rows selected.

例2-23 条件を満たす行への集計ファンクションの制限

SELECT DEPARTMENT_ID "Department",
SUM(SALARY*12) "All Salaries"
FROM EMPLOYEES
HAVING SUM(SALARY * 12) >= 1000000
GROUP BY DEPARTMENT_ID;

結果:

Department All Salaries
---------- ------------
        50      1876800
        80      3654000

例2-24 統計情報を得るための集計ファンクションの使用

SELECT JOB_ID,
COUNT(*) "#",
MIN(SALARY) "Minimum",
ROUND(AVG(SALARY), 0) "Average",
MEDIAN(SALARY) "Median",
MAX(SALARY) "Maximum",
ROUND(STDDEV(SALARY)) "Std Dev"
FROM EMPLOYEES
GROUP BY JOB_ID
ORDER BY JOB_ID;

結果:

JOB_ID              #    Minimum    Average     Median    Maximum    Std Dev
---------- ---------- ---------- ---------- ---------- ---------- ----------
AC_ACCOUNT          1       8300       8300       8300       8300          0
AC_MGR              1      12008      12008      12008      12008          0
AD_ASST             1       4400       4400       4400       4400          0
AD_PRES             1      24000      24000      24000      24000          0
AD_VP               2      17000      17000      17000      17000          0
FI_ACCOUNT          5       6900       7920       7800       9000        766
FI_MGR              1      12008      12008      12008      12008          0
HR_REP              1       6500       6500       6500       6500          0
IT_PROG             5       4200       5760       4800       9000       1926
MK_MAN              1      13000      13000      13000      13000          0
MK_REP              1       6000       6000       6000       6000          0
PR_REP              1      10000      10000      10000      10000          0
PU_CLERK            5       2500       2780       2800       3100        239
PU_MAN              1      11000      11000      11000      11000          0
SA_MAN              5      10500      12200      12000      14000       1525
SA_REP             30       6100       8350       8200      11500       1524
SH_CLERK           20       2500       3215       3100       4200        548
ST_CLERK           20       2100       2785       2700       3600        453
ST_MAN              5       5800       7280       7900       8200       1066
 
19 rows selected.
2.6.9.8 問合せにおけるNULL関連ファンクションの使用

NULL関連ファンクションは、NULL値の処理を容易にします。

SQLがサポートするNULL関連ファンクションのリストと説明については、『Oracle Database SQL言語リファレンス』を参照してください。

例2-25の問合せは、姓がBで始まる従業員の姓と歩合を返します。従業員が歩合を受け取らない場合(つまり、COMMISSION_PCTがNULLの場合)、NVLファンクションは、NULLを"Not Applicable"で置換します。

例2-26の問合せは、NVL2ファンクションを使用して、姓がBで始まる従業員の姓、給与および収入を返します(COMMISSION_PCTがNULLでない場合、収入は給与と歩合の合計であり、COMMISSION_PCTがNULLの場合、収入は給与のみです)。

関連項目:

例2-25 文字列によるNULL値の置換

SELECT LAST_NAME,
NVL(TO_CHAR(COMMISSION_PCT), 'Not Applicable') "COMMISSION"
FROM EMPLOYEES
WHERE LAST_NAME LIKE 'B%'
ORDER BY LAST_NAME; 

結果:

LAST_NAME                 COMMISSION
------------------------- ----------------------------------------
Baer                      Not Applicable
Baida                     Not Applicable
Banda                     .1
Bates                     .15
Bell                      Not Applicable
Bernstein                 .25
Bissot                    Not Applicable
Bloom                     .2
Bull                      Not Applicable
 
9 rows selected.

例2-26 NULL値と非NULL値に対する異なる式の指定

SELECT LAST_NAME, SALARY,
NVL2(COMMISSION_PCT, SALARY + (SALARY * COMMISSION_PCT), SALARY) INCOME
FROM EMPLOYEES WHERE LAST_NAME LIKE 'B%'
ORDER BY LAST_NAME;

結果:

LAST_NAME                     SALARY     INCOME
------------------------- ---------- ----------
Baer                           10000      10000
Baida                           2900       2900
Banda                           6200       6820
Bates                           7300       8395
Bell                            4000       4000
Bernstein                       9500      11875
Bissot                          3300       3300
Bloom                          10000      12000
Bull                            4100       4100
 
9 rows selected.
2.6.9.9 問合せにおけるCASE式の使用

CASE式を使用すると、サブプログラムを呼び出すことなく、SQL文でIF ... THEN ... ELSE論理を使用できます。CASE式には、単純と検索の2種類あります。

例2-27の問合せは、単純CASE式を使用し、各国コードの国名を表示します。

例2-28の問合せは、検索CASE式を使用して、勤続年数に基づいて推奨される給与の値上げ(15%、10%、5%または0%)を表示します。

関連項目:

例2-27 問合せでの単純CASE式の使用

SELECT UNIQUE COUNTRY_ID ID,
       CASE COUNTRY_ID
         WHEN 'AU' THEN 'Australia'
         WHEN 'BR' THEN 'Brazil'
         WHEN 'CA' THEN 'Canada'
         WHEN 'CH' THEN 'Switzerland'
         WHEN 'CN' THEN 'China'
         WHEN 'DE' THEN 'Germany'
         WHEN 'IN' THEN 'India'
         WHEN 'IT' THEN 'Italy'
         WHEN 'JP' THEN 'Japan'
         WHEN 'MX' THEN 'Mexico'
         WHEN 'NL' THEN 'Netherlands'
         WHEN 'SG' THEN 'Singapore'
         WHEN 'UK' THEN 'United Kingdom'
         WHEN 'US' THEN 'United States'
       ELSE 'Unknown'
       END COUNTRY
FROM LOCATIONS
ORDER BY COUNTRY_ID;

結果:

ID COUNTRY
-- --------------
AU Australia
BR Brazil
CA Canada
CH Switzerland
CN China
DE Germany
IN India
IT Italy
JP Japan
MX Mexico
NL Netherlands
SG Singapore
UK United Kingdom
US United States
 
14 rows selected.

例2-28 問合せでの検索CASE式の使用

SELECT LAST_NAME "Name",
HIRE_DATE "Started",
SALARY "Salary",
CASE
  WHEN HIRE_DATE < TO_DATE('01-Jan-03', 'dd-mon-yy')
    THEN TRUNC(SALARY*1.15, 0)
  WHEN HIRE_DATE >= TO_DATE('01-Jan-03', 'dd-mon-yy') AND
       HIRE_DATE < TO_DATE('01-Jan-06', 'dd-mon-yy')
    THEN TRUNC(SALARY*1.10, 0)
  WHEN HIRE_DATE >= TO_DATE('01-Jan-06', 'dd-mon-yy') AND
       HIRE_DATE < TO_DATE('01-Jan-07', 'dd-mon-yy')
    THEN TRUNC(SALARY*1.05, 0)
  ELSE SALARY
END "Proposed Salary"
FROM EMPLOYEES
WHERE DEPARTMENT_ID = 100
ORDER BY HIRE_DATE;

結果:

Name                      Started       Salary Proposed Salary
------------------------- --------- ---------- ---------------
Faviet                    16-AUG-02       9000           10350
Greenberg                 17-AUG-02      12008           13809
Chen                      28-SEP-05       8200            9020
Sciarra                   30-SEP-05       7700            8470
Urman                     07-MAR-06       7800            8190
Popp                      07-DEC-07       6900            6900

6 rows selected.
2.6.9.10 問合せにおけるDECODEファンクションの使用

DECODEファンクションは、式といくつかの検索値と比較します。式の値が検索値に一致すると、DECODEは、検索値に関連付けられている結果を返します。DECODEが一致を検出しない場合、デフォルト値(指定されている場合)またはNULL(デフォルト値が指定されていない場合)が返されます。

例2-29の問合せは、DECODEファンクションを使用して、3つの異なる役職に対して推奨される給与の値上げを表示します。式はJOB_ID、検索値は'PU_CLERK'、'SH_CLERK'、'ST_CLERK'、およびデフォルト値はSALARYです。

注意:

DECODEファンクションの引数は、任意のSQL数値型または文字型です。式および各検索値は、比較の前に最初の検索値のデータ型に自動的に変換されます。戻り値は、最初の結果と同じデータ型に自動的に変換されます。最初の結果がデータ型CHARの場合、または最初の結果がNULLの場合、戻り値はデータ型VARCHAR2に変換されます。

関連項目:

例2-29 問合せにおけるDECODEファンクションの使用

SELECT LAST_NAME, JOB_ID, SALARY,
DECODE(JOB_ID,
  'PU_CLERK', SALARY * 1.10,
  'SH_CLERK', SALARY * 1.15,
  'ST_CLERK', SALARY * 1.20,
  SALARY) "Proposed Salary"
FROM EMPLOYEES
WHERE JOB_ID LIKE '%_CLERK'
AND LAST_NAME < 'E'
ORDER BY LAST_NAME;

結果:

LAST_NAME                 JOB_ID         SALARY Proposed Salary
------------------------- ---------- ---------- ---------------
Atkinson                  ST_CLERK         2800            3360
Baida                     PU_CLERK         2900            3190
Bell                      SH_CLERK         4000            4600
Bissot                    ST_CLERK         3300            3960
Bull                      SH_CLERK         4100            4715
Cabrio                    SH_CLERK         3000            3450
Chung                     SH_CLERK         3800            4370
Colmenares                PU_CLERK         2500            2750
Davies                    ST_CLERK         3100            3720
Dellinger                 SH_CLERK         3400            3910
Dilly                     SH_CLERK         3600            4140
 
11 rows selected.