Oracle_SQL函數(shù)-單行函數(shù)

SQL函數(shù)

SQL函數(shù)分類

  • SQL函數(shù)主要有兩種,分為單行函數(shù)、多行函數(shù)
    • 單行函數(shù):只對(duì)一行進(jìn)行變換,每行返回一個(gè)結(jié)果。可以轉(zhuǎn)換數(shù)據(jù)類型,可以嵌套參數(shù)可以是一列或一個(gè)值
    • 多行函數(shù):多行函數(shù),每次對(duì)一組記錄進(jìn)行處理。然后對(duì)于這一組記錄只返回一個(gè)結(jié)果。
兩種SQL函數(shù)

單行函數(shù)

  • 單行函數(shù)的分類:主要有字符通用轉(zhuǎn)換日期數(shù)值
單行函數(shù)

字符函數(shù)

  • 字符函數(shù)分為:大小寫控制函數(shù)字符控制函數(shù)
字符函數(shù)
大小寫控制函數(shù) :這類函數(shù)改變字符的大小寫
 SELECT 'helloworld Java',
        LOWER('helloworld Java') AS "Lower Last_Name",
        UPPER('helloWorld Java') AS "UPper Last_name",
        INITCAP('helloWorld Java') AS "InitCap Last_Name"
FROM dual
大小寫控制函數(shù)
  • 在全稱匹配中,可以通過(guò)大小寫的轉(zhuǎn)換函數(shù)來(lái)進(jìn)行字符的大小寫轉(zhuǎn)換。
字符控制函數(shù)
字符控制函數(shù)的種類
  • CONCAT(字符連接函數(shù)):CONCAT('Hello', ' World!')
SELECT CONCAT('Hello', ' World!') FROM  dual
  • SUBSTR(字符字串函數(shù)) :SUBSTR('HelloWorld', 1, 5)
    • SUBSTR函數(shù)字符串是從 1開(kāi)始,這點(diǎn)和 Java 有點(diǎn)不同。
    • 函數(shù)的最后一個(gè)參數(shù)表示,從開(kāi)始往后截取多少個(gè)字符串。
SELECT SUBSTR('abcdefgh',2,4) FROM dual;
結(jié)果
  • LENGTH:取得字符串的長(zhǎng)度LENGTH('HelloWorld!')
  • INSTR:獲取某個(gè)字符在字符串中的位置INSTR('HelloWorld!','W')
SELECT LENGTH('HelloWorld!'),INSTR('HelloWorld!','W') FROM dual;
結(jié)果
  • LPAD:左補(bǔ)齊函數(shù)LPAD(salary,10,'*')
  • RPAD:右補(bǔ)齊函數(shù)RPAD(salary,10,'*')
SELECT salary,LPAD(salary,10,'*'),RPAD(salary,10,'*') FROM employees;
LPAD,RPAD
  • TRIM去除前后字符函數(shù),函數(shù)能去掉字符的前后空格,或者去掉字符串中首尾特定字符(使用該方式需要使用到FROM關(guān)鍵字)
SELECT TRIM('H' FROM 'HelloHWorldHH') FROM dual;
SELECT TRIM('  HelloHWorldHH   ') FROM dual;
去除特定字符
去除空格
  • REPLACE字符串替換函數(shù)。能夠替換字符串中所有的特定函數(shù)
SELECT REPLACE('abcdabcdabcd','a','m') FROM dual
字符串替換函數(shù)

數(shù)值函數(shù)

  • 數(shù)值函數(shù)主要有以下:ROUND: 四舍五入 、TRUNC: 截?cái)唷?code>MOD: 求余
    數(shù)值函數(shù)
  • ROUND 函數(shù):通過(guò)第二個(gè)參數(shù),表示在第幾位進(jìn)行四舍五入,并且舍棄后面的數(shù)值
