1.經典的select sql語句
//注意:包含空值的數學表達式求出的結果為空值
SQL> select sal+comm from emp;
//連接員工編號與員工姓名這兩個字段
SQL> select empno||ename? as "員工編號和員工姓名" from emp;
//查詢去掉重復行的員工部門編號
SQL> select distinct(deptno) from emp;
//查詢薪水不等于3000的員工信息
SQL> select empno,ename,job,mgr,hiredate,sal,comm,deptno from emp where sal<>3000;
或
SQL> select empno,ename,job,mgr,hiredate,sal,comm,deptno from emp where sal !=3000;
//查詢薪水大于等于1600并且小于等于3000的員工信息
SQL> select empno,ename,job,mgr,hiredate,sal,comm,deptno from emp where sal between 1600 and 3000;
等效于
SQL> select empno,ename,job,mgr,hiredate,sal,comm,deptno from emp where sal>=1600 and sal<=3000;
//查詢部門號位10,20的員工信息
SQL> select empno,ename,job,mgr,hiredate,sal,comm,deptno from emp where deptno in(10,20);
相當于:
SQL> select empno,ename,job,mgr,hiredate,sal,comm,deptno from emp where deptno =10 or deptno=20;
//查詢員工名稱以S開頭的員工信息
SQL> select empno,ename,job,mgr,hiredate,sal,comm,deptno from emp where ename like 'S%';
//查詢員工名稱以S結尾的員工信息
SQL> select empno,ename,job,mgr,hiredate,sal,comm,deptno from emp where ename like '%S';
//查詢員工名稱第三個字符為N的員工信息
SQL> select empno,ename,job,mgr,hiredate,sal,comm,deptno from emp where ename like '__N%';
//查詢員工名稱中含有N的員工信息
SQL> select empno,ename,job,mgr,hiredate,sal,comm,deptno from emp where ename like '%N%';
//查詢員工名稱中倒數第二個字符為%的員工信息
SQL> select empno,ename,job,mgr,hiredate,sal,comm,deptno from emp where ename like '%\%_'escape'\';
//查詢員工名稱總含有%的員工信息
SQL> select empno,ename,job,mgr,hiredate,sal,comm,deptno from emp where ename like '%\%%'escape'\';
?? 關系數據庫-à層次關系---》網狀的關系-à關系數據庫-à對象關系。
備注:可以與條件語句結合使用但order by子句放在最后
//查詢員工信息并按照員工的部門編號升序并且編號進行降序排列
SQL> select empno,ename,job,mgr,hiredate,sal,comm,deptno from emp? order by deptno asc,empno desc;
備注:理解思路:首先查詢員工信息按照部門的編號進行升序,然后每個部門中的員工按照員工的編號進行降序排列
2. 字符串函數
字符串函數是oracle使用最廣泛的一種函數.
LOWER:小寫
UPPER:大寫
INITCAP:首字母大寫
CONCAT:連接
SUBSTR:截取? (參數,開始,數目)
LENGTH:返回字符串的長度
INSTR:(參數,字母) 返回字母出現的位置
LPAD:(參數,長度,在前補齊參數字母)
RPAD:(參數,長度,在后補齊參數字母)
TRIM :截取前后空格
REPLACE:(參數,參數[,參數]):第一個參數操作數,第二是要查找的字符,第三個是替換的字符,如果沒有第三個就刪除查找的字符。
//查詢名稱為scott的員工信息(不區分大小寫)
//查詢員工名稱中含有O字符的位置
3.經典字符串函數sql語句
//查詢員工名稱中含有O字符的位置并且求出了員工名稱字符長度
SQL> select empno,instr(ename,'O'),length(ename),job,mgr,hiredate,sal,comm,deptno from emp;
//在查詢上面結果中過濾出員工工作從第三字母開始為ERK員工
SQL> select empno,instr(ename,'O'),length(ename),job,mgr,hiredate,sal,comm,deptno from emp where substr(job,3)='ERK';
//當含有兩個參數的時候,從開始位置直接到參數結束的結束為止;在效果同上的同時指明了截取個數為3
?SQL> select empno,instr(ename,'O'),length(ename),job,mgr,hiredate,sal,comm,deptno from emp where substr(job,3,3)='ERK';
//查詢員工信息? 薪資是10位位數不夠在左部分補*填充
SQL> select empno,ename,job,mgr,hiredate,LPAD(sal,10,'*'),comm,deptno from emp;
//查詢員工信息? 薪資是10位位數不夠在右部分補*填充
SQL> select empno,ename,job,mgr,hiredate,RPAD(sal,10,'*'),comm,deptno from emp;
//查詢員工信息? 把員工名稱中含有S字符去除掉
SQL> select empno,TRIM('S' from ename),job,mgr,hiredate,comm,deptno from emp;
等效于:
SQL> select empno,TRIM( both 'S' from ename),job,mgr,hiredate,comm,deptno from emp;
//查詢員工信息? 把員工名稱中前面有S字符去除掉
SQL> select empno,TRIM( Leading 'S' from ename),job,mgr,hiredate,comm,deptno from emp;
//等效于
SQL> select empno,LTRIM( ename,'S'),job,mgr,hiredate,comm,deptno from emp;
//查詢員工信息? 把員工名稱中后面有S字符去除掉
SQL> select empno,TRIM( trailing 'S' from ename),job,mgr,hiredate,comm,deptno from emp;
等效于:
SQL> select empno,RTRIM( ename,'S'),job,mgr,hiredate,comm,deptno from emp;
1、字符串連接? || 或? concat(‘’,’’)
SQL> select 'a' || 'b' from dual;??? //oracle 特有的符號操作
'A'||'B'
--------
ab
SQL> select concat('a','b') from dual;
CONCAT('A','B')
---------------
ab
SQL> select concat(concat('a','b'),'c') from dual;
CONCAT(CONCAT('A','B'),'C')
---------------------------
Abc
子串函數 substr(‘’,開始位置,字符長度)? instr(‘’,’出現的字符’)
SQL> select substr('abcdef',1) from dual;
SUBSTR('ABCDEF',1)
------------------
abcdef
備注:開始位置從1開始,如果有兩個參數(substr(‘’,2))那么代表的意思是從位置2開始到字符串的結尾的字符串
?SQL> select substr('abcdef',1,3) from dual;
?SUBSTR('ABCDEF',1,3)
--------------------
abc
隨機字符串的函數
dbms_random.string('a',6) //第一個參數有如下幾個具體含義也有解釋,第二參數代表產生的字符串的長度。
u 大寫字母
l小寫字母
a大小寫字母
x大寫字母和數字
p任意字符
//隨機產生一個長度為5并且字符大寫的字符串? 注意觀察下面的結果
DBMS_RANDOM.STRING('U',5)
-----------------------------------------------------------
RAVTG
DBMS_RANDOM.STRING('U',5)
-----------------------------------------------------------
NOAJN
備注重點理解u,l,a,x,p的含義。
SQL> select dbms_random.string('l',5) from dual; //隨機產生一個長度為5并且字符小寫的字符串
DBMS_RANDOM.STRING('L',5)
-----------------------------------------------------------
tawgc
SQL> select dbms_random.string('a',5) from dual; //隨機產生一個長度為5并且字符大小寫混合的字符串
DBMS_RANDOM.STRING('A',5)
-----------------------------------------------------------TEczi
SQL> select dbms_random.string('x',5) from dual; //隨機產生一個長度為5并且字符與數字組合的字符串
?
DBMS_RANDOM.STRING('X',5)
-----------------------------------------------------------4TDUU
?
SQL> select dbms_random.string('x',5) from dual;
DBMS_RANDOM.STRING('X',5)
-----------------------------------------------------------RONOZ
select dbms_random.string('p',5) from dual; //隨機產生一個長度為5任意的字符串
DBMS_RANDOM.STRING('P',5)
-----------------------------------------------------------5=3)*
?
SQL> select dbms_random.string('p',5) from dual;
?
DBMS_RANDOM.STRING('P',5)
-----------------------------------------------------------
zf,@z
?
4.數字函數:
ROUND: 四舍五入
TRUNC:? 截斷
MOD: 求余
ABS:絕對值
CEIL:返回大于或等于value的最小整數
FLOOR:返回小于或等于value的最大整數
SQRT :返回value的平方根 負數無意義。
//四舍五入 結果為46
5.經典數字函數sql語句
四舍五入(更詳細參考本人oracle博客oracle心得2)
//結果為1800.11
SQL> select round(1800.11111,2) from dual;
//結果為1800
SQL> select round (1800.11111,-2) from dual;
//結果為1900
SQL> select round (1899.11111,-2) from dual;
//結果為1800.67
SQL> select round (1800.6666,2) from dual;
//絕對值結果為45.56
SQL> select abs(-45.56) from dual;
//大于等于最小整數結果為46
SQL> select ceil(45.56) from dual;
//大于等于最小整數結果為-45
SQL> select ceil(-45.56) from dual;
//小于等于最大整數結果為-46
SQL> select floor(-45.56) from dual;
//求余數結果為300
SQL> select mod(1800,500) from dual
//截取的數的操作數是正數的情況下:只操作小數位結果為1800.11
SQL> select trunc(1800.11111,2) from dual;
//截取的數的操作數是負數的情況下:操作的是小數點之前的位,把操作位小數點之前的位數全部改寫成0. 結果就是1000
SQL> select trunc(1899.11111,-3) from dual;
6.日期時間函數
Oracle 中的日期型數據實際含有兩個值: 日期和時間。默認的日期格式是 DD-MON-RR.日期時間函數用來返回當前系統的日期和時間、以及對日期和時間類型的數據進行處理運算。
常用函數有:
add_months(date,count);在指定的日期上增加count個月
last_day(date);返回日期date所在月的最后一天
months_between(date1,dates);返回date1到date2之間間隔多少個月
new_time(date,‘this’,’other’);將時間date從this時區轉換成other時區
next_day(day,’day’);返回指定日期或最后一的第一個星期幾的日期,這里day為星期幾
sysdate();獲取系統的當前日期
current_timestamp();獲取當前的時間和日期值
round:日期的四舍五入
trunc 日期的截取
日期的數學運算:
在日期上加上或減去一個數字結果仍為日期。
兩個日期相減返回日期之間相差的天數。
可以用數字除24來向日期中加上或減去小時。
//獲取系統的當前時間 顯示的格式采用默認格式 顯示結果:07-4月 -11 11.15.38.390000 上午 +08:00
7.經典日期sql語句
//為當前日期加上3個月 顯示的結果:2011-7-7 11:18:36
select add_months(sysdate,3) from dual;
//返回當前月的最后一天顯示的結果:2011-4-30 11:19:4
select last_day(sysdate) from dual;
//返回兩個日期之間的間隔月是幾:結果為:4;(sysdate,4)這里數字是多少結果就是多少
SQL> select months_between(add_months(sysdate,4),sysdate) from dual;
//從GMT時區轉換成AST時區的日期結果
?SQL> select new_time(sysdate,'GMT','AST') from dual;
//返回下一個星期一的日期值?? 必須寫成星期’幾’
?SQL> select next_day(sysdate,'星期一') from dual;
8.轉換函數
? 隱式轉換:在運算過程中由系統自動完成的
? 顯式轉換:在運算過程中需要調用相應的轉換函數實現。
顯式轉換:
to_char(date,’format’):按照指定的格式format把數字或日期類型的數據轉換成字符串
9.經典轉換函數sql語句
//把當前日期轉換成YYYY/MM/DD的格式
SQL> select to_char(current_timestamp,'YYYY/MM/DD') from dual;
//把當前日期轉換成YYYY/MM/DD HH24/MI/SS AM的格式
SQL> select to_char(current_timestamp,'YYYY/MM/DD HH24/MI/SS AM') from dual;
//DD “of” MONTH
SQL> select to_char(current_timestamp,'YYYY DD "of" MONTH? HH/MI/SS AM') from dual;
//把當數字按照$99,999這種方式返回字符串? 并且操作數的位數不能夠大于5(即$后邊的位數)位,否則話結果會是########
SQL> select to_char(11111,'$99,999') from dual;
to_number(char);把包含了數字格式的字符串轉換成數字數據
to_date(string,’format’);按照指定格式的format把字符串轉換成日期數據,如果省略了foramt格式,那么就采用默認的日期格式(DD-MON-YY);
//求出兩個日期之間相差的天數
SQL> select to_date('2011-07-15','YYYY-MM-DD')-to_date('2011-02-08','YYYY-MM-DD') from dual;
//求出兩個日期之間相差的周次
SQL> select (to_date('2011-07-15','YYYY-MM-DD')-to_date('2011-02-08','YYYY-MM-DD'))/7 as "date" from dual;
//對周次進行向上取整
SQL> select ceil((to_date('2011-07-15','YYYY-MM-DD')-to_date('2011-02-08','YYYY-MM-DD'))/7) from dual;
?
chartorowid(char);把字符串轉換成rowid類型
rowidtochar(x);把rowid類型轉換成字符類型數據
10.通用函數
?這些函數適用于任何數據類型,同時也適用于空值:
NVL (expr1, expr2) :? 將expr1的空值替換為expr2
NVL2 (expr1, expr2, expr3) :
判斷expr1是否為空,如果為空返回expr3,如果不為空返回expr2;相當于:expr1!=null?exrp2:expr3;
NULLIF (expr1, expr2)? :
expr1與expr2相等返回NULL,不等返回expr1
COALESCE (expr1, expr2, ..., exprn) :
COALESCE 與 NVL 相比的優點在于 COALESCE 可以同時處理交替的多個值。 如果第一個表達式為空,則返回下一個表達式,對其他的參數進行COALESCE 。
11.經典通用函數sql語句
//日期為空替換成給定的日期
SQL>select empno,ename,job,mgr,nvl(hiredate,to_date('2011-1-10','YYYY-MM-DD')),sal,nvl(comm,0),deptno from? emp;
//計算出員工在該月的工資=(薪資+獎金);使用nvl函數
SQL> select empno,ename,job,mgr,hiredate,(nvl(sal,0)+nvl(comm,0)) as "工資",deptno from? emp;
//計算員工的工資;使用nvl2函數
SQL> select empno,ename,job,mgr,hiredate,nvl2(comm,sal+comm,sal) as "工資",deptno from? emp;
//注意觀察理解;ename的長度跟job的長度是否相等
SQL> select ename as "expr1",job as "expr2",nullif(length(ename),length(job)) from? emp;
//comm與sal交叉執行
SQL> select empno,ename,job,mgr,hiredate,coalesce(comm,sal,10000) as "salll", deptno from? emp;
重點理解:單行函數可以嵌套。嵌套函數的執行順序是由內到外。
12.條件表達式 :IF-THEN-ELSE 邏輯
? Case函數的用法
CASE expr WHEN comparison_expr1 THEN return_expr1
???????? [WHEN comparison_expr2 THEN return_expr2
????????? WHEN comparison_exprn THEN return_exprn
????????? ELSE else_expr]
END
Deecode函數的用法
DECODE(col|expression, search1, result1
????? ??????? ???[, search2, result2,...,]
????? ??????? ???[, default])
//為職位是Manager的員工 發放5000元的獎金
SQL> select ename,job,case job when 'MANAGER' then nvl(sal,0)+5000? end? as "工資" from emp;
//員工的工資
SQL> select ename ,job,
? 2? case job when 'MANAGER' then nvl(sal,0)+5000+nvl(comm,0)
? 3? else nvl(sal,0)+nvl(comm,0)
? 4? end
? 5? from emp;
//改寫成 decode的寫法
SQL> select ename,job
? 2? ,decode(job,'MANAGER', nvl(sal,0)+5000+nvl(comm,0),
? 3? 'CLERK',nvl(sal,0)+nvl(comm,0)+200,
? 4? nvl(sal,0)+nvl(comm,0)) as "工資"
? 5? from emp;
13、中文排序
order by nlssort(列,'NLS_SORT=SCHINESE_PINYIN_M');//拼音
order by nlssort(列,'NLS_SORT=SCHINESE_STROKE_M');//筆畫
order by nlssort(列,'NLS_SORT=SCHINESE_RADICAL_M');//偏旁
舉例如下:
SQL> select * from student; //查詢所有數據
?
? SID NAME???????????? DEPT??? AGE
----- -------------------- ---------- ---
??? 1 張三?????????????? 農大????? 21
??? 2 李四?????????????? 農大????? 22
?? ?3 王五?????????????? 工大????? 21
??? 4 趙六?????????????? 工大????? 20
SQL> select * from student order by name;? //注意觀察
?
? SID NAME???????????? DEPT??? AGE
----- -------------------- ---------- ---
??? 1 張三?????????????? 農大????? 21
??? 2 李四?????????????? 農大?? ???22
??? 3 王五?????????????? 工大????? 21
??? 4 趙六?????????????? 工大????? 20
SQL> select * from student order by nlssort(name,'NLS_SORT=SCHINESE_PINYIN_M');//按名筆畫排序
? SID NAME???????????? DEPT??? AGE
----- -------------------- ---------- ---
??? 2 李四???????? ??????農大????? 22
??? 3 王五?????????????? 工大????? 21
??? 1 張三?????????????? 農大????? 21
??? 4 趙六?????????????? 工大????? 20
SQL> select * from student order by nlssort(name,'NLS_SORT=SCHINESE_STROKE_M');//注意理解
? SID NAME???????????? DEPT??? AGE
----- -------------------- ---------- ---
??? 3 王五?????????????? 工大????? 21
??? 1 張三?????????????? 農大????? 21
??? 2 李四?????????????? 農大????? 22
??? 4 趙六?????????????? 工大????? 20
SQL> select * from student order by nlssort(name,'NLS_SORT=SCHINESE_RADICAL_M');//注意理解
? SID NAME???????????? DEPT??? AGE
----- -------------------- ---------- ---
??? 1 張三?????????????? 農大????? 21
??? 2 李四?????????????? 農大????? 22
??? 4 趙六?????????????? 工大????? 20
??? 3 王五?????????????? 工大????? 21
備注:null值參與排序 null值最大
?
?