ヘッダーをスキップ
Oracle® Database Express Edition 2日で開発者ガイド
11g リリース2 (11.2)
B66463-01
  目次へ移動
目次
索引へ移動
索引

前
 
次
 

4 表データの選択

この章の内容は次のとおりです。


注意:

このマニュアルのチュートリアルを行うには、ユーザーHRとして、SQL DeveloperからOracle Database XEに接続している必要があります。

問合せについて

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

最も簡単な問合せの構文は、次のとおりです。

SELECT select_list FROM source_list

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

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

SQL*Plus環境では、SQL>プロンプトに続いて問合せを入力できます。

SQL Developer環境では、SQLワークシートに問合せを入力できます。


注意:

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


参照:

  • 問合せおよび副問合せの詳細は、『Oracle Database SQL言語リファレンス』を参照してください。

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

  • SQL*Plusコマンド・ライン・インタフェースの詳細は、『SQL*Plusユーザーズ・ガイドおよびリファレンス』を参照してください。

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


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

ここでは、SQL DeveloperからユーザーHRとしてOracle Database XEへ接続している場合に、問合せやその他のSQL文を(SQL Developerで)実行する方法について説明します。

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

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

    「接続の選択」ウィンドウまたは「SQLワークシート」ペインが表示されます。

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

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

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

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

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

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

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

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

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


参照:

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

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

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

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

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

  2. ワークシートに、次の問合せを入力します。

    SELECT * FROM EMPLOYEES;
    
  3. 「文の実行」アイコンをクリックします。

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


注意:

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


参照:

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

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

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

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

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

  2. ワークシートに、次の問合せを入力します。

    SELECT FIRST_NAME, LAST_NAME, DEPARTMENT_ID
    FROM EMPLOYEES;
    
  3. 「文の実行」アイコンをクリックします。

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

    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.
    

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

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

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

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

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.

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

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

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.

参照:

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

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

指定された条件に一致するデータのみを選択するには、SELECT文にWHERE句を含めます。WHERE句には、任意のSQL条件を使用できます。(SQL条件の詳細は、『Oracle Database SQL言語リファレンス』を参照してください。)

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

例4-3 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

例4-4の問合せは、部門100、110および120に所属する従業員のデータのみを選択します。

例4-4 指定された部門からのデータの選択

SELECT FIRST_NAME, LAST_NAME, DEPARTMENT_ID
FROM EMPLOYEES
WHERE DEPARTMENT_ID IN (100, 110, 120);

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

FIRST_NAME           LAST_NAME                 DEPARTMENT_ID
-------------------- ------------------------- -------------
John                 Chen                                100
Daniel               Faviet                              100
William              Gietz                               110
Nancy                Greenberg                           100
Shelley              Higgins                             110
Luis                 Popp                                100
Ismael               Sciarra                             100
Jose Manuel          Urman                               100
 
8 rows selected.

部門120に所属する従業員はいません。

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

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

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.

例4-6の問合せは、姓に「ma」を含む従業員のデータのみを選択します。

例4-6 同じ部分文字列を含む姓を持つデータの選択

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

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

FIRST_NAME           LAST_NAME
-------------------- -------------------------
Sundita              Kumar
Jose Manuel          Urman
Shanta               Vollman

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

例4-7 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.

参照:

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

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


正規表現を使用した条件の指定

「指定された条件を満たすデータの選択」で述べたように、WHERE句の条件には、任意のSQL条件を使用できます。このトピックでは、正規表現を受け入れるSQLファンクションを使用して条件を指定する方法を示します。正規表現は、検索アルゴリズムを指定するメタ文字、および文字を指定するリテラルを使用して、検索パターンを定義します。

EMPLOYEES表内のすべてのマネージャを選択する場合を考えます。マネージャのJOB_IDの末尾は、部門に応じて、'_MGR'または'_MAN'となります。このため、検索パターンは正規表現である必要があり、例4-8のようにREGEXP_LIKEファンクションを使用する必要があります。

正規表現(_m[an|gr])において、メタ文字|は、OR条件を示します。3番目のファンクション・パラメータ'i'は、大/小文字を区別しない一致を指定します。

例4-8 EMPLOYEES表のすべてのマネージャの選択

SELECT FIRST_NAME, LAST_NAME, JOB_ID
FROM EMPLOYEES
WHERE REGEXP_LIKE(JOB_ID, '(_m[an|gr])', 'i');

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

