一、單行函數
大小寫轉換函數
//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;
練習:
- SELECTSYSDATE FROM dual;
- SELECTename,(SYSDATE-hiredate) FROM emp ;
- SELECTNEXT_DAY('06-2月-06','星期一') next_day FROM dual;
- SELECTLAST_DAY('02-2月-06') last_day FROM dual;
- SELECTempno,hiredate,TRUNC(hiredate,'MONTH') FROM emp WHERE SUBSTR(hiredate,-2,2)='81';
- SELECTempno,hiredate,EXTRACT(MONTH FROM hiredate) "hire month" FROM emp;
- SELECTempno,hiredate,EXTRACT(YEAR FROM hiredate) "hire year "FROM emp;
- SELECThiredate,MONTHS_BETWEEN('01-1月-00',hiredate),EXTRACT(MONTH FROM hiredate) FROM emp;
- SELECTename,hiredate,ADD_MONTHS(hiredate,3),NEXT_DAY(hiredate,'星期日'),LAST_DAY(hiredate) FROM emp WHERE job!='MANAGER';
- SELECTTO_DATE('2015-03-18 13:13:13 ','YYYY-MM-DD hh24:mi:ss') FROM dual;
- SELECT ename,sal,comm,(sal*12)+NVL(comm,0) FROM emp;
- SELECTename,
NVL(TO_CHAR(mgr),'No Manager')
FROM emp
- WHEREMGR IS NULL;
- SELECTSUM(sal),AVG(sal) FROM emp WHERE deptno=20;
- SELECTMAX(sal),MIN(sal) FROM emp WHERE deptno=20;
- SELECTCOUNT(deptno) FROM emp;
- 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
- SELECTdeptno,COUNT(empno),AVG(sal)
FROM EMP
GROUP BY deptno
HAVING COUNT(empno)>2 AND AVG(sal)>2000
ORDER BY COUNT(empno) ASC;
- SELECT deptno,COUNT(empno)
FROM emp
GROUP BY deptno
HAVING COUNT(empno)>2;
- SELECTMONTHS_BETWEEN(SYSDATE,'01-1月-00'),
MONTHS_BETWEEN(SYSDATE,'01-1月-00')*4
FROM dual;
- SELECT* FROM emp WHERE SUBSTR(ename,3,1)='A';
- SELECTTRIM('h' FROM 'hello') FROM dual;
- SELECTTRIM('H' FROM 'Hello') FROM dual;
- SELECTename,NVL2(comm,sal*12+comm,sal*12+100) FROM emp;
- SELECTCONCAT(TO_CHAR(sal,'999,999.99'),' RNB') FROM emp;
- SELECTTO_CHAR(hiredate,'MM/YYYY') FROM emp;
- SELECTename,LPAD(sal,15,'$') salary FROM emp;
- SELECT deptno,ROUND(MAX(sal),0),ROUND(MIN(sal),0)
FROM emp
GROUP BY deptno
HAVING COUNT(empno)>=2;
- SELECT job,SUM(sal)
FROM emp
GROUP BY job
HAVING SUM(sal)>=2500 AND job NOT LIKE 'SALESMAN';
- SELECTdeptno,MAX(sal)-MIN(sal) CHA_E
FROM emp
GROUP BY deptno;