選取表格資料
注意:若要完成本節中的教學課程和範例,您必須以 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 子句指定記錄的順序,否則記錄可以按任何順序排列。如需詳細資訊,請參閱排序選取的資料。
另請參閱:
-
Oracle Database SQL Language Reference,瞭解查詢和子查詢的詳細資訊
-
Oracle Database SQL Language Reference,瞭解有關 SELECT 敘述句的詳細資訊
-
SQL*Plus 使用手冊與參照,瞭解 SQL*Plus 命令行介面的詳細資訊
-
Oracle SQL Developer User's Guide,瞭解有關在 SQL Developer 中使用工作表的資訊
在 SQL Developer 中執行查詢
本節說明如何使用「工作表」在 SQL Developer 中執行查詢。
注意:「工作表」不限於查詢;您可以使用它來執行任何 SQL 敘述句。
執行 SQL Developer 查詢的步驟:
-
如果 SQL Developer 的右邊框架顯示 hr_conn 窗格:
-
如果「工作表」子窗格未顯示,請選取工作表頁籤。
-
前往 4 步驟。
-
-
選取 SQL 工作表圖示。
-
如果開啟的是「選取連線」視窗:
-
如果「連線」欄位沒有值
hr_conn,請從選單中選取該值。 -
選取確定。
會顯示一個頁籤標示為 hr_conn 的窗格,以及兩個子窗格:「工作表」和「查詢製作器」。在「工作表」中,您可以輸入 SQL 陳述式。
-
-
在「工作表」中,輸入查詢 (SELECT 陳述式)。
-
按一下執行陳述式圖示。
查詢就會開始執行。在「工作表」下,會出現「查詢結果」窗格,顯示查詢結果。
-
在 hr_conn 頁籤下,按一下清除圖示。
查詢會消失,您可以在「工作表」中輸入其他 SQL 陳述式。當您執行其他 SQL 敘述句時,其結果會出現在「查詢結果」窗格中,取代先前執行之 SQL 敘述句的結果。
另請參閱:Oracle SQL Developer User's Guide,瞭解有關在 SQL Developer 中使用工作表的資訊
教學課程:選取表格的所有資料欄
本教學課程顯示如何選取 EMPLOYEES 表格的所有欄。
選取 EMPLOYEES 表所有欄的步驟:
-
如果顯示含有頁籤 hr_conn 的窗格,請選取它。否則,請按一下 SQL 工作表圖示,如在 SQL Developer 中執行查詢所示。
-
在「工作表」中,輸入下列查詢:
SELECT * FROM EMPLOYEES; -
按一下執行敘述句圖示。
查詢就會開始執行。在「工作表」下,會出現「查詢結果」窗格,顯示 EMPLOYEES 表格的所有欄。
注意:在含有儲存機密資料之資料欄 (例如密碼或信用卡資訊) 的表格上使用 SELECT * 時,請特別小心。
另請參閱:教學課程:使用 SQL Developer 檢視 EMPLOYEES 表格特性和資料,瞭解使用 SQL Developer 檢視表格資料之其他方式的相關資訊
教學課程:選取表格的特定資料欄
本教學課程顯示如何只選取 EMPLOYEES 表的 FIRST_NAME、LAST_NAME 與 DEPARTMENT_ID 欄位。
僅選取 FIRST_NAME、LAST_NAME 和 DEPARTMENT_ID 的步驟:
-
如果顯示含有頁籤 hr_conn 的窗格,請選取它。否則,請按一下「SQL 工作表」圖示,如在 SQL Developer 中執行查詢。
-
如果「工作表」窗格包含查詢,請選取清除圖示來清除查詢。
-
在「工作表」中,輸入下列查詢:
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.
以新標題顯示選取的資料欄
在顯示的查詢結果中,預設資料欄標題是資料欄名稱。若要在新標題下顯示資料欄,請在資料欄名稱後立即指定新標題 ( 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,以及佣金百分比是否不是空值。
另請參閱:
-
Oracle Database SQL Language Reference,瞭解有關 SELECT 敘述句的詳細資訊,包括 WHERE 子句
-
Oracle Database SQL Language Reference,瞭解 SQL 條件的詳細資訊
範例 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 表示式會受到評估,它們的值將會出現在查詢結果中。
另請參閱:
-
Oracle Database SQL Language Reference,瞭解 SQL 運算子的詳細資訊
-
Oracle Database SQL Language Reference,瞭解有關 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 會儲存下列資訊:
-
Year
-
月
-
Date
-
Hour
-
分鐘
-
秒
對於每個時戳值,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 類型的值,而該值用於計算。
另請參閱:
-
Oracle Database SQL Language Reference,瞭解有關 SQL 轉換函數的詳細資訊
範例 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 為空值,則收入僅為薪資。
另請參閱:
-
Oracle Database SQL Language Reference,瞭解有關 NVL 函數的詳細資訊
-
Oracle Database SQL Language Reference,瞭解有關 NVL2 函數的詳細資訊
範例 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%)。
另請參閱:
-
Oracle Database SQL Language Reference,瞭解 CASE 表示式的詳細資訊
-
Oracle Database PL/SQL Language Reference,瞭解 CASE 表示式的詳細資訊
範例 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。
另請參閱:
-
Oracle Database SQL Language Reference,瞭解 DECODE 函數的相關資訊
範例 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.