FIRST_NAME           LAST_NAME                 JOB_ID
-------------------- ------------------------- ----------
Michael              Hartstein                 MK_MAN
Shelley              Higgins                   AC_MGR
Nancy                Greenberg                 FI_MGR
Den                  Raphaely                  PU_MAN
Matthew              Weiss                     ST_MAN
Adam                 Fripp                     ST_MAN
Payam                Kaufling                  ST_MAN
Shanta               Vollman                   ST_MAN
Kevin                Mourgos                   ST_MAN
John                 Russell                   SA_MAN
Karen                Partners                  SA_MAN
 
FIRST_NAME           LAST_NAME                 JOB_ID
-------------------- ------------------------- ----------
Alberto              Errazuriz                 SA_MAN
Gerald               Cambrault                 SA_MAN
Eleni                Zlotkey                   SA_MAN
 
14 rows selected.

姓に二重母音(同じ母音が2つ続くもの)を含むすべての従業員を選択する場合を考えます。例4-9に、その方法を示します。

正規表現([AEIOU])は任意の母音を表します。メタ文字\1は、最初の(この場合は唯一の)正規表現を表します。3番目のファンクション・パラメータ'i'は、大/小文字を区別しない一致を指定します。

例4-9 姓に二重母音を含むすべての従業員の選択

SELECT FIRST_NAME, LAST_NAME
FROM EMPLOYEES
WHERE REGEXP_LIKE(LAST_NAME, '([AEIOU])\1', 'i');

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

FIRST_NAME           LAST_NAME
-------------------- -------------------------
Harrison             Bloom
Lex                  De Haan
Kevin                Feeney
Ki                   Gee
Nancy                Greenberg
Danielle             Greene
Alexander            Khoo
David                Lee
 
8 rows selected.

表示された問合せ結果において、nnn.nnn.nnnnの形式で格納された電話番号を同等の形式(nnn) nnn-nnnnに置換する場合を考えます。例4-10のように、検索パターン(格納形式)に正規表現を使用し、さらに、置換文字列(表示形式)にそれらの正規表現への参照を使用して、REGEXP_REPLACEファンクションを使用します。

検索パターンには3つの正規表現が含まれ、それぞれが丸括弧で囲まれています。メタ文字[[:digit:]]は数字を表し、メタ文字{n}n回発生することを指定し、メタ文字\はエスケープ文字です。エスケープ文字の直後の文字は、リテラルと解釈されます。エスケープ文字がない場合、メタ文字.は任意の文字を表します。

置換文字列は、1番目、2番目および3番目の正規表現を表すのに、\1\2および\3を使用します。(置換文字列において、\はエスケープ文字ではありません。)

例4-10 別の形式での電話番号の表示

SELECT PHONE_NUMBER "Old Format",
REGEXP_REPLACE(PHONE_NUMBER,
'([[:digit:]]{3})\.([[:digit:]]{3})\.([[:digit:]]{4})',
'(\1) \2-\3') "New Format"
FROM EMPLOYEES
WHERE DEPARTMENT_ID = 90;

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

Old Format          New Format
-------------------- ---------------------------------------------------------
515.123.4567         (515) 123-4567
515.123.4568         (515) 123-4568
515.123.4569         (515) 123-4569

LOCATIONS表の各STREET_ADDRESSから、番地番号を抽出するとします。一部の番地番号にはハイフンが含まれるため、例4-11に示すように、検索パターンに正規表現を使用し、REGEXP_SUBSTRファンクションを使用する必要があります。

例4-11 各STREET_ADDRESSからの番地番号の抽出

COLUMN Number FORMAT A8
SELECT STREET_ADDRESS "Address",
REGEXP_SUBSTR(STREET_ADDRESS, '[[:digit:]-]+') "Number"
FROM LOCATIONS;
COLUMN Number CLEAR

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

Address                                  Number
---------------------------------------- --------
1297 Via Cola di Rie                     1297
93091 Calle della Testa                  93091
2017 Shinjuku-ku                         2017
9450 Kamiya-cho                          9450
2014 Jabberwocky Rd                      2014
2011 Interiors Blvd                      2011
2007 Zagora St                           2007
2004 Charade Rd                          2004
147 Spadina Ave                          147
6092 Boxwood St                          6092
40-5-12 Laogianggen                      40-5-12
 
