create table test as select * from dept; --從已知表複製數據和結構 create table test as select * from dept where 1=2; --從已知表複製結構但不包括數據
insert into test select * from dept;
臨時表是隻在會話(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;
算術運算符:+ - * / 能夠在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時,必須使用位置序號,不能使用列名、
返回指定日期加(減)指定月份後(前)的日期:
select sysdate S1,add_months(sysdate,-1) S2,add_months(sysdate,1) S3 from dual;--查詢當前時間及其先後一個月的時間
返回指定日期月的最後一天的日期:
select last_day(sysdate) from dual;
返回日期之間的月份差:
select months_between('13-2月-18','15-10月-17') S3 from dual;
返回下個星期的日期(day爲1-7或星期日-星期六,1表示星期日):
select sysdate S1,next_day(sysdate,1) S2,next_day(sysdate,'星期日') S3 FROM DUAL
四捨五入到最接近的日期(不含時間),這裏的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;
取得值最大值,數字按大小排 ,字符按首字符比較(若是相等則向下比較),日期則返回最晚日期:
select greatest('01-1月-04','04-1月-04','10-2月-04') from dual;
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,用到時再研究。
ceil 向上取整,floor 向下取整:
select ceil(66.6) N1,floor(66.6) N2 from dual;--結果爲67和66
select power(3,2) N1,sqrt(9) N2 from dual;
select mod(9,5) from dual;
round(num,len)四捨五入,trunc(num,len)直接截斷:
select round(66.667,2) N1,trunc(66.667,2) N2 from dual;
sign(n),正數返回爲1,負數爲-1:
select sign(-32),sign(293) from dual;
返回st將每一個單詞的首字母大寫,全部其餘字母小寫
返回st將每一個單詞的字母所有小寫
返回st將每一個單詞的字母所有大寫
返回st爲st2接st1的末尾(可用操做符"||")
返回右對齊的st,st爲在st1的左邊用st2填充直至長度爲n,st2的缺省爲空格
返回左對齊的st,st爲在st1的右邊用st2填充直至長度爲n,st2的缺省爲空格
返回st,st爲從左邊刪除set中字符直到第一個不是set中的字符。缺省時,指的是空格
返回st,st爲從右邊刪除set中字符直到第一個不是set中的字符。缺省時,指的是空格
將每次在st中出現的search_st用replace_st替換,返回一個st。缺省時,刪除search_st
n=返回st串的子串,從m位置開始,取n個字符長。缺省時,一直返回到st末端
數值,返回st中的字符數
數值,返回st1從第m字符開始,st2第n次出現的位置,m及n的缺省值爲1
這裏type爲date/timestamp/int/float/numeric等,數據類型不一樣,格式fmt也不一樣。
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;
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;
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;
Oracle中的分組有兩種——group by 和partition by:
group by更強調的是一個總體,就是組,只能顯示一個組裏知足聚合函數的一條記錄; partition by 在總體後更強調個體,能顯示組裏全部個體的記錄。
相應的分組函數也能夠分爲兩大類:
按分組的第一個列進行統計和最後的小計:
select t.apply_id, t.disposal_field, count(1) from ebill_dump_apply_detail t group by rollup(t.apply_id, t.disposal_field);
按分組的全部列的進行統計和最後的小計:
select t.apply_id, t.disposal_field, count(1) from ebill_dump_apply_detail t group by rollup(t.apply_id, t.disposal_field);
分析函數是Oracle專門用於解決複雜報表統計需求的功能強大的函數,它能夠在數據中進行分組而後計算基於組的某種統計值,而且每一組的每一行均可以返回一個統計值。
分析函數的語法結構通常是:分析函數名(參數) 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/;
這是我給的分類,凡具備分支判斷功能函數都列於此。
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 均可以是函數或計算表達式。
NVL函數是Oracle PL/SQL中的一個函數。它的格式是NVL( string1, replace_with)。它的功能是若是string1爲NULL,則NVL函數返回replace_with的值,不然返回string1的值,若是兩個參數都爲NULL ,則返回NULL。
注意事項:string1和replace_with必須爲同一數據類型,除非顯式的使用TO_CHAR函數進行類型轉換。至關於Sql中的isnull方法。
Oracle在NVL函數的功能上擴展,提供了NVL2函數。
NVL2(E1, E2, E3)的功能爲:若是E1爲NULL,則函數返回E3,不然返回E2。至關於.Net中的三元運算符。
NULLIF (ex1,ex2),值相等返空,不然返回第一個值。
截取函數,返回按指定要求截取後的數字或日期。
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,則是取整到十位,以此類推。
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 |
select user from dual;--返回登陸的用戶名稱
select sysdate from dual;--返回當前系統時間
http://streamsong.iteye.com/blog/1023922