Bootstrap

SQL函数查询语句

 

 

 

目录

重要函数

实例

函数练习




重要函数

  1. length(str):返回一个字符串的长度
  2. concat(str1,str2):字符串连接函数,它和||实现的功能一样。
  3. chr():将一个ASCII码转换成字符
  4. ascii(字符):将一个字符转换成ASCII码值
  5. trim(str)函数:如果只跟一个参数,表示去除字符串两端的空格 
  6.  ltrim(str,):去掉左边空格
  7.   rtrim(str):去掉右边空格 
  8. pad(str,len,'符号'):填充函数,len表示长度,'符号'表示不够的用特定符号填充
  9.  lpad():在左边填充
     rpad():在右边填充
  10. replace(str,s,d):字符串替换函数,将字符串str中的s字符替换成字符d
  11. instr(str,字符,ind,n):表示在字符串str中查找字符,从ind位置开始,n表示查询第n次出现
  12. .substr(str,ind,len):表示从ind位置开始截取字符串str,截取的长度为len
  13. initcap(str):将字符串的英文单词首字母大写
  14. upper/lower():大小写转换函数
  15. floor/ceil:向下取整和向上取整
  16. mod():求余函数
  17. round(num,精度):四舍五入函数,num是数字,精度是小数点后边保留几位小数
  18. trunc():截断函数,可以将数字,日期等截断
  19. power():幂指函数
  20. sqrt():平方根
  21. sysdate:返回当前时间
  22. .to_number():将偏数据类型字符串转换成数字,货币符号也可以添加 $,¥是货币符号 L是本地货币符号
  23. .to_date('时间','yyyy'):将字符串转换成日期 yyyy表示4位的年
       MM 表示2位的月
       dd 表示2位日
       hh24 表示24小时制时间
       mi:表示分钟  ss:表示秒  day:表示时期
  24. to_char():可以将数字,日期等转换成字符串
  25. last_day(日期):取当前日期月的最后一天
  26. next_day():求周
  27. add_months(日期,月):给一个日期加上若干个月
  28. add_months(日期,月):给一个日期加上若干个月
  29. 开窗函数(分析函数):partition by 替换group by
       row_number()over():必须和over形容函数联用,排序的序号和rownum伪列相同,连续序号,不考虑值相等的情况(值   相同序号不相同)
       dense_rank()over:可以用来做排序,它序号连续,考虑重复数据,如果值相等序号就相同 1123
       rank()over:可以用来做排序,它序号不连续,考虑重复数据,如果值相等序号相同 1134
  30. sum(case when) :列转行
  31. case when then/decode:如果....则...

     