Address                                  Number
---------------------------------------- --------
1298 Vileparle (E)                       1298
12-98 Victoria Street                    12-98
198 Clementi North                       198
8204 Arthur St                           8204
Magdalen Centre, The Oxford Science Park
9702 Chester Road                        9702
Schwanthalerstr. 7031                    7031
Rua Frei Caneca 1360                     1360
20 Rue des Corps-Saints                  20
Murtenstrasse 921                        921
Pieter Breughelstraat 837                837
 
Address                                  Number
---------------------------------------- --------
Mariano Escobedo 9991                    9991
 
23 rows selected.

STREET_ADDRESSにある空白の数をカウントするには、例4-12のように、REGEXP_COUNTファンクションを使用できます。

例4-12 各STREET_ADDRESSにある空白数のカウント

SELECT STREET_ADDRESS,
REGEXP_COUNT(STREET_ADDRESS, ' ') "Number of Spaces"
FROM LOCATIONS;

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

STREET_ADDRESS                           Number of Spaces
---------------------------------------- ----------------
1297 Via Cola di Rie                                    4
93091 Calle della Testa                                 3
2017 Shinjuku-ku                                        1
9450 Kamiya-cho                                         1
2014 Jabberwocky Rd                                     2
2011 Interiors Blvd                                     2
2007 Zagora St                                          2
2004 Charade Rd                                         2
147 Spadina Ave                                         2
6092 Boxwood St                                         2
40-5-12 Laogianggen                                     1
 
STREET_ADDRESS                           Number of Spaces
---------------------------------------- ----------------
1298 Vileparle (E)                                      2
12-98 Victoria Street                                   2
198 Clementi North                                      2
8204 Arthur St                                          2
Magdalen Centre, The Oxford Science Park                5
9702 Chester Road                                       2
Schwanthalerstr. 7031                                   1
Rua Frei Caneca 1360                                    4
20 Rue des Corps-Saints                                 3
Murtenstrasse 921                                       1
Pieter Breughelstraat 837                               2
 
STREET_ADDRESS                           Number of Spaces
---------------------------------------- ----------------
Mariano Escobedo 9991                                   2
 
23 rows selected.

STREET_ADDRESSに最初に表示される空白の位置をレポートするには、例4-13のように、REGEXP_INSTRファンクションを使用できます。

例4-13 各STREET_ADDRESSに最初に表示される空白の位置のレポート

SELECT STREET_ADDRESS,
REGEXP_INSTR(STREET_ADDRESS, ' ') "First Space"
FROM LOCATIONS;

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

STREET_ADDRESS                           First Space
---------------------------------------- -----------
1297 Via Cola di Rie                               5
93091 Calle della Testa                            6
2017 Shinjuku-ku                                   5
9450 Kamiya-cho                                    5
2014 Jabberwocky Rd                                5
2011 Interiors Blvd                                5
2007 Zagora St                                     5
2004 Charade Rd                                    5
147 Spadina Ave                                    4
6092 Boxwood St                                    5
40-5-12 Laogianggen                                8
 
STREET_ADDRESS                           First Space
---------------------------------------- -----------
1298 Vileparle (E)                                 5
12-98 Victoria Street                              6
198 Clementi North                                 4
8204 Arthur St                                     5
Magdalen Centre, The Oxford Science Park           9
9702 Chester Road                                  5
Schwanthalerstr. 7031                             17
Rua Frei Caneca 1360                               4
20 Rue des Corps-Saints                            3
Murtenstrasse 921                                 14
Pieter Breughelstraat 837                          7
 
STREET_ADDRESS                           First Space
---------------------------------------- -----------
Mariano Escobedo 9991                              8
 
23 rows selected.

参照:

  • データベース・アプリケーションにおける正規表現の使用方法の詳細は、『Oracle Databaseアドバンスト・アプリケーション開発者ガイド』を参照してください。

  • 正規表現の構文の詳細は、『Oracle Database SQL言語リファレンス』を参照してください。

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

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

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

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

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


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

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

例4-14の問合せの結果は、LAST_NAMEによって、昇順(デフォルト)にソートされています。

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

