Oracle_SQL函数-单行函数

SQL函数

SQL函数分类

  • SQL函数主要有两种,分为单行函数、多行函数
    • 单行函数:只对一行进行变换,每行返回一个结果。可以转换数据类型,可以嵌套参数可以是一列或一个值
    • 多行函数:多行函数,每次对一组记录进行处理。然后对于这一组记录只返回一个结果。
两种SQL函数

单行函数

  • 单行函数的分类:主要有字符通用转换日期数值
单行函数

字符函数

  • 字符函数分为:大小写控制函数字符控制函数
字符函数
大小写控制函数 :这类函数改变字符的大小写
 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
大小写控制函数
  • 在全称匹配中,可以通过大小写的转换函数来进行字符的大小写转换。
字符控制函数
字符控制函数的种类
  • CONCAT(字符连接函数):CONCAT('Hello', ' World!')
SELECT CONCAT('Hello', ' World!') FROM  dual
  • SUBSTR(字符字串函数) :SUBSTR('HelloWorld', 1, 5)
    • SUBSTR函数字符串是从 1开始,这点和 Java 有点不同。
    • 函数的最后一个参数表示,从开始往后截取多少个字符串。
SELECT SUBSTR('abcdefgh',2,4) FROM dual;
结果
  • LENGTH:取得字符串的长度LENGTH('HelloWorld!')
  • INSTR:获取某个字符在字符串中的位置INSTR('HelloWorld!','W')
SELECT LENGTH('HelloWorld!'),INSTR('HelloWorld!','W') FROM dual;
结果
  • LPAD:左补齐函数LPAD(salary,10,'*')
  • RPAD:右补齐函数RPAD(salary,10,'*')
SELECT salary,LPAD(salary,10,'*'),RPAD(salary,10,'*') FROM employees;
LPAD,RPAD
  • TRIM去除前后字符函数,函数能去掉字符的前后空格,或者去掉字符串中首尾特定字符(使用该方式需要使用到FROM关键字)
SELECT TRIM('H' FROM 'HelloHWorldHH') FROM dual;
SELECT TRIM('  HelloHWorldHH   ') FROM dual;
去除特定字符
去除空格
  • REPLACE字符串替换函数。能够替换字符串中所有的特定函数
SELECT REPLACE('abcdabcdabcd','a','m') FROM dual
字符串替换函数

数值函数

  • 数值函数主要有以下:ROUND: 四舍五入 、TRUNC: 截断、MOD: 求余
    数值函数
  • ROUND 函数:通过第二个参数,表示在第几位进行四舍五入,并且舍弃后面的数值
SELECT ROUND(45.923,2),ROUND(45.923,0),ROUND(45.923,-1) FROM dual
四舍五入
  • TRUNC函数,能够直接对于数值进行截断!不做任何进位操作
SELECT TRUNC(45.923,2),TRUNC(45.923,0),TRUNC(45.923,-1) FROM dual
截断函数
  • MOD 函数,对数值进行求余运算。
SELECT salary, MOD(salary,1000) AS Mod_Salary FROM employees;
Mod求余函数

日期函数

  • Oracle 中的日期型数据实际含有两个值: 日期和时间。

  • 函数SYSDATE既包含日期也包含时间SELECT sysdate FROM dual

  • 日期的数学运算

    • 在日期上加上或减去一个数字结果仍为日期。
    • 两个日期相减返回日期之间相差的天数。
      • 日期不允许做加法运算,无意义
    • 可以用数字除24来向日期中加上或减去天数。
  • 可以对两个日期之间的天数进行操作

SELECT last_name,(SYSDATE-hire_date)/7 AS Weeks
FROM employees
WHERE department_id = 90
  • 日期函数主要有以下几种:
函数 描述
MONTHS_BETWEEN 两个日期相差的月数
ADD_MONTHS 向指定日期中加上若干个月数
NEXT_DAY 指定日期的下一个星期所对应的日期
LAST_DAY 本月的最后一天
ROUND 日期四舍五入
TRUNC 日期截断
  • 时间和日期的表示方法:
yyyy  年、 mm   月、dd   日
hh   小时、 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;

转换函数

隐式数据类型转换
  • Oracle 自动完成下列转换:
源数据类型 目标数据类型
VARCHAR2 or CHAR NUMBER
VARCHAR2 or CHAR DATE
NUMBER VARCHAR2
DATE VARCHAR2
DATE <---> VARCHAR2 <---> NUMBER
显式的数据类型转换
  • 显式的数据类型转换主要使用到几个转换函数:
    • TO_DATE
    • TO_CAHR
    • TO_NUMBER
  • TO_CAHR函数对日期的转换的转换
    • TO_CHAR(date,'fomat_model')
  • 格式:
    • 必须包含在单引号中而且大小写敏感。
    • 可以包含任意的有效的日期格式。
    • 日期之间用逗号隔开。
