選取表格資料

注意:若要完成本節中的教學課程和範例,您必須以 SQL Developer 的使用者 HR 身分連線到 Oracle Database。如需指示,請參閱 Connecting to Oracle Database as User HR from SQL Developer

關於查詢

查詢或 SQL SELECT 陳述式會從一或多個表格或檢視中選取資料。

查詢的最簡單形式具有下列語法:

SELECT select_list FROM source_list

select_list 值指定要從中選擇資料的欄,而 source_list 值則指定有這些欄的表格或視觀表。

在另一個 SQL 敘述句內的巢狀查詢稱為子查詢

在 SQL*Plus 環境中,您可以在 SQL> 提示之後輸入查詢 (或任何其他 SQL 敘述句)。

在 SQL Developer 環境中,您可以在「工作表」中輸入查詢 (或任何其他 SQL 陳述式)。

注意:當顯示查詢的結果時,除非您使用 ORDER BY 子句指定記錄的順序,否則記錄可以按任何順序排列。如需詳細資訊,請參閱排序選取的資料

另請參閱:

在 SQL Developer 中執行查詢

本節說明如何使用「工作表」在 SQL Developer 中執行查詢。

注意:「工作表」不限於查詢;您可以使用它來執行任何 SQL 敘述句。

執行 SQL Developer 查詢的步驟:

  1. 如果 SQL Developer 的右邊框架顯示 hr_conn 窗格:

    1. 如果「工作表」子窗格未顯示,請選取工作表頁籤。

    2. 前往 4 步驟。

  2. 選取 SQL 工作表圖示。

  3. 如果開啟的是「選取連線」視窗:

    1. 如果「連線」欄位沒有值 hr_conn,請從選單中選取該值。

    2. 選取確定

    會顯示一個頁籤標示為 hr_conn 的窗格,以及兩個子窗格:「工作表」和「查詢製作器」。在「工作表」中,您可以輸入 SQL 陳述式。

  4. 在「工作表」中,輸入查詢 (SELECT 陳述式)。
  5. 按一下執行陳述式圖示。

    查詢就會開始執行。在「工作表」下,會出現「查詢結果」窗格,顯示查詢結果。

  6. 在 hr_conn 頁籤下,按一下清除圖示。

    查詢會消失,您可以在「工作表」中輸入其他 SQL 陳述式。當您執行其他 SQL 敘述句時,其結果會出現在「查詢結果」窗格中,取代先前執行之 SQL 敘述句的結果。

另請參閱:Oracle SQL Developer User's Guide,瞭解有關在 SQL Developer 中使用工作表的資訊

教學課程:選取表格的所有資料欄

本教學課程顯示如何選取 EMPLOYEES 表格的所有欄。

選取 EMPLOYEES 表所有欄的步驟:

  1. 如果顯示含有頁籤 hr_conn 的窗格,請選取它。否則,請按一下 SQL 工作表圖示,如在 SQL Developer 中執行查詢所示。

  2. 在「工作表」中,輸入下列查詢:

    SELECT * FROM EMPLOYEES;

  3. 按一下執行敘述句圖示。

    查詢就會開始執行。在「工作表」下,會出現「查詢結果」窗格,顯示 EMPLOYEES 表格的所有欄。

注意:在含有儲存機密資料之資料欄 (例如密碼或信用卡資訊) 的表格上使用 SELECT * 時,請特別小心。

另請參閱:教學課程:使用 SQL Developer 檢視 EMPLOYEES 表格特性和資料,瞭解使用 SQL Developer 檢視表格資料之其他方式的相關資訊

教學課程:選取表格的特定資料欄

本教學課程顯示如何只選取 EMPLOYEES 表的 FIRST_NAME、LAST_NAME 與 DEPARTMENT_ID 欄位。

僅選取 FIRST_NAME、LAST_NAME 和 DEPARTMENT_ID 的步驟:

  1. 如果顯示含有頁籤 hr_conn 的窗格,請選取它。否則,請按一下「SQL 工作表」圖示,如在 SQL Developer 中執行查詢

  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.

以新標題顯示選取的資料欄

在顯示的查詢結果中,預設資料欄標題是資料欄名稱。若要在新標題下顯示資料欄,請在資料欄名稱後立即指定新標題 ( alias)。別名會在查詢期間重新命名資料欄,但不會變更它在資料庫中的名稱。

範例 2-5 中的查詢會選取與「教學課程:選取表格的特定欄」中的查詢相同的資料欄,但也會為它們指定別名。由於別名並未使用雙引號括起來,它們會以大寫字母顯示。

如果您以雙引號括住資料欄別名,則會保留大小寫,而別名可以包含空格,如範例 2-6 中所示。

