Oracle数据库中的函数、视图和索引

版权声明:作者: 子非鱼Leo 关于作者:专注大数据,java学习! 本文为博主原创文章,欢迎转载,但未经博主同意必须保留此段声明,且在文章页面明显位置给出原文链接 如有问题, 欢迎共同进步!邮箱[email protected] 原文链接 https://blog.csdn.net/Leo1120178518/article/details/86013649

1. Oracle函数

Oracle SQL 提供了用于执行特定操作的专用函数。这些函数大大增强了 SQL 语言的功能。函数可以接受零个或者多个输入参数,并返回一个输出结果。 Oracle 数据库中主要使用两种类型的函数:
1. 单行函数:
对每一个函数应用在表的记录中时,只能输入一行结果,返回一个结果,比如: MOD(x,y)返回 x 除以 y 的余数( x 和 y 可以是两个整数,也可以是表中的整数列)。常用的单行函数有:对每一个函数应用在表的记录中时,只能输入一行结果,返回一个结果,比如: MOD(x,y)返回 x 除以 y 的余数( x 和 y 可以是两个整数,也可以是表中的整数列)。
常用的单行函数有:
 字符函数:对字符串操作。
 数字函数:对数字进行计算,返回一个数字。
 转换函数:可以将一种数据类型转换为另外一种数据类型。
 日期函数:对日期和时间进行处理。

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

字符函数

字符函数接受字符参数,这些参数可以是表中的列,也可以是一个字符串表达式。下表
列出了常用的字符函数。
在这里插入图片描述

在这里插入图片描述

数字函数

数字函数接受数字参数,参数可以来自表中的一列,也可以是一个数字表达式。

在这里插入图片描述

说明:

  1. ROUND(X[,Y]),四舍五入。
    在缺省 y 时,默认 y=0;比如: ROUND(3.56)=4。
    y 是正整数,就是四舍五入到小数点后 y 位。 ROUND(5.654,2)=5.65。
    y 是负整数,四舍五入到小数点左边|y|位。 ROUND(351.654,-2)=400。

  2. TRUNC(x[,y]),直接截取,不四舍五入。
    在缺省 y 时,默认 y=0;比如: TRUNC (3.56)=3。
    y 是正整数,就是四舍五入到小数点后 y 位。 TRUNC (5.654,2)=5.65。
    y 是负整数,四舍五入到小数点左边|y|位。 TRUNC (351.654,-2)=300。

日期函数

日期函数对日期进行运算。常用的日期函数有:
1.SYSDATE:显示系统当前日期

例:select sysdate from dual
  1. ADD_MONTHS(date,n),在某一个日期 date 上,加上指定的月数 n,返回计算后的新日期。date 表示日期, n 表示要加的月数。
例:select add_months(sysdate, 6) six_month_later from dual;
  1. LAST_DAY(date),返回指定日期当月的最后一天。
    例:select last_day(sysdate) from dual;

4.NEXT_DAY(date,char):返回date日期的下一个周几,周几是由char决定的。

例:select NEXT_DAY(SYSDATE, ‘星期三’) from dual;

Char:中文环境中用中文,英文环境中用英文。
5.MONTHS_BETWEEN(DATE1,DATE2):计算date1和date2两个日期间的间隔。注意是date1-date2

例:select months_between(sysdate, ’17-1月-17’) from dual;

例:计算emp表中职员入职多少个月。

  1. ROUND(d[,fmt]),返回一个以 fmt 为格式的四舍五入日期值, d 是日期, fmt 是格式
    模型。默认 fmt 为 DDD,即月中的某一天。
如果 fmt 为“YEAR”则舍入到某年的 1 月 1 日,即前半年舍去,后半年作为下一年。
如果 fmt 为“MONTH”则舍入到某月的 1 日,即前月舍去,后半月作为下一月。
例:select round(to_date(‘2009-09-25’, ‘yyyy-mm-dd’), ‘MONTH’) round_date from dual;
例:select round(to_date(‘2009-09-25’, ‘yyyy-mm-dd’), ‘YEAR’) round_date from dual;
例:select round(to_date(‘2009-09-25’, ‘yyyy-mm-dd’)) round_date from dual;

