欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

oracle的学习笔记--NVL()函数的使用技巧

程序员文章站 2022-07-07 22:39:25
一、给列起别名的规则:特殊字符(#$除外)、数字、空格需要加双引号处理;中文加不加双引号都可以;as关键字可以省略。 -- 查询员工姓名,员工编号,员工的工作。 SELECT...

一、给列起别名的规则:特殊字符(#$除外)、数字、空格需要加双引号处理;中文加不加双引号都可以;as关键字可以省略。

-- 查询员工姓名,员工编号,员工的工作。
SELECT empno AS "员工编号",ename "员工姓名",job 工作 FROM emp;
select empno as "员工编号",ename "员工姓名",job 工 作 from emp;--语法错误 ,别名“工 作”中出现空格没有加双引号
select empno as "员工编号",ename "员工姓名",job "工 作" from emp;--正确,出现空格加双引号
select empno as "员工编号",ename "员工@姓名",job "工 作" from emp;--正确,出现特殊字符加双引号
select empno as "员工编号",ename "123",job "工 作" from emp;--正确,出现数字加双引号
select empno as 员工$编号,ename "123",job "工 作" from emp;--正确,特殊字符中(#,$)除外

二、NVL()函数的使用:要记住一点,null值参与运算,结果为空

emp表:有员工没有奖金

oracle的学习笔记--NVL()函数的使用技巧

--计算一下员工的年薪(月薪x12+奖金)
SELECT sal*12+comm 年薪 FROM emp;

未使用nvl函数的情况,查询结果如下:

oracle的学习笔记--NVL()函数的使用技巧
--nvl(v1,v2),其中v1是原始值,v2是当为空时参与计算的值
SELECT sal*12+NVL(comm,0) AS 年薪 FROM emp;

使用nvl函数的情况下,查询结果如下:

oracle的学习笔记--NVL()函数的使用技巧

三、distinct关键字和oracle特有的连接符“||”

需求:在一列中显示员工编号和员工姓名;方法:使用oracle特有的连接符

select 'empno:'||empno||' '||'ename:'||ename 个人简介 from emp;

查询结果:

oracle的学习笔记--NVL()函数的使用技巧

distinct去重关键字,在查询结果中去掉重复的

select distinct job from emp;

四、条件查询(目的是过滤出满足条件的结果)

where是条件关键字,后面加条件

比较运算符:> < >= <= = <> !=

逻辑运算符:and or not

其余运算表达式:like模糊查询 % 匹配0个或多个字符

in not in 判断范围

between and 判断区间,包含边界

is null,is not null 判断是否为空值

---查询工作不是 MANAGER 的员工信息
SELECT * FROM emp WHERE job !='MANAGER';
SELECT * FROM emp WHERE job <>'MANAGER';
--查询工作是领导MANAGER 并且工资> 2000的员工信息
SELECT * FROM emp WHERE job='MANAGER' AND sal>2000;
--查询工资>2000 或者 工作是MANAGER的员工信息
SELECT * FROM emp WHERE sal>2000 OR job='MANAGER';
--查询员工姓名包含M的员工信息
SELECT * FROM emp WHERE ename LIKE '%M%';
--查询员工姓名第二位M的员工信息
SELECT * FROM emp WHERE ename LIKE '_M%';
--查询员工工作是MANAGER 或者工作室PRESIDENT
SELECT * FROM emp WHERE job='MANAGER' OR job='MANAGER';
--使用in来实现
SELECT * FROM emp WHERE job IN('MANAGER','PRESIDENT');
--查询工资在1500 和3000之间的员工信息
SELECT * FROM emp WHERE sal BETWEEN 1500 AND 3000;
--查询有奖金的员工信息
SELECT * FROM emp WHERE comm IS NOT NULL;
--null不等于任何值 如果对null判断 比较判断 UNKUOW
SELECT * FROM emp WHERE comm=NULL;

五、排序关键字order by关键字的使用

--将员工的数据按照工资从小到大排序
SELECT * FROM emp ORDER BY sal;
--将员工数据按照奖金倒叙排序
SELECT * FROM emp ORDER BY comm DESC;
--null倒序排序 null在上面 指定null到末尾 nulls last
SELECT * FROM emp ORDER BY comm DESC NULLS LAST;

oracle的学习笔记--NVL()函数的使用技巧

六、数据库函数:单行函数(数值、字符、日期、转换、通用函数),多行函数(max,min,sum,count,avg)

1.四舍五入 round(v1,v2) v1是原始的数值 v2是保留的小数位数(v2默认数值是0)
select round(43.726) from dual;
select round(43.726,0) from dual;--44
select round(43.726,1) from dual;--43.7
select round(43.726,2) from dual;--43.73
select round(43.726,-1) from dual;--40
select round(43.726,-2) from dual;--0
select round(53.726,-2) from dual;--100

2.--截取 trunc(v1,v2) v1是原始的数值 v2是保留的小数位数( v2默认数值是0)
--43.726
select trunc(43.726) from dual;
select trunc(43.726,0) from dual;--43
select trunc(43.726,1) from dual;--43.7
select trunc(43.726,2) from dual;--43.72
select trunc(43.726,-1) from dual;--40
select trunc(43.726,-2) from dual;--0
select trunc(53.726,-2) from dual;--0

3.--mod取余数
select mod(10,3) from dual; --1

4.获取字符的长度 length(v1)
--abcde
select length('abcde') from dual;

5.截取字符串 substr(v1,v2,v3) v1原始字符串 v2开始截取位置 v3截取长度
--截取字符串 从0开始和1开始都是第一位开始截取
select substr('abcde',0,2) from dual; -- ab
select substr('abcde',1,2) from dual; --ab
select substr('abcde',-1,2) from dual; -- e
select substr('abcde',-2,2) from dual; -- de

6.替换字符串 replace(v1,v2,v3)v1原始字符串 v2被替换的字符 v3替换后的字符
--替换字符串 hello 替换匹配的所有字符
select replace('hello','l','o') from dual; -- heooo
select replace('hello','he','l') from dual; -- lllo
select replace('hello','he','') from dual; -- llo

7.大小写转换 upper() lower()
select * from emp;
select * from emp where ename = 'smith'
select * from emp where ename = 'sMIth'
select * from emp where ename = upper('smith');
select * from emp where ename = upper('Smith');
select * from emp where ename = upper('SMITH');

8.去除空格 trim()

--去除空格__abc_de__ 去除字符串两端的空格
select trim(' abc de ') from dual;--abc_de

七、日期函数

--查看系统当前时间

SELECT SYSDATE FROM dual;

--增加月份,查询3个月以后的日期
SELECT add_months(SYSDATE,3) FROM dual;
--计算所有员工到目前为止,入职了多少个月
SELECT months_between(SYSDATE,hiredate) FROM emp;
----计算所有员工入职的天数 日期和日期做计算 结果为天数
SELECT ROUND(SYSDATE-hiredate) FROM emp;

八、转换函数

--字符串转数字
SELECT to_number('123')+1 FROM dual;
--数字转字符串
select to_char(sal,'$99,999.00') from emp;
--日期转字符串
SELECT to_char(SYSDATE,'yyyy-mm-dd') FROM dual;
SELECT to_char(SYSDATE,'hh:mi:ss') FROM dual;
SELECT to_char(SYSDATE,'yyyy-MM-dd HH:mi:ss') FROM dual;
--字符串转日期
SELECT to_date('2017-05-03','yyyy-mm-dd') FROM dual;
SELECT to_date('2017-05-03 6:08:32','yyyy-mm-dd hh:mi:ss') FROM dual;--小时只能取1-12的值
SELECT to_date('2017-05-03 16:08:32','yyyy-mm-dd hh24:mi:ss') FROM dual;--小时可以取1-24的值

九、聚合函数和分组函数的使用

---查询每个部门的平均工资
select * from emp;
SELECT avg(sal) from emp group by deptno;
--显示部门编号
select deptno,avg(sal) from emp group by deptno;
--加入其余的列是不可以的,使用group by,select语句只能查询分组的列和聚合函数
select job,deptno,avg(sal) from emp group by deptno;
--使用多个列做分组 必须多个列的数值一致 才为一组
select job,deptno,count(*) from emp group by deptno,job;
--查询部门平均工资>2000的部门编号
select deptno,avg(sal) from emp group by deptno having avg(sal)>2000;
--mySql分组可以起别名过滤
select deptno,avg(sal) s from emp group by deptno having s >2000;