例4-14 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-96
Sundar               Ande                      24-MAR-00
Mozhe                Atkinson                  30-OCT-97
David                Austin                    25-JUN-97
Hermann              Baer                      07-JUN-94
Shelli               Baida                     24-DEC-97
Amit                 Banda                     21-APR-00
Elizabeth            Bates                     24-MAR-99
...
FIRST_NAME           LAST_NAME                 HIRE_DATE
-------------------- ------------------------- ---------
Jose Manuel          Urman                     07-MAR-98
Peter                Vargas                    09-JUL-98
Clara                Vishney                   11-NOV-97
Shanta               Vollman                   10-OCT-97
Alana                Walsh                     24-APR-98
Matthew              Weiss                     18-JUL-96
Jennifer             Whalen                    17-SEP-87
Eleni                Zlotkey                   29-JAN-00

107 rows selected

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

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

SELECT FIRST_NAME, HIRE_DATE
FROM EMPLOYEES
ORDER BY LAST_NAME;
 

結果:

FIRST_NAME           HIRE_DATE
-------------------- ---------
Ellen                11-MAY-96
Sundar               24-MAR-00
Mozhe                30-OCT-97
David                25-JUN-97
Hermann              07-JUN-94
Shelli               24-DEC-97
Amit                 21-APR-00
Elizabeth            24-MAR-99
...
FIRST_NAME           HIRE_DATE
-------------------- ---------
Jose Manuel          07-MAR-98
Peter                09-JUL-98
Clara                11-NOV-97
Shanta               10-OCT-97
Alana                24-APR-98
Matthew              18-JUL-96
Jennifer             17-SEP-87
Eleni                29-JAN-00
 
107 rows selected.

参照:

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

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

すべての従業員のFIRST_NAMELAST_NAMEおよびDEPARTMENT_NAMEを選択する場合を考えます。FIRST_NAMEおよびLAST_NAMEEMPLOYEES表にあり、DEPARTMENT_NAMEDEPARTMENTS表にあります。どちらの表にもDEPARTMENT_IDがあります。この場合、例4-16の問合せを使用できます。このような問合せを結合と呼びます。

例4-16 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;
 

結果:

First                Last                      Dept. Name
-------------------- ------------------------- ------------------------------
Jennifer             Whalen                    Administration
Michael              Hartstein                 Marketing
Pat                  Fay                       Marketing
Den                  Raphaely                  Purchasing
Karen                Colmenares                Purchasing
Alexander            Khoo                      Purchasing
Shelli               Baida                     Purchasing
Sigal                Tobias                    Purchasing
Guy                  Himuro                    Purchasing
Susan                Mavris                    Human Resources
Donald               OConnell                  Shipping
 
First                Last                      Dept. Name
-------------------- ------------------------- ------------------------------
Douglas              Grant                     Shipping
...
Shelley              Higgins                   Accounting
 
106 rows selected.

テーブル名修飾子は、結合内の一方の表にのみ現れる列名に対してはオプションですが、両方の表に現れる列名に対しては必須です。次の問合せは、例4-16の問合せと同等です。

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

修飾された列名を使用する問合せを読みやすくするには、次の例のように、表の別名を使用します。

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

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;

参照:

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

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

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

トピック:


参照:

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

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


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

SQLは、基本的な算術演算子として+(加算)、-(減算)、*(乗算)および/(除算)をサポートしています。

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

例4-17 問合せにおける演算式の使用

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

問合せにおける数値ファンクションの使用

数値ファンクションは、数値入力を受け取り、数値を返します。各数値ファンクションは、評価される各行に対し、値を1つ返します。SQLがサポートする数値ファンクションのリストと説明については、『Oracle Database SQL言語リファレンス』を参照してください。

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

例4-18 数値データの四捨五入

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.

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

例4-19 数値データの切捨て

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.

参照:

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

問合せにおける連結演算子の使用

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

例4-20 文字データの連結

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.

問合せにおける文字ファンクションの使用

文字ファンクションは、文字入力を受け取ります。多くは文字の値を返しますが、数値を返すものもあります。各文字ファンクションは、評価される各行に対し、値を1つ返します。SQLがサポートする文字ファンクションのリストと説明については、『Oracle Database SQL言語リファレンス』を参照してください。

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

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

例4-21 文字データの大/小文字の変更

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.

LTRIMおよびRTRIMファンクションはそれぞれ、文字引数の左端および右端から文字を切り捨てます。 TRIMファンクションは、先頭のゼロ、末尾のゼロ、あるいはその両方を切り捨てます。

