1. 程式人生 > >Oracle DB 使用單行函式定製輸出

Oracle DB 使用單行函式定製輸出

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow

也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!

                • 描述SQL 提供的各類函式 • 在SELECT 語句中使用字元、數字和日期函式
  • SQL 函式
函式是SQL 的一項非常強大的功能,可用於執行以下操作: • 執行資料計算 • 修改單個數據項 • 處理成組行的輸出 • 設定日期和數字的顯示格式 • 轉換列資料型別 SQL 函式有時接受多個引數,但始終返回一個值。

  • 兩種型別的SQL 函式
有兩種型別的函式: • 單行函式 • 多行函式
單行函式 這些函式僅對單行進行處理, 為每行返回一個結果。單行函式具有多種不同型別。 介紹以下幾種函式: • 字元 • 數字 • 日期 • 轉換 • 常規
多行函式
這些函式可以處理成組的行,為每組行返回一個結果。
  • 單行函式
單行函式: • 處理資料項 • 接受引數並返回一個值 • 對每個返回行進行處理 • 為每行返回一個結果 • 可能會修改資料型別 • 可以巢狀 • 接受引數,這些引數可以是 列或表示式
function_name [(arg1, arg2,...)]
在該語法中: function_name:是函式的名稱 arg1, arg2:是函式使用的任意引數,可以是列名稱或表示式。
單行函式用於處理資料項。其 接受一個或多個引數,並對查詢返回的 每一行返回一個值。 引數可以是下列物件之一: • 使用者提供的常量 • 變數值 • 列名 • 表示式 單行函式的特點包括: • 對查詢中返回的每一行進行處理 • 為每行返回一個結果 • 可能會返回一個與所引用型別不同的資料值 • 可能需要一個或多個引數 • 可用於 SELECT 、WHERE和ORDER BY 子句中;也可以巢狀。

將介紹以下單行函式: • 字元函式:接受字元輸入,可以返回 字元值和數字值 • 數字函式:接受數字輸入,可以返回數字值 • 日期函式:對DATE 資料型別的值進行處理(所有日期函式都會返回一個DATE 資料 型別的值,只有 MONTHS_BETWEEN 函式返回一個數字 。) • 轉換函式:將值從一種資料型別轉換為另一種資料型別 • 常規函式: - NVL  - NVL2  - NULLIF  - COALESCE  - CASE  - DECODE
  • 字元函式
單行字元函式接受的輸入是字元資料,可以返回字元值和數字值。字元函式可以分為 以下幾類: • 大小寫轉換函式 • 字元處理函式


注:以下是一些完全或部分符合 SQL:2003 的函式: UPPER LOWER TRIM LENGTH SUBSTR INSTR
  •  大小寫轉換函式
以下函式用於轉換字串的大小寫:   LOWER、UPPER和INITCAP是三個大小寫轉換函式。 • LOWER:將大小寫混合或大寫的字串轉換為小寫 • UPPER:將大小寫混合或小寫的字串轉換為大寫 • INITCAP:將每個單詞的首字母轉換為大寫,其餘字母保留為小寫
[email protected]> SELECT 'The job id for '||UPPER(last_name)||' is '||LOWER(job_id) AS "EMPLOYEE DETAILS" FROM   employees;
EMPLOYEE DETAILS ------------------------------------------------------ The job id for ABEL is sa_rep The job id for ANDE is sa_rep The job id for ATKINSON is st_clerk
  • 使用大小寫轉換函式
使用以下語句可顯示僱員Higgins 的僱員編號、姓名和部門 編號:
[email protected]> SELECT employee_id, last_name, department_id FROM   employees WHERE  last_name = 'higgins';
no rows selected 第一個SQL 語句的WHERE子句將僱員姓名指定為higgins。因為EMPLOYEES 表中的 所有資料都是以正常大小寫形式儲存的,所以姓名higgins在表中沒有找到匹配項, 因此不會選擇任何行。 [email protected]> SELECT employee_id, last_name, department_id FROM   employees WHERE  LOWER(last_name) = 'higgins';
EMPLOYEE_ID LAST_NAME                 DEPARTMENT_ID ----------- ------------------------- -------------         205 Higgins                             110
第二個SQL 語句中的WHERE子句指定將EMPLOYEES 表中的僱員姓名與higgins進行 比較,但是先將LAST_NAME 列轉換為小寫,然後再進行比較。因為兩個姓名都是小寫的, 因此找到了匹配項,從而選擇了一行。可以按以下方式重寫WHERE子句,產生的結果 相同: ...WHERE last_name = 'Higgins' 輸出中姓名的顯示格式與其儲存在資料庫中的一樣。要以大寫形式顯示姓名,可以在 SELECT 語句中使用UPPER函式。 [email protected]> SELECT employee_id, UPPER(last_name), department_id FROM   employees WHERE  INITCAP(last_name) = 'Higgins';
EMPLOYEE_ID UPPER(LAST_NAME)          DEPARTMENT_ID ----------- ------------------------- -------------         205 HIGGINS                             110
  • 字元處理函式
