Oracle 開發——單行函式
單行函式
本次文章主要學習
-理解函式的作用
-掌握單行函式的五大分類函式
-其中,會一直用到到的虛表
DUAL:是一張虛表,不能儲存任何資料,只有一個欄位,一行記錄。當我們不希望從任何表中讀取資料,同時又想利用SQL引擎中的計算表示式的能力幫我們運算時,就可以使用DUAL表
SQL函式概述
SQL函式分類主要分為兩種
-單行函式
-多行函式
單行函式語法
語法:
函式名[(引數1,引數2,…)]
其中的引數可以是以下之一:
- 變數
- 列名
- 表示式
單行函式特徵
- 單行函式特徵
- 單行函式對單行操作
- 每行返回一個結果
- 有可能返回值與原引數資料型別不一致
- 單行函式可以寫在SELECT、WHERE、ORDER BY子句中
- 有些函式沒有引數,有些函式包括一個或多個引數
- 函式可以巢狀
單行函式分類
分為5大類
- 字元函式
- 數值函式
- 日期函式
- 轉換函式
- 通用函式
字元函式
字元函式
- 字元函式:主要指引數型別是字元型,不同函式返回值可能是字元型或數值型。
大小寫函式
LOWER(列名|表示式)
將大寫或大小寫混合的字元轉換成小寫
select lower('ABCDE')
from dual;
UPPER(列名|表示式)
將小寫或大小寫混合的字元轉換成大寫
select upper('abcde')
from dual;
INITCAP(列名|表示式)
將每個單詞的第一個字母轉換成大寫,其餘的字母都轉換成小寫
select initcap('oycp oyyyyy') from dual;
字元處理函式
CONCAT(column1|expression1,column2|expression2)
連線兩個值 ,等同於||
select concat(ename,sal)
from emp;
SUBSTR (column|expression,n1[,n2])
返回第一個引數中,從第n1位開始,長度為n2的子串。
如果n2省略,取第n1位開始的所有字元。
如果n1是負值,表示從第一個引數的後面第abs(n1)位開始向右取長度為n2的子串。
select substr('abcdefg',1,3)
from dual;
LENGTH(column | expression)
取字元長度
select length('abcdefg')
from dual;
INSTR(s1,s2,[,n1],[n2])
返回s1中,子串s2從n1開始,第n2次出現的位置。n1,n2預設值為1
select instr('abcdefg','c')---3
from dual;
LPAD(s1,n1,s2)
返回s1被s2從左面填充到n1長度後的字串。
select lpad('abc',11,'*')
from dual;
RPAD(s1,n1,s2)
返回s1被s2從右面填充到n1長度後的字串。
select rpad('abc',11,'*')
from dual;
TRIM
去除字串頭部或尾部(頭尾)的字元格式:TRIM(leading | trailing | both trim_character From trim_source)
select trim('c' from 'abcdefccccccccc')
from dual;
![在這裡插入圖片描述](https://www.icode9.com/img/ll/?i=20201230190643897.png)
REPLACE(s1,s2,s3)
把s1中的s2用s3替換。
select replace('abcdef','c','p')----abpdef
from dual;
數值函式
ROUND
將列或表示式所表示的數值四捨五入到小數點後的第n位。
格式: ROUND(column| expression, n)
ROUND(45.926, 2) -> 45.93
select round(12.4846,2)
from dual;
TRUNC
將列或表示式所表示的數值擷取到小數點後的第n位。
格式:TRUNC(column| expression, n)
TRUNC(45.926, 2) -> 45.92
select trunc(12.4846,2)
from dual;
MOD
取m除以n後得到的餘數
格式:MOD(m,n)
MOD(1600, 300) ->100
select mod(1600,300)
from dual;
常用日期函式
SYSDATE
返回系統日期
select sysdate
from dual;
MONTHS_BETWEEN
返回兩個日期型別資料之間間隔的自然月數
SELECT ename, sal, MONTHS_BETWEEN(SYSDATE,hiredate) months
FROM emp
ORDER BY months;
ADD_MONTHS
返回指定日期加上相應的月數後的日期
SELECT ename, sal, hiredate, ADD_MONTHS(hiredate,3) new_date
FROM emp
WHERE hiredate>'01-1月-82';
NEXT_DAY
返回某一日期的下一個指定日期
SELECT NEXT_DAY('02-2月-06','星期一') NEXT_DAY
FROM DUAL;
LAST_DAY
返回指定日期當月最後一天的日期
SELECT LAST_DAY('02-2月-06') "LAST DAY"
FROM DUAL;
ROUND(date[,‘fmt’])
將date按照fmt指定的格式進行四捨五入,fmt為可選項,如果沒有指定fmt,則預設為DD,將date四捨五入為最近的天。
格式碼:世紀CC,年YY,月MM,日DD,小時HH24,分MI,秒SS
SELECT empno, hiredate,
ROUND(hiredate, 'MONTH')
FROM emp
WHERE SUBSTR(hiredate,-2,2)='81'
TRUNC(date[,‘fmt’])
將date按照fmt指定的格式進行截斷,fmt為可選項,如果沒有指定fmt,則預設為‘DD’,將date擷取為最近的天。
SELECT empno, hiredate, TRUNC(hiredate, 'MONTH')
FROM emp
WHERE SUBSTR(hiredate,-2,2)='81';
EXTRACT
返回日期型別資料中的年份、月份或者日
SELECT ename, hiredate,
EXTRACT (MONTH FROM HIREDATE) MONTH
FROM emp
WHERE deptno= 10;
轉換函式
分為兩種
- 隱式資料型別轉換
- 顯式資料型別轉換
隱式資料型別轉換規則
不同的資料型別之間關聯,如果不使用顯式轉換函式,則它會根據以下規則對資料進行隱式轉換:
- 對於INSERT和UPDATE操作,oracle會把插入值或者更新值隱式轉換為欄位的資料型別
- 對於SELECT語句,oracle會把欄位的資料型別隱式轉換為變數的資料型別
當比較一個字元型和數值型的值時,oracle會把字元型的值隱式轉換為數值型 - 當比較字元型和日期型的資料時,oracle會把字元型轉換為日期型
- 用連線操作符(||)時,oracle會把非字元型別的資料轉換為字元型別
- 如果字元型別的資料和非字元型別的資料(如number、date、rowid等)作算術運算,則oracle會將字元型別的資料轉換為合適的資料型別,這些資料型別可能是number、date、rowid等
顯式資料型別轉換
通常是在字元型別、日期型別、數值型別之間進行顯式轉換。主要有3個顯式轉換函式:
- TO_CHAR
- TO_NUMBER
- TO_DATE
TO_CHAR 用於日期型
日期格式模型:
- 必須用單引號引起來並且是大小寫敏感的
- 可以包含任何有效的日期元素
- 使用逗號將日期型資料與日期型格式模型分隔開
SELECT ename,TO_CHAR(hiredate,'MM/YY') month_hired
FROM emp;
日期格式模型的元素
TO_CHAR 用於數值型
通過在TO_CHAR中使用以下形式可以把數值型資料轉化成變長的字串:
SELECT TO_CHAR(sal,'$99,999') SALARY
FROM emp
WHERE ename = 'SCOTT';
TO_NUMBER 函式
使用TO_NUMBER將一個字串轉換成數值型資料
TO_NUMBER(char[, 'fmt'])
注意:要轉換的char型別資料必須是由數字組成的字串,格式碼中相應的格式必須要和char中的格式匹配。
TO_DATE 函式
select to_date('2020/12/30','YYYY/MM/DD')
from dual
通用函式
與空值(NULL)相關的一些函式,完成對空值(NULL)的一些操作。主要包括以下函式:
NVL
語法:NVL (expr1,expr2)
如果expr1不是null,返回expr1,否則返回expr2
NVL2
語法:NVL2(expr1,expr2,expr3)
如果expr1不是null,返回expr2,否則返回expr3
NULLIF
語法: NULLIF(expr1,expr2)
比較兩個表示式,如果相等,返回null,否則,返回第一個表示式
COALESCE
COALESCE (表示式1, 表示式2, … 表示式n)函式是對NVL函式的擴充套件。COALESCE函式的功能是返回第一個不為空的引數,引數個數不受限制。
SELECT ename, COALESCE(comm, 0) comm , deptno
FROM emp;
條件處理函式:
CASE表示式
SELECT ename, deptno,
(CASE deptno
WHEN 10 THEN '銷售部'
WHEN 20 THEN '技術部'
WHEN 30 THEN '管理部'
ELSE '無' END)
deptname
FROM emp;
DECODE
SELECT ename, deptno,
decode(deptno,
10,'銷售部',
20,'技術部',
30 , '管理部',
'無') deptname
FROM emp;