(02)oracle新人筆記------函數

一、單行函數

大小寫轉換函數

//dual:虛表,不能保存任何數據,只有一個字段,一行記錄,當我們不希望讀取任何記錄又想做計算時dual表.

SELECT LOWER('ABCDEFG') FROM dual;  

SELECT UPPER('abcdefg') FROM dual;

SELECT INITCAP('zhao qian') FROM dual;   //首字母大寫,其他小寫

SELECT empno,ename,deptno FROM emp WHERE ename=UPPER('blake');

 

字符處理函數

SELECT CONCAT('Zhao','Qian') FROM dual ;                           //字符拼接

SELECT SUBSTR('aaabbbcccddd',4,3)FROM dual;                      //截取

SELECT LENGTH('zhao qian')FROM dual;                              //求長度

SELECT REPLACE('ABCABCABC','B','F') FROM dual;                 //替換

SELECT INSTR('ABCDABCD','D') FROM dual;                        //查位置

SELECT INSTR('ABCDABCD','D',5) FROM dual;

SELECT LPAD('A',5,'C') FROM dual;    //字符拼接:把C拼到A左邊,拼接後一共5位

SELECT RPAD('A',5,'C') FROM dual;    //字符拼接:把C拼到A右邊,拼接後:ACCCC

SELECT TRIM('S' FROM 'SSMITH') FROM dual;           //刪除

SELECT REPLACE('AAABBBCCC','A','D') FROM dual;     //替換

數值函數

SELECT ROUND(4343.1253,2) FROM dual;       //四捨五入取兩位小數

SELECT TRUNC(4312.1253,2) FROM dual;       //不四捨五入取兩位小數

SELECT MOD(1600,300) FROM dual;             //取餘

 

 

日期

  • SELECT SYSDATE FROM dual;           //系統當前時間

 

  • SELECTename,(SYSDATE-hiredate)/7WEEKS FROM emp ;

 

3、SELECT ename,MONTHS_BETWEEN(SYSDATE,hiredate) months FROM emp ORDER BY  

   months;                //月數查詢

 

  • SELECT ename,ADD_MONTHS(hiredate,3) new_date FROM emp where    

   hiredate>'01-1月-82';                

   //查詢82年後入職的員工轉正日期,其中入職後試用期三個月

 

5、SELECT NEXT_DAY('06-2月-06','星期一') next_day FROM dual;  

//返回在2016年2 月6號後的下一個週一是什麼日期

 

6、SELECT LAST_DAY('02-2月-06') last_day FROM dual;  //返回該月最後一天

   SELECT empno,hiredate,EXTRACT(MONTH FROM hiredate) "hire month" FROM emp;

   //查所有員工入職月份

 

7、SELECT empno,hiredate,EXTRACT(YEAR FROM hiredate) "hire year "FROM emp;

   //查所有員工入職年份

 

轉換函數

1、 TO_CHAR

   SELECT ename,TO_CHAR(hiredate,'YYYY') month_hired FROM emp;

   SELECT ename,TO_CHAR(hiredate,'MM/YY') month_hired FROM emp;  

   SELECT ename,TO_CHAR(hiredate,'YEAR') month_hired FROM emp;

   SELECT ename,TO_CHAR(hiredate,'DD MONTH YYYY') HIREDATE FROM emp;

   SELECT ename,TO_CHAR(sal,'$999,999,999') SALARY FROM emp;

         YYYY:完整年份       YEAR:年份英文表示      MM:用兩位數字表示月份

         MONTH:月份全名     DAY:星期幾             DY:用三個英文字符表示星期幾     

2、SELECT TO_DATE('2017-05-04 11:50:00','yyyy-MM-dd hh:mi:ss') FROM dual;

3、SELECT TO_NUMBER('000012345') FROM dual;

         9:一位數字           0:顯示前導0           $:顯示美元符號

         .:顯示小數點        ,:顯示千位符           L:顯示本地貨幣符號     

 

 

通用函數

  • //NVL(comm,100):comm不爲空,返回comm;comm爲空,返回100

   SELECT ename,sal,comm,(sal*12)+NVL(comm,100) FROM emp;

 

   //comm不爲空,返回sal*12+comm;comm爲空,返回sal*12+100

   SELECT ename,NVL2(comm,sal*12+comm,sal*12+100) FROM emp;

 

2、//如果一樣返回空,如果不一樣返回第一個

   SELECT NULLIF(100+200,200+100) FROM dual;

 

3、//comm爲空,就變0

   SELECT ename,COALESCE(comm,0) comm,deptno FROM emp;

 

4、CASE/DECODE函數:

   SELECT ename,deptno,

   (CASE deptno

     WHEN 10 THEN '銷售部'

     WHEN 20 THEN '技術部'

     WHEN 30 THEN '管理部'

     ELSE '無' END) deptname

   FROM emp;

 

   SELECT ename,deptno,

   DECODE (deptno,

     10,'銷售部',

     20,'技術部',

     30,'管理部',

    '無' ) deptname

   FROM emp;

 

   SELECT ename,sal,deptno,(CASE deptno

     WHEN 10 THEN sal*1.1

     WHEN 20 THEN sal*1.2

     WHEN 30 THEN sal*1.3

     END) NEWSAL

   FROM emp

 

 

