【Oracle學習筆記】經常使用知識梳理

1、  基本操做

1.  表操做

1.1 複製建表

create table test as select * from dept; --從已知表複製數據和結構

create table test as select * from dept where 1=2; --從已知表複製結構但不包括數據

1.2 複製插入

insert into test select * from dept;

1.3 建立臨時表

臨時表是隻在會話(SESSION)期間或在事務(TRANSACTION)處理期間存在的表插入數據時,動態分配空間。SESSION級的臨時表數據在整個SESSION都存在,直到結束這次 SESSION;而TRANSACTION級的臨時表數據在TRANACTION結束後消失,即COMMIT/ROLLBACK或結束SESSION都會清除TRANACTION臨時表數據。語法以下:html

create global temporary table 臨時表名(表定義)

  on commit preserve|delete rows;

說明:oracle

(1)    用preserve時就是SESSION級的臨時表,用delete就是TRANSACTION級的臨時表;app

(2)       SESSION級的臨時表,被本次會話使用,刪除表時需結束本次會話。函數

示例:spa

--建立臨時表
create global temporary table temp_dept
(dno number,
dname varchar2(10))
on commit delete rows;

--插入數據
insert into temp_dept values(10,'ABC');
commit;

--查詢
select * from temp_dept;-- 無數據顯示,事務結束時數據自動清除,應在事務前使用

--刪除
drop table temp_dept;

2、 運算符

算術運算符:+ - * / 能夠在select 語句中使用.net

鏈接運算符:|| select deptno|| dname from dept;code

比較運算符:> >= = != < <= like between is null inorm

邏輯運算符:not and orhtm

集合運算符: intersect ,union, union all, minusblog

select * from emp intersect select * from emp where deptno=10 ;--取交集

select * from emp minus select * from emp where deptno=10;--取差集

select * from emp where deptno=10 union select * from emp where deptno in (10,20); --不包括重複行

select * from emp where deptno=10 union all select * from emp where deptno in (10,20); --包括重複行

【注】集合運算符使用注意事項:

1.對應集合的列數和數據類型相同

2.查詢中不能包含long 列

3.列的標籤是第一個集合的標籤

4.使用order by時,必須使用位置序號,不能使用列名、

3、 經常使用函數

1. 日期函數

1.1 add_months(d,n)

返回指定日期加(減)指定月份後(前)的日期:

select sysdate S1,add_months(sysdate,-1) S2,add_months(sysdate,1) S3 from dual;--查詢當前時間及其先後一個月的時間

1.2 last_day(d)

返回指定日期月的最後一天的日期:

select last_day(sysdate) from dual;

1.3 months_between(d1,d2)

返回日期之間的月份差:

select months_between('13-2月-18','15-10月-17') S3 from dual;

1.4 next_day(d,day)

返回下個星期的日期(day爲1-7或星期日-星期六,1表示星期日):

select sysdate S1,next_day(sysdate,1) S2,next_day(sysdate,'星期日') S3 FROM DUAL

1.5 round(d,[fmt])

四捨五入到最接近的日期(不含時間),這裏的fmt是可選參數,相似於精確度,默認精確到日,參入day時舍入到最接近的星期日:

select  sysdate S1,
       round(sysdate) S2,
       round(sysdate, 'year') YEAR,
       round(sysdate, 'month') MONTH,
       round(sysdate, 'day') DAY,
       round(sysdate, 'hh') YEAR,
  from dual;

1.6 greatest( expr1, ... expr_n )

取得值最大值,數字按大小排 ,字符按首字符比較(若是相等則向下比較),日期則返回最晚日期:

select greatest('01-1月-04','04-1月-04','10-2月-04') from dual;

1.7 extract(expr)

oracle中extract()函數從oracle 9i中引入,用於從一個date或者interval類型中截取到特定的部分。

語法以下:

EXTRACT (  
        { YEAR | MONTH | DAY | HOUR | MINUTE | SECOND }  
        | { TIMEZONE_HOUR | TIMEZONE_MINUTE }  
        | { TIMEZONE_REGION | TIMEZONE_ABBR }  
FROM { date_value | interval_value } )

咱們只能夠從一個date類型中截取 year,month,day(date日期的格式爲yyyy-mm-dd);  也只能夠從一個 timestamp with time zone 的數據類型中截取TIMEZONE_HOUR和TIMEZONE_MINUTE;獲取兩個日期之間的具體時間間隔,extract函數是最好的選擇。