例4-22の問合せは、EMPLOYEES表内のすべての事務員を検出し、JOB_IDから'_CLERK'を切り捨て、事務員の種別を識別する文字列のみを表示します。

例4-22 文字データの切捨て

SELECT LAST_NAME,
RTRIM(JOB_ID, '_CLERK') "Clerk Type"
FROM EMPLOYEES
WHERE JOB_ID LIKE '%_CLERK'
ORDER BY LAST_NAME;

結果:

LAST_NAME                 Clerk Type
------------------------- ----------
Atkinson                  ST
Baida                     PU
Bell                      SH
Bissot                    ST
Bull                      SH
Cabrio                    SH
Chung                     SH
Colmenares                PU
Davies                    ST
Dellinger                 SH
Dilly                     SH
 
LAST_NAME                 Clerk Type
------------------------- ----------
Everett                   SH
Feeney                    SH
...
LAST_NAME                 Clerk Type
------------------------- ----------
Walsh                     SH
 
45 rows selected.

LPADおよびRPADファンクションは、それぞれ、文字引数の左側と右側に指定された文字(デフォルト文字は空白)を埋め込みます。

例4-23の問合せは、FIRST_NAMEおよびLAST_NAMEを15文字の列に表示する際に、FIRST_NAMEの左側とLAST_NAMEの右側に空白を埋め込みます。

例4-23 文字データの埋込み

SELECT LPAD(FIRST_NAME,15) "First",
RPAD(LAST_NAME,15) "Last"
FROM EMPLOYEES
WHERE DEPARTMENT_ID = 100
ORDER BY FIRST_NAME;

結果:

First           Last
--------------- ---------------
         Daniel Faviet
         Ismael Sciarra
           John Chen
    Jose Manuel Urman
           Luis Popp
          Nancy Greenberg
 
6 rows selected.

SUBSTRファンクションは、引数として、文字列、文字の位置および長さを受け取り、文字列内の指定された位置から始まる指定された長さの部分文字列を返します。

例4-24の問合せは、SUBSTRを使用して、FIRST_NAMEを頭文字に短縮し、PHONE_NUMBERから地域コードを取り除きます。

例4-24 文字データからの部分文字列の抽出

SELECT SUBSTR(FIRST_NAME, 1, 1) || '. ' || LAST_NAME "Name",
SUBSTR(PHONE_NUMBER, 5, 8) "Phone"
FROM EMPLOYEES
WHERE DEPARTMENT_ID = 100
ORDER BY LAST_NAME;

結果:

Name                         Phone
---------------------------- --------
J. Chen                      124.4269
D. Faviet                    124.4169
N. Greenberg                 124.4569
L. Popp                      124.4567
I. Sciarra                   124.4369
J. Urman                     124.4469
 
6 rows selected.

REPLACEファンクションは、ある部分文字列を他の文字列に置き換えます。

例4-25の問合せは、WHERE句でSUBSTRファンクションを使用して、JOB_ID'SH'で始まる従業員を選択し、さらに、それらの各JOB_IDREPLACEファンクションを使用して、'SH''SHIPPING'に置き換えます。

例4-25 文字データの部分文字列の置換

COLUMN "Job" FORMAT A15;
SELECT LAST_NAME,
REPLACE(JOB_ID, 'SH', 'SHIPPING') "Job"
FROM EMPLOYEES
WHERE SUBSTR(JOB_ID, 1, 2) = 'SH'
ORDER BY LAST_NAME;

結果:

LAST_NAME                 Job
------------------------- ---------------
Bell                      SHIPPING_CLERK
Bull                      SHIPPING_CLERK
Cabrio                    SHIPPING_CLERK
Chung                     SHIPPING_CLERK
Dellinger                 SHIPPING_CLERK
Dilly                     SHIPPING_CLERK
Everett                   SHIPPING_CLERK
Feeney                    SHIPPING_CLERK
Fleaur                    SHIPPING_CLERK
Gates                     SHIPPING_CLERK
Geoni                     SHIPPING_CLERK
 
LAST_NAME                 Job
------------------------- ---------------
Grant                     SHIPPING_CLERK
Jones                     SHIPPING_CLERK
McCain                    SHIPPING_CLERK
OConnell                  SHIPPING_CLERK
Perkins                   SHIPPING_CLERK
Sarchand                  SHIPPING_CLERK
Sullivan                  SHIPPING_CLERK
Taylor                    SHIPPING_CLERK
Walsh                     SHIPPING_CLERK
 