下面的函式用於處理字串:
CONCAT 、SUBSTR 、LENGTH 、INSTR、LPAD、RPAD 和TRIM 是要介紹的字元 處理函式。 • CONCAT :將值聯接在一起(CONCAT 函式中只能使用兩個引數) • SUBSTR :提取確定長度的字串 • LENGTH :以數字值的形式顯示字串的長度 • INSTR:查詢指定字串的數字位置 • LPAD:返回一個表示式,左邊使用一個字元表示式填充到n 個字元的長度 • RPAD:返回一個表示式,右邊使用一個字元表示式填充到n 個字元的長度 • TRIM:截去字串首字元或尾字元(或者兩者都截去)(如果trim_character 或trim_source 是一個字元文字,則必須將其放在單引號內) 注:可以將UPPER和LOWER等函式與& 替代變數組合使用。例如,如果使用 UPPER('&job_title'),使用者就不必以特定的大小寫形式輸入職務了。   instr( string1, string2, start_position,nth_appearance ) 
string1 源字串,要在此字串中查詢。
string2 要在string1中查詢的字串 。
start_position 代表string1 的哪個位置開始查詢。此引數可選,如果省略預設為1. 字串索引從1開始。如果此引數為正,從左到右開始檢索,如果此引數為負,從右到左檢索,返回要查詢的字串在源字串中的開始索引。
nth_appearance 代表要查詢第幾次出現的string2. 此引數可選,如果省略,預設為 1.如果為負數系統會報錯。
  • 使用字元處理函式
[email protected]> l                                                                                                                                         1  SELECT employee_id, CONCAT(first_name, last_name) NAME, job_id, LENGTH (last_name), INSTR(last_name, 'a') "Contains 'a'?"   2* FROM   employees WHERE  SUBSTR(job_id, 4) = 'REP' [email protected]> /
EMPLOYEE_ID NAME                                          JOB_ID     LENGTH(LAST_NAME) Contains 'a'? ----------- --------------------------------------------- ---------- ----------------- -------------         202 PatFay                                        MK_REP                     3             2         203 SusanMavris                                   HR_REP                     6             2         204 HermannBaer                                   PR_REP                     4             2
示例中顯示從其職務ID 的第四個位置開始包含字串 REP 的所有僱員的以下資訊: 聯接在一起的名字和姓氏、僱員姓氏的長度,以及字母a  在僱員姓氏中的數字位置。 示例: 修改幻燈片中的SQL 語句,以顯示姓氏以字母“n”為結尾的僱員的資料。 [email protected]> SELECT employee_id, CONCAT(first_name, last_name) NAME,LENGTH (last_name), INSTR(last_name, 'a') "Contains 'a'?"   2  FROM   employees WHERE  SUBSTR(last_name, -1, 1) = 'n';
EMPLOYEE_ID NAME                                          LENGTH(LAST_NAME) Contains 'a'? ----------- --------------------------------------------- ----------------- -------------         102 LexDe Haan                                                    7             5         105 DavidAustin                                                   6             0
  • 數字函式
• ROUND:將值舍入到指定的小數位 • TRUNC:將值截斷到指定的小數位 • MOD :返回除法運算的餘數 數字函式接受數字形式的輸入並返回數字值。
  • 使用ROUND 函式
