Oracle經典sql語句總結@sql-plus重點函式串講與sql語句案例@中文排序詳講).doc

y_keven發表於2013-04-09

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值最大

 

 

相關文章