与 ROUND 对应的函数是TRUNC(d[,fmt])对日期的操作, TRUNC 与 ROUND 非常相似,只
是不对日期进行舍入,直接截取到对应格式的第一天。

例:select TRUNC(to_date(‘2009-09-25’, ‘yyyy-mm-dd’), ‘MONTH’) trunc_date from dual;
例:select TRUNC (to_date(‘2009-09-25’, ‘yyyy-mm-dd’), ‘YEAR’) trunc_date from dual;
例:select TRUNC (to_date(‘2009-09-25’, ‘yyyy-mm-dd’)) trunc_date from dual;
  1. EXTRACT(fmt FROM d),提取日期中的特定部分。
    fmt 为: YEAR、MONTH、DAY、HOUR、MINUTE、SECOND。其中 YEAR、MONTH、DAY可以为 DATE 类型匹配,也可以与TIMESTAMP 类型匹配;但HOUR、MINUTE、SECOND 必须与 TIMESTAMP 类型匹配。
    例:EXTRACT 函数示例
    Select sysdate “date”,
    Extract(year from sysdate) “year”
    Extract(month from sysdate) “month”
    Extract(day from sysdate) “day”
    Extract(hour from systimestamp) “hour”
    Extract(minute from systimestamp) “minute”
    Extract(second from systimestamp) “second”
    From dual;

转换函数

转换函数将值从一种数据类型转换为另外一种数据类型。常用的转换函数有:

  1. TO_CHAR(d|n[,fmt])
    把日期和数字转换为制定格式的字符串。 fmt 是格式化字符串,日期的格式化字符串前
    面已经学习过。
    代码演示:TO_CHAR 对日期的处理
    SQL> SELECT TO_CHAR(SYSDATE,‘YYYY"年"MM"月"DD"日" HH24:MI:SS’) “date” FROM DUAL;

  2. TO_DATE(x [,fmt])
    将一个格式字符串转换成日期

  3. NVL(x,value)
    如果 x 为空,返回 value,否则返回 x。
    案例 7:对工资是 2000 元以下的员工,如果没有发奖金,每人奖金 100 元。

    代码演示:NVL 函数
    SQL> SELECT ENAME,JOB,SAL,NVL(COMM,100) FROM EMP WHERE SAL<2000;
    ENAME JOB SAL NVL(COMM,100)
  1. NVL2(x,value1,value2)
    如果 x 非空,返回 value1,否则返回 value2。
    案例 8:对 EMP 表中工资为 2000 元以下的员工,如果没有奖金,则奖金为 200 元,如
    果有奖金,则在原来的奖金基础上加 100 元。
代码演示:NVL2 函数
SQL> SELECT ENAME,JOB,SAL,NVL2(COMM,comm+100,200) "comm"
2 FROM EMP WHERE SAL<2000;
  1. COALESCE(expr1[,expr2[,expr3]]…)
    返回参数列表中第一个非空的表达式的结果。
例:select ename,sal,comm,COALESCE(sal+comm,sal)salary FROM emp WHERE deptno=30;
  1. LNNVL(condition):通常用在where子句中,返回那些不满足condition条件或者判断条件为NULL的记录。所有LNNVL也可以认为是is null 或is not true。
例:获取奖金数小于500的员工的信息
Select ename,comm from emp where lnnvl(comm>=500);

1.DECODE(expr, search1,result[, search2, result2…][, default])
DECODE用于比较参数expr的值,如果匹配到哪一个search条件,就返回对应的result结果。可以有多组search和result的对应关系,如果任何一个search条件都没有匹配到,返回最后default的值。Default参数是可选的,如果没有提供default参数值,当没有匹配到时,返回NULL。

