この章の内容は次のとおりです。
注意: このマニュアルのチュートリアルを行うには、ユーザー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ワークシートに問合せを入力できます。
参照:
|
ここでは、SQL DeveloperからユーザーHR
としてOracle Database XEへ接続している場合に、問合せやその他のSQL文を(SQL Developerで)実行する方法について説明します。
SQL Developerにおいて問合せを実行するには、次の手順を実行します。
「SQLワークシート」アイコンをクリックします。
「接続の選択」ウィンドウまたは「SQLワークシート」ペインが表示されます。
「接続の選択」ウィンドウが開かれた場合は、次のようにします。
「接続」フィールドの値がhr_conn
ではない場合は、メニューからその値を選択します。
「OK」をクリックします。
「SQLワークシート」ペインが表示され、「hr_conn」
というラベルのタブと、「ワークシート」および「クエリー・ビルダー」の2つのサブペインが表示されます。ワークシートにはSQL文を入力できます。
ワークシートに問合せ(SELECT
文)を入力します。
「文の実行」アイコンをクリックします。
問合せが実行されます。ワークシートの下に「問合せ結果」ペインが表示され、問合せの結果が表示されます。
「hr_conn」
タブの下で、「クリア」アイコンをクリックします。
問合せが消去され、ワークシートに別のSQL文を入力できます。別のSQL文を実行すると、その結果が前に実行したSQL文の結果のかわりに「問合せ結果」ペインに表示されます。
参照: SQL DeveloperにおけるSQLワークシートの使用の詳細は、『Oracle Database SQL Developerユーザーズ・ガイド』を参照してください。 |
このチュートリアルは、EMPLOYEES
表の列を選択する方法を示します。
EMPLOYEES表のすべての列を選択するには、次の手順を実行します。
タブ「hr_conn」
が含まれる「SQLワークシート」ペインがあれば、それを選択します。そうでない場合は、「SQL Developerにおける問合せの実行」にあるように、「SQLワークシート」アイコンをクリックします。
ワークシートに、次の問合せを入力します。
SELECT * FROM EMPLOYEES;
「文の実行」アイコンをクリックします。
問合せが実行されます。ワークシートの下に「問合せ結果」ペインが表示され、EMPLOYEES
表のすべての列が表示されます。
注意: パスワードやクレジット・カード情報などの機密データを保存する列が含まれる表でSELECT * を使用する場合は十分に注意してください。 |
このチュートリアルでは、EMPLOYEES
表のFIRST_NAME
列、LAST_NAME
列およびDEPARTMENT_ID
列のみを選択する方法を示します。
FIRST_NAME、LAST_NAMEおよびDEPARTMENT_IDのみを選択するには、次の手順を実行します。
タブ「hr_conn」
が含まれる「SQLワークシート」ペインがあれば、それを選択します。そうでない場合は、「SQL Developerにおける問合せの実行」にあるように、「SQLワークシート」アイコンをクリックします。
ワークシートに、次の問合せを入力します。
SELECT FIRST_NAME, LAST_NAME, DEPARTMENT_ID FROM EMPLOYEES;
「文の実行」アイコンをクリックします。
問合せが実行されます。ワークシートの下に「問合せ結果」ペインが表示され、次のような問合せの結果が表示されます。
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
句の条件には、任意の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.
参照:
|
問合せの結果を表示する際に、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_NAME
、LAST_NAME
およびDEPARTMENT_NAME
を選択する場合を考えます。FIRST_NAME
およびLAST_NAME
はEMPLOYEES
表にあり、DEPARTMENT_NAME
はDEPARTMENTS
表にあります。どちらの表にも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は、基本的な算術演算子として+
(加算)、-
(減算)、*
(乗算)および/
(除算)をサポートしています。
例4-17の問合せは、部門90に所属する各従業員のLAST_NAME
、SALARY
(月給)および年間賃金をSALARY
の降順で表示します。
数値ファンクションは、数値入力を受け取り、数値を返します。各数値ファンクションは、評価される各行に対し、値を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つの列または式の情報をレポートの同じ列の中に結合できます。
文字ファンクションは、文字入力を受け取ります。多くは文字の値を返しますが、数値を返すものもあります。各文字ファンクションは、評価される各行に対し、値を1つ返します。SQLがサポートする文字ファンクションのリストと説明については、『Oracle Database SQL言語リファレンス』を参照してください。
UPPER
、INITCAP
および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_ID
でREPLACE
ファンクションを使用して、'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_DATE
がJOB_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
ファンクションを使用して、現在のシステム時間と日付を表示します。 SYSTIMESTAMP
はSYSDATE
と似ていますが、より詳しい情報を返します。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
参照:
|
集計ファンクションは、行のグループに基づいて、結果行を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
値の処理を容易にします。SQLがサポートするNULL
関連ファンクションのリストと説明については、『Oracle Database SQL言語リファレンス』を参照してください。
例4-43の問合せは、姓がB
で始まる従業員の姓と歩合を返します。従業員が歩合を受け取らない場合(つまり、COMMISSION_PCT
がNULL
の場合)、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_PCT
がNULL
でない場合、収入は給与と歩合の合計であり、COMMISSION_PCT
がNULL
の場合、収入は給与のみです。
例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.
参照:
|
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.
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言語リファレンス』を参照してください。 |