欧美V国产V亚洲V日韩九九_国产偷V国产偷V亚洲高清_蜜桃精品免费久久久久影院_亚洲男同志Gay 片可播放

-------------------------------oracle基礎------------------------------------------
1.oracle中聲明變量時,變量類型是在變量名的后面。如:v_count number(7,1)

2.oracle中賦值用:=,等于用=.不同于java中等于用:“==”,賦值用"=".
v_msg varchar2(32) := 'testing'

3.字符常量用單引號,而不是雙引號。若要輸出帶字符可以如:'in='||v_count.
而不能被java中,用"in="+v_count.

4.在存儲過程或函數中,聲明變量名的規則是:
第一個字符必須是字母,不能是數字如:200_count;
變量不分大小寫;
不能含有"-","/","$"等符號,但可以用"_".
 
5.可以用"<>"或"!="來表示不等于。
單行注釋,用--,多行注釋,用/**/

6.條件語句if,case:
if,case以及以前的循環標簽,結果時,都須用end[關鍵字]來表示結果。

6.1
if      條件 then ...
else if 條件 then ...
else              ...
end if
如:
if      salse>5000 then bonus :=500;
else if salse>3000 then bonus :=300;(即當銷售額大于3000小于等于5000時)
else    bonus :=100
end if
 
6.2
case格式用二種,一種是有選擇器,另一種則沒有。如下:
case grade
when 'A' then status :='good';
when 'B' then status :='normal'
else status :='bad'
end case

case
when grade='A' then status :='good';
when grade='B' then status :='normal'
else status :='bad'
end case
 
7.循環語句,while<條件> loop...end loop / for...loop ...end loop.
實例如下:
create or replace procedure a(max in number,value out number)
as
index number :=0;
begin
while index<=max
loop
value :=value*value;
end loop;
end
若用for,可以是:
for <循環計數變量> in [reverse] <上限> .. <下限>
for m in 1 .. 10
loop
.........
end loop
將執行從1到10的循環;
若用
for m in reverse 1 ..10
loop ...end loop
則實現從10到1的逆向循環。
 
oracle左/右/全連接
inner join  --內連接和where相同;相當于join;
left join   --左向外連接,返回左邊表所有符合條件的 
right join  --右向外連接,返回右邊表所有符合條件的 
full join   --完整外部連接,左向外連接和右向外連接的合集 
--建立測試數據 
create table a(id number); 
create table b(id number); 
insert into a values(1); 
insert into a values(2); 
insert into a values(3); 
insert into b values(1); 
insert into b values(2); 
insert into b values(4); 
--左: 
--主流數據庫通用的方法 
select * from a left join b on a.id=b.id; 
--Oracle特有的方法  --最好不要用這樣,不便于sql語句的移植。
select * from a, b where a.id=b.id(+); 
 
        ID         ID 
---------- ---------- 
         1          1 
         2          2 
         3  
 
--右: 
--主流數據庫通用的方法 
select * from a right join b on a.id=b.id; 
--Oracle特有的方法 
select * from a, b where a.id(+)=b.id; 
 
        ID         ID 
---------- ---------- 
         1          1 
         2          2 
                    4  
--內 
--主流數據庫通用的方法 
select * from a join b on a.id=b.id; 
--where關聯 
select * from a, b where a.id=b.id; 
 
        ID         ID 
---------- ---------- 
         1          1 
         2          2          
--全外 
--主流數據庫通用的方法 
select * from a full join b on a.id=b.id; 
--Oracle特有的方法 
select * 
  from a, b 
where a.id = b.id(+) 
union 
select *  
  from a, b  
where a.id(+) = b.id; 
 
        ID         ID 
---------- ---------- 
         1          1 
         2          2 
         3  
                    4 
 
對于多表查詢,如下:
select * from a
left join b on a.id=b.id  
left join c on c.id=b.id;
        ID         ID         ID 
---------- ---------- ---------- 
         1          1          1 
         2          2 
         3  
