以下所有内容仅供个人记录,可能会有错误,恳请指正。
一.new fuction
今天一共学了不少新函数,我将函数的结构参数与方法,注意事项记录在例题中。
数值函数
1.员工总工资,平均工资,四舍五入,保留小数点后2位
SELECT ROUND(SUM(SAL),2),ROUND(AVG(SAL),2) FROM EMP;
ROUND函数可以进行四舍五入运算 ROUND(NUMBER,INTEGER)其中INTGER表示小数点左右保留的位数。
当INTEGER > 0时保留小数点后int位
当INTEGER < 0时保留小数点前int位,剩余位补0
另外小数参数只能是整形,浮点数无用。
与round相关的函数还有 ceil()和floor()
顾名思义,ceil(number)表示向上取整,floor(number)表示向下取整
字符函数
2.显示所有员工姓名的前三个字符。
SELECT SUBSTR(ENAME,1,3) FROM EMP;
substr(str,star,number):在所给的字符串从star开始,数number个字符长度
其中只有number可以省略,若省略则会数到max(length(str))结束。
length(str)会返回字符串的长度
3.显示正好为5个字符的员工的姓名。
select ename from emp where length(ename)=5;
select ename from emp where length(substr(ename,1))=5;
4.以首字母大写,后面小写的方式显示所有员工的姓名。
select initcap(ename) from emp;
5.以首字母小写,后面大写的方式显示所有员工的姓名。
select concat(substr(lower(ename),1,1),substr(upper(ename),2))from emp;
如题,函数initcap(str)的作用是 将str首字母大写,其余字母小写
但目前没学到一个可以将str小写,其余大写的函数
为了完成第二个题 先介绍两个函数 upper(str)和lower(str)分别表示将str全大写或者全小写,利用这两个函数再加上 concat或者|| 就可以实现。
这里顺带提一下concat(str1,str2),它的作用是将两个字符串连接起来。
6.显示所有员工的姓名,用“我”替换所有“A”
select replace(ename,'A','我') from emp-- REPALCE(STR,'被替换','替换的')
函数replace(str,'被替换的','替换的'):可以将指定的字符串进行替换,其中可以用整体思想
7.求名字中至少有两个A的员工
select ENAME from emp WHERE INSTR(ename,'A',1,2)>0;
函数instr(str,'s',star,times)表示在给定的str中从star位置开始寻找s第times出现的位置
注意instr()返回的是字符的位置
11.以字符长度为10的方式显示员工职位,多余的位数在右边以*来填充
select rpad(ename,10,'*') from emp;
函数rpad(str,newstr.length,'要补充的字符')表示将str的长度用指定的字符补充到newstr.length
与此类似的函数还有lpad(str,newstr.length,'要补充的字符')
需要注意的是 当newstr.length < str.length时 会对str进行截断
13.去除字符串“ aadde gf ”两边的空格
select trim(' ' from ' aadde gf ') from dual;
首先是三个和去除字符串有关的函数:
trim(s from str):去除str 两边的s
ltrim(str,s):去除str 左边的s
rtrim(str,s):去除str 右边的s
需要注意的是 三者格式并不都相同
日期函数
10.显示所有10月份入职的员工
SELECT * FROM EMP WHERE TO_CHAR(TRUNC(HIREDATE,'MM'),'MM')=12;
trunc(date,'要截取的位置'):可以将日期进行截取
yyyy mm dd
当trunc截取这三者时 yyyy会默认yyyy/1/1
mm会默认yyyy/mm/1
所以使用trunc截取后不能直接截到你想要的单个年或者月
需要使用to_char,to_char在将日期转换为char后没有默认值,可以方便的拿出来进行比较。
4.查询一个月前入职的员工
select * from emp where months_between(sysdate,hiredate)=1;
函数months_between(date1,date2)可以返回两个日期的月份差值
注意是date1-date2 可能返回负值
7.从当前时间算,下个星期三是多少号?
select next_day(sysdate,4) from dual;
函数next_day(date,一周的第几天):可以返回指定日期最近一周的第几天
西方周末是第一天
1.使用decode函数,职位是分析员的,工资+1000;职位是经理的,工资+800;职位是其它的,工资+400
select job,decode(job,'ANALYST',SAL+1000,'MANAGER',SAL+800,SAL+400)as newsal FROM EMP;
decode函数(cloumn_name,'if1','result1','if2','result2',...,'else')
此else非else 直接表示其他类型的结果