Oracle数据库中通用的函数

简介: Oracle数据库中的函数🍅程序员小王的博客:程序员小王的博客🍅 欢迎点赞 👍 收藏 ⭐留言 📝🍅 如有编辑错误联系作者,如果有比较好的文章欢迎分享给我,我会取其精华去其糟粕🍅java自学的学习路线:java自学的学习路线

一、 Scott用户下的表结构

SCOTT。是在Oracle数据库中,一个示例用户的名称。其作用是为初学者提供一些简单的应用示例,不过其默认是锁定状态,在安装时,根据用户需要,在“数据库配置助手”界面完成后,弹出的对话框中--口令管理,里面解锁。


SCOTT是ORACLE内部的一个示例用户,缺省口令为tiger,下面有表emp, dept等,这些表和表间的关系演示了关系型数据库的一些基本原理


0.png


1、如果自己没有Scoot表就可以自己创建一个

(1)创建DEPT表


CREATE  TABLE  DEPT  (
DEPTNO  NUMBER(2)  CONSTRAINT  PK_DEPT   PRIMARY KEY,
DNAME  VARCHAR2(14) ,  
LOC  VARCHAR2(13) 
) ;


(2)表DEPT添加数据


INSERT  INTO  DEPT  VALUES  (10  ,  'ACCOUNTING'  ,  'NEW YORK'  );  
COMMIT;
INSERT  INTO  DEPT  VALUES  (20  ,  'RESEARCH'  ,  'DALLAS'  );  
COMMIT;
INSERT  INTO  DEPT  VALUES  (30  ,  'SALES'  ,  'CHICAGO'  );  
COMMIT;
INSERT  INTO  DEPT  VALUES  (40  ,  'OPERATIONS'  ,  'BOSTON'  );  
COMMIT;

1.png


(3)创建EMP表


CREATE  TABLE  EMP  (
EMPNO  NUMBER(4)    CONSTRAINT PK_EMP PRIMARY KEY,  
ENAME  VARCHAR2(10),  
JOB  VARCHAR2(9),  
MGR  NUMBER(4),  
HIREDATE  DATE,  
SAL  NUMBER(7,2),  
COMM  NUMBER(7,2),  
DEPTNO  NUMBER(2) CONSTRAINT FK_DEPTNO REFERENCES DEPT
);

2.png


(4)表EMP添加数据


INSERT   INTO   EMP   VALUES  (7369,'SMITH','CLERK',7902,to_date('17-12-1980','dd-mm-yyyy'),800,NULL,20);
COMMIT;
INSERT   INTO   EMP   VALUES  (7499,'ALLEN','SALESMAN',7698,to_date('20-2-1981','dd-mm-yyyy'),1600,300,30);
COMMIT;
INSERT   INTO   EMP   VALUES  (7521,'WARD','SALESMAN',7698,to_date('22-2-1981','dd-mm-yyyy'),1250,500,30);
COMMIT;
INSERT   INTO   EMP   VALUES  (7566,'JONES','MANAGER',7839,to_date('2-4-1981','dd-mm-yyyy'),2975,NULL,20);
COMMIT;
INSERT   INTO   EMP   VALUES  (7654,'MARTIN','SALESMAN',7698,to_date('28-9-1981','dd-mm-yyyy'),1250,1400,30);
COMMIT;
INSERT   INTO   EMP   VALUES  (7698,'BLAKE','MANAGER',7839,to_date('1-5-1981','dd-mm-yyyy'),2850,NULL,30);
COMMIT;
INSERT   INTO   EMP   VALUES  (7782,'CLARK','MANAGER',7839,to_date('9-6-1981','dd-mm-yyyy'),2450,NULL,10);
COMMIT;
INSERT   INTO   EMP   VALUES  (7788,'SCOTT','ANALYST',7566,to_date('19-04-1987','dd-mm-yyyy')-85,3000,NULL,20);
COMMIT;
INSERT   INTO   EMP   VALUES  (7839,'KING','PRESIDENT',NULL,to_date('17-11-1981','dd-mm-yyyy'),5000,NULL,10);
COMMIT;
INSERT   INTO   EMP   VALUES  (7844,'TURNER','SALESMAN',7698,to_date('8-9-1981','dd-mm-yyyy'),1500,0,30);
COMMIT;
INSERT   INTO   EMP   VALUES  (7876,'ADAMS','CLERK',7788,to_date('23-05-1987','dd-mm-yyyy')-51,1100,NULL,20);
COMMIT;
INSERT   INTO   EMP   VALUES  (7900,'JAMES','CLERK',7698,to_date('3-12-1981','dd-mm-yyyy'),950,NULL,30);
COMMIT;
INSERT   INTO   EMP   VALUES  (7902,'FORD','ANALYST',7566,to_date('3-12-1981','dd-mm-yyyy'),3000,NULL,20);
COMMIT;
INSERT   INTO   EMP   VALUES  (7934,'MILLER','CLERK',7782,to_date('23-1-1982','dd-mm-yyyy'),1300,NULL,10);
COMMIT;


