Oracle数据库系列之基础篇2

1、单行函数
– 字符函数,接收字符输入返回字符或者数值,dual是伪表

desc dual;
select * from dual;

2、字符串的连接可以使用concat,也可以用 || ,建议使用 ||

select concat('hello','world') 连接 from dual;
select 'hello' || ',' || 'world' 连接 from dual;

3、字符串截取,使用substr
– 第一个参数是源字符串,第二个参数是开始索引,第三个参数长度,开始的索引使用1和0效果相同

select substr('hello',0,3) from dual;
select substr('hello',1,3) from dual;
select substr('hello',2,3) from dual;

4、获取字符串的长度,使用length

select length('hello') from dual;

5、字符串替换,使用replace
– 第一个参数是源字符串,第二个参数是被替换的字符串,第三个参数是替换的字符串

select replace('hello','l','p') from dual;

数值函数
6、ROUND 四舍五入

select round(3.1415,2) from dual;
select round(3.1440,2) from dual;
select round(3.1446,2) from dual;
select round(3.1449,2) from dual;
select round(3.1450,2) from dual;
select round(3.1466,2) from dual;
select round(45.923,2) from dual;
select round(45.926,2) from dual;

7、TRUNC 截断

select trunc(3.1415826,4) from dual;
select trunc(34.923,2) from dual;

8、MOD 求余

select mod(167,3) from dual;
select mod(167,30) from dual;

/*
日期函数
日期型数据实际含有两个值:日期和时间,默认日期格式:DD-MM–YY
日期的数学运算,在日期上加减一个数字结果仍为日期,两日期相减返回日期之间相差天数
可以用数字除24
*/

9、查询雇员的进入公司的周数

select ename,round((sysdate - hiredate)/7) from emp;

10、获得两个时间段中的月数,MONTHS_BETWEEN()

select ename,round(months_between(sysdate,hiredate)) from emp;

11、获得几个月后的日期,ADD_MONTHS()
– 求出两个月后的日期

select add_months(sysdate,2) from dual;

/*
转换函数
TO_CHAR函数对日期的转换
TO_CHAR(date, ‘format_model’)
*/

/*
日期的格式
YYYY 2020
Year twenty twenty
MM 10
MONTH 10月
DY 星期二
DAY 星期二
DD 06
*/

/*
TO_CHAR函数对数字的转换
TO_CHAR(number, ‘format_model’)
数字转换的格式
9 数字
0 零
$ 美元符
L 本地货币符号
. 小数点
, 千位符
*/

/*
TO_NUMBER函数将字符转换成数字
TO_NUMBER(char[,‘format_model’])
TO_DATE函数将字符转换成日期
TO_DATE(char[,‘format_model’])
*/

/*
查询所有的雇员将年月日分开,此时可以使用TO_CHAR函数来拆分,拆分时需要使用通配符
年:y,年是四位,使用yyyy
月:m,月是两位,使用mm
日:d,日是两位,使用dd
*/

select empno,ename,to_char(hiredate,'yyyy-mm-dd') from emp;

– 10以下的月前面被补零,可以使用fm去掉前导零

select empno,ename,to_char(hiredate,'fmyyyy-mm-dd') from emp;

12、TO_NUMBER数值转换函数

select to_number('10') + to_number('20') from dual;
select to_char(2345.67,'$9999.9') from dual;
select to_char(2345.67,'L9999.9') from dual;
select to_char(2345.67,'$9999.0') from dual;

select to_char(2342345.67,'$9,999,999.999') from dual; 
--  $2,342,345.670

select to_number('$2,342,345.670','$9999999.999') from dual; 
-- 2342345.67

select to_number('a','xx') from dual; 
-- 10

select to_number('d','xx') from dual; 
-- 13

select to_number('1a','xxx') from dual; 
-- 26

select to_number('00012345') from dual;
select to_number('34567.89') from dual;

13、TO_DATE日期转换函数

select to_date('2020-10-06','yyyy-mm-dd') from dual;
select to_date('2020-10-06','yyyy/mm/dd') from dual;
select to_date('2020/10/06','yyyy-mm-dd') from dual;
select to_date('2020-10-06','yy-mm-dd') from dual;
select to_date('06-10-2020','dd-mm-yyyy') from dual;

/*
通用函数:适用于任何数据类型,同时也适用于空值
常用通用函数 NVL(expr1,expr2) NVL2(expr1,expr2) NULLIF(expr1,expr2) COALESCE(expr1,expr2)
空值处理 NVL
*/

14、查询所有雇员的年薪

select ename 雇员名,sal*12 + comm 年薪 from emp;

15、发现很多员工年薪是null,这是因为null和任何数值计算都是null,下面用nvl处理

select ename 雇员名, nvl(comm,0) 奖金, sal*12 + nvl(comm,0) 年薪 from emp;

/*
条件表达式
CASE表达式,SQL99语法,类似Basic,比较繁琐

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

/*
DECODE函数,Oracle自身语法,类似Java,比较简洁

DECODE(col|expression, search1, result1
[, search2, result2,…,]
[,default])

16、条件表达式示例:根据10部门员工工资,显示税率

select ename,sal,
       decode(trunc(sal/2000,0),
                        0,0.00,
                        1,0.09,
                        2,0.20,
                        3,0.30,
                        4,0.40,
                        5,0.42,
                        6,0.44,
                          0.45) tax_rate
from emp
where deptno = 10;

/*
ENAME SAL TAX_RATE


CLARK 2450.00 0.09
KING 5000.00 0.2
MILLER 1300.00 0
*/

/*
多行函数,分组函数,组函数
组函数会忽略空值,NVL函数使分组函数无法忽略空值
常用多行函数
AVG
COUNT
MAX
MIN
SUM
*/

17、统计记录数 count()
– 查询所有员工的记录数

select count(*) from emp;

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

select count(ename) 员工数 from emp;

18、最小值查询 min()
– 查询员工最低工资

select min(sal) 最低工资 from emp;

19、最大值查询 max()
– 查询员工最高工资

select max(sal) 最高工资 from emp;

20、查询平均值 avg()
– 查询员工平均工资

select avg(sal) from emp;

21、求和函数 sum()
– 查询20 部门员工工资总和

select '20部门员工工资总和' || sum(sal) from emp e where e.deptno=20;

/*
分组数据
GROUP BY 子句将表中的数据分成若干组
*/

22、查询各部门人数

select deptno,count(ename) from emp group by deptno;

23、查询每个部门的平均工资

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

24、查询部门编号和部门下的人数

select deptno,count(ename) from emp;

– 报错

/*
select deptno,count(ename) from emp
ORA-00937: 不是单组分组函数
*/

/*
注意:
1、如果使用分组函数,SQL只可以把 GROUP BY 分组条件字段和分组函数查询出来,不能有其他字段;
2、如果使用分组函数,不使用 GROUP BY 只可以查询出来分组函数的值。
*/

select deptno,ename,count(ename) from emp group by deptno;

/*
select deptno,ename,count(ename) from emp group by deptno
ORA-00979: 不是 GROUP BY 表达式
*/

25、过滤分组数据 group by … having …
– 查询部门平均工资大于2000的部门

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

/*
WHERE 和 HAVING 的区别
最大的区别在于:where后面不能有组函数
*/

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

/*
select deptno,avg(sal) from emp where avg(sal)>8000 group by deptno
ORA-00934: 此处不允许使用分组函数
*/

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

都看到最后了啦,如果觉得写得好的话呐
记得 一键三连 哦!点赞 也行呐!

猜你喜欢

转载自blog.csdn.net/frdevolcqzyxynjds/article/details/109086607
今日推荐