自己理解:
相當于先進行第一個left join,得到結果集A(3條記錄);結果集A再與第二個left join進行查詢;
select * from a
left join b on a.id=b.id 
right join c on c.id=b.id;
相當于先進行第一個left join,得到結果集A(3條記錄);結果集A再與right join進行查詢,即以c表為主,因為C表只有一個記錄,所以最終才顯示一條記錄;
-----------------------------------------------------------------------------------------
1.
NVL(ac.ovrided_ac_nam, en.stmt_nam) accountDisplayName,
NVL(EXPR1,EXPR2)
若EXPR1是NULL,則返回EXPR2,否則返回EXPR1.
SELECT NAME,NVL(TO_CHAR(COMM),'NOT APPLICATION') FROM TABLE1; --注意不能是雙引號。
2.
DUAL叫虛表,又叫啞表。這表示其中的內容并不是在數據庫實際存在的,而是隨表達式的不同而不是同的。
select * from dual,返回什么?
D
-
X
這表示其中沒有任何內容,也不要對DUAL這個虛表進行增刪改,這樣做沒有實際意義,更不能DROP。強調,它是一個系統表。
使用DUAL比較常見的情況是查詢當前的系統時間,如:
SQL> select to_char(sysdate,'yyyy.mm.dd') as x from dual;
當我們計算表達式時,可用
  SELECT sqrt(81) FROM dual;
  SELECT (5+6)*7 FROM dual;
3.
to_char,to_date
日期到字符操作
select to_char(sysdate,'yyyy.mm.dd') as x from dual;
字符到日期操作
select to_date('2003-10-17 21:15:37','yyyy-mm-dd hh24:mi:ss') from dual
to_char(1210.73, '9999.9') would return '1210.7'
 
to_char(1210.73, '9,999.99') would return '1,210.73'
 
to_char(1210.73, '$9,999.00') would return '$1,210.73'
 
to_char(21, '000099') would return '000021'
 
4.
select a,
       CASE WHEN t.b = 'yes' THEN
          t.c ELSE 0 END yescolumn,
       CASE WHEN t.b = 'no' THEN
          t.c ELSE 0 END nocolumn,