实例

  • 1.length(str):返回一个字符串的长度
      ----查询所有员工的姓名长度
      select length(ename) from emp;
      ----查询 hahaha 的长度
      select length('hahahha') from dual;
      ----查询工作长度为5的员工姓名和工种
      select ename,job from emp where length(job)=5;
    2.concat(str1,str2):字符串连接函数,它和||实现的功能一样。
      select 'aaa'||'bbb' from dual;
      select concat('aaa','bbb') from dual;
      select empno||':'||ename||':'||job from emp;
      select concat(empno,ename,job) from emp;
      ---求员工的工资,以 姓名是:smith,工资是:800 的形式显示
      select ' 姓名是:'||ename,'工资是:'||sal from emp;
    3.chr():将一个ASCII码转换成字符
      select chr(97) from dual;
      select chr(10)  from dual;
      将工资与姓名之间以空格的形式显示
      select sal||chr(10) ||ename from emp;
      select sal||' '||ename from emp;
    4.ascii(字符):将一个字符转换成ASCII码值
      select ascii('a') from dual;
      select ascii('$') from dual;
    5.trim(str)函数:如果只跟一个参数,表示去除字符串两端的空格
      ltrim(str,):去掉左边空格
      rtrim(str):去掉右边空格
      select trim('         adsf          ') from dual;
      select ltrim('         adsf          ') from dual;
      select rtrim('         adsf          ') from dual;
    6.pad(str,len,'符号'):填充函数,len表示长度,'符号'表示不够的用特定符号填充
      lpad():在左边填充
      rpad():在右边填充
      select lpad(ename,10,'*') from emp;
      ---将姓名补充到10位,不够的在左边用‘*’表示,再将名字补充到15位,不够的在右边用‘¥’表示
      select Rpad(lpad(ename,10,'*'),15,'¥') from emp;
    6.replace(str,s,d):字符串替换函数,将字符串str中的s字符替换成字符d
      select replace('asdfasdf','f','A') from dual;
    7.instr(str,字符,ind,n):表示在字符串str中查找字符,从ind位置开始,n表示查询第n次出现
      select instr('abkasdawe','a',1,1) from dual;
      select instr('abkasdawe','a',-1,1) from dual;
      select ename,instr( ename,'A',1) from emp;
      select ename,instr( ename,'A') from emp;
      ---求第五位是H的员工姓名
      select ename from emp where ename like '____H%';
      select ename from emp where instr(ename,'H',5,1)=5;
    8.substr(str,ind,len):表示从ind位置开始截取字符串str,截取的长度为len
      select substr('aa|bb|cc|dd|ee',1,3) from dual;
      select substr('aa|bb|cc|dd|ee',-3,2) from dual;
      select ename,substr(ename,3) from emp;
      求第五十位是H的员工姓名
      select ename from emp where instr(ename,'H',50,1)=50;
      select ename from emp where substr(ename,50,1)='H';
    9.initcap(str):将字符串的英文单词首字母大写
      select initcap(ename) from emp;
    10.upper/lower():大小写转换函数
      select * from emp;
      select lower(ename) from emp;
      select upper('hahhah') from dual;
      ---将员工的姓名以首字母小写,其他字母大写的方式显示
      select lower(substr(ename,1,1))||upper(substr(ename,2)) from emp; 
    11.floor/ceil:向下取整和向上取整
       select floor(1234.838134) from dual;
       select floor(-166.1235) from dual;
       select ceil(1234.1234) from dual;
       select ceil(-1234.1234) from dual;
    ---11:floor向下取整 ceil向上取整
           select * from emp
           select floor (1254.2342) from dual ---返回结果1254
           select floor (-1667.324) from dual ---返回结果-1668
           select ceil (234.45) from dual;    ---返回结果235
           select ceil (-1234.456) from dual ---返回结果-1234
           select ceil (-1234.456) from emp ;--已有表查询
    ---12:mod()求余函数
           select mod(123,4) from dual ;
           查询姓名,编号是 编号/工资余数是169的信息
           select  ename,empno from emp where mod(empno,sal)=169;
           查询工资数是偶数的员工姓名
           select  ename,empno from emp where mod(,sal,2)=0;
    ---13:round(num,精度):四舍五入函数,num是数字,精度正数是小数点后边保留几位小数,负数是小数点前面几位
           select round(48888.866859,2) from dual;
           select round(48888.866859,-2) from dual;
     
    ---14:trunc():截断函数,可以将数字,日期等截断 精度正数是小数点后边保留几位小数,负数是小数点前面几位
           select trunc(1234.8964,-2) from dual; 
           select trunc(-1234.8934) from dual; ---默认截断小数点后所有
           select trunc (’yuiefd‘,2) from dual 不能截断字符串, 
           select trunc(sysdate,'yyyy')from dual ;
           select trunc(hiredate,'dd') from emp; 
           select trunc(sysdate,'mm') from dual;
           截取当前字段的日期,之后返回字段当月第一天或当年日期的第一月第一天
    ---15 sysdate返回当前系统日期
          select sysdate from dual;--
    ---16 --power(2,2)幂指函数,第一个数值,第二个指数  
          select power(20,2) zhi from dual;-
    ---17--sqrt()开方根
          select sqrt(64)from dual;
    ---18-- to_number 将偏数据类型字符串转换成数字,货币符号也可以添加(模板需要加‘’)
     数值模板的最小位数需要包含是转换字符数值最小位位数的,模板数值需为9或0(0时需要加’‘)
        select to_number ('2647.00',9999.99)from dual 
        select to_number ('2647.00',9999.99)from dual
        select to_number('97.9890','99.0000000') from dual;
        select to_number('$97.9890','$99.0000000') from dual;
        select to_number('$97.9890','$99.0000000') from dual;
    ---19.to_date('时间','yyyy'):将字符串转换成日期
        yyyy表示4位的年
        MM表示2位的月
       dd表示2位日
       hh24表示24小时制时间
       mi:表示分钟
       ss:表示秒
       day:表示时期
       select to_date('1999','yyyy') from dual;
       select to_date('1999-05-07','yyyy-mm-dd') from dual;
       select to_date('1999-05-07-12-14-45','yyyy-mm-dd-hh24-mi-ss') from dual;
    --- 20--to_char():可以将数字,日期等转换成字符串
     select to_char(hiredate,'yyyy-mm') from emp;
     select to_char(sysdate,'yyyy-mm') from dual; 
    ---21--last_day() :去当前日期约的最后一天
     select last_day(hiredate)from emp;
     select last_day(sysdate) from dual;
    ---查询员工倒数第三天入职的员工
     select hiredate,ename from emp where hiredate=last_day(hiredate)-2; 
    ---22--next_day() 未来几天的日期
     select next_day(sysdate,7)from dual;
     select next_day(next_day(sysdate,7),7) "下下周" from dual;
    ---23--add-months 某日期加上若干个月
       select add_months(sysdate,6)from dual
       select add_months(sysdate,-6)from dual
    ---24 months_between(date1,date2)取两个日期相差的月数
     --查询2015-09-09入职的年数
       select months_between(sysdate,to_date('2015-09-09','yyyy-mm-dd'))/12 from dual;
    ***25.开窗函数(分析函数):
       partition by 替换group by
       row_number()over():
       必须和over形容函数联用,排序的序号和rownum伪列相同,连续序号,不考虑值相等的情况(值相同序号不相同)
       dense_rank()over:
       可以用来做排序,它序号连续,考虑重复数据,如果值相等序号就相同 1123
       rank()over:
       可以用来做排序,它序号不连续,考虑重复数据,如果值相等序号相同 1134
       select deptno ,sal ,row_number() over(partition by deptno order by sal desc) biaoyi from emp; 
       select deptno ,sal ,dense_rank()over (partition by deptno order by sal desc) biaoer from  emp;
       select deptno ,sal,rank ()over(partition by deptno order by sal desc) biaoer from emp;     
     
       select deptno,sal,row_number()over(partition by deptno order by sal desc) from emp ;
       select deptno,sal,dense_rank()over(partition by deptno order by sal desc) from emp ;
       select deptno,sal,rank()over(partition by deptno order by sal desc)  from emp ; 
    ---26.sum(case when) :列转行  
       ---查询十号、二十号、三十号和其他部门和部门的人数
       select deptno, 
       sum(case when deptno =10 then 1 end) 十号部门人数,
       sum (case when deptno=20 then 1 end) 二十号部门人数,
       sum(case when deptno=30 then 1 end ) 三十好部门人数,
       sum(case when deptno not in (10,20,30) then 1 end) 其余部门人数
       from emp group by deptno
       ---查询 clerk salesman manager analyst 的人数
       select 
       sum(case when job ='CLERK' then 1 else 0 end ) clerk,
       sum(case when job='SALESMAN' then 1  else 0end) salseman,
       sum(case when job='MANAGER' then 1  else 0 end) manager ,
       sum (case when job='ANALYST' then 1  else 0 end )analayst
       from emp 
      ---case when then/decode:如果....则...
       select  sal,   case when sal < 1000 then 'low'
        when sal >=1000 and sal <2000 then 'middle'
        else 'high'
        end gzfb
       from emp;
       select sal,decode(sal,800,'low',2000,'middle',3000,'high') from emp