[email protected]> SELECT ROUND(45.923,2), ROUND(45.923,0),ROUND(45.923,-1) FROM   DUAL;
ROUND(45.923,2) ROUND(45.923,0) ROUND(45.923,-1) --------------- --------------- ----------------           45.92              46               50
ROUND函式用於將列、表示式或值舍入到n 位小數位。如果第二個引數為0  或者缺失, 則會將值舍入為整數。如果第二個引數為2,則會將值舍入到2  位小數位。相反,如果 第二個引數為-2 ,則會將值舍入到小數點左邊2  位(即舍入到最近的百位)。 ROUND函式還可與日期函式一起使用。在本課稍後您將看到相應的示例。 DUAL 表 DUAL 表屬於SYS 使用者,但所有使用者都可以訪問它。它包含一個DUMMY列和一個值為X 的行。如果某個值只需返回一次,例如,不是從含有使用者資料的表中匯出的常量值、偽列 值或表示式值,則DUAL 表非常有用。DUAL 表通常用於保持SELECT 子句語法的完整性, 因為SELECT 和FROM 子句都是必需的,而有些計算並不需要從實際表中進行選擇。

  • 使用TRUNC 函式
[email protected]> SELECT TRUNC(45.923,2), TRUNC(45.923),TRUNC(45.923,-1) FROM   DUAL;
TRUNC(45.923,2) TRUNC(45.923) TRUNC(45.923,-1) --------------- ------------- ----------------           45.92            45               40
TRUNC函式用於將列、表示式或值截斷到n 位小數位。 TRUNC函式使用引數的方式與ROUND函式非常類似。如果第二個引數為0  或者缺失, 則會將值截斷為整數。如果第二個引數為2,則會將值截斷到2  位小數位。相反,如果 第二個引數為-2 ,則會將值截斷到小數點左邊2  位。如果第二個引數為-1 ,則將值截斷 到小數點左邊1  位。 與ROUND函式一樣,TRUNC函式也可與日期函式一起使用。      --Oracle trunc()函式的用法
/**************日期********************/
1.select trunc(sysdate) from dual   --2011-3-18  今天的日期為2011-3-18
2.select trunc(sysdate, 'mm')   from   dual   --2011-3-1    返回當月第一天.
3.select trunc(sysdate,'yy') from dual   --2011-1-1       返回當年第一天
4.select trunc(sysdate,'dd') from dual   --2011-3-18    返回當前年月日
5.select trunc(sysdate,'yyyy') from dual   --2011-1-1   返回當年第一天
6.select trunc(sysdate,'d') from dual   --2011-3-13 (星期天)返回當前星期的第一天
7.select trunc(sysdate, 'hh') from dual    --2011-3-18 14:00:00   當前時間為14:41   
8.select trunc(sysdate, 'mi') from dual   --2011-3-18 14:41:00   TRUNC()函式沒有秒的精確
/***************數字********************/
/*
TRUNC(number,num_digits) 
Number 需要截尾取整的數字。 
Num_digits 用於指定取整精度的數字。Num_digits 的預設值為 0。
TRUNC()函式擷取時不進行四捨五入
*/
9.select trunc(123.458) from dual  --123
10.select trunc(123.458,0) from dual  --123
11.select trunc(123.458,1) from dual  --123.4
12.select trunc(123.458,-1) from dual  --120
13.select trunc(123.458,-4) from dual  --0
14.select trunc(123.458,4) from dual   --123.458
15.select trunc(123) from dual   --123
16.select trunc(123,1) from dual  --123
17.select trunc(123,-1) from dual  --120
  • 使用MOD 函式
針對職務為銷售代表的所有僱員,計算薪金除以5,000  後的 餘數。 [email protected]> SELECT last_name, salary, MOD(salary, 5000) FROM   employees WHERE  job_id  = 'SA_REP';
LAST_NAME                     SALARY MOD(SALARY,5000) ------------------------- ---------- ---------------- Tucker                         10000                0 Bernstein                       9500             4500 Hall                            9000             4000 MOD 函式將返回第一個引數除以第二個引數之後的餘數。在示例中,針對職務ID  為SA_REP 的所有僱員計算薪金除以5,000 後的餘數。 注:MOD 函式經常用於確定一個值是奇數還是偶數。MOD 函式也是Oracle  雜湊函式。
  • 處理日期