在select語句中,也可應用case.在select的字段中,會同時出現yes,no兩個字段。
5.
不等于:WHERE ROWID <> (SELECT MAX(ROWID)
6.
字段合并:

select ac_id || unit_cde from cc_ac t --make two column into one
相當于:
select concat(ac_id , unit_cde) from cc_ac t --make two column into one
----------------------------------sqlplus命令(系統命令)------------------------------
sql語句主要是對數據庫的定義與操作,而對像環境設置,數據庫會話等SQL語句是不能完成的。
Oracle公司提供的附加語句(或稱命令),可以滿足程序人員和管理員的一些特殊操作要求。比如,在顯示超過上百行記錄信息時,可以采用每屏“暫停”來實現。要達到這樣的目的,就要在SQL>下發 set pause on 命令。由于SQL*PLUS命令較多,下面僅給出最常用的幾個命令的說明:
1.
logon可以是:
{username[/password][@connect_identifier]|/} [AS {SYSOPER|SYSDBA}]
切換用戶:
connect user/password
退出:disconnect
2.
EXIT和QUIT
可以用 exit 或quit 來終止SQL*PLUS的操作(會話)。
3.
DESCRIBE(顯示表、視圖結構)
DESCRIBE可以用(只要用DESC即可)來顯示表、視圖的列的定義,也可以顯示同義詞、函數或存儲過程的說明。語法如下:DESC[RIBE] {[schema.]object[@connect_identifier]}
Schema:用戶名,如果省去,則為對象的所有者。
object
可以是 表(table), 視圖(view),類型( type), 存儲過程(procedure),函數( function), 包(package)或同義詞( synonym)
4.
LIST(列出)命令
可以用 LIST 命令來列出當前SQL緩沖區中的一行或多行命令語句。
L[IST] [n|n m|n *|n LAST|*|* n|* LAST|LAST]
n 列出第n行
n m 列出n到m行
n * 列出第n行到當前行
n LAST 列出第n行到最末行
* 列出所有行
* n 列出當前行到第n行
* LAST列出當前行到最末行
LAST 列出最末行
例:
SQL> LIST
1 SELECT ENAME, DEPTNO, JOB
2 FROM EMP
3 WHERE JOB = ’CLERK’
4* ORDER BY DEPTNO
5.
Save保存當前緩沖區命令到文件
可以用SAVE命令將當前的命令行保存到操作系統的文件中。
例:
SQL>select table_name from dict where table_name like ‘%ROLE%’;
SQL>save c:\get_role
6.
GET將命令文件讀到緩沖區
可以用GET 命令將操作系統的目錄下的命令文件讀到緩沖區(但不執行)。語法如下:
GET filename [.ext] [LIS[T]|NOL[IST]]
其中:
filename: 希望加載到SQL緩沖區的文件名
ext: 文件的擴展名,缺省為 SQL.
7.
再運行當前緩沖區的命令
在SQL>方式下,如果希望在運行當前的命令,可用Run(或R)或用 / 來實現,如:
1* select table_name from dict where table_name like '%ROLE%'
SQL> /
8.
設置顯示行字符數:set linesize 180(默認80個字符)
設置頁面顯示行數:set pagesize 66
9.
事務自動提交:
show auto,會顯示:autocommit on/off
set auto on/off.
設置暫停:
set pause on
---------------------------------------數據類型---------------------------------
Char 定長字符,≤255個字符
Varchar2 變長字符,≤2000個字符
Number(m,n) 數字類型,含整數、浮點、雙精度等
Date 固定長度(7字節)的日期型
Blob 大二進制對象,≤4GB
Clob 大字符串對象,≤4GB
對于數字類型,也可以用:
Decimal
Double PREcision
Float
Integer
Int
Numeric
但,oracle在保存時,會將上面的類型自動轉換為number.
------------------group by 與 分類統計-----------------
1.報表合計專用的Rollup函數
銷售報表
廣州 1月 2000元
廣州 2月 2500元
廣州 4500元
深圳 1月 1000元
深圳 2月 2000元
深圳 3000元
所有地區 7500元
以往的查詢SQL:
Select area,month,sum(money) from SaleOrder group by area,month
然后廣州,深圳的合計和所有地區合計都需要在程序里自行累計

1.其實可以使用如下SQL:
Select area,month,sum(total_sale) from SaleOrder group by rollup(area,month)
就能產生和報表一模一樣的紀錄
2.如果year不想累加,可以寫成
Select year,month,area,sum(total_sale) from SaleOrder group by year, rollup(month,area)
另外Oracle 9i還支持如下語法:
Select year,month,area,sum(total_sale) from SaleOrder group by rollup((year,month),area)
 
3.Grouping讓合計列更好讀
RollUp在顯示廣州合計時,月份列為NULL,但更好的做法應該是顯示為"所有月份"
Grouping就是用來判斷當前Column是否是一個合計列,1為yes,然后用Decode把它轉為"所有月份"
Select Decode(Grouping(area),1,'所有地區',area) area, Decode(Grouping(month),1,'所有月份',month), sum(money) From SaleOrder Group by RollUp(area,month);
說明:
decode格式:
decode(字段或字段的運算,值1,值2,值3)
這個函數運行的結果是,當字段或字段的運算的值等于值1時,該函數返回值2,否則返回值3。
當然值1,值2,值3也可以是表達式,這個函數使得某些sql語句簡單了許多。
Decode(Grouping(area),1,'所有地區',area),判斷Grouping(area)是否為1,若是,則采用“所有地區”,否則采用area.
比如我要查詢某班男生和女生的數量分別是多少?
通常我們這么寫:
select count(*) from 表 where 性別 = 男;
select count(*) from 表 where 性別 = 女;
要想顯示到一起還要 union一下,太麻煩了
用decode呢,只需要一句話
select decode(性別,男,1,0),decode(性別,女,1,0) from 表
 
--------------------------------多級層次查詢---------------------------------
Oracle中Start with...Connect By理解及用法
其基本語法是:
select ... from tablename start with cond1
connect by cond2
where cond3;
簡單說來是將一個樹狀結構存儲在一張表里,比如一個表中存在兩個字段: id,parentid,那么通過表示每一條記錄的parent是誰,就可以形成一個樹狀結構。用上述語法的查詢可以取得這棵樹的所有記錄。
 
其中COND1是根結點的限定語句,當然可以放寬限定條件,以取得多個根結點,實際就是多棵樹。
COND2是連接條件,其中用PRIOR表示上一條記錄,比如 CONNECT BY PRIOR ID=PRAENTID就是說上一條記錄的ID是本條記錄的PRAENTID,即本記錄的父親是上一條記錄。
COND3是過濾條件,用于對返回的所有記錄進行過濾。
 
例子:
創建示例表:
CREATE TABLE TBL_TEST
(
ID NUMBER,
NAME VARCHAR2(100 BYTE),
PID NUMBER DEFAULT 0
);
插入測試數據:
INSERT INTO TBL_TEST(ID,NAME,PID) VALUES('1','10','0');
INSERT INTO TBL_TEST(ID,NAME,PID) VALUES('2','11','1');
INSERT INTO TBL_TEST(ID,NAME,PID) VALUES('3','20','0');
INSERT INTO TBL_TEST(ID,NAME,PID) VALUES('4','12','1');
INSERT INTO TBL_TEST(ID,NAME,PID) VALUES('5','121','2');
從Root往樹末梢遞歸(取所有點)
select * from TBL_TEST
start with id=1
connect by prior id = pid
從末梢往樹ROOT遞歸(只取根結點,根結點的根結點......)
select * from TBL_TEST
start with id=5
connect by prior pid = id
------------------------------------------------
3.更多報表/分析決策功能
3.1 分析功能的基本結構
分析功能() over( partion子句,order by子句,窗口子句)
概念上很難講清楚,還是用例子說話比較好.
 
3.2 Row_Number 和 Rank, DENSE_Rank
用于選出Top 3 sales這樣的報表
當兩個業務員可能有相同業績時,就要使用Rank和Dense_Rank
比如
金額 RowNum Rank Dense_Rank
張三 4000元 1 1 1
李四 3000元 2 2 2
錢五 2000元 3 3 3
孫六 2000元 4 3 3
丁七 1000元 5 5 4
這時,應該把并列第三的錢五和孫六都選進去,所以用Ranking功能比RowNumber保險.至于Desnse還是Ranking就看具體情況了。
SELECT salesperson_id, SUM(tot_sales) sp_sales, RANK( ) OVER (ORDER BY SUM(tot_sales) DESC) sales_rank FROM orders GROUP BY salesperson_id
3.3 NTILE 把紀錄平分成甲乙丙丁四等
比如我想取得前25%的紀錄,或者把25%的紀錄當作同一個level平等對待,把另25%當作另一個Level平等對待
SELECT cust_nbr, SUM(tot_sales) cust_sales, NTILE(4) OVER (ORDER BY SUM(tot_sales) DESC) sales_quartile FROM orders GROUP BY cust_nbr ORDER BY 3,2 DESC;
NTITLE(4)把紀錄以 SUM(tot_sales)排序分成4份.
 
(1)
between,add_months用法
如:
intCalc.Calc_Date between  TO_DATE( '20100330', 'DDMMYYYY') and ADD_MONTHS(TO_DATE('20100330','YYYYMMDD'),1) - 1
分析:
between .. and ..:
相當于大于A,小于B。 在其中不能加括號,如:between(.. and ..)是錯的。
add_months("時間",正負數):
正數,表示之前的幾個月,負數,表示之前幾個月。
add_months("時間",正負數) +/- A:表示之后之前的幾天。
ADD_MONTHS(TO_DATE('20100330','YYYYMMDD'),1) - 1:表示之后的一個月的前一天。
(2)
可以點擊pl/sql的美化功能。F8運行功能。
(3)
TRUNC(i.expr_date, 'YYYY-MM'):
TRUNC(date[,fmt])
   其中:
   date 一個日期值
   fmt 日期格式,該日期將由指定的元素格式所截去。忽略它則由最近的日期截去
2.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記。
(3)
oracle獲取子字符串函數:
substr(‘123456789’,1,2) -從1到2
substr(‘123456789’2)     -從2到完
(4)
oracle:
在oracle中,若group aCurrency,bCurrency,cCurrency,則表示當:
aCurrency=HKD,bCurrency=HKD,cCurrency=HKD;
aCurrency=HKD,bCurrency=HKD,cCurrency=USD;
aCurrency=USD,bCurrency=HKD,cCurrency=HKD;
.....
每種排列組合時,進行分組.統計。