例:查询职员表,根据职员的职位计算奖金,当职位分别是MANAGER,ANALYST,SALESMAN时,奖励金额分别是薪水的1.2倍,1.1倍,1.05倍。如果不是这三个职位,则奖励金额为领取薪水值
Select ename,job,sal, decode(job,’MANAGR’,sal*1.2, ‘ANALYST’,sal*1.1,’SALESMAN’,
sal*1.05,sal)bonus from emp;

总结:函数可以嵌套使用

–==字符函数:处理字符串

第一组

–ascii chr

select ascii('a') from dual;
select char(97) from dual;

–lower upperinitcap
–求大写A 的ascii

select ascii (upper('a')) from dual;

–求小写a的ascii

select ascii (lower('A')) from dual;

–Initcap

select initcap(ename) from emp;

第二组

–ltrim rtrim trim
–注意事项 Ltrimrtrim 是字符级别的截取,在截取的时候,按照字符去匹配

select  Ltrim('ellen','e') from dual;
select rtrim('ellenellneen','ne') from dual;
select trim('ne',from 'ellenellneen') from dual;

–会报错,,trim的截取集只能是一个字符

select trim('   ellen') from dual;
--去空格--

第三组

–Lpad rpad 字符串补位函数

左补齐

select lpad('hao',2,'ni') from dual;
select lpad('hao',5,'ni') from dual;
select lpad('hao',10,'ni') from dual;

右补齐

select rpad ('ni',1,'hao') from dual;
select rpad ('ni',5,'hao') from dual;
select rpad ('ni',10,'hao') from dual;

其他组

–concat
–字符串连接:和连接运算符作用一致

select concat ('Dear',ename) from emp;

–legth:查询emp员工表中员工姓名为5个字符的员工信息

select *from emp where length(ename)=5;

–substr:求子串

select substr('Hello word',3) from dual;
select substr('Hello word',3,5) from dual;

–replace:字符串替换

select replace('shelly','el','en') from dual;

可以分组去记

–=数学函数=====

–sign :求符号

select sign(-5) from dual;

–ceil: 求上整

select ceil(5.6) from dual;

–floor 求下整

select floor(5.6) from dual;

–round 四舍五入

select round(3.14) from dual
select round(3.14,1) from dual
select round(3.1415926,4) from dual
select round(356,-2) from dual   --一般是不用的

–trunc:截断

select trunc(3.1415926,4) from dual;
select trunc(356,-2) from dual

–=日期函数==========

--sysdatesystimestamp(比sysdate)更精确
 
select sysdate from dual;
 
--add_months(date,1)1表示月份
 
select add_months(sysdate,1) from dual;
 
--month_between(date,date)
 
select months_between(sysdate,hiredate) from emp;
select month_between(sysdate,add_months(sysdate,1)) from dual;

 
--last_day(date)
select last_day(sysdate) from dual;
select last_day('08-2月-2018')from dual;
 
--next_day(date,char)
select next_day(sysdate,'星期二') from dual;

–round 四舍五入–trunc:截断也可以对日期进行操作

select trunc(sysdate,'MONTH') from dual;
select round(sysdate,'MONTH') from dual;
 
select round(date'2018-01-16','MONTH') from dual;

—extract:

select extract(year from sysdate) as 年,
extract(month from sysdate) as 月,
extract (day from sysdate) as 日,
extract (hour from systimestamp) as 时,
extract (minute from systimestamp) as 分,
extract(second from systimestamp) as 秒
from dual;

–=转换函数======

to_char to_date
–nvl nvl2
–问题:对emp表中的员工奖金为空,那么给200元奖金,如果奖金不为空,那么在原有奖金基础上加100

update emp set comm=nvl2(comm,comm+100,200);

–问题:查询emp表中所有员工的月收入

select ename,sal+nvl(comm,0) as 月收入 from emp;
select ename,coalesec(sal+comm,sal) as 月收入 from emp;

–decode
–案例:按照职位提升工资,如果是MANAGER,工资是原来的1.5倍,如果是ANALYST工资是原来的1.2倍
–如果是SALERSMAN工资是原来的1.1倍,默认情况下,工资是原来的1.05倍