另請參閱:Oracle Database SQL Language Reference,瞭解有關 SELECT 敘述句的詳細資訊,包括資料欄別名 (c_alias)

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

選取符合指定條件的資料

若只要選取符合指定條件的資料,請在 SELECT 敘述句中包含 WHERE 子句。

WHERE 子句中的條件可以是任何 SQL 條件 (如需 SQL 條件的相關資訊,請參閱 Oracle Database SQL Language Reference)。

範例 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,以及佣金百分比是否不是空值。

另請參閱:

範例 2-7 從一個部門選取資料

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 選取滿足兩個條件的數據

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.

排序選取的資料

顯示查詢結果後,除非您使用 ORDER BY 子句指定記錄的順序,否則記錄可以任意順序。

範例 2-10 中的查詢結果會以遞增順序 (預設值) 依 LAST_NAME 排序。

或者,在 SQL Developer 中,您可以省略 ORDER BY 子句,然後按兩下來要排序的資料欄名稱。

範例 2-11 顯示時,選取清單中不需要包含排序條件。

另請參閱:Oracle Database SQL Language Reference,瞭解有關 SELECT 敘述句的詳細資訊,包括 ORDER BY 子句

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

從多個表格選取資料

若要從多個表格選取資料,請使用稱為結合的查詢。結合中的表格必須至少共用一個資料欄名稱。

假設您要選取每個員工的 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 Language Reference,瞭解有關結合的詳細資訊

範例 2-12 從兩個表格選取資料 (結合兩個表格)

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.

在查詢中使用運算子和函數

查詢的 select_list 可以包含 SQL 表示式,其中可包含 SQL 運算子與 SQL 函數。這些運算子和函數可以用表格資料作為運算元與引數。SQL 表示式會受到評估,它們的值將會出現在查詢結果中。

另請參閱:

在查詢中使用算術運算子

基本算術運算子 -+ (加法)、- (減法)、\* (乘法) 和 / (除法) - 在欄值上作業。

範例 2-13 中的查詢會以 SALARY 的遞減順序,顯示部門 90 中每位員工的 LAST_NAME、SALARY (月薪) 及年薪。

範例 2-13 在 Query 中使用算術表示式

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

在查詢中使用數值函數

數值函數接受數值輸入並傳回數值。每個數字函數會針對接受評估的每一個資料列傳回單一值。

Oracle Database SQL Language Reference 中會列出並說明 SQL 所支援的數值函數。

範例 2-14 中的查詢使用數值函數 ROUND 來顯示部門 100 中每位員工的每日薪資,四捨五入至最接近的中心。

範例 2-15 中的查詢使用數值函數 TRUNC 來顯示部門 100 中每位員工的每日薪資,並截斷成最接近的金額。

另請參閱:Oracle Database SQL Language Reference,瞭解有關 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.

在查詢中使用串接運算子

串連運算子 (||) 會藉由將第二個字串附加至第一個字串,將兩個字串結合成一個單一字串。例如,'a'||'b'='ab'。您可以使用此運算子,在查詢結果的同一欄中合併兩個欄或表示式的資訊。

範例 2-16 中的查詢會串連每個所選員工的名字、空格及姓氏。

另請參閱:Oracle Database SQL Language Reference,瞭解有關串連運算子的詳細資訊

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

在查詢中使用字元函數

字元函數接受輸入字元。其中大部分會傳回字元值,有部分則傳回數字值。每個字元函數都會針對接受評估的每一個資料列傳回單一值。

Oracle Database SQL Language Reference 中會列出並說明 SQL 所支援的字元函數。

UPPER、INITCAP 和 LOWER 函數會分別以大寫字元、起始大寫字元及小寫字元顯示其字元引數。

範例 2-17 中的查詢會以大寫顯示 LAST_NAME,FIRST_NAME 會以大寫顯示第一個字元,並以小寫顯示所有其他字元,並以小寫顯示 EMAIL。

另請參閱:Oracle Database SQL Language Reference,瞭解有關 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.

在查詢中使用日期與時間函數

日期時間函數在 DATE、時戳以及間隔值上作業。每個日期與時間函數會針對接受評估的每一個資料列傳回單一值。

Oracle Database SQL Language Reference 中會列出並說明 SQL 支援的日期時間函數。

對於每個 DATE 和時戳值,Oracle Database 會儲存下列資訊:

對於每個時戳值,Oracle Database 也會儲存第二個的小數部分,您可以指定其精確度。若要同時儲存時區,請使用 TIMESTAMP WITH TIME ZONE 或 TIMESTAMP WITH LOCAL TIME ZONE 資料類型。

如需有關 DATE 資料類型的詳細資訊,請參閱 Oracle Database SQL Language Reference

如需有關 TIMESTAMP 資料類型的詳細資訊,請參閱 Oracle Database SQL Language Reference

