1. initcap 首字母大写
       select ename,initcap(ename) from emp;


2. lower   转换为小写字符
        select ename,lower(ename) from emp;


3. upper 转换为大写
        update dept set loc=lower(loc);
        update dept set loc=upper(loc);


4. lpad(string,n,[pad_string])左填充
        select deptno,lpad(dname,10,' '),loc from dept;
       lpad('tech on the net', 16, 'z'); 将返回'ztech on the net'

5. RPAD 右填充
     rpad('tech on the net', 16, 'z'); 将返回 'tech on the netz'


6. LTRIM 去除左边的空格
   RTRIM 去除右边的空格
   ALLTRIM  去除两边的空格


7. replace    替换
   translate  转换
      select ename,replace(ename,'S','s') from emp;
          -- 用's'去替换ename中的'S'
      select ename,translate(ename,'S','a') from emp;


8. substr 字符截取函数
      select ename,substr(ename,1,3) from emp;
      --从第1个位置开始 显示3个字符


9. sysdate 系统时间
      select sysdate from dual;
      select to_char(sysdate,'yyyy/mm/dd hh24:mi:ss') from dual;
      select to_char(sysdate,'DDD') from dual;   
      select to_char(sysdate,'D') from dual;
      select to_char(sysdate,'DAY') from dual;
      select to_char(sysdate,'yyyy-mm-dd') from dual;
      select to_char(sysdate,'yyyy"年"mm"月"dd"日" hh24:mi:ss') from dual;
      select '''' from dual;
      --从今天零点以后的秒数
      select to_char(sysdate,'SSSSS') from dual;


10. ADD_MONTHS 添加月份 得到一个新的日期
      select add_months(sysdate,1) from dual;
      select add_months(sysdate,-1) from dual; 
      select trunc(sysdate)-to_date('20050101','yyyymmdd') from dual;
      select add_months(sysdate,12) from dual;
          --一年以后的今天
      select add_months(sysdate,-12) from dual;
          --一年以前的今天


11. last_day  某月的最后一天
       select last_day(sysdate) from dual; 
       select add_months(last_day(sysdate)+3,-1) from dual;
           --本月第3天的日期


12. months_between 两个日期之间的月数
      select months_between(sysdate,'2005-02-01') from dual;
          --方向 sysdate - '2005-02-01'
      select months_between('2005-02-01',sysdate) from dual;


13. ceil(x)  不小于x的最小整数
        ceil(12.4)   13
        ceil(-12.4)   -12


14. round(x)  四舍五入
     round(12.5)   13
     round(12.456,2) 12.46


15. floor(x)  不大于x的最大整数
        floor(12.5)  12
        floor(-12.4)  -13


16. trunc(x)  舍去尾数
     trunc(12.5)  12
     trunc(12.456,2)  12.45
    舍去日期的小时部分
     select to_char(trunc(sysdate),'yyyymmdd hh24:mi:ss') from dual;


17. mod(x,n)  x除以n以后的余数
     mod(5,2) 1
     mod(4,2) 0


18. power(x,y)  x的y次方
    select power(3,3) from dual;
     
19. 求最大值
   select greatest(100,90,80,101,01,19) from dual;
   
     求最小值 
   select least(100,0,-9,10) from dual;


20. decode   选择结构  (if ... elseif .... elesif ... else结构) 
要求: 
   sal=800  显示低工资   
   sal=3000  正常工资
   sal=5000  高工资
   只能做等值比较
   select sal,decode(sal,800,'低工资',3000,'正常工资',5000,'高工资','没判断') from emp;
   表示如下的if  else 结构
     if sal=800 then
        '低工资'
     else if sal =3000 then
        '正常工资'
     else if  sal = 5000 then
         '高工资'
     else
        '没判断'
     end if


21.  判断正负
  sign(x)   x是正  1
            x是负  -1
            x是0   0 
    select sign(-5) from  dual;
  如何做大于小于的比较????
  sal
   1000
   3000


   select sal,decode(sign(sal-1000),-1,'低工资',
              decode(sign(sal-3000),-1,'正常工资',0,'正常工资',1,
              decode(sign(sal-5000),-1,'高工资','高工资')
            )) as 工资状态 from emp;
      
   一般的情况  decode(x,y1,z1,y2,z2,z3)
      if x= y1 then
          z1          
      else if x = y2 then
          z2
      else 
         z3
      end if  


22. 层次查询
--level 伪列 层次查询的时候可以使用的  层的编号
    select lpad('+',level,' ')||ename from emp
    connect by prior empno = mgr --父子关系 父结点中的empno = 子节点中的mgr
    start with mgr is null;--从 mgr is null的节点 开始遍历
    select lpad('+',level,' ')||ename from emp
    connect by prior empno = mgr 
    start with ename = 'BLAKE';


23. 关联查询
      多张表,而表与表之间是有联系的
      是通过字段中的数据的内在联系来发生
      而不是靠相同的字段名来联系的或者是否有主外键的联系是没有关系的
    select dname,ename from emp,dept;
       笛卡尔积  (无意义的)
      --当2个表作关联查询的时候一定要写关联的条件
      --N个表 关联条件一定有N-1个
    select dname,ename from mydept,myemp
    where mydept.no = myemp.deptno;
    多表查询的时候一定要有关联的条件
     --使用的表的全名 
    select dname,ename from emp,dept
    where emp.deptno = dept.deptno ;
    --使用表的别名
    select dname,ename,a.deptno from emp a,dept b
    where a.deptno = b.deptno and a.deptno = 10;
    --等值连接(内连接-两个表的数据作匹配a.deptno = b.deptno )
    select dname,ename,a.deptno from
    emp a inner join dept b
    on a.deptno = b.deptno;
    where a.deptno = 10;
    --on写连接条件的
    --where中写别的条件
    --使用where/on
    select dname,ename,a.deptno from emp a,dept b
    where a.deptno = b.deptno and a.deptno=10;  
    --on中写连接条件
    --where中写其他的条件
    select dname,ename,a.deptno from
    emp a inner join dept b
    on a.deptno = b.deptno 
    where a.deptno = 10 ;
    --外连接
    左外连接 右外连接  全外连接
    (+)写法只有在ORACLE中有效
    select dname,ename,b.deptno
    from emp a,dept b
    where a.deptno(+) = b.deptno;
    --标准写法
    select dname,ename,b.deptno
    from emp a right outer join dept b
    on a.deptno = b.deptno;    
    
    select dname,ename,b.deptno
    from emp a,dept b
    where a.deptno = b.deptno(+);
    --标准写法
    select dname,ename,b.deptno
    from emp a left outer join dept b
    on a.deptno = b.deptno;         
    --标准写法(全外联)  
    select dname,ename,b.deptno
    from emp a full outer join dept b
    on a.deptno = b.deptno;     
    --自连接
    select a.ename as 员工姓名,b.ename as 经理名字 from emp a,emp b
    where a.mgr = b.empno(+);
    a.empno = b.mgr  ???????

09-19 14:48