二、分組函數

    查詢流程:FROM---->WHERE---->GROUP BY---->HAVING---->SELECT---->ORDER BY

 

1、SELECT MAX(sal),MIN(sal),AVG(sal),SUM(sal) FROM emp;

2、 //除了COUNT(*),其他所有分組函數都會忽略列中的空值

   SELECT COUNT(*) FROM emp WHERE deptno=30;     

   SELECT AVG(comm) FROM emp;

   SELECT AVG(NVL(comm,0)) FROM emp;

3、SELECT COUNT(comm) FROM emp WHERE deptno=30;

4、SELECT COUNT(DISTINCT deptno) FROM emp;        //去重複

5、SELECT deptno,AVG(sal) FROM emp GROUP BY deptno;   //分組

   SELECT deptno,job,SUM(sal) FROM emp GROUP BY deptno,job;

 

6、正確:SELECT deptno,MAX(sal) FROM emp GROUP BY deptno HAVING MAX(sal)>2900;

   錯誤:SELECT deptno,MAX(sal) FROM emp where MAX(sal)>2900;

 

7、組函數嵌套:SELECT MAX(AVG(sal)) FROM emp GROUP BY deptno;

 

 

 

      

 

練習:

  1. SELECTSYSDATE FROM dual;
  2. SELECTename,(SYSDATE-hiredate) FROM emp ;
  3. SELECTNEXT_DAY('06-2月-06','星期一') next_day FROM dual;
  4. SELECTLAST_DAY('02-2月-06') last_day FROM dual;
  5. SELECTempno,hiredate,TRUNC(hiredate,'MONTH') FROM emp WHERE SUBSTR(hiredate,-2,2)='81';
  6. SELECTempno,hiredate,EXTRACT(MONTH FROM hiredate) "hire month" FROM emp;
  7. SELECTempno,hiredate,EXTRACT(YEAR FROM hiredate) "hire year "FROM emp;
  8. SELECThiredate,MONTHS_BETWEEN('01-1月-00',hiredate),EXTRACT(MONTH FROM hiredate) FROM emp;
  9. SELECTename,hiredate,ADD_MONTHS(hiredate,3),NEXT_DAY(hiredate,'星期日'),LAST_DAY(hiredate) FROM emp WHERE job!='MANAGER';
  10. SELECTTO_DATE('2015-03-18 13:13:13 ','YYYY-MM-DD hh24:mi:ss') FROM dual;
  11. SELECT ename,sal,comm,(sal*12)+NVL(comm,0) FROM emp;
  12. SELECTename,

    NVL(TO_CHAR(mgr),'No Manager')

    FROM emp

  1. WHEREMGR IS NULL;
  2. SELECTSUM(sal),AVG(sal) FROM emp WHERE deptno=20;
  3. SELECTMAX(sal),MIN(sal) FROM emp WHERE deptno=20;
  4. SELECTCOUNT(deptno) FROM emp;
  5. SELECT deptno,job,AVG(sal)

    FROM emp

    WHERE job IN('SALESMAN','MANAGER','CLERK')

    GROUP BY deptno,job

    HAVING AVG(sal)>1000

ORDER BY 3 DESC

  1. SELECTdeptno,COUNT(empno),AVG(sal)

    FROM EMP

    GROUP BY deptno

    HAVING COUNT(empno)>2 AND AVG(sal)>2000

    ORDER BY COUNT(empno) ASC;

  1. SELECT deptno,COUNT(empno)

    FROM emp

    GROUP BY deptno

HAVING COUNT(empno)>2;

  1. SELECTMONTHS_BETWEEN(SYSDATE,'01-1月-00'),

    MONTHS_BETWEEN(SYSDATE,'01-1月-00')*4 

    FROM dual;

  1. SELECT* FROM emp WHERE SUBSTR(ename,3,1)='A';
  2. SELECTTRIM('h' FROM 'hello') FROM dual;
  3. SELECTTRIM('H' FROM 'Hello') FROM dual;
  4. SELECTename,NVL2(comm,sal*12+comm,sal*12+100) FROM emp;
  5. SELECTCONCAT(TO_CHAR(sal,'999,999.99'),' RNB') FROM emp;
  6. SELECTTO_CHAR(hiredate,'MM/YYYY') FROM emp;
  7. SELECTename,LPAD(sal,15,'$') salary FROM emp;
  8. SELECT deptno,ROUND(MAX(sal),0),ROUND(MIN(sal),0)

    FROM emp

    GROUP BY deptno

HAVING COUNT(empno)>=2;

  1. SELECT job,SUM(sal)

    FROM emp

    GROUP BY job

    HAVING SUM(sal)>=2500 AND job NOT LIKE 'SALESMAN';

  1. SELECTdeptno,MAX(sal)-MIN(sal) CHA_E

    FROM emp

    GROUP BY deptno;

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章