20 rows selected.

参照:

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

問合せにおける日付ファンクションの使用

日付ファンクションは、日付、タイムスタンプおよび間隔値を操作します。各日付ファンクションは、評価される各行に対し、値を1つ返します。SQLがサポートする日付ファンクションのリストと説明については、『Oracle Database SQL言語リファレンス』を参照してください。

例4-26を理解するには、JOB_HISTORY表を理解する必要があります。

従業員の役職が変更されるとき、これまでの役職のSTART_DATEおよびEND_DATEJOB_HISTORY表に記録されます。2回以上、役職が変更となった従業員は、次の問合せと結果が示すように、JOB_HISTORY表に複数の行があります。

SELECT * FROM JOB_HISTORY
ORDER BY EMPLOYEE_ID;

結果:

EMPLOYEE_ID START_DAT END_DATE  JOB_ID     DEPARTMENT_ID
----------- --------- --------- ---------- -------------
        101 21-SEP-97 27-OCT-01 AC_ACCOUNT           110
        101 28-OCT-01 15-MAR-05 AC_MGR               110
        102 13-JAN-01 24-JUL-06 IT_PROG               60
        114 24-MAR-06 31-DEC-07 ST_CLERK              50
        122 01-JAN-07 31-DEC-07 ST_CLERK              50
        176 24-MAR-06 31-DEC-06 SA_REP                80
        176 01-JAN-07 31-DEC-07 SA_MAN                80
        200 17-SEP-95 17-JUN-01 AD_ASST               90
        200 01-JUL-02 31-DEC-06 AC_ACCOUNT            90
        201 17-FEB-04 19-DEC-07 MK_REP                20
 
10 rows selected.

例4-26の問合せは、MONTHS_BETWEENファンクションを使用して、各従業員が従来の役職に就いていた月数を表示します。MONTHS_BETWEENファンクションの詳細は、『Oracle Database SQL言語リファレンス』を参照してください。

例4-26 日付間の月数の表示

SELECT e.EMPLOYEE_ID,
e.LAST_NAME,
TRUNC(MONTHS_BETWEEN(j.END_DATE, j.START_DATE)) "Months Worked"
FROM EMPLOYEES e, JOB_HISTORY j
WHERE e.EMPLOYEE_ID = j.EMPLOYEE_ID
ORDER BY "Months Worked";

結果:

EMPLOYEE_ID LAST_NAME                 Months Worked
----------- ------------------------- -------------
        176 Taylor                                9
        122 Kaufling                             11
        176 Taylor                               11
        114 Raphaely                             21
        101 Kochhar                              40
        201 Hartstein                            46
        101 Kochhar                              49
        200 Whalen                               53
        102 De Haan                              66
        200 Whalen                               69
 
10 rows selected.

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

例4-27 日付間の年数の表示

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                                   4
Urman                                  5
Chen                                   6
Sciarra                                6
Greenberg                              9
Faviet                                 9
 
6 rows selected.

従業員は、雇用された月の月末に最初の小切手を受け取るものとします。例4-28の問合せは、LAST_DAYファンクションを使用して、部門100の各従業員の最初の給料日を表示します。LAST_DAYファンクションの詳細は、『Oracle Database SQL言語リファレンス』を参照してください。

例4-28 選択された月の最後の日の表示

SELECT LAST_NAME,
HIRE_DATE "Hired",
LAST_DAY(HIRE_DATE) "Paid"
FROM EMPLOYEES
WHERE DEPARTMENT_ID = 100
ORDER BY HIRE_DATE;

結果:

LAST_NAME                 Hired     Paid
------------------------- --------- ---------
Faviet                    16-AUG-02 31-AUG-02
Greenberg                 17-AUG-02 31-AUG-02
Chen                      28-SEP-05 30-SEP-05
Sciarra                   30-SEP-05 30-SEP-05
Urman                     07-MAR-06 31-MAR-06
Popp                      07-DEC-07 31-DEC-07
 
6 rows selected.

雇用された従業員は、6か月後に最初の評価を受け取るものとします。例4-29の問合せは、ADD_MONTHSファンクションを使用して、部門100の各従業員の最初の評価日を表示します。ADD_MONTHSファンクションの詳細は、『Oracle Database SQL言語リファレンス』を参照してください。

例4-29 選択された日から6か月後の日の表示

