• oracle-函数总结


    Oracle函数

    一 Oracle函数概述

           Oracle数据库的强大,体现在对用户管理,pl/sql编程,函数丰富。在Oracle 数据库中主要使用两种类型的函数:

    单行函数:对每一个函数应用在表的记录中时,只能输入一行结果,返回一个结果,比如:MOD(x,y)返回x 除以y 的余数(x 和y 可以是两个整数,也可以是表中的整数列)。常用的单行函数有:

    字符函数:对字符串操作。

    数学函数:对数字进行计算,返回一个数字。

    转换函数:可以将一种数据类型转换为另外一种数据类型。

    日期函数:对日期和时间进行处理。

    聚合函数:聚合函数同时可以对多行数据进行操作,并返回一个结果。比如 SUM(x)

    返回结果集中 x 列的总合。

    二 字符函数

    字符函数接受字符参数,这些参数可以是表中的列,也可以是一个字符串表达式。

    函数

    说明

    举例

    结果

    ascii(x)

    返回字符x对应的ascii码值

    select ascii ('A') from dual;

    65

    chr(n)

    返回整数n对应的字符

    select chr (65) from dual;

    A

    concat(x,y)

    连接字符串x,y

    连接字段x,y

    select concat('hell','world') from dual;

    select concat(empno,ename) from emp;

    hellworld

    initcap(str)

    返回字符串并将字符串的第一个字母变成大写

    select initcap(‘hello WORLD’) from dual;

    Hello World

    instr(str1,str2[,s,n])

    在一个字符串中搜索指定的字符,返回发现指定的字符的位置;

    str1被搜索的字符串;

    str2希望搜索的字符串;

    s搜索的开始位置,默认为1;

    n第n次出现的位置,默认为1;

    select instr('oracle training','ra',1,2) from dual;

    9

    lenghh(str)

    返回字符串的长度

    select ename,length(ename) from emp;

     

    lower(str)

    返回字符串,并将所有字符小写

    select lower(ename) from emp;

     

    upper(str)

    返回字符串,并将所有字符大写

    select upper('AaBbCcDd') from dual;

    AABBCCDD

    rpad(str1,x[,str2])

    在列或字符的右边粘贴字符;x表示字符总长度

    select rpad('hello', 10, '*') from dual;

    hello*****

    lpad(str1,x[,str2])

    在列或字符的左边粘贴字符;x表示字符总长度

    select lpad('hello', 10, '*') from dual;

    *****hello

    ltrim(str1 [,str2])

    删除左边出现的字符串, 默认为空字符串

    select ltrim('   hello   ') from dual;

    select ltrim('hello world hello','hello') from dual;

    hello  

     

     

    world hello

    rtrim(str1[,str2])

    删除右边出现的字符串, 默认为空字符串

    select rtrim('   hello   ') from dual;或

    select rtrim('hello world hello','hello') from dual;

       hello

     

     

    hello world

    trim(str from string)

    去处string左右两边的str字符

    trim(0 from 0009872348900)

    98723489

    substr(str,s,n)

    取子字符串,从s开始,取n个

    substr('130123456789',3,8)

    01234567

    replace(str,st1,str2)

    用str2替换str中的str1

    replace('boll', 'l', 'd')

    bodd

    三 数学函数

    函数

    说明

    举例

    结果

    ceil(x)

    返回大于或等于x的最小整数

    ceil(3.1415)

    4

    floor(x)

    返回小于或等于x的最大整数

    floor(3.987)

    3

    round(x ,y)

    按照四舍五入精度进行舍入,y缺省为0

    round(124.16666,-2)

    round(124.16666,2)

    100

    124.17

    trunc(x,y)

    按照指定的精度截取x,y缺省为0

    trunc(124.16666,-2)

    trunc(124.16666,2)

    100

    124.16

    abs(x)

    返回x的绝对值

    abs(100)  abs(-100)

    100   100

    exp(x)

    返回e的x次方

    exp(2)

    7.38905609

    ln(x)

    返回x的自然对数

    ln(2)

    ln(exp(2))

    0.69314718

    2

    log(x,y)

    返回以x为底,y的对数

    Log(2,4)

    2

    power(x,y)

    返回x的y次幂

    power(2,3)

    8

    sqrt(x)

    返回x的平方根

    sqrt(4)

    2

    mod(x,y)

    返回x除以y的余数

    mod(8,3)

    2

    sign(x)

    返回x的符号,大于0返回1,小于0返回-1,等于0返回0

    sign(5)、sign(-5)、sign(0)

    1,-1,0

    四 日期函数

    4.1 sysdate

    解释:获取当前系统日期使用sysdate

    示例:

    select sysdate from dual;

    4.2 add_months

    语法:add_months(d,n)

    参数:d日期类型,n增减的月份值

    解释:返回在日期d基础上再加n个月后新的日期

    示例:

    select add_months(sysdate,2) from dual;

    select hiredate,add_months(hiredate,2) from emp where ename='SMITH';

    练习:

    请查找最近半年入职的员工

    select ename,hiredate from emp where add_months(hiredate,6)>=sysdate;

    4.3 last_day

    语法:last_day(d)

    参数:d日期类型

    解释:返回日期d所在月的最后一天;

    示例:

    select ast_day(sysdate) from dual;

    4.4 months_between

    语法:months_between(d2,d1)

    参数:d2日期类型,d1日期类型

    解释:给出d2-d1的月份,共有多少个月;

    示例:

    select months_between('19-12月-1999','19-3月-1999') mon_between from dual;

    select months_between(to_date('2000-05-20','yyyy-mm-dd'),to_date('2005-05-20','yyyy-mm-dd')) from dual;

    4.5 next_day

    语法:next_day(d,w)

    参数:d日期,w星期

    解释:给出日期d和星期w之后计算下一个星期的日期;

    示例:

    select next_day('26-6月-2017','星期五') next_day from dual;

    例子:

    问题:查找已经入职8个月多的员工

    select * from emp where sysdate>=add_months(hiredate,8);

    问题:显示满10年服务年限的员工的姓名和受雇日期。

    select ename, hiredate from emp where sysdate>=add_months(hiredate,12*10);

    问题:对于每个员工,显示其加入公司的天数。(掌握)

    select floor(sysdate-hiredate) "入职天数",ename from emp;

    select trunc(sysdate-hiredate) "入职天数",ename from emp;

    问题:找出各月倒数第3天受雇的所有员工。

    select hiredate,ename from emp where last_day(hiredate)-2=hiredate;

    五 转换类型函数

    5.1 to_char

    语法:to_char(d,formate)

    参数:d日期类型或者数值类型,formate字符格式

    解释:将日期类型或者数值类型转换成指定字符串格式

    示例:

    select to_char(sysdate,'yyyy/mm/dd hh24:mi:ss') from dual;

    select to_char(sal,'$9999.99') from emp;

    特别说明:

    日期格式:

    yy:两位数字的年份 2004--04

    yyyy:四位数字的年份 2004年

    mm:两位数字的月份 8月--08

    dd:两位数字的天数 30号--30

    hh24:二十四小时制8点--20

    hh12:十二小时制8点--08

    mi:显示分钟

    ss:显示秒

    day:显示星期几

    数字格式:

    9:显示数字,并忽略前面0

    0:显示数字,如位数不足,则用0补齐

    .:在指定位置显示小数点

    ,:在指定位置显示逗号

    $:在数字前加美元符号

    L:在数字前加本地货币符号

    C:在数字前加国际货币符号

    G:在指定位置显示组分隔符

    D:在指定位置显示小数点符号(.)

    说明:,逗号和.小数点可以合在一起使用,G分隔符和D小数点符可以合在一起使用,但,.不能和GD综合使用,否则报错。

    5.2 to_date

    语法:to_date(str,formate)

    参数:str字符类型,formate日期格式

    解释:将字符串转换成日期

    示例:

    select to_date('2004-05-07 1:23:44','yy-mm-dd hh:mi:ss') from dual;

    5.3 to_number

    语法:to_number(str)

    参数:str字符类型

    解释:将给出的字符转换为数字;

    示例:select to_number('1999') year from dual;

     

    例子:

    问题:显示薪水的时候,把本地货币单位加在前面

    select ename, to_char(hiredate, 'yyyy-mm-dd hh24:mi:ss'), to_char(sal,'L99999.99') from emp;

    问题:显示1980年入职的所有员工

    select * from emp where to_char(hiredate, 'yyyy')=1980;

    问题:显示所有12月份入职的员工

    select * from emp where to_char(hiredate, 'mm')=12;

    六 聚合函数

    聚合函数:一组值进行计算,并返回计算后的值,具有统计数据的作用。分组函数会自动忽略空值。

    6.1 sum

    语法:sum(distinct|all)

    参数:all表示对所有的值 (缺省),distinct只对不同的值

    解释:求总和

    示例:

    select sum(distinct sal) from emp;

    select sum(all sal) from emp;

    6.2 avg

    语法:avg(distinct|all)

    参数:all表示对所有的值 (缺省),distinct只对不同的值

    解释:求平均值

    示例:

    select avg(distinct sal) from emp;

    select avg(all sal) from emp;

    6.3 max

    语法:max(distinct|all)

    参数:all表示对所有的值 (缺省),distinct只对不同的值

    解释:求最大值

    示例:

    select max(distinct sal) from emp;

    6.4 min

    语法:min(distinct|all)

    参数:all表示对所有的值 (缺省),distinct只对不同的值

    解释:求最小值

    示例:

    select min(all sal) from emp;

    6.5 count

    语法:count(distinct|all)

    参数:all表示对所有的值 (缺省),distinct只对不同的值(相同值只取一次)

    解释:求记录、数据个数。记的是多少行

    示例:

    select count(sal) from emp;

    select count(distinct sal) from emp;

    七 分组查询

           在实际SQL应用中,经常需要进行分组聚合,即将查询对象按一定条件分组,然后对每一个组进行聚合分析。创建分组是通过GROUP BY子句实现的。与WHERE子句不同,GROUP BY子句用于归纳信息类型,以汇总相关数据。GROUP BY的作用是通过一定的规则将一个数据集划分成若干个小的区域,然后针对若干个小区域进行数据处理。

    7.1 group by

    语法:select 字段名,聚合函数()  

    from 表名

    group by 字段名;

    解释:主要用来对一组数进行统计

    示例:

    求每个部门的平均工资,要求显示:部门号,部门的平均工资

    select deptno ,avg(sal) from emp group by deptno;

    说明:

    在使用group by关键字时,在select列表中可以指定的项目是有限制的,select语句中仅许以下几项:

    (1)被分组的列

    (2)为每个分组返回一个值得表达式,例如用一个列名作为参数的聚合函数

    group by 有一个原则,就是 select 后面的所有列中,没有使用聚合函数的列,必须出现在 group by 后面。

    当GROUP BY子句中用于分组的列中出现NULL值时,将所有的NULL值分在同一组,即认为它们是“相等”的。

    7.2 having

    语法:SELECT column, SUM(column) 

    FROM table

    GROUP BY column

    HAVING SUM(column) condition value

    解释:

    对分组统计再加限制条件进行筛选

    示例:

    select deptno,count(*),sum(sal)

    from emp

    group by deptno

    having count(*)>=5;

    说明: HAVING通常与GROUP BY子句同时使用。当然sum()也可以是其他聚合函数。

    注意事项:

    (1)聚合函数不能出现在from后面,where子句,group by后面,

            --聚合函数可以出现在select子句,having子句,order by子句

     (2)where子句中放的是普通的条件,不涉及到聚合函数的条件

     (3)having子句中不能放普通条件,必须放与聚合函数有关的条件

    HAVING子句与WHERE子句的区别

    having子句和where子句的相似之处在于,它也定义搜索条件。都是对查询结果的一种筛选。不同之处在于:

    1、    where不能跟在group by子句后面,having是跟group by子句一起连用的,跟在其后面。

    2、where条件中不能有聚合函数,而having可以有。

    3、where子句只能接收from子句输出的数据,对其进行筛选;having对使用group by进行分组统计后的结果进行进一步的筛选。

    八 语句执行顺序

    select 列 from 表列表名/视图列表名

    where 条件

    group by (列)

    having 条件

    order by 列列表

    执行顺序:

    先where 再group 再having 再select 后order

    九 案例分析

    9.1 案例一

    某公司印了一批充值卡,卡的密码是随机生成的,现在出现这个问题:

        卡里面的“O0”(哦和零)“i1”(哎和一),用户反映说看不清楚,公司决定,把存储在数据库中的密码中所有的“哦”都改成“零”,把所有的“i”都改成“1”

           请编写SQL语句实现以上要求;

    数据库表名:card

    密码字段名:password

    update card set password= replace(password,’o’,’0’);

    update card set password= replace(password,’i’,’1’);

    update card set password=replace(replace(password,’o’,’0’),’i’,’1’);

    9.2 案例二

    在数据库表中有以下字符数据,如:

           13-113-213-313-1013-10013-10813-1813-1113-1514-114-2

           现在希望通过SQL语句进行排序,并且首先要按照前半部分的数字进行排序,然后再按照后半部分的数字进行排需,输出要排成这样:

           13-113-213-313-1013-1113-1513-1813-10013-10814-114-2

    数据库表名:sellRecord

    字段名:listNumber

    select listNumber

    from sellRecord

    order by

    to_number(substr(listNumber,1, instr(listNumber,’-’)-1))

    to_number(substr(listNumber, instr(listNumber,’-’)+1))


    作者:8亩田
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接.

    本文如对您有帮助,还请多帮 【推荐】 下此文。
    如果喜欢我的文章,请关注我的公众号
    如果有疑问,请下面留言

    学而不思则罔 思而不学则殆
  • 相关阅读:
    【linux磁盘与文件系统管理】8-RAID工作原理和实现
    【linux磁盘与文件系统管理】5,6,7-文件系统使用-管理
    【linux磁盘与文件系统管理】3,4-MBR和GPT分区-分区管理
    【linux磁盘与文件系统管理】2-分区表MBR
    【linux磁盘与文件系统管理】1-磁盘结构和概念
    01学习Vue.js过程总结
    oracle表管理(建表,改表,删表,表数据增删改查)
    oracle数据类型
    Orcal登录密码过期
    基于Container部署的k8s集群
  • 原文地址:https://www.cnblogs.com/liu-wang/p/8267356.html
Copyright © 2020-2023  润新知