天天看點

oracle筆記4——簡單sql查詢

一、常用的sql語句

 1、使用算術表達式  +  -  *  /

         找出每個員工的獎金和工資的總和

         select sal+comm,ename from emp;

2、連接配接運算符||

3、使用字段别名as

4、空值 is null

5、去除重複行  distinct

6、查詢結果排序order by asc (desc)

7、比較運算符><(!= or <>)  between and

8、in  not in

9、模糊查詢  %----表示零或多個字元

                      _  表示一個字元

對于特殊符号可以用ESCAPE辨別符來查找

select * from emp where ename like '%*_%'  escape  '*'

上面的escape表示  * 後面的那個符号不當成特殊字元處理,就是查找普通的_符号

10、邏輯運算符   or and not

練習:

1、找出部門10中得經理(MANAGER)和部門20中得普通員工(CLERK)

select * from emp where (deptno=10 and job='MANAGER') OR (deptno = 20 and job='clerk');

2、找出部門10中既不是經理也不是普通員工而且工資大于等于2000的員工

select * from emp where deptno=10 and job not in('Manager','Clerk') and sal >=2000

3、找出有獎金的員工的不同工作

select distinct job from emp where commis not null and comm >0

4 、找出沒有獎金或者獎金低于500的員工

select * from emp where comm is null or comm<500

二、sql函數

1、單行函數

1)字元函數

UPPDER  轉換為大寫

select UPPER('abcde') from dual;     ---ABCDE

select * from emp where ename = UPPER('smith');

LOWER  轉換為小寫

select  lower('ABCDE') from dual;

INITCAP--使第一個字母大寫

select inicap(ename) from emp;

concat  --連接配接兩個字段

select concat('a','b') from dual;    

select 'a'||'b' from dual;

結果是:  ab

select concat(empno,ename) from emp; 

結果是: 7369Smith

                 ....

substr

select substr('abcde', length('abcde')-2) from dual;

結果:cde

select substr('abcde',-3,3) from dual;

結果:cde

length

select length(ename) from emp;

replace  将’A‘替換掉’a‘

select replace (ename,'a','A') from emp;

instr  定義字元的位置索引

select instr('Hello World', 'or') from dual;   

結果:8 === equals (index of   in 'java')

Lpad

lpad('Smith',10,'*')  左側填充*   (*****Smith)

Rpad

rpad('Smith',10,'*')  右側填充*  (Smith*****)

注意:10---代表總共十個字元,不足十個字元用’*‘填充,lpad-向左側填充; rpad--向右側填充

Trim

trim('        Mr Smith           ') 作用:過濾掉首尾的空格,相當于java裡面的trim()方法  (Mr Smith)

2)數值函數

round

select round(412,-2) from dual;          -----------400

select round (412.313,2) from dual;  ------------412.31

mod

trunc 截取

select trunc(412.13,-2) from dual;  ---400

3)日期函數

MONTHS_BETWEEN()傳回兩個日期之間的月份數。

SQL> select months_between(to_date('20090228', 'yyyymmdd'), to_date('20080228', 'yyyymmdd')) as months from dual;

    MONTHS

----------

        12

select months_between(sysdate,hiredate) from emp;

 ADD_MONTHS函數在輸入日期上加上指定的幾個月傳回一個新的日期。如果給出一負數,傳回值日期之前幾個月日期。

 ADD_MONTHS(DATE,NUMBER)中的NUMBER應當是整數,給出小數時,正數被截為小于該數的最大整數,負數被截為大于該數的最小整數。

 例:add_months(to_date('29-Feb-96','d-mon-yyyy'),-12.99)   傳回  28-Feb-95

注:上例中29調整為28,是因為96年二月份最後一天是29号,而95年二月份最後一天是28号。

 add_months(to_date('15-Nov-1961','d-mon-yyyy'),1)  傳回   15-Dec-1961

 add_months(to_date('30-Nov-1961','d-mon-yyyy'),1)  傳回   31-Dec-1961

注:從30調整為31,為了保持都是對應最後一天。

 add_months(to_date('31-Jan-1999','d-mon-yyyy'),1)  傳回   28-Feb-1999

注:函數将31日調為28日,以使結果對應新一月的最後一天,因1999年2月隻有28天。

select add_months(sysdate,1) from dual;

next_day();

NEXT_DAT函數傳回輸入日期開始,緊随其後的指定星期對應的日期,weekday可以用全稱,也可以用縮寫(如'monday','tuesday','wed')

例:next_day(to_date('1999.11.24','yyyy.mm.dd'),'friday')       傳回   1999年11月26日

例:next_day(to_date('1999.11.24','yyyy.mm.dd'),'wed')         傳回   1999年11月01日

注:1999年11月24日是星期三,第二個參數是星期五,是兩天後。第二個例子由于日期正好是星期三,隻能用下一個星期三日期。

last_day(d): 時間點d當月份最後一天

select last_day(sysdate) from dual;--2011.12.31

NEW_TIME(d,c1,c2)  

NEW_TIME(d,c1,c2)  
 --轉換新時區  
 ex.  
  select to_char(sysdate,'YYYY/MM/DD HH24:MI:SS') 台北,   
         to_char(NEW_TIME(sysdate,'EST','GMT'),'YYYY/MM/DD HH24:MI:SS') 格林威治   
  from dual;  
  台北                 格林威治  
  -------------------- -------------------  
  2007/09/21 14:36:53  2007/09/21 19:36:53  

4)轉換函數

to_char

select to_char(sysdate,'yyyy') from dual;

select to_char(sysdate,'fmyyyy-mm-dd') from dual;

select to_char(sal,'L999,999,999') from emp;

select to_char(sysdate,'D') from dual;//傳回星期

to_number

select to_number('13') + to_number('14') from dual;

to_date

select to_date('20111205','yyyyMMdd') from dual;

select to_date('20111205','yyyy-MM-dd') from dual;

5)通用函數

nvl(a,b)函數 如果a不為null 則傳回a,如果a為null則傳回b;

select nvl(comm,0) from emp;---如果comm 為null ,就為0 (預設)

 NULLIF()函數

如果表達式exp1 與 exp2 值相等則傳回null,否則傳回exp1的值

select NULLIF(2,2) from dual;

結果:---null

select NULLIF(2,3) from dual;

結果:---2

nvl2(a,b,c)函數,如果a不為null 則傳回b,如果a為null則傳回c;

select empno,ename,sal,comm,nvl2(comm,sal+comm,sal) total from emp;

 注意:如果comm(獎金)不為空,就獲得獎金+工資的和,否則就獲得工資的金額

COALESCE()函數  依次考察各個參數表達式,遇到非null的值即停止并傳回該值

***********************

CASE表達式

select empno,ename,sal

     case deptno

               when 10 then '财務部'

               when  20 then '研發部'

               when 30 then '銷售部'

               else '未知部門'

               end 部門

  from emp;

decode()函數, 和case表達式類似,decode()

函數也用于實作多路分支結構

例子:

select empno,ename,sal,decode(deptno,10,'财務部'

                                                                            20,’研發部‘

                                                                             30,’銷售部‘

                                                      ’未知部門‘)

部門

from emp;