SELECT LAST_NAME,
HIRE_DATE "Hired",
ADD_MONTHS(HIRE_DATE, 6) "Evaluated"
FROM EMPLOYEES
WHERE DEPARTMENT_ID = 100
ORDER BY HIRE_DATE;

結果:

LAST_NAME                 Hired     Evaluated
------------------------- --------- ---------
Faviet                    16-AUG-02 16-FEB-03
Greenberg                 17-AUG-02 17-FEB-03
Chen                      28-SEP-05 28-MAR-06
Sciarra                   30-SEP-05 31-MAR-06
Urman                     07-MAR-06 07-SEP-06
Popp                      07-DEC-07 07-JUN-08
 
6 rows selected.

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

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

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

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:47:33, 6/19/2008

参照:

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

問合せにおける変換ファンクションの使用

変換ファンクションは、あるデータ型を他のデータ型に変換します。SQLがサポートする変換ファンクションのリストと説明については、『Oracle Database SQL言語リファレンス』を参照してください。

例4-31の問合せは、TO_CHARファンクションを使用して、HIRE_DATE値(DATE型)をFMMonth DD YYYY書式の文字値に変換します。 FMは、月名から先頭と末尾の空白を削除します。 FMMonth DD YYYYは、日付時間書式モデルの一例です。

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

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.

例4-32の問合せは、TO_CHARファンクションを使用して、HIRE_DATE値をDS(短い日付)およびDL(長い日付)の2つの標準書式の文字値に変換します。

例4-32 日付から文字への標準書式を使用した変換

SELECT LAST_NAME,
TO_CHAR(HIRE_DATE, 'DS') "Short Date",
TO_CHAR(HIRE_DATE, 'DL') "Long Date"
FROM EMPLOYEES
WHERE DEPARTMENT_ID = 100
ORDER BY LAST_NAME;

結果:

LAST_NAME                 Short Date Long Date
------------------------- ---------- -----------------------------
Chen                      9/28/2005  Sunday, September 28, 2005
Faviet                    8/16/2002  Tuesday, August 16, 2002
Greenberg                 8/17/2002  Wednesday, August 17, 2002
Popp                      12/7/2007  Tuesday, December 07, 2007
Sciarra                   9/30/2005  Tuesday, September 30, 2005
Urman                     3/7/2006   Saturday, March 07, 2006
 
6 rows selected.

例4-33の問合せは、TO_CHARファンクションを使用して、SALARY値(NUMBER型)を$99,999.99の書式を持つ文字値に変換します。

例4-33 数値から文字列への書式テンプレートを使用した変換

SELECT LAST_NAME,
TO_CHAR(SALARY, '$99,999.99') "Salary"
FROM EMPLOYEES
WHERE DEPARTMENT_ID = 100
ORDER BY SALARY;

結果:

LAST_NAME                 Salary
------------------------- -----------
Popp                        $6,900.00
Sciarra                     $7,700.00
Urman                       $7,800.00
Chen                        $8,200.00
Faviet                      $9,000.00
Greenberg                  $12,000.00
 
6 rows selected.

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

例4-34 文字列から数値への変換

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.

例4-35の問合せは、TO_DATEファンクションを使用して、Month dd, YYYY, HH:MI A.M.という書式の文字列をDATE値に変換します。

例4-35 文字列から日付への変換

SELECT TO_DATE('January 5, 2007, 8:43 A.M.',
'Month dd, YYYY, HH:MI A.M.') "Date"
FROM DUAL;

結果:

Date
---------
05-JAN-07

例4-36の問合せは、TO_TIMESTAMPファンクションを使用して、DD-Mon-RR HH24:MI:SS.FFという書式の文字列をTIMESTAMP値に変換します。

例4-36 文字列からタイム・スタンプへの変換

SELECT TO_TIMESTAMP('May 5, 2007, 8:43 A.M.',
'Month dd, YYYY, HH:MI A.M.') "Timestamp"
FROM DUAL;

結果:

Timestamp
------------------------------------------------------------------------------
05-MAY-07 08.43.00.000000000 AM

参照:

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

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

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

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

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

  • 「NLS_DATE_FORMATパラメータについて」


問合せにおける集計ファンクションの使用

集計ファンクションは、行のグループに基づいて、結果行を1つ返します。行のグループは表またはビュー全体です。SQLがサポートする集計ファンクションのリストと説明については、『Oracle Database SQL言語リファレンス』を参照してください。

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

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