示例:

select systimestamp s,
       extract(year from systimestamp) year,
       extract(month from systimestamp) month,
       extract(day from systimestamp) day,
       extract(minute from systimestamp) minute,
       extract(second from systimestamp) second,
       extract(timezone_hour from systimestamp) th,--時區:8
       extract(timezone_minute from systimestamp) tm,
       extract(timezone_region from systimestamp) tr,
       extract(timezone_abbr from systimestamp) ta
  from dual;

【注】關於TIMEZONE_HOUR、TIMEZONE_MINUTE、TIMEZONE_REGION和TIMEZONE_ABBR,用到時再研究。

2. 數字函數

2.1 取整函數

         ceil 向上取整,floor 向下取整:

select ceil(66.6) N1,floor(66.6) N2 from dual;--結果爲67和66

2.2 取冪(power) 和 求平方根(sqrt)

select power(3,2) N1,sqrt(9) N2 from dual;

2.3 求餘mod(n1,n2)

select mod(9,5) from dual;

2.4 返回固定小數位數

round(num,len)四捨五入,trunc(num,len)直接截斷:

select round(66.667,2) N1,trunc(66.667,2) N2 from dual;

2.5 返回值的符號

sign(n),正數返回爲1,負數爲-1:

select sign(-32),sign(293) from dual;

3. 字符函數

3.1 initcap(st)

返回st將每一個單詞的首字母大寫,全部其餘字母小寫

3.2 lower(st)

返回st將每一個單詞的字母所有小寫

3.3 upper(st)

返回st將每一個單詞的字母所有大寫

3.4 concat(st1,st2) 

返回st爲st2接st1的末尾(可用操做符"||")

3.5 lpad(st1,n[,st2])

返回右對齊的st,st爲在st1的左邊用st2填充直至長度爲n,st2的缺省爲空格

3.6 rpad(st1,n[,st2])

返回左對齊的st,st爲在st1的右邊用st2填充直至長度爲n,st2的缺省爲空格

3.7 ltrim(st[,set]) 

返回st,st爲從左邊刪除set中字符直到第一個不是set中的字符。缺省時,指的是空格

3.8 rtrim(st[,set]) 

返回st,st爲從右邊刪除set中字符直到第一個不是set中的字符。缺省時,指的是空格

3.9 replace(st,search_st[,replace_st])

將每次在st中出現的search_st用replace_st替換,返回一個st。缺省時,刪除search_st

3.10 substr(st,m[,n])

n=返回st串的子串,從m位置開始,取n個字符長。缺省時,一直返回到st末端

3.11 length(st)

數值,返回st中的字符數

3.12 instr(st1,st2[,m[,n]]) 

數值,返回st1從第m字符開始,st2第n次出現的位置,m及n的缺省值爲1

4. 轉換函數

4.1 to_char(type,[fmt])

         這裏type爲date/timestamp/int/float/numeric等,數據類型不一樣,格式fmt也不一樣。

4.1.1 日期轉字符
select  to_char(sysdate) s1,--日-月-年,格式與語言環境有關
       to_char(sysdate, 'yyyy-mm-dd') s2,
       to_char(sysdate, 'yyyy') s3,
       to_char(sysdate, 'yyyy-mm-dd hh12:mi:ss') s4,
       to_char(sysdate, 'hh24:mi:ss') s5,
       to_char(sysdate, 'DAY') s6
  from dual;
4.1.2 時間戳轉字符
select  sysdate,
       systimestamp,
       to_char(systimestamp, 'yyyymmdd hh24:mi:ssxff6'),
       to_char(systimestamp, 'yyyymmdd hh24:mi:ss.ff6'),
       to_char(timestamp '2011-09-14 12:52:42.123456789', 'YYYY-MM-DD')
  from dual;
4.1.3 數字轉字符
select to_char(88877) s1,
       to_char(1234567890, '099999999999999') s2,-- 000001234567890
       to_char(12345678, '999,999,999,999') s3,
       to_char(123456, '99.999') s4,--溢出,顯示#####
       to_char(1234567890, '999,999,999,999.9999') s5,
       to_char(123, 'xx') s6,--十六制,7b
       to_char(4567, 'xxxx') s7,--11d7
       to_char(12345,'$99999') s8,--$12345
       to_char(12345.6,'$99,999.00') s9--$12345.60
  from dual;

