• Oracle函数


    一.函数的分类

    1.函数:一般是在数据上执行的,它只是将取出的数据进行处理,不会改变数据库中的值

    2.组合函数又称聚合函数:输入多个值,最终只会返回一个值

          组函数仅可用于选择列表或查询的having字句

    3.单行函数: 输入一个值,输出一个值

    二.字符函数

    1.concat:表示字符串的连接,等同于||

      select concat('my name is ',ename) from emp;

    2.将字符串的首字符大写

      select initcap(ename) from emp;

    3.将字符串全部转换为大写

      select upper(ename) from emp;

    4.将字符串全部转换为小写

      select lower(ename) from emp;

    5.填充字符串

      select lpad(ename,10,'*') from emp;  若字符串不够10位,从左开始补充*

      select rpad(ename,10,'*') from emp;  若字符串不够10位,从左开始补充*

    6.去除空格

      select trim(ename) from emp;  去除左右两边的空格

      select ltrim(ename) from emp;  去除左边的空格

      select rtrim(ename) from emp;  去除右边的空格

    7.查找指定字符串的位置

      select instr('ABABCD','A') from emp;

    8.查看字符串的长度

      select length(ename) from emp;

    9.截取字符串的操作

      select substr(ename,0,2) from emp;

    10.替换操作

      select replace('ababefg','ab','hehe') from emp;

    二.数值函数

    1.给小数进行四舍五入操作,可以指定小数部分的位数

      select round(123.123 , 2) from dual;

    2.截断数据,此时按照位数截取,但是不能进行四舍五入的操作

      select trunc(123.123 , 2) from dual;

    3.取模操作

      select mod(10 , 4) from dual;

    4.向上取整

      select ceil(12.56) from dual;

    5.向下取整

      select floor(13.99) from dual;

     6.取绝对值

      select abs(-100) from dual;

    7.获取正负值

      select sign(-100) from dual;

    8.x的y次幂

      select power(2,3) from dual;

    三.日期函数

    1.mysql中时间:

      select current_time() from xx;

    2.mysql中日期:

      select current_date() from xx;

    3.mysql中日期加时间:

      select current_timestamp() from dual;

    4.oracle中日期函数:

      select sysdate from dual;

      select current_date from dual;

    5.在当前时间上添加指定的月份:

      select add_months(hiredate,2),hiredate from emp;

    6.返回输入日期所在月份的最后一天:

      select last_day(sysdate) from dual;

    7.两个日期间隔的月份:

      select months_between(syadate,hiredate) from emp;

    8.返回四舍五入的第一天:

      

    9. 返回下周的星期几:

      select next_day(sysdate,'星期一') from dual;

    10.提取日期中的时间:

      

    11. 返回日期的时间戳:

      select localtimestamp from dual;

      select current_date from dual;

      select current_timestamp from dual;

    12.给指定的时间单位增加数值:

      

    四.转换函数

    在oracle中存在数值的隐式转换和显式转换

      隐式转换:字符串可以转换为数值或者日期

      显式转换(to_char):当由数值或者日期转成字符串的时候,必须要规定格式

    转换函数:

      to_char、to_number、to_date

      

     1.to_char:函数操作日期

      date-->to_char:select to_char(sysdate,'YYYY-MM-SS HH24:MI:SS') from dual;

    2.to_char:函数操作字符

      number--> to_char:select to_char(123.456789,'9999') from dual;

                  select to_char(123.456789,'0000.00') from dual;

                  select to_char(123.456789,'$0000.00') from dual;

                  select to_char(123.456789,'L0000.00') from dual;

                  select to_char(123456789,'999,999,999,999') from dual;

    3.to_date:函数操作字符串

      to_date:转换之后都是固定的格式

      select to_date('2019/10/10 10:10:10','YYYY-MM-DD HH24:MI:SS') from dual; 4.to_number:函数操作数字

      select to_number('123,456,789','999,999,999') from dual;

    五.条件函数

    1.decode

      给不同部门的人员涨薪,10部门涨10%,20部门涨20%,30部门涨30%

      select ename,deptno,sal,decode(deptno,10,sal*1.1,20,sal*1.2,30,sal*1.3) from emp;

    2.case when  

      给不同部门的人员涨薪,10部门涨10%,20部门涨20%,30部门涨30%

      select deptno,case deptno when 10 then sal*1.1 when 20 then sal*1.2 when 30 then sal*1.3 end from emp;

    六.组函数

    一般情况下组函数都要和group by结合进行使用

    1.avg:只用于数值类型的值

      select avg(sal) from emp;

    2.min:适用于所有类型的值

      select min(sal) from emp;

    3.max:适用于所有类型的值

      select max(sal) from emp;

    4.count:处理数值,跳过空值而处理非空值

    一般用于获取表中记录条数,使用时可以使用*、某一具体的类或者数字来替代,从运行效率上看,建议使用数字或者某一具体的类,而不要使用*

      select count(sal) from emp;

    5.sum:只用于数值类型的值

      select sun(sal) from emp;

    6.group by :按照某些相同的值去进行分组操作

      select avg(sal) from emp group by deptno;

    注意:

      group by进行分组操作的时候,可以指定一个列或者多个列,但是使用group by后选择列表中只能包含组函数值或者group by的普通字段

      select deptno,avg(sal),ename from emp group by deptno;  会报错

      因为你在进行了group by分组后,每个分组中的ename是不一样的

    7.having:进行条件判断时我们通常使用where,但是使用where时仅限表中已有的字段,这时就要使用having

      求平均薪水大于2000的部门

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

    8.限制输出

      limit:仅在mysql中shiyong(select * from emp order by sal limit 5;)

        注意:mysql中limit+数字n表示取前n条,limit +数字n,m表示从n条开始取,取m条

      分页rownum:在oracle中不能直接使用rownum,需要嵌套使用

        求薪水最高的前5名雇员

        select * from (select * from emp e order by e.sal desc) t1 where rownum <= 5;

        求薪水最高的6到10名雇员

        错误写法:select * from (select * from emp e order by sal desc) where rownum >5 and rownum <=10;

        错误原因:rownum会随着查询结果的变化而变化,先执行rownum>5,那么oracle会将前5条数据删除,从第6条数据开始的编号从1开始递增发生改变,即第6条数据编号变为1,第七条变为2。。。。这样数据就被破坏了

        正确写法:先取出前10条数据,当取出前10条数据后,默认的rownum会显示,之后再将取出的值作为查询数据进行查询

        

    七.SQL执行顺序

    当select、from、where、group by、orger by这吴哥关键字同时存在sql中时

    from > where > group by > select > order by

    八.关联查询

    92语法:多张表进行关联的时候关联条件会写在where条件后,用逗号分隔,这样会导致结构很乱

      例如:select a.a1,b.b1,c.c1,d.d1 from a,b,c,d where a.a1=b.b1,b.b1=c.c1 ......;

    1.等值连接:两个表中包含相同的列名

    2.非等值连接:两个表中没有相同的列名,但是某一个列在另一张表的列的范围之中

    3.左外连接:把左表的全部数据显示

       右外连接:把右表的全部数据显示

       自连接:将一张表当成不同的表来看待,自己关联自己

        例如:将雇员和他经理的名称查出来

              select e.ename,m.ename from emp e,emp m where e.mgr = m.empno; 

    笛卡尔积:当关联多张表,但是不指定连接条件的时候,会进行笛卡尔积

            关联后的总记录数为m*n

      select * from emp e,dept d;

    99语法:关联条件写在on后,结构清晰

    1.cross join:等同于92语法中的笛卡尔积

      select * from emp cross join dept;

    2.nature join:自然连接,相当于等值连接,但是不需要写连接条件,会从两张表中找到相同字段进行连接。若两张表中不具有相同的列名的时候会进行笛卡尔积操作。

      select * from emp e nature join dept d;

    3.on子句:添加连接条件

      select * from emp e join dept d on e.deptno = d.deptno;

    4.left outer join:左外连接,会将左表中的数据完全显示,右表中没有的会显示空

      select * from emp e left outer join dept d on e.deptno = d.deptno;

    5.right outer join:右外连接,会将右表中的数据完全显示,左表中没有的会显示空

      select * from emp e right outer join dept d on e.deptno = d.deptno;

    6.全连接:相当于左外连接和右外连接的合集

      select * from emp e full join dept d on e.deptno = d.deptno;

      注意:左外连接、右外连接和全连接中的outer可以不写

    7.inner join:两张表的连接查询,只会查询出有匹配记录的数据

      select * form emp e inner join dept d on e.deptno = d.deptno;

    8.using:除了可以使用on表示连接条件之外,也可以使用using作为连接条件,此时连接条件的列不再归属任何一张表

      select * from emp e join dept d using(deptno);  emp表与dept表中都存在deptno字段,但是当使用using连接时,deptno字段不再属于任何一张表。

      select e.deptno from emp e join dept d using(deptno);    不会查询出来结果,因为deptno不属于任何一张表,所以查询不出结果。

    九.子查询

    sql允许多层嵌套,子查询,即嵌套在其他查询中的查询

      例如:查询薪水在整个雇员薪水之上的员工

            select * from emp e where e.sal > (select avg(sal) from emp);

     

  • 相关阅读:
    常用C# 6.0 常用 新特性
    VS 编译总是出现错误: "LC.EXE 已退出,代码为1"
    C# XML封装
    VS 2015秘钥
    写入Txt文本信息
    C# 7.0 新特性
    Winform 弹框增加确定按钮并点击确定后进行下一步操作
    VS 代码过长自动换行
    C# 6.0 新特性
    string::npos 是什么 c++ /STL
  • 原文地址:https://www.cnblogs.com/lyc-code/p/13174419.html
Copyright © 2020-2023  润新知