(5)创建SALGRADE表

CREATE   TABLE   SALGRADE    (
GRADE   NUMBER,  
LOSAL   NUMBER,  
HISAL   NUMBER 
);

3.png


(6)表SALGRADE添加数据


INSERT   INTO   SALGRADE   VALUES   (1,700,1200);  
COMMIT;
INSERT   INTO   SALGRADE   VALUES   (2,1201,1400);  
COMMIT;
INSERT   INTO   SALGRADE   VALUES   (3,1401,2000);  
COMMIT;
INSERT   INTO   SALGRADE   VALUES   (4,2001,3000);  
COMMIT;
INSERT   INTO   SALGRADE   VALUES   (5,3001,9999);  
COMMIT;


(7)创建BONUS表

CREATE   TABLE   BONUS    (  
ENAME   VARCHAR2(10)  , 
JOB   VARCHAR2(9)  ,  
SAL   NUMBER,  
COMM   NUMBER  
) ;

4.png


二、单行函数

1、字符函数

接收字符输入返回字符或者数值,dual 是伪表


(1)把小写的字符转换成大写的字符

--(1)把小写的字符转换成大写的字符
select upper('smith') from dual;

5.png

(2)把大写字符变成小写字符

1. --(2)把大写字符变成小写字符
2. select lower('WHJ') from dual;

6.png


2、数值函数

(1)四舍五入函数:round()

默认情况下 ROUND 四舍五入取整,可以自己指定保留的位数

  • 四舍五入函数 小数第一位小于5
1. --四舍五入函数 小数第一位小于5
2. select round(5.342345) from dual;
  • 四舍五入函数 小数第一位大于5
1. --四舍五入函数 小数第一位大于5
2. select round(5.878) from dual;


四舍五入函数 小数点保留两位


8.png

--四舍五入函数 小数点保留两位
select round(5.12764,2) from dual;


(2)日期函数


Oracle 中提供了很多和日期相关的函数,包括日期的加减,在日期加减时有一些规律

日期 – 数字 = 日期

日期 + 数字 = 日期

日期 – 日期 = 数字


范例:查询雇员的进入公司的周数。(分析:查询雇员进入公司的天数(sysdate – 入职日期)/7就是周数)


--查询雇员的进入公司的周数。(分析:查询雇员进入公司的天数(sysdate – 入职日期)/7就是周数)
--1.员工表
select * from emp;
--2.查询ward 进入公司的周数
select Ename,round((sysdate-hiredate)/7) from emp where Ename='WARD';

9.png


获得两个时间段中的月数:MONTHS_BETWEEN()


  • 范例:查询所有雇员进入公司的月数
1. --查询所有雇员进入公司的月数
2. select ename,round(months_between(sysdate,hiredate)) as 进入公司月数 from emp;


10.png


(3)转换函数


TO_CHAR:字符串转换函数


范例:查询所有的雇员将将年月日分开,此时可以使用 TO_CHAR 函数来拆分


拆分时需要使用通配符
年:y, 年是四位使用 yyyy
月:m, 月是两位使用 mm
日:d, 日是两位使用 dd

查询所有的雇员将将年月日分开


--查询所有的雇员将将年月日分开
select empno,ename,
       to_char(hiredate,'yyyy') as 年,
       to_char(hiredate,'mm') as 月,
       to_char(hiredate,'dd') as 日
       from emp;

11.png


日期将日期格式改为yyyy-mm-dd字符串格式

12.png


 
         

13.png


  • 在结果中10以下的月前面补了0,可以使用fm去掉前置0
1. --在结果中10以下的月前面补了0,可以使用fm去掉前置0
2. select empno,ename,to_char(hiredate,'fmyyyy-mm-dd') from emp;


14.png


TO_DATE:日期转换函数


TO_DATE 可以把字符串的数据转换成日期类型


--TO_DATE 可以把字符串的数据转换成日期类型
select to_date('2022-03-10','yyyy/mm/dd:ss')as 当前日期 from dual;

15.png

(4)通用函数


空值处理 nvl


  • 范例:查询所有的雇员的年薪
1. --查询所有的雇员的年薪 comm年终奖
2. select ename,sal*12+comm from emp;


16.png