select TO_CAHR(SYSDATE,'yyyy-MM-dd hh:mm:dd day') from dual
  • 日期格式的元素
Model View
YYYY 2016
YEAR twenty sixteen
MM 06
MONTH 6月(根据本地显示) 或者June
MON 6月(根据本地显示) 或者Jun
DY 星期六 或者 SATURDAY
DAY 星期六 或者 SAT
DD 18
  • 时间格式
HH:MI:SS AM         02:06:18 下午
HH24:MI:SS          14:06:18 
  • 使用双引号向日期中添加字符
-- DD "of" MONTH    18 of 6月 
select to_char(sysdate,'DD "of" MONTH') from dual
  • TO_DATE 函数对字符的转换
    • TO_DATE(CHAR,'fomat_model')
    • 使用TO_DATE函数将字符转换为数字
  • 注意:文字与格式的字符串要相匹配!
SELECT TO_DATE('2016年06月18日 14:31:35','yyyy"年"mm"月"dd"日"hh24:mi:ss')
From dual
  • TO_DATE 函数对数字的转换

    • 下面是在TO_CHAR 函数中经常使用的几种格式:
      格式
  • 金额格式,如果是用9,不足的位数不会填充;但是使用0,就会在不足的位上补零

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 函数对字符的转换
  • 使用 TO_NUMBER 函数将字符转换成数值:
    • TO_DATE(CHAR,'fomat_model')
SELECT TO_NUMBER('¥1,234,567,890.00','L999,999,999,999.99')
FROM dual

通用函数

  • 这些函数适用于任何数据类型,同时也适用于空值

    • NVL (expr1, expr2)
    • NVL2 (expr1, expr2, expr3)
    • NULLIF (expr1, expr2)
    • COALESCE (expr1, expr2, ..., exprn)
  • NVL 函数:将空值转换成一个已知的值

    • 可以使用的数据类型有日期、字符、数字。
    • 函数的一般形式:
    • NVL(commission_pct,0)
    • NVL(hire_date,'01-JAN-97')
    • NVL(job_id,'No Job Yet')
  • NVL2 函数: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 函数: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 函数
    • COALESCE 与 NVL 相比的优点在于 COALESCE 可以同时处理交替的多个值。
    • 如果第一个表达式为空,则返回下一个表达式,对其他的参数进行COALESCE 。
-- 如果commision_pct 为空,返回salary,如果salary还为空就返回10.  

SELECT   last_name,
         COALESCE(commission_pct, salary, 10) comm
FROM     employees
ORDER BY commission_pct;
  • 条件表达式

    • 在 SQL 语句中使用IF-THEN-ELSE 逻辑
    • 使用两种方法:
      • CASE 表达式
      • DECODE 函数
  • CASE 表达式示例

CASE expr WHEN comparison_expr1 THEN return_expr1
         [WHEN comparison_expr2 THEN return_expr2
          WHEN comparison_exprn THEN return_exprn
          ELSE else_expr]
END
-- 练习:查询部门号为 10, 20, 30 的员工信息, 若部门号为 10, 则打印其工资的 1.1 倍, 20 号部门, 则打印其工资的 1.2 倍, 30 号部门打印其工资的 1.3 倍数
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 函数示例
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)

嵌套函数

  • 单行函数可以嵌套。
  • 嵌套函数的执行顺序是由内到外。


    嵌套函数
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,454评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,553评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,921评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,648评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,770评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,950评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,090评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,817评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,275评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,592评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,724评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,409评论 4 333
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,052评论 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,815评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,043评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,503评论 2 361
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,627评论 2 350

推荐阅读更多精彩内容

  • SQL SELECT 语句 一、查询SQL SELECT 语法 (1)SELECT 列名称 FROM 表名称 (2...
    有钱且幸福阅读 5,438评论 0 33
  • 1.简介 数据存储有哪些方式?电子表格,纸质文件,数据库。 那么究竟什么是关系型数据库? 目前对数据库的分类主要是...
    乔震阅读 1,710评论 0 2
  • Oracle-SQL 这是对Oracle-SQL知识点详细介绍的文章系列,其他文章如下: Oracle-SQL系列...
    GuaKin_Huang阅读 2,589评论 0 14
  • 作者/盖是那么美 那一夜,无雪的寒冬,开心的冰激凌; 那一夜,孤单的街灯,漫长的身影。 那一夜,看着你如嫣的笑脸,...
    盖是那么美阅读 536评论 23 17
  • 2017年4月3日 星期一 晴 【早起】 5:10起床。(在老家,这次因为要跑三处,没提电脑回...
    滋心润霖阅读 66评论 0 0