• Oracle DB  以內部數字格式儲存日期:世紀、年、月、 日、小時、分鐘和秒。 • 預設的日期顯示格式為DD-MON-RR 。 – 通過僅指定年份的後兩位,可以在 20 世紀儲存 21 世紀 的日期 – 同樣,也可以在 21 世紀儲存 20 世紀的日期 [email protected]> SELECT last_name, hire_date FROM   employees WHERE  hire_date < '01-FEB-01 ';
LAST_NAME                 HIRE_DATE ------------------------- ------------------ De Haan                   13-JAN-01
Oracle DB 以內部數字格式儲存日期,以此代表世紀、年、月、日、小時、分鐘和秒。 任何日期的預設顯示格式和輸出格式均為DD-MON-RR 。有效的Oracle  日期介於公元前 4712 年1  月1  日和公元9999 年12 月31 日之間。 在示例中,HIRE_DATE 列輸出以預設格式DD-MON-RR 顯示。但是,在資料庫 中並不以這種格式儲存日期,而是儲存了日期和時間的所有組成部分。所以,儘管 17-JUN-87  之類的HIRE_DATE 只顯示出日、月和年,但是資料庫中還存在與該日期相 關聯的時間和世紀資訊。完整資料可能是June 17, 1987, 5:10:43 PM 。
  • RR日期格式

表中彙總了RR元素的行為。 RR日期格式與YY元素類似,但是可以使用它指定不同的世紀。請使用RR日期格式元素 代替YY,這樣返回值的世紀會根據指定的兩位數年份和當前年份的後兩位數而變化。   請注意顯示在上表倒數兩行中的值。當接近世紀中期時,RR 的行為大概不是你所 希望看到的。 此資料在內部按以下格式進行儲存: CENTURY YEAR MONTH DAY     HOUR    MINUTE SECOND  19             87             06         17         17         10         43   世紀和2000 年 將包含日期列的記錄插入到表中時,系統會從SYSDATE函式中獲取世紀資訊。但是, 在螢幕上顯示日期列時,預設情況下卻不顯示世紀的相應部分。 DATE 資料型別用2  個位元組儲存年份資訊:1  個位元組儲存世紀,1  個位元組儲存年。無論 是否指定或顯示世紀值,其始終會包含在內。這種情況下,RR決定INSERT 中世紀的 預設值。
  • 使用SYSDATE函式
SYSDATE是返回以下物件的函式: • 日期 • 時間 [email protected]> SELECT sysdate FROM   dual ;
SYSDATE ------------------ 17-OCT-13
SYSDATE是一個日期函式,它返回當前資料庫伺服器的日期和時間。可以像使用任何 其它列名稱一樣使用SYSDATE。例如,通過從表中選擇SYSDATE,可以顯示當前日期。 通常從稱為DUAL 的公用表中選擇SYSDATE。 注:SYSDATE將返回為資料庫所在作業系統設定的當前日期和時間。因此,如果本人 位於澳大利亞,但連線到位於美國(U.S.)  某地的遠端資料庫,則 sysdate函式將返回 美國的日期和時間。在這種情況下,可以使用CURRENT_DATE函式返回會話時區的當前 日期。
  • 與日期有關的運算
• 對日期加上或減去一個數字可以獲得一個新的日期值。 • 將兩個日期相減可以得出它們之間的天數。 • 將小時數除以24 可以將小時新增到日期中。
因為資料庫將日期作為數字進行儲存,因此可以使用算術運算子(如加和減)執行計算。 可以加減數字常量和日期。 可以執行下列操作:
  • 使用算術運算子處理日期
[email protected]> SELECT last_name, (SYSDATE-hire_date) /7 AS WEEKS FROM   employees WHERE  department_id = 90;
LAST_NAME                      WEEKS ------------------------- ---------- King                      539.384281 Kochhar                   421.241424 De Haan                   665.812852 示例中顯示部門 90 中所有僱員的姓氏和聘用週數。它用當前日期 ( SYSDATE)  減去 聘用僱員的日期,然後用所得的結果除以 7  計算出僱員的聘用週數。 注: SYSDATE是一個 SQL 函式,它用於返回當前日期和時間。在執行 SQL 查詢時, 返回的結果將隨為本地資料庫所在作業系統設定的日期和時間而變化。 如果從較早的日期中減去較晚的日期,差值將是一個負數。
  • 日期處理函式