我们发现很多员工的年薪是空的,原因是很多员工的奖金是 null,null 和任何数值计算都是


null,这时我们可以使用 nvl 来处理


--查询所有的雇员的年薪 comm年终奖
select ename,nvl(comm,0) 年终奖 ,sal*12+nvl(comm,0)年薪 from emp;

17.png


Decode 函数


--该函数类似 if....else if...esle
--语法:
 DECODE(col/expression, [search1,result1],[search2, result2]....[default])
Col/expression:列名或表达式
1. Search1,search2...:用于比较的条件
2. Result1, result2...:返回值
3. 如果 col/expression 和 Searchi 匹配就返回 resulti,否则返回 default 的默认值
--decode函数
--1. 我是1
select decode(1,1,'我是1',2,'我是2','我是无名') from dual;
--2. 我是2
select decode(2,1,'我是1',2,'我是2','我是无名') from dual;
--3. 我是无名
select decode(3,1,'我是1',2,'我是2','我是无名') from dual;

18.png


范例:查询出所有雇员的职位的中文名

select ename,decode(job,
                   'clerk','业务员',
                   'SALESMAN','销售',
                   'PRESIDENT','总裁',
                   'MANAGER','经理',
                   'NALYST','分析员',
                   '员工' 
                   ) from emp ;

19.png


case when


CASE expr WHEN comparison_expr1 THEN return_expr1
 [WHEN comparison_expr2 THEN return_expr2
 WHEN comparison_exprn THEN return_exprn 
 ELSE else_expr]
END

范例:查询出所有雇员的职位的中文名

--范例:Case when 查询出所有雇员的职位的中文名
select t.empno,t.ename,
       case
          when t.job='clerk' then '业务员'
          when t.job='SALESMAN' then '销售'
          when t.job='PRESIDENT' then '总裁'
          when t.job='MANAGER' then '经理'
          when t.job='NALYST' then '分析员'
          else '员工'
          end
          from emp t;

20.png


三、多行函数(聚合函数)

1、统计记录数

范例:查询出所有员工的记录数


-- 范例:查询出所有员工的记录数
select count(*) from emp;

不建议使用 count(*),可以使用一个具体的列以免影响性能。


 
         


2、最小值查询 min()

范例:查询出来员工最低工资


--范例:查询出来员工最低工资
select min(sal) from emp;


3、最大值查询 max()

范例:查询出员工的最高工资


--范例:查询出员工的最高工资
select max(sal) from emp;

4、平均值查询 avg()

范例:查询出员工的平均工资


--范例:查询出员工的平均工资
select avg(sal) from emp;


5、求和函数

范例:查询出 20 号部门的员工的工资总和


 
         


四、分组统计

分组统计需要使用 GROUP BY 来分组


--语法:
SELECT * |列名 FROM 表名 
{WEHRE 查询条件} 
{GROUP BY 分组字段}
 ORDER BY 
 列 名 1 ASC|DESC,列名 2...ASC|DESC


范例:查询每个部门的人数


-- 范例:查询每个部门的人数
select deptno,count(ename) from emp group by deptno;

范例:查询出每个部门的平均工资


-- 范例:查询出每个部门的平均工资
select deptno,avg(sal) from emp group by deptno;

如果我们想查询出来部门编号,和部门下的人数


-- 如果我们想查询出来部门编号,和部门下的人数
select deptno,count(ename) from emp;


我们发现报了一个 ORA-00937 的错误

21.png



注意:


1.如果使用分组函数,SQL 只可以把 GOURP BY 分组条件字段和分组函数查询出来,不能有其
他字段。
2. 如果使用分组函数,不使用 GROUP BY 只可以查询出来分组函数的值

范例:按部门分组,查询出部门名称和部门的员工数量

-- 范例:按部门分组,查询出部门名称和部门的员工数量
select d.deptno,d.dname,count(e.ename) 
from emp e,dept d
where e.deptno=d.deptno 
group by d.deptno,d.dname

22.png


范例:查询出部门人数大于 5 人的部门


-- 范例:查询出部门人数大于 5 人的部门
--(分析:需要给 count(ename)加条件,此时在本查询中不能使用 where,可以使用 HAVING)
select d.deptno,d.dname,count(e.ename) 
 from emp e,dept d
 where e.deptno=d.deptno 
 group by d.deptno,d.dname 
 having  count(e.ename)>5 ;

分析:需要给 count(ename)加条件,此时在本查询中不能使用 where,可以使用 HAVING


23.png


范例:查询出部门平均工资大于 2000 的部门


-- 范例:查询出部门平均工资大于 2000 的部门
select d.deptno,d.dname,avg(e.sal) 
from dept d ,emp e
 where d.deptno=e.deptno 
 group by d.deptno,d.dname
  having avg(e.sal)>2000;