函数练习

1.将所有员工的名字按小写的方式显示
select lower(ename) from emp ; 
2.显示正好为5个字符的员工的姓名。
select ename from emp where length(ename)=5;
3.显示所有员工姓名的前三个字符。
select substr(ename,1,3) from emp 
4 显示所有员工姓名的后三个字符
select substr(ename,-3) from emp;
5.以首字母大写,后面小写的方式显示所有员工的姓名。(两种方法)
select initcap(ename) from emp ;
 select upper(substr(ename,1,1))||lower(substr(ename,2)) from emp;
6.以首字母小写后面大写方式显示所有员工姓名。
select lower(substr(ename,1,1))||upper(substr(ename,2)) from emp 
7.显示所有员工的姓名,用“我是老虎”替换所有“A”
select replace(ename,'A','我是老虎') from emp 

8.以字符长度为10的方式显示员工职位,多余的位数在右边以*来填充
selselect rpad(job,10,'*') from emp 
9.找出字符串"oracle training"中第二个ra出现的位置
select instr('oracle training','ra',1,2) from dual
10. 去除字符串‘ aadde gf ’两边的空格
select trim(' aadde gf ') from dual
11.以指定格式显示员工的工资(格式:SMITH 的工资是 800)
select ename||'的工资是'||sal from emp
12.显示所有员工的姓名,用a替换所有"A"
select replace(ename,'A','a') from emp
13.显示员工姓名中包含‘H’的员工(三种方法)
select ename from emp where ename like'%H%'
select ename from emp where instr(ename,'H')>0
select ename from emp where substr(ename,instr(ename,'H'),1)='H'
14.显示员工姓名中第二个字符是‘L’的员工(三种方法)
select ename from emp where ename like '_L%';
select ename from emp where instr(ename,'L',2,1)=2;
select ename from emp where substr(ename,2,1)='L'
15.显示员工姓名中最后一个字符是‘T’的员工(四种方法)
select ename from emp where ename like'%T';
select ename from emp where substr(ename,-1)='T';
select ename from emp where instr(ename,'T',-3,1)=length(ename)-2;
select ename from emp where instr(ename,'T',length(ename),1)>0;
 