SELECT ROUND(45.923,2),ROUND(45.923,0),ROUND(45.923,-1) FROM dual
四舍五入
  • TRUNC函數(shù),能夠直接對(duì)于數(shù)值進(jìn)行截?cái)啵〔蛔鋈魏芜M(jìn)位操作
SELECT TRUNC(45.923,2),TRUNC(45.923,0),TRUNC(45.923,-1) FROM dual
截?cái)嗪瘮?shù)
  • MOD 函數(shù),對(duì)數(shù)值進(jìn)行求余運(yùn)算。
SELECT salary, MOD(salary,1000) AS Mod_Salary FROM employees;
Mod求余函數(shù)

日期函數(shù)

  • Oracle 中的日期型數(shù)據(jù)實(shí)際含有兩個(gè)值: 日期和時(shí)間。

  • 函數(shù)SYSDATE既包含日期也包含時(shí)間SELECT sysdate FROM dual

  • 日期的數(shù)學(xué)運(yùn)算

    • 在日期上加上或減去一個(gè)數(shù)字結(jié)果仍為日期。
    • 兩個(gè)日期相減返回日期之間相差的天數(shù)。
      • 日期不允許做加法運(yùn)算,無(wú)意義
    • 可以用數(shù)字除24來(lái)向日期中加上或減去天數(shù)。
  • 可以對(duì)兩個(gè)日期之間的天數(shù)進(jìn)行操作

SELECT last_name,(SYSDATE-hire_date)/7 AS Weeks
FROM employees
WHERE department_id = 90
  • 日期函數(shù)主要有以下幾種:
函數(shù) 描述
MONTHS_BETWEEN 兩個(gè)日期相差的月數(shù)
ADD_MONTHS 向指定日期中加上若干個(gè)月數(shù)
NEXT_DAY 指定日期的下一個(gè)星期所對(duì)應(yīng)的日期
LAST_DAY 本月的最后一天
ROUND 日期四舍五入
TRUNC 日期截?cái)?/td>
  • 時(shí)間和日期的表示方法:
yyyy  年、 mm   月、dd   日
hh   小時(shí)、 mi  分鐘、ss 秒
day  星期      
SELECT MONTHS_BETWEEN(SYSDATE+30,SYSDATE),
       ADD_MONTHS(SYSDATE,2),
       NEXT_DAY(SYSDATE,'星期四'),
       LAST_DAY(SYSDATE),
       ROUND(SYSDATE,'mm'),ROUND(SYSDATE,'yyyy'), 
       TRUNC(SYSDATE,'mm'),TRUNC(SYSDATE,'yyyy')
FROM dual;

轉(zhuǎn)換函數(shù)

隱式數(shù)據(jù)類型轉(zhuǎn)換
  • Oracle 自動(dòng)完成下列轉(zhuǎn)換:
源數(shù)據(jù)類型 目標(biāo)數(shù)據(jù)類型
VARCHAR2 or CHAR NUMBER
VARCHAR2 or CHAR DATE
NUMBER VARCHAR2
DATE VARCHAR2
DATE <---> VARCHAR2 <---> NUMBER
顯式的數(shù)據(jù)類型轉(zhuǎn)換
  • 顯式的數(shù)據(jù)類型轉(zhuǎn)換主要使用到幾個(gè)轉(zhuǎn)換函數(shù):
    • TO_DATE
    • TO_CAHR
    • TO_NUMBER
  • TO_CAHR函數(shù)對(duì)日期的轉(zhuǎn)換的轉(zhuǎn)換
    • TO_CHAR(date,'fomat_model')
  • 格式:
    • 必須包含在單引號(hào)中而且大小寫敏感。
    • 可以包含任意的有效的日期格式。
    • 日期之間用逗號(hào)隔開(kāi)。
select TO_CAHR(SYSDATE,'yyyy-MM-dd hh:mm:dd day') from dual
  • 日期格式的元素
Model View
YYYY 2016
YEAR twenty sixteen
MM 06
MONTH 6月(根據(jù)本地顯示) 或者June
MON 6月(根據(jù)本地顯示) 或者Jun
DY 星期六 或者 SATURDAY
DAY 星期六 或者 SAT
DD 18
  • 時(shí)間格式
