您好,登錄后才能下訂單哦!
一、字符串函數是oracle使用最廣泛的一種函數(表是參考sql查詢介紹(二)中的表).
A、LOWER(參數):把參數變成小寫
例如:查詢名稱為scott的員工信息 (不區分大小寫的查詢)
SQL> select empno,ename,job,mgr,hiredate,sal,comm,deptno from emp where lower(ename)='scott';
輸出的結果是:
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
----- ---------- --------- ----- ----------- --------- --------- ------
7788 SCOTT ANALYST 7566 1982-12-9 3000.00 20
B、UPPER(參數):把參數變成大寫
例如:查詢名稱為scott的員工信息 (不區分大小寫的查詢)
SQL> select empno,ename,job,mgr,hiredate,sal,comm,deptno from emp where upper(ename)='scott';
輸出的結果是:
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
----- ---------- --------- ----- ----------- --------- --------- ------
7788 SCOTT ANALYST 7566 1982-12-9 3000.00 20
C、INITCAP(參數): 把參數的首字母大寫
例如:查找員工編號是7788的信息,他的名字顯示成首字母大寫
SQL> select empno,initcap(ename),job,mgr,hiredate,sal,comm,deptno from emp where empno='7788';
顯示結果是:
EMPNO INITCAP(ENAME) JOB MGR HIREDATE SAL COMM DEPTNO
----- -------------- --------- ----- ----------- --------- --------- ------
7788 Scott ANALYST 7566 1982-12-9 3000.00 20
D、LENGTH(參數): 返回參數的長度
例如:輸出員工編號是7788的job的長度
SQL> select length(job) as "7788的job的length" from emp where empno=7788;
顯示的結果如下:
7788的job的length
-----------------
7
E、CONCAT(參數1,參數2): 把參數1和參數2連接起來
例如:把員工7788的工資顯示成:薪水+獎金
SQL> select empno,ename,job,mgr,hiredate,concat(sal,comm) as "工資",deptno from emp where empno='7788';
顯示的結果如下:
EMPNO ENAME JOB MGR HIREDATE 工資 DEPTNO
----- ------ ------ ----- ----------- ---------------- ------
7788 SCOTT ANALYST 7566 1982-12-9 3000 20
F、SUBSTR(參數,開始,截取數目): 截取參數
例如:輸出員工編號是7788的job的后三位
SQL> select empno,ename,job,substr(job,length(job)-2,3) as "job的后三位" from emp where empno=7788; 或:
select empno,ename,job,substr(job,length(job)-2) as "job的后三位" from emp where empno=7788;顯示的結果如下:
EMPNO ENAME JOB job的后三位
----- ---------- --------- ------------
7788 SCOTT ANALYST YST
G、INSTR(參數,字母): 返回字母首次出現的位置
例如:查找用戶7788的名字中‘T’出現的位置
SQL> select empno,ename,instr(ename,'T') as "T首次出現的位置" from emp where empno=7788;
顯示的結果如下:
EMPNO ENAME T首次出現的位置
----- ---------- ---------------
7788 SCOTT 4
H、LPAD(參數,長度,在前補齊參數字母):向左補齊
例如:查找用戶是7788的薪水,如果不夠4位的話,前面補0
SQL> select empno,ename,sal,lpad(sal,6,'0') as "薪水是6位的格式" from emp where empno=7788;
顯示的結果如下:
EMPNO ENAME SAL 薪水是6位的格式
----- ---------- --------- ------------------------
7788 SCOTT 3000.00 003000
I、RPAD(參數,長度,在后補齊參數字母):向右補齊
例如:查找用戶是7788的薪水,如果不夠4位的話,前面補0
SQL> select empno,ename,sal,rpad(sal,6,'0') as "薪水是6位的格式" from emp where empno=7788;
顯示的結果如下:
EMPNO ENAME SAL 薪水是6位的格式
----- ---------- --------- ------------------------
7788 SCOTT 3000.00 300000
J、TRIM([both||leadingtrailing||]字母 from 參數):從參數中去掉指定的字母
例如:查找員工編號是7788的去掉“T”后的員工姓名
SQL> select empno,ename,trim('T' from ename) as "去掉T后" from emp where empno=7788;
或
SQL> select empno,ename,trim(both 'T' from ename) as "去掉T后" from emp where empno=7788;
顯示的結果如下:
EMPNO ENAME 去掉T后
----- ---------- ----------
7788 SCOTT SCO
例如:查找員工編號是7788的去掉左邊的“T”后的員工姓名
SQL> select empno,ename,trim(leading 'T' from ename) as "去掉T后" from emp where empno=7788;
或:
SQL> select empno,ename,ltrim(ename,'T') as "去掉T后" from emp where empno=7788;
顯示的結果如下:
EMPNO ENAME 去掉T后
----- ---------- ----------
7788 SCOTT SCOTT
例如:查找員工編號是7788的去掉右邊的“T”后的員工姓名
SQL> select empno,ename,trim(trailing 'T' from ename) as "去掉T后" from emp where empno=7788;
或:
SQL> select empno,ename,rtrim(ename,'T') as "去掉T后" from emp where empno=7788;
顯示的結果如下:
EMPNO ENAME 去掉T后
----- ---------- ----------
7788 SCOTT SCO
K、REPLACE:(參數,參數[,參數]): 第一個參數操作數,第二是要查找的字符,第三個是替換的字符,如果沒有第三個就刪除查找的字符。
例如:把編號7788的員工姓名中的‘T’換成‘L’
SQL> select empno,ename,replace(ename,'T','L') as "替換后" from emp where empno=7788;
顯示的結果如下:
EMPNO ENAME 替換后
----- ---------- ----------
7788 SCOTT SCOLL
二、數字函數
A、ROUND(參數): 四舍五入
例如:查找12.89的四舍五入
SQL> select round(12.89) from dual;
顯示的結果如下:
ROUND(12.89)
------------
13
B、TRUNC(參數1[,參數2]): 截斷 ,第一個參數是要操作的數,第二個參數可有可無,如果沒有的話,截斷的是整數部分,如果參數2是正數的話,截取小數點右邊的‘參數2’個數,如果是負數的話,截取小數點左邊的“參數2”個數
例如:采用默認的方式
SQL> select trunc(12.89) from dual;
顯示的結果:
TRUNC(12.89)
------------
12
例如:第二個參數是正數的時候
SQL> select trunc(12.89,1) from dual;
顯示的結果:
TRUNC(12.89,1)
--------------
12.8
例如:第二個參數是負數的時候
SQL> select trunc(12.89,-1) from dual;
顯示的結果:
TRUNC(12.89,-1)
---------------
10
C、MOD(參數1,參數2): 求參數1除以參數2后的余數
例如:100除以30的余數
SQL> select mod(100,30) from dual;
顯示的結果:
MOD(100,30)
-----------
10
D、ABS(參數):求參數的絕對值
例如:求-10 的絕對值
SQL> select abs(-10) from dual;
顯示的結果:
ABS(-10)
----------
10
E、CEIL(參數):返回大于或等于參數的最小整數
SQL> select ceil(-10.23) from dual;
顯示的結果:
CEIL(-10.23)
------------
-10
F、FLOOR(參數):返回小于或等于參數的最大整數
例如:求-10.23的向下取整
SQL> select floor(-10.23) from dual;
顯示的結果:
FLOOR(-10.23)
------------
-11
G、SQRT(參數) :返回參數的平方根 負數無意義。
例如:求4的平方根
SQL> select sqrt(4) from dual;
顯示的結果:
SQRT(4)
----------
2
日期函數:Oracle 中的日期型數據實際含有兩個值: 日期和時間。默認的日期格式是 DD-MON-RR.日期時間函數用來返回當前系統的日期和時間、以及對日期和時間類型的數據進行處理運算。
A、sysdate();獲取系統的當前日期
例如:
SQL> select sysdate from dual;
顯示的結果是:
SYSDATE
-----------
2011-4-8 13
B、current_timestamp();獲取當前的時間和日期值
例如:
SQL> select current_timestamp from dual;
顯示的結果是:
CURRENT_TIMESTAMP
--------------------------------------------------------------------------------
08-4月 -11 01.38.27.546000 下午 +08:00
C、add_months(date,count):在指定的日期上增加count個月
例如:輸出當前時間的加上3個月的后的時間
SQL> select add_months(sysdate,3) from dual;
顯示結果:
ADD_MONTHS(SYSDATE,3)
---------------------
2011-7-8 13:43:06
D、last_day(date);返回日期date所在月的最后一天
例如:
SQL> select sysdate,last_day(sysdate) from dual;
顯示結果:
SYSDATE LAST_DAY(SYSDATE)
----------- -----------------
2011-4-8 13 2011-4-30 13:51:2
E、months_between(date1,dates);返回date1到date2之間間隔多少個月
例如:
SQL> select sysdate,months_between(sysdate,add_months(sysdate,3)) from dual;
顯示結果:
SYSDATE MONTHS_BETWEEN(SYSDATE,ADD_MON
----------- ------------------------------
2011-4-8 13 -3
F、new_time(date,'this','other');將時間date從this時區轉換成other時區
例如:
SQL> select sysdate,new_time(sysdate,'GMT','AST') from dual;
顯示結果:
SYSDATE NEW_TIME(SYSDATE,'GMT','AST')
----------- -----------------------------
2011-4-8 13 2011-4-8 9:
G、next_day(day,'week');返回指定日期或最后一的第一個星期幾的日期,這里day為星期幾
例如:
SQL> select sysdate,next_day(sysdate,'星期五') from dual;
顯示結果:
SYSDATE NEXT_DAY(SYSDATE,'星期五')
----------- --------------------------
2011-4-8 13 2011-4-15 13:53:10
H、round(參數,截取類型):日期的四舍五入
例如:四舍五入當前時間年
SQL> select sysdate,round(sysdate,'yyyy') from dual;
顯示結果:
SYSDATE ROUND(SYSDATE,'YYYY')
----------- ---------------------
2011-4-9 22 2011-1-1
例如:四舍五入當前時間月
SQL> select sysdate,round(sysdate,'mm') from dual;
顯示結果:
SYSDATE ROUND(SYSDATE,'MM')
----------- -------------------
2011-4-9 22 2011-4-1
例如:四舍五入當前時間日
SQL> select sysdate,round(sysdate,'dd') from dual;
顯示的結果:
SYSDATE ROUND(SYSDATE,'DD')
----------- -------------------
2011-4-9 22 2011-4-10
I、to_char(參數,轉換的類型): 日期的截取
例如:截取當前時間的年
SQL> select sysdate,to_char(sysdate,'yyyy') from dual;
顯示結果:
SYSDATE TO_CHAR(SYSDATE,'YYYY')
----------- -----------------------
2011-4-9 22 2011
例如:截取當前時間的月
SQL> select sysdate,to_char(sysdate,'mm') from dual;
顯示結果:
SYSDATE TO_CHAR(SYSDATE,'MM')
----------- ---------------------
2011-4-9 22 04
例如:截取當前時間的日
SQL> select sysdate,to_char(sysdate,'dd') from dual;
顯示結果:
SYSDATE TO_CHAR(SYSDATE,'DD')
----------- ---------------------
2011-4-9 22 09
日期的數學運算:
在日期上加上或減去一個數字結果仍為日期。
兩個日期相減返回日期之間相差的天數。
可以用數字除24來向日期中加上或減去小時
通用函數
這些函數適用于任何數據類型,同時也適用于空值:
A、NVL (expr1, expr2):如果expr1為空的話,顯示expr2
例如:查看emp如獎金comm為空的話,替換成0
SQL> select empno,ename,job,mgr,hiredate,sal,nvl(comm,0),deptno from emp;
顯示結果:
EMPNO ENAME JOB MGR HIREDATE SAL NVL(COMM,0) DEPTNO
----- ---------- --------- ----- ----------- --------- ----------- ------
7369 SMITH CLERK 7902 1980-12-17 800.00 0 20
7499 ALLEN SALESMAN 7698 1981-2-20 1600.00 300 30
7521 WARD SALESMAN 7698 1981-2-22 1250.00 500 30
7566 JONES MANAGER 7839 1981-4-2 2975.00 0 20
7654 MARTIN SALESMAN 7698 1981-9-28 1250.00 1400 30
7698 BLAKE MANAGER 7839 1981-5-1 2850.00 0 30
7782 CLARK MANAGER 7839 1981-6-9 2450.00 0 10
7788 SCOTT ANALYST 7566 1982-12-9 3000.00 0 20
7839 KING PRESIDENT 1981-11-17 5000.00 0 10
7844 TURNER SALESMAN 7698 1981-9-8 1500.00 0 30
7876 ADAMS CLERK 7788 1983-1-12 1100.00 0 20
7900 JAMES CLERK 7698 1981-12-3 950.00 0 30
7902 FORD ANALYST 7566 1981-12-3 3000.00 0 20
7934 MILLER CLERK 7782 1982-1-23 1300.00 0 10
14 rows selected
B、NVL2 (expr1, expr2, expr3):如果expr1為不空的話,顯示expr2,如果expr1為空的話,顯示expr3
例如:查找員工的編號是7521的員工的工資,如果獎金(comm)不為空的話,顯示工資加獎金
SQL> select sal,nvl2(comm,sal+comm,sal) from emp where empno=7521;
顯示結果:
SAL NVL2(COMM,SAL+COMM,SAL)
--------- -----------------------
1250.00 1750
C、NULLIF (expr1, expr2):expr1與expr2相等返回NULL,不等返回expr1
例如:查看員工7788的薪水和獎金,如果薪水和獎金相等的話返回null,否則返回工資
SQL> select sal,comm,nullif(sal,comm) from emp where empno=7788;
顯示結果:
SAL COMM NULLIF(SAL,COMM)
--------- --------- ----------------
3000.00 3000
D、COALESCE (expr1, expr2, ..., exprn):如果第一個表達式為空,則返回下一個表達式。COALESCE 與 NVL 相比的優點在于 COALESCE 可以同時處理交替的多個值
例如:在emp表中測試的
為了測試,向emp表中添加一條記錄:
SQL> insert into emp(empno,ename,deptno) values(7978,'guo',10);
測試語句:
SQL> select empno,ename,job,mgr,hiredate,sal,comm,deptno,coalesce(comm,sal,1000) as "測試結果" from emp;
顯示結果:
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO 測試結果
----- ---------- --------- ----- ----------- --------- --------- ------ ----------
7369 SMITH CLERK 7902 1980-12-17 800.00 20 800
7499 ALLEN SALESMAN 7698 1981-2-20 1600.00 300.00 30 300
7521 WARD SALESMAN 7698 1981-2-22 1250.00 500.00 30 500
7566 JONES MANAGER 7839 1981-4-2 2975.00 20 2975
7654 MARTIN SALESMAN 7698 1981-9-28 1250.00 1400.00 30 1400
7698 BLAKE MANAGER 7839 1981-5-1 2850.00 30 2850
7782 CLARK MANAGER 7839 1981-6-9 2450.00 10 2450
7788 SCOTT ANALYST 7566 1982-12-9 3000.00 20 3000
7839 KING PRESIDENT 1981-11-17 5000.00 10 5000
7844 TURNER SALESMAN 7698 1981-9-8 1500.00 0.00 30 0
7876 ADAMS CLERK 7788 1983-1-12 1100.00 20 1100
7900 JAMES CLERK 7698 1981-12-3 950.00 30 950
7902 FORD ANALYST 7566 1981-12-3 3000.00 20 3000
7934 MILLER CLERK 7782 1982-1-23 1300.00 10 1300
7978 guo 10 1000
15 rows selected
組合函數:
分組函數作用于一組數據,并對一組數據返回一個值。
A、AVG(字段名):求該字段的平均值
例如:求出emp表中工資的平均值
SQL> select avg(nvl(sal,0)) from emp;
顯示結果:
AVG(NVL(SAL,0))
---------------
1935
B、COUNT(字段名):求該字段中的總記錄
例如:查詢emp表中有幾條記錄
SQL> select count(*) from emp;
顯示結果:
COUNT(*)
----------
15
C、MAX(字段名):求該字段的最大值
例如:求出emp表中的最高的工資的員工
SQL> select max(nvl(sal,0)) from emp;
顯示結果:
MAX(NVL(SAL,0))
---------------
5000
D、MIN(字段名):求該字段的最小值
例如:求出emp表中的最低的工資的員工
SQL> select min(nvl(sal,0)) from emp;
顯示結果:
MIN(NVL(SAL,0))
---------------
0
E、SUM(字段名):求該字段的和
例如:求emp一個需要發多少工資
SQL> select sum(sal)+sum(comm) as "總工資" from emp;
顯示結果:
MIN(NVL(SAL,0))
---------------
0
非法使用組函數
A、所用包含于SELECT 列表中,而未包含于組函數中的列都必須包含于 GROUP BY 子句中。
例如:
SQL> select empno,count(job) from emp;
正確寫法如下:
SQL> select empno,count(job) from emp group by empno;
B、不能在 WHERE 子句中使用組函數(注意)。
例如:SQL> select deptno from emp where count(job)>0 group by deptno;
備注:ORA-00934: 此處不允許使用分組函數
group by 語句
如果在查詢的過程中需要按某一列的值進行分組,以統計該組內數據的信息時,就要使用group by子句。不管select是否使用了where子句都可以使用group by子句。
注意:group by子句一定要與分組函數結合使用,否則沒有意義。
求出每個部門的員工的數
SQL> select count(*) from emp group by deptno;
顯示的結果:
COUNT(*)
----------
6
5
4
求每個部門的中員工的平均工資
SQL> select avg(nvl(sal,0)) from emp group by deptno;
顯示的結果:
AVG(NVL(SAL,0))
---------------
1566.6666666666
2175
2187.5
Having子句
HAVING 子句對 GROUP BY 子句設置條件的方式與 WHERE 子句和 SELECT 語句交互的方式類似。WHERE 子句搜索條件在進行分組操作之前應用;而 HAVING 搜索條件在進行分組操作之后應用。HAVING 語法與 WHERE 語法類似,但 HAVING 可以包含聚合函數。HAVING 子句可以引用選擇列表中出現的任意項。
備注:having子句通常與group by子句結合使用
語法:
SELECT column, group_function
FROM table
[WHERE condition]
[GROUP BY group_by_expression]
[HAVING group_condition]
[ORDER BY column];
A、查詢部門的員工人數大于五部門編號
SQL> select deptno,count(*) from emp group by deptno having count(*)>5;
顯示結果:
DEPTNO COUNT(*)
------ ----------
30 6
備注:分組函數可以嵌套
Order by語句
ORDER BY 子句在SELECT語句的結尾。使用 ORDER BY 子句排序 :ASC(ascend): 升序 ;DESC(descend): 降序 。默認的是ASC升序
查詢員工信息按照部門的編號進行升序排列
SQL> select empno,ename,job,mgr,hiredate,sal,comm,deptno from emp order by empno;
或:
SQL> select empno,ename,job,mgr,hiredate,sal,comm,deptno from emp order by empno asc;
顯示的結果:
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
----- ---------- --------- ----- ----------- --------- --------- ------
7369 SMITH CLERK 7902 1980-12-17 800.00 20
7499 ALLEN SALESMAN 7698 1981-2-20 1600.00 300.00 30
7521 WARD SALESMAN 7698 1981-2-22 1250.00 500.00 30
7566 JONES MANAGER 7839 1981-4-2 2975.00 20
7654 MARTIN SALESMAN 7698 1981-9-28 1250.00 1400.00 30
7698 BLAKE MANAGER 7839 1981-5-1 2850.00 30
7782 CLARK MANAGER 7839 1981-6-9 2450.00 10
7788 SCOTT ANALYST 7566 1982-12-9 3000.00 20
7839 KING PRESIDENT 1981-11-17 5000.00 10
7844 TURNER SALESMAN 7698 1981-9-8 1500.00 0.00 30
7876 ADAMS CLERK 7788 1983-1-12 1100.00 20
7900 JAMES CLERK 7698 1981-12-3 950.00 30
7902 FORD ANALYST 7566 1981-12-3 3000.00 20
7934 MILLER CLERK 7782 1982-1-23 1300.00 10
7978 guo 10
15 rows selected
查詢員工信息按照部門的編號進行降序排列
SQL> select empno,ename,job,mgr,hiredate,sal,comm,deptno from emp order by empno desc;
顯示的結果:
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
----- ---------- --------- ----- ----------- --------- --------- ------
7978 guo 10
7934 MILLER CLERK 7782 1982-1-23 1300.00 10
7902 FORD ANALYST 7566 1981-12-3 3000.00 20
7900 JAMES CLERK 7698 1981-12-3 950.00 30
7876 ADAMS CLERK 7788 1983-1-12 1100.00 20
7844 TURNER SALESMAN 7698 1981-9-8 1500.00 0.00 30
7839 KING PRESIDENT 1981-11-17 5000.00 10
7788 SCOTT ANALYST 7566 1982-12-9 3000.00 20
7782 CLARK MANAGER 7839 1981-6-9 2450.00 10
7698 BLAKE MANAGER 7839 1981-5-1 2850.00 30
7654 MARTIN SALESMAN 7698 1981-9-28 1250.00 1400.00 30
7566 JONES MANAGER 7839 1981-4-2 2975.00 20
7521 WARD SALESMAN 7698 1981-2-22 1250.00 500.00 30
7499 ALLEN SALESMAN 7698 1981-2-20 1600.00 300.00 30
7369 SMITH CLERK 7902 1980-12-17 800.00 20
15 rows selected
按部門升序,員工編號降序查詢
SQL> select empno,ename,job,mgr,hiredate,sal,comm,deptno from emp order by deptno asc,empno desc;
顯示的結果:
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
----- ---------- --------- ----- ----------- --------- --------- ------
7978 guo 10
7934 MILLER CLERK 7782 1982-1-23 1300.00 10
7839 KING PRESIDENT 1981-11-17 5000.00 10
7782 CLARK MANAGER 7839 1981-6-9 2450.00 10
7902 FORD ANALYST 7566 1981-12-3 3000.00 20
7876 ADAMS CLERK 7788 1983-1-12 1100.00 20
7788 SCOTT ANALYST 7566 1982-12-9 3000.00 20
7566 JONES MANAGER 7839 1981-4-2 2975.00 20
7369 SMITH CLERK 7902 1980-12-17 800.00 20
7900 JAMES CLERK 7698 1981-12-3 950.00 30
7844 TURNER SALESMAN 7698 1981-9-8 1500.00 0.00 30
7698 BLAKE MANAGER 7839 1981-5-1 2850.00 30
7654 MARTIN SALESMAN 7698 1981-9-28 1250.00 1400.00 30
7521 WARD SALESMAN 7698 1981-2-22 1250.00 500.00 30
7499 ALLEN SALESMAN 7698 1981-2-20 1600.00 300.00 30
15 rows selected
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。