【DB】Oracle学习笔记(2)

 

 

排序

select * from dept where deptno <>10 order by deptno asc;   //(升序排列)      

select ename, sal, deptno from emp order by deptno asc, ename desc;   //(按照多个字段排序 首先按照deptno升序排列,当detpno相同时,按照ename的降序排列) 

函数

搜索结果转换为小写

select lower(ename) from emp;  //(函数lower() 将ename搜索出来后全部转化为小写);    

截取子串

select substr(ename, 2, 3) from emp;    //(使用函数substr() 将搜素出来的ename字段从第二个字母开始截,一共截3个字符)   

字符ASC码转换

  select chr(65) from dual;  //(函数chr() 将数字转化为AscII中相对应的字符)     

select ascii('A') from dual;  //(函数ascii()与32中的chr()函数是相反的 将相应的字符转化为相应的Ascii编码)    

四舍五入

     select round(23.232) from dual;  //(函数round() 进行四舍五入操作)    

select round(23.232, 2) from dual;  //(四舍五入后保留的小数位数 0 个位 -1 十位)    

         select round(23.652,1) from dual; 结果为: 23.7

         select round(23.652,-1) from dual; 20

货币操作

select to_char(sal, '$99,999.9999')from emp;  //(加$符号加入千位分隔符,保留四位小数,没有的补零)    

select to_char(sal, 'L99,999.9999')from emp;  //(L 将货币转化为本地币种此处将显示¥人民币)   

select sal from emp where sal>888.88 无错.但

select sal from emp where sal>$1,250,00;会出现无效字符错误. 改为:select sal from emp where sal>to_number('$1.250.00','$9,999,99');

日期操作

select to_char(hiredate, 'yyyy-MM-DD HH:MI:SS') from emp;  //(改变日期默认的显示格式)    

select to_char(sysdate, 'yyyy-MM-DD HH:MI:SS') from dual;  //(用12小时制显示当前的系统时间)    

select to_char(sysdate, 'yyyy-MM-DD HH24:MI:SS') from dual;  //(用24小时制显示当前的系统时间)    

   select birthdate from emp;

        显示为:

        BIRTHDATE

        ----------------

        17-12月-80

        ----------------

        改为:

        select to_char(birthdate,'YYYY-MM-DD HH:MI:SS') from emp;

        显示: 

        BIRTHDATE

        -------------------

        1980-12-17 12:00:00

        -------------------

        select to_char(sysdate,'YYYY-MM-DD HH24:MI:SS') from dual; //也可以改为:HH12

        TO_CHAR(SYSDATE,'YY

        -------------------

        2007-02-25 14:46:14

        

        to_date函数:

        select ename,birthdate from emp where birthdate > to_date('1981-2-20 12:34:56','YYYY-MM-DD HH24:MI:SS');

        如果直接写 birthdate>'1981-2-20 12:34:56'会出现格式不匹配,因为表中的格式为: DD-MM月-YY.                                                                             

  替换空值

   select ename,sal*12+nvl(comm,0) from emp; 这样可以防止comm为空时,sal*12相加也为空的情况.

组函数

45、select max(sal) from emp;  // (函数max() 求出emp表中sal字段的最大值)    

46、select min(sal) from emp;  // (函数max() 求出emp表中sal字段的最小值)    

47、select avg(sal) from emp;  //(avg()求平均薪水);    

48、select to_char(avg(sal), '999999.99') from emp;   //(将求出来的平均薪水只保留2位小数)    

49、select round(avg(sal), 2) from emp;  //(将平均薪水四舍五入到小数点后2位)    

50、select sum(sal) from emp;  //(求出每个月要支付的总薪水)  

group by

    select avg(sal) from emp group by deptno;

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

    select deptno,job,max(sal) from emp group by deptno,job;

    求薪水值最高的人的名字.

    select ename,max(sal) from emp;出错,因为max只有一个值,但等于max值的人可能好几个,不能匹配.

    应如下求:

    select ename from emp where sal=(select max(sal) from emp);

    Group by语句应注意,出现在select中的字段,如果没出现在组函数中,必须出现在Group by语句中.

Having 对分组结果筛选

      Where是对单条纪录进行筛选,Having是对分组结果进行筛选.

      

       select avg(sal),deptno from emp 

       group by deptno 

       having avg(sal)>2000;

       

       查询工资大于1200雇员,按部门编号进行分组,分组后平均薪水大于1500,按工薪倒充排列.

       select * from emp 

       where sal>1200

       group by deptno

       having avg(sal)>1500

       order by avg(sal) desc;

子查询

       问那些人工资,在平均工资之上.

       select ename,sal from emp where sal>(select avg(sal) from emp);

表连接

  三张表连接

      slect ename,dname, grade from 

      emp e join dept d on(e.deptno=d.deptno)

      join salgrade s on(e.sal between s.losal and s.hisal)

      where ename not like '_A%';

      把每张表连接 条件不混在一起,然后数据过滤条件全部区分开来。读起来更清晰,更容易懂一点。

  自连接

   不准用组函数,求薪水的最高值(面试题)       

   select distinct sal from emp where sal not in(select distinct e1.sal from emp e1 join emp e2 on (e1.sal<e2.sal))

 

推荐一个淘宝旗下网站,每天9块9包邮还返利。现在登录还有9元支付宝红包送你哦!http://invite.etao.com/67121619402a047e.htm 

 

你可能感兴趣的:(oracle,学习)