例4-37 各グループの行数のカウント

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

結果:

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

例4-37は、従業員の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

COUNTファンクションは、DISTINCTオプションとともに使用すると、データ・セット内にある個別値の数を表示します。

例4-38の2つの問合せは、全部門数および従業員が存在する部門の数を表示します。

例4-38 セット内の個別値の数のカウント

SELECT COUNT(*) FROM DEPARTMENTS;
 

結果:

  COUNT(*)
----------
        27

SELECT COUNT(DISTINCT DEPARTMENT_ID) "Number of Departments"
FROM EMPLOYEES;

結果:

Number of Departments
---------------------
                   11

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

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

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      12000      12000      12000      12000          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      12000      12000      12000      12000          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
 
JOB_ID              #    Minimum    Average     Median    Maximum    Std Dev
---------- ---------- ---------- ---------- ---------- ---------- ----------
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.

指定された条件を集計値が満たす行のみを返す問合せを行うには、HAVING句を使用します。

例4-40の問合せは、毎年$1,000,000を超える額を給与に費やしている部門についてのみ、部門およびその額を表示します。

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

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

RANKファンクションは、ある数の相対的な順序付けランクを返し、PERCENT_RANKファンクションは、ある数の百分率を返します。

例4-41の問合せは、給与$3,000がすべての事務員の中で20番目に高く、百分率では42%であることを示します。

例4-41 グループ内におけるある数のランクと百分率の表示

SELECT RANK(3000) WITHIN GROUP
  (ORDER BY SALARY DESC) "Rank",
ROUND(100 * (PERCENT_RANK(3000) WITHIN GROUP
  (ORDER BY SALARY DESC)), 0) "Percentile"
FROM EMPLOYEES
WHERE JOB_ID LIKE '%CLERK';

結果:

      Rank Percentile
---------- ----------
        20         42

DENSE_RANKファンクションは、RANKファンクションと似ていますが、同じ値はすべて同じランクとなり、ランキングにギャップが発生しません。DENSE_RANKファンクションを使用すると、例4-42が示すように、$3,000は事務員の12番目に高い給与となります。

例4-42 グループ内におけるある数の稠密ランクの表示

SELECT DENSE_RANK(3000) WITHIN GROUP (ORDER BY salary DESC) "Rank"
FROM EMPLOYEES
WHERE JOB_ID LIKE '%CLERK';

結果:

      Rank
----------
        12

参照:

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

問合せにおけるNULL関連ファンクションの使用

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

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

例4-43 文字列による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.

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

例4-44 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       6882
Bates                           7300       8468
Bell                            4000       4000
Bernstein                       9500      11970
Bissot                          3300       3300
Bloom                          10000      12100
Bull                            4100       4100
 
9 rows selected.

参照:

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

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


問合せにおけるCASE式の使用

CASE式を使用すると、プロシージャを起動することなく、SQL文においてIF ... THEN ... ELSEロジックを使用できます。

例4-45の問合せは、CASE式を使用して、勤続年数に基づいて推奨される給与の値上げを表示します。

例4-45 問合せにおけるCASE式の使用

SELECT LAST_NAME "Name",
HIRE_DATE "Started",
SALARY "Salary",
CASE
  WHEN HIRE_DATE < TO_DATE('01-Jan-90') THEN TRUNC(SALARY*1.15, 0)
  WHEN HIRE_DATE < TO_DATE('01-Jan-95') THEN TRUNC(SALARY*1.10, 0)
  WHEN HIRE_DATE < TO_DATE('01-Jan-00') 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            9000
Greenberg                 17-AUG-02      12008           12008
Chen                      28-SEP-05       8200            8200
Sciarra                   30-SEP-05       7700            7700
Urman                     07-MAR-06       7800            7800
Popp                      07-DEC-07       6900            6900
 
6 rows selected.

参照:

  • 「CASE文の使用」

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


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

DECODEファンクションは、値または式を検索値と対比し、一致を検出した場合に結果を戻します。一致が検出されない場合、DECODEファンクションは、デフォルト値またはNULL(デフォルト値が指定されていない場合)を戻します。

例4-46の問合せは、DECODEファンクションを使用して、3つの異なる役職に対して推奨される給与の値上げを表示します。

例4-46 問合せにおける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.

参照:

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