【注】timestamp含義爲時間戳,精確到小數秒(fractional_seconds_precision),能夠是 0 to 9,缺省是6:

  select systimestamp,systimestamp(9) from dual;

4.2 to_date(c,[fmt])

4.3 to_timestamp(c,[fmt])

4.4 to_number(c,[fmt])

5. 分組函數

       Oracle中的分組有兩種——group by 和partition by:

group by更強調的是一個總體,就是組,只能顯示一個組裏知足聚合函數的一條記錄; partition by 在總體後更強調個體,能顯示組裏全部個體的記錄。

相應的分組函數也能夠分爲兩大類:

5.1 聚合函數

5.1.1 統計方式
5.1.1.1 rollup

         按分組的第一個列進行統計和最後的小計:

select t.apply_id, t.disposal_field, count(1)
  from ebill_dump_apply_detail t
 group by rollup(t.apply_id, t.disposal_field);

5.1.1.2 cube

按分組的全部列的進行統計和最後的小計:

select t.apply_id, t.disposal_field, count(1)
  from ebill_dump_apply_detail t
 group by rollup(t.apply_id, t.disposal_field);

5.2 分析函數

5.2.1 什麼是分析函數

分析函數是Oracle專門用於解決複雜報表統計需求的功能強大的函數,它能夠在數據中進行分組而後計算基於組的某種統計值,而且每一組的每一行均可以返回一個統計值。

5.2.2 分析函數的形式

分析函數的語法結構通常是:分析函數名(參數) OVER (PARTITION BY子句 ORDER BY子句 ROWS/RANGE子句)

即由如下三部分組成:

分析函數名:如sum、max、min、count、avg等彙集函數以及lead、lag行比較函數等;

over: 關鍵字,表示前面的函數是分析函數,不是普通的集合函數;

分析子句:over關鍵字後面掛號內的內容;

分析子句又由下面三部分組成:

partition by :分組子句,表示分析函數的計算範圍,不一樣的組互不相干;

ORDER BY: 排序子句,表示分組後,組內的排序方式;

ROWS/RANGE:窗口子句,是在分組(PARTITION BY)後,組內的子分組(也稱窗口),此時分析函數的計算範圍窗口,而不是PARTITON。窗口有兩種,ROWS和RANGE; 

示例:

WITH t AS
 (SELECT (CASE
           WHEN LEVEL IN (1, 2) THEN
            1
           WHEN LEVEL IN (4, 5) THEN
            6
           ELSE
            LEVEL
         END) ID
    FROM dual
  CONNECT BY LEVEL < 10)
 

SELECT id,
       SUM(ID) over(ORDER BY ID) default_sum,
       SUM(ID) over(ORDER BY ID RANGE BETWEEN unbounded preceding AND CURRENT ROW) range_unbound_sum,
       SUM(ID) over(ORDER BY ID ROWS BETWEEN unbounded preceding AND CURRENT ROW) rows_unbound_sum,
       SUM(ID) over(ORDER BY ID RANGE BETWEEN 1 preceding AND 2 following) range_sum,
       SUM(ID) over(ORDER BY ID ROWS BETWEEN 1 preceding AND 2 following) rows_sum
  FROM t;

從上面的例子可知:
(1)窗口子句必須和order by 子句同時使用,且若是指定了order by 子句未指定窗口子句,則默認爲RANGE BETWEEN unbounded preceding AND CURRENT ROW,如上例結果集中的defult_sum等於range_unbound_sum;

(2)若是分析函數沒有指定ORDER BY子句,也就不存在ROWS/RANGE窗口的計算;

(3)range是邏輯窗口,是指定當前行對應值的範圍取值,列數不固定,只要行值在範圍內,對應列都包含在內,如上例中range_sum(即range 1 preceing and 2 following)例的分析結果:

當id=1時,是sum爲1-1<=id<=1+2 的和,即sum=1+1+3=5(取id爲1,1,3);

當id=3時,是sum爲3-1<=id<=3+2 的和,即sum=3(取id爲3);

當id=6時,是sum爲6-1<=id<=6+2 的和,即sum=6+6+6+7+8=33(取id爲6,6,6,7,8);

以此類推下去,結果如上例中所示。

四、rows是物理窗口,即根據order by 子句排序後,取的前N行及後N行的數據計算(與當前行的值無關,只與排序後的行號相關),如上例中rows_sum例結果,是取前1行和後2行數據的求和,分析上例rows_sum的結果:

當id=1(第一個1時)時,前一行沒數,後二行分別是1和3,sum=1+1+3=5;

當id=3時,前一行id=1,後二行id都爲6,則sum=1+3+6+6=16;

以此類推下去,結果如上例所示。

注:行比較分析函數lead和lag無window(窗口)子句。

 

參考

http://www.cnblogs.com/lanzi/archive/2010/10/26/1861338.html

http://www.javashuo.com/article/p-rdtzswad-n.html

http://blog.itpub.net/21251711/viewspace-1068855/

6. 其餘函數

6.1 分支函數

         這是我給的分類,凡具備分支判斷功能函數都列於此。

6.1.1 DECODE函數

DECODE函數,是ORACLE公司的SQL軟件ORACLE PL/SQL所提供的特有函數計算方式。

       DECODE的語法:DECODE(value,if1,then1,if2,then2,if3,then3,...,else),表示若是value等於if1時,DECODE函數的結果返回then1,...,若是不等於任何一個if值,則返回else。

       須要注意的是,這裏的if、then及else 均可以是函數或計算表達式。

6.1.2 NVL函數

NVL函數是Oracle PL/SQL中的一個函數。它的格式是NVL( string1, replace_with)。它的功能是若是string1爲NULL,則NVL函數返回replace_with的值,不然返回string1的值,若是兩個參數都爲NULL ,則返回NULL。

注意事項:string1和replace_with必須爲同一數據類型,除非顯式的使用TO_CHAR函數進行類型轉換。至關於Sql中的isnull方法。

6.1.3 NVL2函數

Oracle在NVL函數的功能上擴展,提供了NVL2函數。

NVL2(E1, E2, E3)的功能爲:若是E1爲NULL,則函數返回E3,不然返回E2。至關於.Net中的三元運算符。

6.1.4 NULLIF函數

       NULLIF (ex1,ex2),值相等返空,不然返回第一個值。

6.2 TRUNC函數

截取函數,返回按指定要求截取後的數字或日期。

6.2.1 TRUNC(for number)

  TRUNC函數返回處理後的數值,其工做機制與ROUND函數極爲相似,只是該函數不對指定小數前或後的部分作相應舍入選擇處理,而通通截去。

  其具體的語法格式以下

  TRUNC(number[,decimals])

  其中:

  number 待作截取處理的數值

  decimals 指明需保留小數點後面的位數。可選項,忽略它則截去全部的小數部分

  下面是該函數的使用狀況:

  TRUNC(89.985,2)=89.98

  TRUNC(89.985)=89

  TRUNC(89.985,-1)=80

注意:第二個參數能夠爲負數,表示爲小數點左邊指定位數後面的部分截去,即均以0記。與取整相似,好比參數爲1即取整到十分位,若是是-1,則是取整到十位,以此類推。

6.2.2 TRUNC(for dates)

  TRUNC函數爲指定元素而截去的日期值。

  其具體的語法格式以下:

  TRUNC(date[,fmt])

  其中:

  date 一個日期值

  fmt 日期格式,該日期將由指定的元素格式所截去。忽略它則由最近的日期截去

  下面是該函數的使用狀況:

  TRUNC(TO_DATE(24-Nov-1999 08:00 pm),dd-mon-yyyyhh:mi am)

  =24-Nov-1999 12:00:00 am

  TRUNC(TO_DATE(24-Nov-1999 08:37 pm,dd-mon-yyyyhh:mi am),hh) =24-Nov-1999 08:00:00 am

  trunc(sysdate,yyyy) --返回當年第一天。

  trunc(sysdate,mm) --返回當月第一天。

  trunc(sysdate,d) --返回當前星期的第一天。

trunc(sysdate,dd)--返回當前年月日

fmt值參考以下:

Unit

Valid format parameters

Year

SYYYY, YYYY, YEAR, SYEAR, YYY, YY, Y

ISO Year

IYYY, IY, I

Quarter

Q

Month

MONTH, MON, MM, RM

Week

WW

IW

IW

W

W

Day

DDD, DD, J

Start day of the week

DAY, DY, D

Hour

HH, HH12, HH24

Minute

MI

 

4、 經常使用保留字

4.1 user

select user from dual;--返回登陸的用戶名稱

4.2 sysdate

select sysdate from dual;--返回當前系統時間

http://streamsong.iteye.com/blog/1023922

相關文章
相關標籤/搜索