HH:MI:SS AM         02:06:18 下午
HH24:MI:SS          14:06:18 
  • 使用雙引號(hào)向日期中添加字符
-- DD "of" MONTH    18 of 6月 
select to_char(sysdate,'DD "of" MONTH') from dual
  • TO_DATE 函數(shù)對(duì)字符的轉(zhuǎn)換
    • TO_DATE(CHAR,'fomat_model')
    • 使用TO_DATE函數(shù)將字符轉(zhuǎn)換為數(shù)字
  • 注意:文字與格式的字符串要相匹配!
SELECT TO_DATE('2016年06月18日 14:31:35','yyyy"年"mm"月"dd"日"hh24:mi:ss')
From dual
  • TO_DATE 函數(shù)對(duì)數(shù)字的轉(zhuǎn)換

    • 下面是在TO_CHAR 函數(shù)中經(jīng)常使用的幾種格式:
      格式
  • 金額格式,如果是用9,不足的位數(shù)不會(huì)填充;但是使用0,就會(huì)在不足的位上補(bǔ)零

SELECT TO_CHAR(salary, '$999,999.00') SALARY
FROM   employees
WHERE  last_name = 'Ernst';

SELECT TO_CHAR(salary, '$000,000.00') SALARY
FROM   employees
WHERE  last_name = 'Ernst';
  • TO_NUMBER 函數(shù)對(duì)字符的轉(zhuǎn)換
  • 使用 TO_NUMBER 函數(shù)將字符轉(zhuǎn)換成數(shù)值:
    • TO_DATE(CHAR,'fomat_model')
SELECT TO_NUMBER('¥1,234,567,890.00','L999,999,999,999.99')
FROM dual

通用函數(shù)

  • 這些函數(shù)適用于任何數(shù)據(jù)類型,同時(shí)也適用于空值

    • NVL (expr1, expr2)
    • NVL2 (expr1, expr2, expr3)
    • NULLIF (expr1, expr2)
    • COALESCE (expr1, expr2, ..., exprn)
  • NVL 函數(shù):將空值轉(zhuǎn)換成一個(gè)已知的值

    • 可以使用的數(shù)據(jù)類型有日期、字符、數(shù)字。
    • 函數(shù)的一般形式:
    • NVL(commission_pct,0)
    • NVL(hire_date,'01-JAN-97')
    • NVL(job_id,'No Job Yet')
  • NVL2 函數(shù):NVL2 (expr1, expr2, expr3) : expr1不為NULL,返回expr2;為NULL,返回expr3。

SELECT last_name,  salary, commission_pct,
       NVL2(commission_pct, 
            'SAL+COMM', 'SAL') income
FROM  employees 
WHERE department_id IN (50, 80);
  • NULLIF 函數(shù):NULLIF (expr1, expr2) : 相等返回NULL,不等返回expr1
SELECT first_name, LENGTH(first_name) "expr1", 
       last_name,  LENGTH(last_name)  "expr2",
       NULLIF(LENGTH(first_name), LENGTH(last_name)) result
FROM   employees;
  • COALESCE 函數(shù)
    • COALESCE 與 NVL 相比的優(yōu)點(diǎn)在于 COALESCE 可以同時(shí)處理交替的多個(gè)值。
    • 如果第一個(gè)表達(dá)式為空,則返回下一個(gè)表達(dá)式,對(duì)其他的參數(shù)進(jìn)行COALESCE 。
-- 如果commision_pct 為空,返回salary,如果salary還為空就返回10.  

SELECT   last_name,
         COALESCE(commission_pct, salary, 10) comm
FROM     employees
ORDER BY commission_pct;
  • 條件表達(dá)式

    • 在 SQL 語(yǔ)句中使用IF-THEN-ELSE 邏輯
    • 使用兩種方法:
      • CASE 表達(dá)式
      • DECODE 函數(shù)
  • CASE 表達(dá)式示例