日期函式用於處理 Oracle  日期。所有日期函式都返回一個 DATE 資料型別的值, 只有 MONTHS_BETWEEN 函式返回一個數字值 • MONTHS_BETWEEN(date1, date2):計算date1和date2之間的月數。結果可 以是正數,也可以是負數。如果 date1晚於 date2,則結果為正數;如果 date1 早於 date2,則結果為負數。結果中的非整數部分代表月份的一部分。 • ADD_MONTHS( date, n):將 n 個日曆月新增到 date。n 的值必須為整數,但可以 為負數。 • NEXT_DAY(date, ' char'):計算date 之後一週內下一個指定日 ('char')的 日期。char 的值可以是代表某一天的一個數字或者是一個字串。 • LAST_DAY(date):計算包含 date 的月份的最後一天的日期。 此列表只列出了部分可用日期函式。ROUND和TRUNC數字函式也可用來處理日期值, 如下所示: • ROUND( date[,' fmt ']) :返回舍入到由格式樣式 fmt 指定的單位的 date。如果 省略格式樣式 fmt ,則 date 將舍入到最近的一天。 • TRUNC( date[, 'fmt ']) :返回包含時間部分的日期 date,該日期已截斷到由 格式樣式 fmt 指定的單位。如果省略格式樣式 fmt ,則 date 將截斷到最近的一天。
  • 使用日期函式
在示例中,ADD_MONTHS函式在提供的日期值“31-JAN-96”上添加了一個月, 因而返回“29-FEB-96”。該函式將1996 年識別為閏年,因此返回二月份的最後一天。 如果將輸入日期值更改為“31-JAN-95”,該函式將返回“28-FEB-95”。 例如,顯示聘用時間不足150  個月的所有僱員的僱員編號、聘用日期、聘用月數、六個月 複核日期、聘用日期之後的第一個星期五和聘用月份的最後一天。 [email protected]> SELECT employee_id, hire_date, MONTHS_BETWEEN (SYSDATE, hire_date) TENURE, ADD_MONTHS (hire_date, 6) REVIEW,  NEXT_DAY (hire_date, 'FRIDAY'), LAST_DAY(hire_date) FROM   employees WHERE  MONTHS_BETWEEN (SYSDATE, hire_date) < 150;
EMPLOYEE_ID HIRE_DATE              TENURE REVIEW             NEXT_DAY(HIRE_DATE LAST_DAY(HIRE_DATE ----------- ------------------ ---------- ------------------ ------------------ ------------------         198 21-JUN-07          75.8933128 21-DEC-07          22-JUN-07          30-JUN-07         199 13-JAN-08          69.1513773 13-JUL-08          18-JAN-08          31-JAN-08         200 17-SEP-03                 121 17-MAR-04          19-SEP-03          30-SEP-03         201 17-FEB-04                 116 17-AUG-04          20-FEB-04          29-FEB-04
  • 使用ROUND 函式和TRUNC 函式處理日期
假設SYSDATE = '25-JUL-03':   可以使用ROUND和TRUNC函式處理數字和日期值。在處理日期時,這些函式會將日期 舍入或截斷到指定的格式樣式。因此,可以將日期舍入到最近的年份或月份。如果格式 樣式為Month,則日期在1-15 時,返回當前月份的第一天。日期在16-31  時,返回下一月 份的第一天。如果格式樣式為Year ,則月份在1-6  時,返回當前年份的第一天。月份在 7-12 時,返回下一年份的第一天。 示例: 將在2001年進入公司的所有僱員的聘用日期進行比較。使用ROUND和TRUNC函式顯示 僱員編號、聘用日期和起始月份。 [email protected]> SELECT employee_id, hire_date,ROUND(hire_date, 'MONTH'), TRUNC(hire_date, 'MONTH') FROM   employees WHERE  hire_date LIKE '%01';
EMPLOYEE_ID HIRE_DATE          ROUND(HIRE_DATE,'M TRUNC(HIRE_DATE,'M ----------- ------------------ ------------------ ------------------         102 13-JAN-01          01-JAN-01          01-JAN-01
  • 小結
單行函式可以巢狀到任意層。單行函式可以處理以下內容: • 字元資料:LOWER、UPPER、INITCAP、CONCAT 、SUBSTR 、INSTR、LENGTH • 數字資料:ROUND、TRUNC、MOD • 日期值: SYSDATE、MONTHS_BETWEEN、ADD_MONTHS、NEXT_DAY 、LAST_DAY 請牢記以下內容: • 日期值也可以使用算術運算子 • ROUND函式和TRUNC函式也可用來處理日期值 SYSDATE和DUAL SYSDATE是一個日期函式,它會返回當前日期和時間。通常從稱為 DUAL 的單行公用表 中選擇 SYSDATE。

           

給我老師的人工智慧教程打call!http://blog.csdn.net/jiangjunshow

這裡寫圖片描述