24.png

相关文章
|
4天前
|
存储 自然语言处理 Oracle
Oracle数据库字符集概述及修改方式
【8月更文挑战第15天】Oracle 数据库字符集定义了数据的编码方案,决定可存储的字符类型及其表示方式。主要作用包括数据存储、检索及跨系统传输时的正确表示。常见字符集如 AL32UTF8 支持多语言,而 WE8MSWIN1252 主用于西欧语言。修改字符集风险高,可能导致数据问题,需事先备份并评估兼容性。可通过 ALTER DATABASE 语句直接修改或采用导出-导入数据的方式进行。完成后应验证数据完整性。此操作复杂,须谨慎处理。
|
8天前
|
Oracle 关系型数据库 MySQL
Mysql和Oracle数据库死锁查看以及解决
【8月更文挑战第11天】本文介绍了解决MySQL与Oracle数据库死锁的方法。MySQL可通过`SHOW ENGINE INNODB STATUS`查看死锁详情,并自动回滚一个事务解除死锁;也可手动KILL事务。Oracle则通过查询V$LOCK与V$SESSION视图定位死锁,并用`ALTER SYSTEM KILL SESSION`命令终止相关会话。预防措施包括遵循ACID原则、优化索引及拆分大型事务。
|
10天前
|
监控 Oracle 关系型数据库
"深度剖析:Oracle SGA大小调整策略——从组件解析到动态优化,打造高效数据库性能"
【8月更文挑战第9天】在Oracle数据库性能优化中,系统全局区(SGA)的大小调整至关重要。SGA作为一组共享内存区域,直接影响数据库处理能力和响应速度。本文通过问答形式介绍SGA调整策略:包括SGA的组成(如数据缓冲区、共享池等),如何根据负载与物理内存确定初始大小,手动调整SGA的方法(如使用`ALTER SYSTEM`命令),以及利用自动内存管理(AMM)特性实现智能调整。调整过程中需注意监控与测试,确保稳定性和性能。
22 2
|
1天前
|
数据采集 Oracle 关系型数据库
实时计算 Flink版产品使用问题之怎么实现从Oracle数据库读取多个表并将数据写入到Iceberg表
实时计算Flink版作为一种强大的流处理和批处理统一的计算框架,广泛应用于各种需要实时数据处理和分析的场景。实时计算Flink版通常结合SQL接口、DataStream API、以及与上下游数据源和存储系统的丰富连接器,提供了一套全面的解决方案,以应对各种实时计算需求。其低延迟、高吞吐、容错性强的特点,使其成为众多企业和组织实时数据处理首选的技术平台。以下是实时计算Flink版的一些典型使用合集。
|
10天前
|
SQL 存储 Oracle
"挑战极限!Oracle数据库精英试炼场:夺命连环5问,你能否一路披荆斩棘,登顶技术巅峰?"
【8月更文挑战第9天】Oracle,数据库领域的巨擘,以卓越的数据处理能力、稳定性和安全性成为企业级应用首选。今天我们带来“Oracle夺命连环25问”。首问:核心组件有哪些?答:实例(含内存结构和后台进程)、物理存储(数据文件、控制文件等)及逻辑存储(表空间、段等)。第二问:如何理解事务隔离级别?答:Oracle支持四种级别,默认READ COMMITTED,避免脏读,但可能遇到不可重复读和幻读。
23 0
|
Oracle 关系型数据库
Oracle常用函数整理
今天再给大家分享一下Oracle的常用函数。
Oracle常用函数整理
|
Oracle 关系型数据库
|
Oracle 关系型数据库
Oracle常用函数整理
wm_concat(lie[,',','|'])列转行 rount(lie,2)保留小数点
713 0
|
11天前
|
SQL Oracle 关系型数据库
"揭秘!一键解锁Oracle日志清理魔法,让海量归档日志无处遁形,守护数据库健康,告别磁盘空间告急噩梦!"
【8月更文挑战第9天】随着Oracle数据库在企业应用中的普及,归档日志管理对保持数据库健康至关重要。归档日志记录所有更改,对数据恢复极为重要,但也可能迅速占用大量磁盘空间影响性能。利用Oracle提供的RMAN工具,可通过编写Shell脚本来自动清理归档日志。脚本包括设置环境变量、连接数据库、检查和删除指定时间前的日志,并记录执行情况。通过Cron作业定时运行脚本,可有效管理日志文件,确保数据库稳定运行。
36 7
|
26天前
|
Oracle 安全 关系型数据库

推荐镜像

更多