CASE expr WHEN comparison_expr1 THEN return_expr1
         [WHEN comparison_expr2 THEN return_expr2
          WHEN comparison_exprn THEN return_exprn
          ELSE else_expr]
END
-- 練習(xí):查詢部門號(hào)為 10, 20, 30 的員工信息, 若部門號(hào)為 10, 則打印其工資的 1.1 倍, 20 號(hào)部門, 則打印其工資的 1.2 倍, 30 號(hào)部門打印其工資的 1.3 倍數(shù)
SELECT employee_id,last_name,department_id,salary,
       CASE department_id WHEN 10 THEN salary*1.1
                          WHEN 20 THEN salary*1.2
                          WHEN 30 THEN salary*1.3
                          ELSE salary
       END AS "new_salary"
FROM employees
WHERE department_id in (10,20,30)
  • DECODE 函數(shù)示例
DECODE(col|expression, search1, result1 ,
               [, search2, result2,...,]
               [, default])
-- DECODE版本
SELECT employee_id,last_name,department_id,salary,
       DECODE (department_id,10, salary*1.1,
                             20, salary*1.2,
                             30, salary*1.3,
                             salary) AS "new_salary"
FROM employees
WHERE department_id in (10,20,30)

嵌套函數(shù)

  • 單行函數(shù)可以嵌套。
  • 嵌套函數(shù)的執(zhí)行順序是由內(nèi)到外。


    嵌套函數(shù)
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 229,732評(píng)論 6 539
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 99,214評(píng)論 3 426
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人,你說(shuō)我怎么就攤上這事。” “怎么了?”我有些...
    開(kāi)封第一講書人閱讀 177,781評(píng)論 0 382
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我,道長(zhǎng),這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書人閱讀 63,588評(píng)論 1 316
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 72,315評(píng)論 6 410
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書人閱讀 55,699評(píng)論 1 327
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,698評(píng)論 3 446
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書人閱讀 42,882評(píng)論 0 289
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 49,441評(píng)論 1 335
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 41,189評(píng)論 3 356
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 43,388評(píng)論 1 372
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,933評(píng)論 5 363
  • 正文 年R本政府宣布,位于F島的核電站,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 44,613評(píng)論 3 348
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 35,023評(píng)論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 36,310評(píng)論 1 293
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 52,112評(píng)論 3 398
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 48,334評(píng)論 2 377

推薦閱讀更多精彩內(nèi)容

  • SQL SELECT 語(yǔ)句 一、查詢SQL SELECT 語(yǔ)法 (1)SELECT 列名稱 FROM 表名稱 (2...
    有錢且幸福閱讀 5,501評(píng)論 0 33
  • 1.簡(jiǎn)介 數(shù)據(jù)存儲(chǔ)有哪些方式?電子表格,紙質(zhì)文件,數(shù)據(jù)庫(kù)。 那么究竟什么是關(guān)系型數(shù)據(jù)庫(kù)? 目前對(duì)數(shù)據(jù)庫(kù)的分類主要是...
    喬震閱讀 1,755評(píng)論 0 2
  • Oracle-SQL 這是對(duì)Oracle-SQL知識(shí)點(diǎn)詳細(xì)介紹的文章系列,其他文章如下: Oracle-SQL系列...
    GuaKin_Huang閱讀 2,624評(píng)論 0 14
  • 作者/蓋是那么美 那一夜,無(wú)雪的寒冬,開(kāi)心的冰激凌; 那一夜,孤單的街燈,漫長(zhǎng)的身影。 那一夜,看著你如嫣的笑臉,...
    蓋是那么美閱讀 556評(píng)論 23 17
  • 2017年4月3日 星期一 晴 【早起】 5:10起床。(在老家,這次因?yàn)橐苋帲瑳](méi)提電腦回...
    滋心潤(rùn)霖閱讀 67評(píng)論 0 0