如需其他時戳資料類型和間隔資料類型的相關資訊,請參閱 Oracle Database SQL Language Reference

範例 2-18 中的查詢使用 EXTRACT 和 SYSDATE 函數來顯示部門 100 中每位員工的僱用年數。SYSDATE 函數會將系統時鐘的目前日期傳回為 DATE 值。如需有關 SYSDATE 函數的詳細資訊,請參閱 Oracle Database SQL Language Reference。如需有關 EXTRACT 函數的資訊,請參閱 Oracle Database SQL Language Reference

範例 2-19 中的查詢使用 SYSTIMESTAMP 函數來顯示目前的系統日期和時間。SYSTIMESTAMP 函數傳回 TIMESTAMP 的值。如需有關 SYSTIMESTAMP 函數的資訊,請參閱 Oracle Database SQL Language Reference

查詢之 FROM 子句中的表格 DUAL 是一個資料列表格,Oracle Database 會與資料說明一起自動建立。當您要使用 SELECT 敘述句計算常數表示式時,請從 DUAL 選取。因為 DUAL 只有一列,所以常數只會傳回一次。如需有關從 DUAL 選取的詳細資訊,請參閱 Oracle Database SQL Language Reference

另請參閱:Oracle Database SQL Language Reference,瞭解有關 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

在查詢中使用轉換函數

轉換函數會將一個資料類型轉換成另一個資料類型。

Oracle Database SQL Language Reference 中會列出並說明 SQL 所支援的轉換功能。

範例 2-20 中的查詢使用 TO_CHAR 函數,將 HIRE_DATE 值 (類型為 DATE) 轉換成格式為 FMMonth DD YYYY 的字元值。FM 會從月份名稱中移除前後的空白。FMMonth DD YYYY日期時間格式模型的範例。如需有關日期時間格式模型的資訊,請參閱 Oracle Database SQL Language Reference

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

在查詢中使用聚總函數

彙總函數會採用一組列,並傳回單一結果列。資料列群組可以是整個表格或視觀表。

Oracle Database SQL Language Reference 中會列出並說明 SQL 所支援的聚總函數。

與 GROUP BY 子句搭配使用時,聚總函數特別強大,而 GROUP BY 子句會依一或多個資料欄來群組查詢結果,並針對每個群組產生結果。

範例 2-22 中的查詢使用 COUNT 函數與 GROUP BY 子句來顯示有多少人向每位經理報告。萬用字元 * 代表整個記錄。範例 2-22 顯示某位員工未向經理報告。下列查詢將會選取該員工的名字、姓氏和職稱。

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 之薪資的統計資料。

另請參閱:Oracle Database SQL Language Reference,瞭解有關 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.

在查詢中使用 NULL 相關函數

與空值相關的函數有助於處理空值值。

Oracle Database SQL Language Reference 中會列出並說明 SQL 支援的 NULL 相關函數。

範例 2-25 中的查詢會傳回姓氏以 'B' 開頭之員工的姓氏與佣金。如果員工未收到佣金 (亦即,如果 COMMISSION_PCT 為空值),則 NVL 函數會將 NULL 替代為「不適用」。

範例 2-26 中的查詢會使用 NVL2 函數傳回姓氏以 'B' 開頭之員工的姓氏、薪資及所得:如果 COMMISSION_PCT 不是空值,則收入為薪資加上佣金;如果 COMMISSION_PCT 為空值,則收入僅為薪資。

另請參閱:

範例 2-25 替換空值的字串

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 與 Not 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.

在查詢中使用 CASE 表示式

CASE 表示式可讓您使用 SQL 陳述式中的 IF … THEN … ELSE 邏輯,而不需要呼叫子程式。有兩種 CASE 表示式,簡單且搜尋。

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

在查詢中使用 DECODE 函數

DECODE 函數會將表示式與數個搜尋值進行比較。每當表示式的值符合搜尋值時,DECODE 就會傳回與該搜尋值關聯的結果。若 DECODE 找不到相符項目,則會傳回預設值 (若已指定) 或 NULL (若未指定預設值)。

範例 2-29 中的查詢使用 DECODE 函數來顯示三個不同工作的建議加薪。表示式為 JOB_ID;搜尋值為 'PU_CLERK'、'SH_CLERK' 及 'ST_CLERK';且預設值為 SALARY。

注意: DECODE 函數的引數可以是任何 SQL 數值或字元類型。Oracle 會在比較之前,自動將表示式和每個搜尋值轉換成第一個搜尋值的資料類型。Oracle 會自動將傳回值轉換成與第一個結果相同的資料類型。如果第一個結果的資料類型為 CHAR 或第一個結果為 NULL,則 Oracle 會將傳回值轉換成資料類型 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.