Oracle DB 使用單行函式定製輸出
阿新 • • 發佈:2018-11-16
分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow
也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!
• 描述SQL 提供的各類函式 • 在SELECT 語句中使用字元、數字和日期函式- SQL 函式
- 兩種型別的SQL 函式
單行函式 這些函式僅對單行進行處理, 為每行返回一個結果。單行函式具有多種不同型別。 介紹以下幾種函式: • 字元 • 數字 • 日期 • 轉換 • 常規
多行函式
- 單行函式
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
- 大小寫轉換函式
[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
- 使用大小寫轉換函式
[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.如果為負數系統會報錯。 |
- 使用字元處理函式
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 函式
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 函式
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 函式
LAST_NAME SALARY MOD(SALARY,5000) ------------------------- ---------- ---------------- Tucker 10000 0 Bernstein 9500 4500 Hall 9000 4000 MOD 函式將返回第一個引數除以第二個引數之後的餘數。在示例中,針對職務ID 為SA_REP 的所有僱員計算薪金除以5,000 後的餘數。 注:MOD 函式經常用於確定一個值是奇數還是偶數。MOD 函式也是Oracle 雜湊函式。
- 處理日期
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 ------------------ 17-OCT-13
SYSDATE是一個日期函式,它返回當前資料庫伺服器的日期和時間。可以像使用任何 其它列名稱一樣使用SYSDATE。例如,通過從表中選擇SYSDATE,可以顯示當前日期。 通常從稱為DUAL 的公用表中選擇SYSDATE。 注:SYSDATE將返回為資料庫所在作業系統設定的當前日期和時間。因此,如果本人 位於澳大利亞,但連線到位於美國(U.S.) 某地的遠端資料庫,則 sysdate函式將返回 美國的日期和時間。在這種情況下,可以使用CURRENT_DATE函式返回會話時區的當前 日期。
- 與日期有關的運算
因為資料庫將日期作為數字進行儲存,因此可以使用算術運算子(如加和減)執行計算。 可以加減數字常量和日期。 可以執行下列操作:
- 使用算術運算子處理日期
LAST_NAME WEEKS ------------------------- ---------- King 539.384281 Kochhar 421.241424 De Haan 665.812852 示例中顯示部門 90 中所有僱員的姓氏和聘用週數。它用當前日期 ( SYSDATE) 減去 聘用僱員的日期,然後用所得的結果除以 7 計算出僱員的聘用週數。 注: SYSDATE是一個 SQL 函式,它用於返回當前日期和時間。在執行 SQL 查詢時, 返回的結果將隨為本地資料庫所在作業系統設定的日期和時間而變化。 如果從較早的日期中減去較晚的日期,差值將是一個負數。
- 日期處理函式
- 使用日期函式
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 函式處理日期
EMPLOYEE_ID HIRE_DATE ROUND(HIRE_DATE,'M TRUNC(HIRE_DATE,'M ----------- ------------------ ------------------ ------------------ 102 13-JAN-01 01-JAN-01 01-JAN-01
- 小結