• oracle中的函数


    一、单行函数

         1.定义:作用于一行,返回值为一个

             注:以下所有的操作的表是Oracle数据库中自带的用户scott下的表

         2.字符函数

    --小写变大写
    select upper('yes') from dual;--YES
    select lower('YES') from dual;--yes

          3.数值函数

    select round(26.18,1) from dual;--四舍五入,后面的参数为保留几位小数,26.2
    select trunc(26.18,1) from dual;--直接截取,不在看后面面的位数,26.1
    select mod(10,3) from dual;--求余,1

          4.日期函数

             系统时间:sysdate

    --查询emp表中所有员工入职距离现在几天
    select sysdate-e.hiredate from emp e; 
    --算出明天此刻
    select sysdate+1 from dual;
    --查询emp表中所有员工入职距离现在几个月
    select months_between(sysdate,e.hiredate) from emp e;
    --查询emp表中所有员工入职距离现在几个年
    select months_between(sysdate,e.hiredate)/12 from emp e;
    
    --查询emp表中所有员工入职距离现在几周
    select round((sysdate-e.hiredate)/7) from emp e;
    --转换函数 --日期转字符串 select to_char(sysdate,'fm yyyy-mm-dd hh24:mi:ss') from dual; --字符串传日期 select to_date('2020-4-3 14:9:37','fm yyyy-mm-dd hh24:mi:ss') from dual;

            5.通用函数 

    --计算员工没年的工资:基础工资(sal)+ 奖金(comm),奖金中存在null值
    --如果null值和任意数字做算数运算,结果都是null;
    --nvl(e.comm,0)此函数表示e.comm不为空就用本身值,如果为空就用零
     select e.sal*12+nvl(e.comm,0) from emp e;

           6.条件表达式

    --条件表达式
    --给emp表中起一个中文名称
    select e.ename,
           case e.ename
             when 'SMITH' then '老杜'
               when 'ALLEN' then '老李'
                 when 'JONES' then '老张'
                   else '无名'
                     end
    
    from emp e;
    --判断emp表中员工工资,如果>3000显示高收入,>3000 and <1500显示中等,其余低收入
     select e.sal,
           case 
             when e.sal>3000 then '高收入'
               when e.sal>1500 then '中等'
                   else '低收入'
                     end
    
    from emp e;
    --oracle专用条件表达式
    --Oracle中除了起别名用双引号,其他都用单引号
    select e.ename,
           decode( e.ename,
              'SMITH' , '老杜',
                'ALLEN',  '老李',
                  'JONES',  '老张',
                    '无名') "中文名"
                     
    from emp e;

    二、多行函数[集合函数]

              定义:作用域多行,返回一个值。         

    select count(1) from emp;  --查询总数量,count(1)和count(*)一样
    select sum(sal) from emp; --工资总和
    select max(sal) from emp;  --最大工资
    select min(sal) from emp;   --最小工资
    select avg(sal) from emp;   --工资平均

    三、分组查询

    --查询每个部门的平均工资
    --分组查询中,出现在group by后面的原始列,才能出现在select后,其他的要加上聚合函数
    select e.deptno,avg(e.sal)
    from emp e
    group by e.deptno;
    --查询出平均工资高于2000部门信息
    --所有条件不能使用别名
    select e.deptno,avg(e.sal)
    from emp e
    group by e.deptno
    having avg(e.sal)>2000;
    --查询每个部门工资高于800的员工的平均工资
    --where 是过滤分组之前的数据,having是过滤分组之后数据进行判断
    select e.deptno,avg(e.sal)
    from emp e
    where e.sal>800
    group by e.deptno;
    --查询每个部门工资高于800的员工的平均工资,再查询出平均工资高于2000的部门
    select e.deptno,avg(e.sal)
    from emp e
    where e.sal>800
    group by e.deptno
    having avg(e.sal)>2000;

    四、连接

           1.等值连接           

    select *
    from emp e,dept d
    where e.deptno=d.deptno;

            2.外连接     

    --查询出所有部门,以及部门下的员工的信息【右外连接】
    select *
    from emp e right join dept d
    on e.deptno=d.deptno;
    --查询出所有员工的信息,以及员工所属的部门【左外连接】
    select *
    from emp e left join dept d
    on e.deptno=d.deptno;
    --oracle中的专业的外连接
    select * 
    from emp e,dept d
    where e.deptno(+)=d.deptno;

            3.自连接

    --查询员工姓名和员工领导姓名
    select e1.ename,e2.ename
    from emp e1,emp e2
    where e1.mgr=e2.empno;
    --查询员工姓名,员工部门名称,和员工领导姓名,员工领导部门名称
    select e1.ename,d1.dname,d2.dname,e2.ename
    from emp e1,emp e2,dept d1,dept d2
    where e1.mgr=e2.empno and e1.deptno=d1.deptno and e2.deptno=d2.deptno;

    五、子查询 

    --子查询
    --查询出工资和SCOTT一样的员工信息
    select * from emp where sal in
    (select sal from emp where ename='SCOTT');
    --查询出工资和10号部门一样的员工信息
    select * from emp where sal in(
    select sal from emp where deptno=10);
    --查询每个部门最低工资,和最低工资的员工姓名,和该员工所在部门名称
    --先查询每个部门最低工资
    select e.deptno,min(sal) msal
    from emp e
    group by e.deptno 
    
    
    --最终结果
    select t.deptno,t.msal,e.ename,d.dname
    from (select e.deptno,min(sal) msal
    from emp e
    group by e.deptno) t,emp e,dept d
    where t.deptno=e.deptno and t.msal=e.sal
    and e.deptno=d.deptno;

    六、分页查询

           1.oracle中的分页

              - - rownum行号:当我们做select操作时,没查询处一行记录就会在该行加上一个行号。

              - - 行号从1开始,依次递增,不能跳着走。

              - - 排序操作会影响rownum的顺序,如果要排序,还要使用rownum的话,我们可以使用嵌套查询。

    --根据rownum排序
    select rownum, t.* from(
    select * from emp e order by e.sal desc
    ) t
    --emp表工资倒叙排序后,每页五条记录,查询第二页
    select * from 
    (select rownum rn,t.* from(
    select * from emp e order by e.sal desc
    ) t where rownum<11
    ) where rn>5 

     七、视图

            1.将其他用户的表拉到当前用户下        

    create table emp as select * from scott.emp;

             2.视图作用

                1)可以屏蔽掉敏感字段

                2)保证总部和分部数据的统一    

    --创建视图(必须有dba权限)
    create view v_emp as
    select ename ,job from emp;
    
    --修改视图
    update v_emp set job='CLERK' where ename='ALLEN';
    commit;
    --创建只读视图
    create view v_emp as select ename ,job from emp  with read only;

    八、索引

           1.概念:索引就是在表上构建一个二叉树,达到大幅度提高查询效率的目的,但是索引会影响增删改的效率

           2.单例索引       

    --创建单列索引
    create index idx_ename on emp(ename);
    --单列索引触发规则,必须是索引列的原始值
    --单行函数,模糊查询都会影响索引的触发
    select * from emp where ename='SCOTT';

            3.复合索引

    --复合索引触发规则,复合索引第一列位有限检索列
    --必须包含优先检索列中的值,才会触发
    select *from emp where ename='SCOTT' and job='xx';--触发复合索引
    select *from emp where ename='SCOTT' or job='xx';--不触发

       

  • 相关阅读:
    Java 验证码工具类
    Servlet实现文件下载
    SQLyog连接报错 Error No.2058 Plugin caching_sha2_password could not be loaded
    springmvc上传文件出现异常,postman测试,文件上传问题org.springframework.web.HttpMediaTypeNotSupportedException: Content type 'multipart/form-data;
    swaager2中实现文件上传的api测试操作
    idea中无法正常显示java与jsp文件内容
    servlet容器多线程与spring单例
    ThreadLocal使用与注意事项
    mysql的分组之后取时间最大的时间的那个数据
    servlet中常见装饰类HttpServletRequestWrapper等等
  • 原文地址:https://www.cnblogs.com/cqyp/p/12630537.html
Copyright © 2020-2023  润新知