16.查找已经入职8个月多的员工

select empno,ename from emp where months_between(sysdate,hiredate)>8; 
--17显示满10年服务年限的员工的姓名和受雇日期。
select ename ,hiredate from emp where (months_between(sysdate,hiredate)/12)>=10;
--18对于每个员工,显示其加入公司的天数。
select ename,trunc (sysdate-hiredate,0)  天数 from emp;
--19找出各月倒数第3天受雇的所有员工。
select ename  from emp where hiredate=(last_day(hiredate)-2);
--20显示1981年入职的所有员工
select ename from emp  where   to_char(hiredate,'yyyy')=1981
--21显示所有10月份入职的员工
select ename from emp where to_char (hiredate,'mm')=10
--22查询一个月前入职的员工
select ename from emp where months_between(sysdate,hiredate)>1
select ename from emp where add_months(hiredate,1)<sysdate 
23.显示在一个月为30天的情况所有员工的日薪,忽略余数
select ename, trunc (sal/30) from emp 
24.显示员工在此公司工作了几个月(要求结果是整数)
select ename ,trunc(months_between(sysdate,hiredate))from emp
25.显示所有12月份入职的员工
select ename from emp where to_char(hiredate,'mm')=12
26. 显示所有员工的姓名、加入公司的年份和月份,并且按照年份排序
select ename ,to_char(hiredate,'yyyy') 年份,to_char(hiredate,'mm') 月份 from emp order by 2 ;

27.查询当前日期
select trunc (sysdate) from dual; 
28.将字符串"1980-12-17"转成日期
select to_date('1980-12-17','yyyy-mm-dd') 日期 from dual
29.使职位是分析员的,工资+1000;职位是经理的,工资+800;职位是其它的,工资+400
select ename, case when job='ANALYST' THEN SAL+1000
when job='MANAGER' then sal+800
  else sal+400
    end 工资
    from emp
30.员工总工资,平均工资,四舍五入,保留小数点后2位
select sum(sal+nvl(comm,0)) 总工资,round(avg(sal+nvl(comm,0)),2) 平均工资 from emp;
select round(sum(sal+nvl(comm,0)),2),round(avg(sal+nvl(comm,0)),2) from emp;
31.按部门求出部门平均工资,且平均工资取整数
select deptno,trunc(avg(sal)) from emp group by deptno

;