update emp01 set sal=decode(job,'MANAGER',sal*1.5,'ANALYST',sal*1.2
,'SALERMAN',sal*1.1,sal*1.05)

2. 数据库中的视图

(1)什么是视图?

视图是一张虚表,就是对select查询的结果给取了一个名字。select查询的表称为基表
视图不会存储数据,数据存储在基表中,视图只是保存一个映射关系

create view test as select ename,sal,job from emp;

(2)视图的作用

		1.简化复杂查询
		2.限制数据访问

–简化复杂查询
–举例:查询每个部门的员工人数和部门名称

select d.dname,count(*)
from dept d,emp e
where d.deptno=e.deptno
group by d.dname;

可以创建视图存储上述结果

create view numEmp as
select d.dname,count(*) co
from dept d,emp e
where d.deptno=e.deptno
group by d.dname;


问题:查询人数大于3的部门的名称和员工信息
select *from numEmp where co>3;

–创建视图的时候,如果遇到select语句中有聚合函数,需要给聚合函数别名

   --限制数据访问举例
  create user hope identified by 123456;
  grant connect to hope;
  grant select on scott.emp to hope; --现在是可以看见整张表

create view empSimple as
select empno,ename,job,mgr,hiredate,deptno
from emp;

–注意事项:
(1)对于视图的查询和表的查询是一样的
(2)视图中不包含数据,视图只是一个映射关系
(3)当基表发生改变时,视图也会随之改变

(3)怎么创建和删除视图

语法:

create view 视图名(可以起别名) as
select...from ...【with read only】
--with  read only 表示视图是一个只读视图,只能查询,不能修改

–分类:简单视图(创建视图的时候可以指定一个别名)

create view v_emp(“工号”,“姓名“) as
select empno,ename from emp;

create or replace view v_emp("编号","姓名‘) as
select empno,ename from emp with read only;

注意事项:别名,要么没有引号,要是有引号就必须是双引号 " "**

question:能不能对视图进行DML操作insert update delete?
能,但是不是所用的视图都能进行DML操作
牵扯到视图的分类
(1)非只读的简单视图可以进行DML操作,事实上是对基表的操作

create or replace view test
   as select empno,ename from emp;
     
       insert into test values(1010,'sheely')可以看到基表里面多了一条记录          
       是不是所有的简单视图都可以进行DML操作呢?不是的          
        create or replace view test
       as select ename,sal from emp;        
       insert into test values('haloo',5000)执行不了,不允许插入
       原因是:违反了基表的主键约束
      
       结论:针对视图的DML操作,不能违反基表的约束,所以并不是所有的简单的都可以

(2)带有with read only 和复杂视图  连接视图不能进行DML操作

-修改视图 replace: 没有就创建,有的话就修改

视图的分类

简单视图:简单查询语句(不涉及到连接和聚合函数)

复杂视图:牵扯到聚合函数,但是不涉及到表连接

连接视图:涉及到表连接的视图

–连接视图举例:

CREATE view  emp_dept as
select e.*,d.*
where e.deptno=d.deptno;

(4)什么是索引?

类比图书的目录:索引是一种加快数据访问速度的机制
索引需要占用磁盘空间的,维护索引需要资源开销,所以索引并不是越多越好

索引的分类:
(1)单列索引
(2)复合索引

–单列索引

create index idx_ename on emp(ename)
语法:create index 索引名on 表名(字段名1,字段名2)

–复合索引

create index idx_ename_deptno on emp(ename,deptno);

–唯一索引

create unique index idx_ename on emp(ename);
--注意;在某一字段上创建一个唯一索引,自动会在该字段创建一个唯一约束
--删除:drop index 索引名
drop  index idx_ename;

--重建  alter index idx_ename rebuild;

注意事项:如果定义了主键约束和唯一约束,那么Oracle会再自动的创建一个唯一索引

+++++++原创博文,转载请注明出处。+++++++++

猜你喜欢

转载自blog.csdn.net/Leo1120178518/article/details/86013649