PL/SQL學習筆記

number數字類型函數

ABS(x) 函數,此函數用來返回一個數的絕對值。

ACOS(x)函數,返回X的反餘弦值。X範圍從1到-1,輸入值從0到派,以弧度爲單位。

ASIN(x)函數,返回X的反正弦值。X範圍從1到-1,輸入值從-PI/2到PI/2,以弧度爲單位。

ATAN(x)函數,返回X的反正切值。輸入值從-PI/2到PI/2,以弧度爲單位。

BITAND(x,y)函數,返回X和Y的與結果。X和Y必須爲非負整數。注意沒有BITOR函數,但是在UTL_RAW包中有用      於RAW值的位操作符。

CEIL(x)函數,用來返回大於或等於X的最小整數。

COS(x)函數,返回x的餘弦值。x是以弧度表示的角度。

COSH(x)函數,返回X的雙曲餘弦。

EXP(x)函數,與power(x,y)函數類似,不過不用指明基數,返回E的X次冪。E=2.71828183...

FLOOR(x)函數,用來返回小於或等於X的最大整數。

LN(x)函數,返回x的自然對數。x必須大於0。

LOG(x,y)函數,返回以X爲底Y的對數。底必須是不爲0和1的正數,Y是任意正數。

MOD(被除數,除數)求餘函數,如果除數爲0,則返回被除數。

POWER(x,y)函數,返回X的Y次冪。底X和指數Y都不必是正整數,但如果X是負數的話,Y必須是整數。

ROUND(x[,y])函數,返回舍入到小數點右邊Y位的X值。Y缺省爲0,這將X舍入爲最接近的整數。如果Y是負數,       那麼舍入到小數點左邊相應的位上,Y必須爲整數。

SIGN(x)函數,此函數用來返回一個數的正負值,若爲一個正數則返回1,若爲一個負數則返回-1,
            若爲0則仍返回0,有點像把模擬量數字化的意思。  

SIN(x)函數,返回X的正弦。x是以弧度表示的角度。

SINH(x)函數,返回x的雙曲正弦。

SQRT(x)函數,返回x的平方根,x不能是負數。

TAN(x)函數,返回x的正切。x是以弧度表示的角度。

TANH(x)函數,返回x的雙曲正切。

TRUNC(x[,y])截取值函數,Y缺省爲0,這樣X被截取成一個整數。如果Y爲負數,那麼截取到小數點左邊相應位置

WIDTH_BUCKET(x,min,max,num_buckets) 只能在SQL語句中使用。

使用WIDTH_BUCKET可以根據輸入參數創建等長的段。範圍MIN到MAX被分爲num_buckets節,每節有相同的大小。返回X所在的那一節。如果X小於MIN,將返回0,如果X大於或等於MAX,將返回num_buckets+1.MIN和MAX
都不能爲NULL,num_buckets必須是一個正整數。如果X是NULL,則返回NULL。

 


時間類型函數:(date)

內部存儲格式:
世紀、年、月、日、小時、分鐘、秒

默認格式是:DD-MON-RR。


SYSDATE 返回當前的系統時間。

SELECT SYSDATE FROM DUAL;


對日期的數學運算

SELECT (SYSDATE-HIRE_DATE)/7 FROM TABLENAME WHERE ROWNUM;
  數字列

ADD_MONTHS(date,x)函數,返回加上X月後的日期DATE的值。X可以是任意整數。如果結果的月份中所包含的   日分量少於DATE的月份的日分量,則返回結果月份的最後一天。如果不小於,則    結果與DATE的日分量相同。時間分量也相同。

CURRENT_DATE 以DATE類型返回會話時區當前的日期。這個函數同SYSDATE相似,除了SYSDATE不管當               會話時區。

CURRENT_TIMESTAMP[(precision)] 以TIMESTAMP WITH TIMEZONE 類型返回會話時區當前的日期。如果    指定precision,它指返回秒數的精度,缺省爲6。

DBTIMEZONE 返回數據庫的時區。 
 
LAST_DAY(日期) 指定日期所在月份的最後一天的日期,這個函數可用來確定本月還有多少天。

LOCALTIMESTAMP[(precision)] 以TIMESTAMP類型返回會話時區的當前日期。如果指定precision,它指    返回秒數的精度,缺省爲6 。

MONTHS_BETWEEN(離當前比較近的日期date1,以前的日期)  兩個日期之間相差的月數(以日作爲最小單位來計算的)。返回是相差的月數。如果date1和date2的日分量相同,或者這兩個日期都分別是所在月的最後一天,那麼返回結果是個整數。否則,返回結果包含一個分數,以一個月31天計算。

NEW_TIME(d,zone1,zone2)函數,當時區zone1中的日期和時間是D的時候,返回時區zone2中的日期和時間。
              返回類型爲DATE。zone1和zone2是字符字符串,另外的時區可在ORACLE9I中
              通過查詢V$TIMEZONE_NAMES得到。  

NEXT_DAY (日期,星期幾) 指定日期後將要遇到的後七天的某一天的日期。

ROUND(日期,‘MONTH/YEAR’) 四捨五入得到新的日期。 保留位置是月和年

SESSIONTIMEZONE 返回當前會話的時區。返回類型是一個時區偏移或時區片名的字符字符串。如果指   定格式,則與 ALTER SESSION 語句中的格式相同。

SYS_EXTRACT_UTC(datetime) 從提供的DATETIME中以UTC(Coordinated Universal Time)返回時間。
    DATETIME必須包含一個時區。

SYSTIMESTAMP 以TIMESTAMP WITH TIMEZONE 返回當前的日期和時間。當在分佈式SQL語句中使用的時  候,返回本地數據庫的日期和時間。

TRUNC(日期,‘MONTH/YEAR’) 截取

TZ_OFFSET(timezone) 以字符字符串返回提供的timezone和UTC之間的偏移量。timezone可以被指定爲時   區名或'+/-HH:HI'格式表示的偏移量。也可使用SESSIONTIMEZONE和   DBTIMEZONE函數,返回格式爲'+/-HH:HI'。

字符字符串   時區
AST    大西洋標準時
ADT    大西洋夏令時
BST    白令標準時
BDT    白令夏令時
CST    中央標準時
CDT    中央夏令時
EST    東部標準時
EDT    東部夏令時
GMT    格林威治平均時
HST    阿拉斯加夏威夷標準時
HDT    阿拉斯加夏威夷夏令時
MST    Mountain標準時
MDT    Mountain夏令時
NST    紐芬蘭標準時
PST    太平洋標準時
PDT    太平洋夏令時
YST    YuKon標準時
YDT    YuKon夏令時 
    


日期和日期時間算術

運算  返回類型
結果 

d1-d2  NUMBER
返回D1和D2之間相差的天數。該值是一個數值,其小數部分代表一天的幾分之幾。

dt1-dt2  INTERVAL
返回DT1和DT2之間的時間間隔。

i1-i2  INTERVAL
返回i1和i2之間的差距。

d1+d2  N/A
非法——僅能進行兩個日期之間的相減。

dt1+dt2  N/A
非法——僅能進行兩個日期之間的相減。

i1+i2  INTERVAL
返回i1和i2的和。

d1+n  DATE
在D1上加上N天作爲DATE類型返回。N可以是實數,它包含一天的幾分之幾。

d1-n  DATE
從D1上減去N天作爲DATE類型返回。N可以是實數,它包含一天的幾分之幾。

dt1+i1  DATETIME
返回DT1和I1的和。

dt1-i1  DATETIME
返回DT1和I1之間的差距。

i1*n  INTERVAL
返回I1的N次方。

i1/n  INTERVAL
返回I1除以N的值。

表中注:
D1和D2指日期值;
DT1和DT2指日期時間值;
I1和I2指時間間隔值;
N指數字值。

 

 


顯示轉換:(conversion)

TO_NUMBER(char[,'format_model'])  字符轉換到數字類型
       

TO_DATE(char[,'format_model'])  字符轉換到日期類型
  格式說明符:要與前邊要轉換的字符串的格式要相同才能轉換(匹配問題:格式和位數)。

 

TO_CHAR(date[,'format_model'[,nlsparams]])
  第二個參數可以省略,不指定格式,按系統默認格式輸出。
  區分大小寫。
  使用FM(在格式控制符前添加)符號可以去掉空格或是首位的零。
  如果指定了NLSPARAMS,則它控制返回字符串的月和日分量所使用的語言。格式爲:
  'NLS_DATA_LANGUAGE=language',language指需要的語言。
  例:
  select to_char(sysdate,'FMyyyy-mm-dd') from dual;
  格式控制符的類型:
    YYYY 四位的年
    YEAR 年的拼寫      
    MM  2位數字的月
    MONTH 月的全名
    MON 月名的前三個字符
    DY 星期名的前三個字符
    DAY 星期名的全稱
    DD 2位的天 
  時間格式控制符:
    HH24:MI:SS AM
    HH12:MI:SS PM
    
  通過“”來實現加入特殊字符的格式控制符。
  SELECT TO_CHAR(SYSDATE,'FMyyyy"年"mm"月"dd"日"') from dual;

  DDSPTH
  ~~ 
  DD是格式控制符。 
  TH是序數詞,將日期轉換成英文的序數詞拼寫。
  SP是基數詞,將日期轉換成英文的基數詞拼寫。

TO_CHAR(NUM[,'format_model'[,nlsparams]])轉換數字

將NUMBER類型參數NUM轉換成VARCHAR2類型。如果指定FORMAT,它會控制整個轉換。
如果沒有指定FORMAT,那麼結果字符串中將包含和NUM中有效位的個數相同的字符。NLSPARAMS用來指定小數點和千分符及貨幣符號。它的格式可爲:'NLS_NUMERIC_CHARS=' ' dg ' 'NLS_CURRENCY= ' 'string' ' '
d和g分別代表小數點和千分符。STRING代表貨幣符號。  


數字格式控制符:
  9 代表一位數字(替換符。有,數字顯示;沒有。不什麼都顯示。) 
  0 代表一位數字(有數字,顯示;沒有,強制顯示0。) 
  $ 美圓符號
  L 本地貨幣
  . 小數點
  , 千分符
  B 當整數部分爲0時,將整數部分填充爲空格。 例:B999
  MI  返回帶有後繼符號而不是前導負號的負數值,正數值將帶有後繼的空格。999MI 
  S 返回一個前導符號或後繼符號,正數爲+,負數爲-。 S9999 或 9999S
  PR  使用尖括號返回負數。正數將有前導或後繼空格。999PR
  D 在指定位置返回一個小數點。兩側的9的個數指定了最大的位數。99D9
  G 在指定位置返回千分符,G可以在FORMAT_model中出現多次。9G999G9
  C 在指定位置返回ISO貨幣符號。C可以在FORMAT_model中出現多次。C99
  L 在指定位置上返回本地貨幣符號。 L99
  V 返回一個被乘以10的N次方的數值,這裏N是V後邊9的個數。99V99
  EEEE 使用科學記數法返回該數值。9.99EEEE
  RM 使用大寫的羅馬數字表示返回該數值。 RM
  rm 使用小寫的羅馬數字表示返回該數值。 rm
  FM 返回不含前導和後繼空格的數值。 FM99.09
  
  格式控制符位數一定要大於或等於NUMBER的位數,不能小於。


用RR解決跨世紀問題:
     小於50的認爲是1950-2050
     大於50的認爲是1951-1999   

數字和日期是不能相互轉換的。

ASCIISTR(string) 

返回只包含有效的SQL字符和斜線的字符串。string中的任何無效的字符將被轉換爲一個相當的數字,在之前加上斜線。
   
BIN_TO_NUM(num[,num]...) 

將一位矢量轉換位相當的數字。它的參數是一系列逗號隔開的NUMS,每一個都必須是0或1。
例如BIN_TO_NUM(1,0,1,1)將返回11,因爲11的二進制表示是1011。當使用分組集合和GROUP BY 子句時該函數很有用。     CHARTOROWID(x)函數,

將字符串轉換成一個ROWID類型的值,注意格式必須採用ROWID數據類型格式,即“數據塊號:行序號:數據文件號”。
  
COMPOSE(string) 

以相同字符集中完全規格化Unicode形式返回string.string可以是CHAR、VARCHAR2、NCHAR、NVARCHAR2、CLOB或NCLOB類型。
  

DECOMPOSE(string)

返回一個Unicode字符串。它是string的規範分解。string可以是CHAR、VARCHAR2、 NCHAR、NVARCHAR2、CLOB或NCLOB類型。      

FROM_TZ(timestamp,timezone)

返回一個TIMESTAMP WITH TIMEZONE 類型值。它將TIMESTAMP(沒有時區信息)和提供的TIMEZONE組合在一起。

HEXTORAW(string)

 將由STRING表示的二進制數值轉換爲一個RAW數值。STRING應該包含十六進制值。STRING中的每兩個字符表示結果RAW中的一個字節。HEXTORAW和RAWTOHEX互爲反函數。 

NUMTODSINTERVAL(x,unit)

將X轉換爲INTERVAL DAY TO SECOND 值,X應該是一個數字。UNIT是一個字符字符串(可以是CHAR、VARCHAR2、NCHAR或NVARCHAR2),且是'DAY'、'HOUR'、'MINUTE'、'SECOND'之一。unit是不區分大小寫的,返回值的缺省精度爲9。

NUMTOYMINTERVAL(x,unit)

將X轉換成INTERVAL YEAR TO MONTH 值,X應該是一個數字。UNIT是一個字符字符串(可以是CHAR、VARCHAR2、NCHAR或NVARCHAR2),且是'YEAR'或'MONTH'之一。unit是不區分大小寫的,返回值的缺省精度爲9。 

REFTOHEX(refvalue)

返回一REF refvalue的十六進制表示。

RAWTOHEX(rawvalue)

將RAW類型值rawvalue轉換爲一個十六進制表示的字符串。rawvalue中的每個字節轉換爲一個雙字符的字符串。

RAWTONHEX(rawvalue)
 
將RAW類型值rawvalue轉換爲一個十六進制表示的字符串。rawvalue中的每個字節轉換爲一個雙字符的字符串。
RAWTONHEX返回值是NVARCHAR2類型而不是VARCHAR2類型。

ROWIDTOCHAR(rowid)函數,將ROWID類型值轉換成字符串。與CHARTOROWID互爲反函數。

ROWIDYONCHAR(rowid) 與ROWIDTOCHAR類似,返回類型是NCHAR,而不是CHAR。

TO_CLOB(string)

將string轉換爲CLOB。string可以是文字或另一個LOB列。如果參數包含NCHAR數據,它被轉換爲數據庫字符集

TO_DSINTERVAL(string[,nlsparams])

將string(可以是CHAR、VARCHAR2、NCHAR、NVARCHAR2)轉換爲 INTERVAL DAY TO SECOND 類型。如果
選定nlsparams,則nlsparams只能包含小數點和千分位字符的NLS_NUMERIC_CHARARCTERS表示。

TO_LOB(long_column)

將long_column轉換成LOB。這個函數用於將LONG和LONG RAW分別轉換爲CLOB和LOB。

TO_MULTI_BYTE(string)

返回將所有單字節字符替換爲等價的多字節字符的STRING。該函數僅當數據庫字符集同時包含單字節和多字節字符時才使用。否則,STRING不會進行任何處理而被返回,與TO_SINGLE_BYTE 互爲反函數。
TO_NCHAR

和TO_CHAR相似,結果是屬於國家字符集而不是數據庫字符集。

TO_NCLOB(string)

將STRING轉換爲NCLOB。STRING可以是文字或另一LOB列。

TO_SINGLE_BYTE(string)

返回將所有雙字節字符替換爲等價的單字節字符的STRING。。該函數僅當數據庫字符集同時包含單字節和多字節字符時才使用。否則,STRING不會進行任何處理而被返回,與TO_MULTI_BYTE 互爲反函數。

TO_TIMESTAMP(string[,format[,nlsparams]])

將其參數CHAR或VARCHAR2類型string轉換成TIMESTAMP類型。

TO_TIMESTAMP_TZ(string[,format[,nlsparams]])

將其參數CHAR或VARCHAR2類型string轉換成 TIMESTAMP WITH TIMEZONE 類型。

TO_YMINTERVAL(string)

將string(可以是CHAR、VARCHAR2、NCHAR、NVARCHAR2)轉換爲INTERVAL YEAR TO MONTH 類型。
TO_YMINTERVAL與TO_DSINTERVAL相似,除了它不能使用NLS參數作爲參數並返回YEAR TO MONTH時間間隔而不DAY TO SECOND 時間間隔。

to_label(x[,y])函數,按照格式Y將字符串X轉換成MLSLABEL類型的一個值,若默認格式爲Y,則按照默認格式進  行轉換。

dump(w,[x[,y[,z]]])函數,用來返回字符串EXPR的數據類型,內部的存儲位置和字符長度。
      dump(expr,return_datatype,start_position,length).
      return_datatype是指定返回返回位置用什麼方式表示,可以爲8、10、16、17,分別表示      用八進制、十進制、十六進制和字符類型。

例:
select dump(last_name,8,3,2) ,dump(last_name,10,3,2) ,
dump(last_name,16,3,2) ,dump(last_name,17,3,2) from employees
where lower(last_name) = 'smith';

greatest(x,y,...)函數,返回參數列表中的最大值。其參數的類型是由第一個參數決定的,可以爲數值型、日期型  、和字符型等,後面的參數被強制轉換成此種數據類型。
  進行字符串的比較時,其大小由字符在字符集中的數值決定,在字符集中的數值大,則此字  符就大,對於字符串,此函數返回VARCHAR2類型。  

least(x,y,......)函數,返回列表參數中的最小值。

與上兩個函數類似的有:
greatest_lb(x,y,....)函數和least_lb(x,y,....)函數,分別求出列表中的標籤的最大下限和最小上限,其參數必須爲
MLSLABEL 類型,返回值爲 RAW MLSLABEL類型。

user 函數,返回當前用戶的數據庫用戶名。
uid函數,返回唯一標識當前用戶的整數。
這兩個函數在完整性約束檢查時會用到,可以當作引用變量一樣引用它們。

userenv(x)函數,返回當前會話的一些信息,由X指定返回何種信息。在寫一個指定應用的審計測試表或決定爲當            前會話指定哪種語言時會用到,但完整性約束時不能用。
參數:
 entryid  返回有效的審計條目標識   
 label  返回當前會話的標籤
 language  以“語言.字符集”形式返回所用的語言和字符集
 sessionid  返回正在使用的審計會話號
 terminal  返回當前會話終端所用的操作系統

 

嵌套函數:

單行函數可以嵌套任意層;
嵌套函數從最深層開始執行。

 


通用函數:

BFILENAME(directory,file_name)
返回操作系統中與物理文件file_name相關的BFILE位置指示符。directory必須是數據字典中的一個DIRECTORY類型對象。

COALESCE(,,,,可以多個參數)返回從左到右的第一個非空的表達式。如果所有表達式都爲NULL,則返回NULL。

EMPTY_BLOB/EMPTY_CLOB
返回一個空的LOB位置指示符。EMPTY_CLOB返回一個字符位置指示符,EMPTY_BLOB返回一個二進制位置指示符。

EXISTSNODE(XMLType_instrance,Xpath_string)
使用Xpath_string中的路徑,確定由XMLType_instrance標識的XML文檔的TRAVELSAL是否返回任何節點。這個函數將返回一  個NUMBER值,如果沒有節點則爲0,如果有節點則爲大於0。

EXTRACT(XMLType_instrance,Xpath_string)
應用Xpath_string之後,返回由XMLType_instrance標識的XML文檔的一部分。

GREATEST(expr1[,expr2]...)
返回其參數中最大的表達式。在進行比較之前,每個表達式都被隱式轉換爲EXPR1的類型,如果EXPR1是字符類型,則使用非填充空格字符比較,返回結果爲VARCHAR2類型。

LEAST(expr1[,expr2]...)
返回其參數中最小的表達式,其餘同上。

NVL(EXPR1,EXPR2)
類型必須匹配,如果EXPR1是NULL,則返回EXPR2,否則返回EXPR1。返回值與EXPR1類型相同,除非EXPR1是字符類型,在這種情況下將返回VARCHAR2類型。這個函數用於確保查詢記錄集中不包含NULL值。

NVL2(EXPR1,EXPR2,EXPR3)
如果EXPR1是NULL,則返回EXPR2,否則返回EXPR3。返回值與EXPR2類型相同,除非EXPR2是字符類型,在這種情況下將返回VARCHAR2類型。

SYS_CONNECT_BY_PATH 返回列值的從根到結點的路徑,它僅在層次查詢中有效。

SYS_CONTEXT(namespace,parameter[,length])
返回與namespace的內容相關聯的patameter的值。使用DBMS_SESSION.SET_CONTEXT過程設置參數和namespace.返回值是VARCHAR2類型,如果沒有指定length,則最大長度是255字節。

SYS_DBURIGEN
產生一個URL用於從數據庫中提取XML文檔。

SYS_GUID
以16位RAW類型值形式返回一個全局唯一的標識符。

SYS_TYPEID(object_type)
返回指定類型object_type的類型ID。

SYS_XMLAGG
將幾個XML文檔或文檔片段組合爲一個文檔。

SYS_XMLGEN
返回一個基於數據庫中數據的XML文檔片段。

TREAT(expr AS [REF] [schema.]type)
TREAT用於改變一個表達式的聲明類型。僅可以將聲明類型改變爲給定表達式的子類型或超類型。以類型[schema.]type返回
expr,如果指定了REF,則返回REF。

UID
返回一個唯一標識當前數據庫用戶的整數,UID沒有參數。

VSIZE(x)返回X內部表示的字節數。

NULLIF(a,b)如果A等於B返回NULL,如果不等於返回B。

DUMP(expr[,number_format[,start_position][,length]])
返回一個包含EXPR內部表示信息的VARCHAR值,如果沒有指定NUMBER_FORMAT,則返回結果以十進制形式返回。如果指定了start_position和length,則返回從start_position開始,長爲length字節的字符串,缺省是返回整個表達式。
所返回的數據類型是內部數據類型編碼的對應數字。

NUMBER_FORMAT

格式  返回結果
8  8進制符號
10  10進制符號
16  16進制符號
17  單字符


編碼   數據類型       有效於
 
1   VARCHAR2     ORACLE7
2   NUMBER      ORACLE7
8   LONG      ORACLE7
12   DATE      ORACLE7
23   RAW      ORACLE7
24   LONG RAW     ORACLE7
69   ROWID      ORACLE7 
96   CHAR      ORACLE7
112   CLOB      ORACLE8
113   BLOB      ORACLE8
114   BFILE      ORACLE8
180   TIMESTAMP     ORACLE9i 
181   TIMESTAMP WITH TIMEZONE   ORACLE9i
182   INTERVAL YEAR TO MONTH   ORACLE9i
183   INTERVAL DAY TO SECOND   ORACLE9i
208   UROWID      ORACLE9i
231   TIMESTAMP WITH LOCAL TIMEZONE   ORACLE9i 


USERENV[option]
基於option返回包含有關當前會話信息的VARCHAR2值。

函數的行爲

選項值    USERENV(option)的行爲

'OSDBA'    如果當前會話將OSDBA角色的設置打開了,則返回'TRUE',否則返回'FALSE',注意返    回值是VARCHAR2類型,而不是BOOLEAN類型。

'LABEL'    僅對TRUSTED ORACLE 中有效,返回當前會話標誌。

'LANGUAGE'   返回當前會話所使用的語言和地域,以及數據庫字符集,這是NLS參數,返回形式是
    LANGUAGE_TERRITORY.CHARACTERSET.

'TERMINAL'   返回當前會話所使用終端的操作系統標識符。對於分佈式的SQL語句,返回的是本地    會話的標識符。

'SESSIONID'   如果初始化參數AUDIT_TRAIL被設置爲TRUE,那麼將返回審計會話標識符。在分佈    式SQL語句中,USERENV('SESSIONID')是無效的。

'ENTRYID'   如果初始化參數AUDIT_TRAIL被設置爲TRUE,那麼將返回可用的審計項標識符。在    分佈式SQL語句中USERENV('ENTRYID')是無效的。

'LANG'    返回語言名稱的ISO縮寫符號。它的格式比USERENV('LANGUAGE')要短。

 

例:
select USERENV('TERMINAL'),USERENV('LANGUAGE') from dual;

USERENV('TERMINA USERENV('LANGUAGE')
---------------- ----------------------------------------------------
WNJ              SIMPLIFIED CHINESE_CHINA.ZHS16GBK

條件表達式:

CASE表達式(簡單CASE)


語法:

CASE 表達式 WHEN  條件1 THEN 返回值1
     WHEN  條件2 THEN 返回值2
   .
   .
   .
     WHEN  條件n THEN 返回值n
ELSE 返回值
END  
  

DECODE函數

語法:

DECODE(
 條件,比較值1,返回值1
      比較值2,返回值2
      .
       .
      .
      比較值n,返回值n
      返回值(不滿足條件時)        

select last_name,salary,
 decode( trunc(salary/2000,0),//條件
  0, 0.00,//比較值1,返回值1
  1, 0.09,
  2, 0.20,
  3, 0.30,
  4, 0.40,
  5, 0.42,
  6, 0.44,
   0.45
       )   TAX_RATE
from employees
where department_id=80;

 

 

從多表中顯示數據:

SQL(老版本的)

等值查詢
SELECT TABLE1.COLUMN,TABLE2.COLUMN FROM TABLE1,TABLE2 WHERE TABLE1.COLUMN1=TABLE2.COLUMN2;//自然連接
使用AND操作符增加查詢條件

使用表的別名來簡化查詢。
提高查詢功能。

SELECT E.ID,D.ID FROM EMPL E,DEP D WHERE E.NAME=D.NAME;
       ~~     ~
       表別名
多表等值連接查詢
爲了連接N個表,至少需要N-1個連接條件。


 
非等值查詢

使用 BETWEEN AND 查詢近似值作爲連接條件的多表結果。
WHERE E.SALARY BETWEEN J.LOW AND J.HIGH

 


外連接查詢

SELECT T1.COL,T2.COL FROM WHERE T1.COL(+)=T2.COL;左外連接
    所有T2的T1信息。 
SELECT T1.COL,T2.COL FROM WHERE T1.COL=T2.COL(+);右外連接
    所有T1的T2信息。
爲了看到與連接條件不匹配的數據,就必須得用外連接。

 

 

自連接

通過表的別名來創建虛擬邏輯表,進行自連接查詢。
select worker.last_name || 'work for' || manager.last_name
from employees worker,employees manager
where worker.manager_id=manager.employee_id;

 


9I適應性連接:

select t1.col,t2.col
from table
 
cross join t2 //交叉連接

natural join t2//自然連接:把兩表中所有等值的字段都作爲連接條件(但這些連接條件不用寫)。
     從兩個表中選出連接列的值相等的所有行。
     如果兩個列的名稱相同,但數據類型不同;或是類型相同,意義不同都會出錯。

join t2 using (column_name);基於自然連接,只有在USING中出現的,才作爲連接條件(在USING中列名前一定不能加前綴)。
 
join t2 on (t1.col=t2.col);基於ON的自然連接。等值、非等值或自連接都可以實現。

left|right|full outer join t2 on(t1.col=t2.col);

 select e.last_name,d.department_name,l.city
 from employees e
 left outer join departments d on e.department_id=d.department_id
        right outer join locations l  on d.location_id=l.location_id;
*&* 可以連續做左連接或右連接的操作。
 full outer join 忽略連接條件,把要查詢的列的所有行全顯示出來。 
  


笛卡爾乘積(多表查詢容易產生的錯誤)形成原因:
*、忽略連接條件;
*、連接條件不正確;
*、笛卡爾乘積是由第一個表的所有行和第二個表的所有行聯合形成的;
*、爲了避免笛卡爾乘積的產生,一定要在WHERE條件中正確寫出連接條件。
set linesize 160;設置顯示行的行數。

 

 

用字函數產生的總計

對多行的計算產生單行的結果。

組函數用語對每個組的行集進行運算,每個組產生一個結果。

AVG([DISTINCT/ALL]col)只能用與數字。只能對多行的數據進行運算,不能在這個函數中做單行的數學運算。

CORR(x1,x2)

返回表達式X1和X2組成的集合的相關係數。在保證所有行中的X1和X2都不爲NULL之後結果通過
COVAR_POP(x1,x2)/(STDDEV_POP(x1)*STDDEV_POP(x2))得到。

COUNT([DISTINCT/ALL]col)所有非空字段的行數。

COVAR_POP(x1,x2)返回表達式x1和x2組成的集合的人口協方差結果通過(SUM(x1*x2)-SUM(x2)*SUM(x1)/n)/n得到,n是沒有  NULL項的集合的數目。

COVAR_SAMP(x1,x2)返回表達式X1和X2組成的集合的相同協方差。

CUME_DIST 返回一組值中一個值的累積分佈。

DENSE_RANK返回有序分組的行中一行的秩,秩是從1開始的連續的整數。

GROUP_ID()返回一個唯一數字值用於在GROUP BY 字句中辨別組。

GROUPING_ID返回一個數字對應於一行的GROUPING位矢量。

MAX([DISTINCT/ALL]col)可以用於任何類型,當用於日期類型時代表最晚。忽略空值。字符類型時候,比較字符串首字母的  ASCLL值。

MIN([DISTINCT/ALL]col)可以用於任何類型,當用於日期類型時代表最早。忽略空值。字符類型時候,比較字符串首字母的  ASCLL值。

PERCENTILE_CONT這個函數是一個反分佈函數,它假設了一個連續分佈模式。

PERCENTILE_DISC一個反分佈函數,它假設了一個離散分佈模式。

RANK 返回給定行的秩。秩不必是連續的,因爲相同的行有相同的秩。

REGR這些函數(REGR_SLOPE,REGR_INTERCEPT,REGR_COUNT,REGR_R2,REGR_AVGX,REGR_AVGY,REGR_SXX
REGR_SYY,REGR_SXY)得到了雙集合的普通最小衰減線。

SUM([DISTINCT/ALL]col)返回選擇列表項目的總和,只能用於數字。

STDDEV([DISTINCT/ALL]col) 標準方差

STDDEV_POP(col)計算人口標準差並返回人口方差的平方根。

STDDEV_SAMP(col)計算累計標準差並返回例子方差的平方根。

VAR_POP(x)返回提系列數字在去除了NULL值之後的人口不同。由(SUM(x*x)-SUM(x)*SUM(X)/COUNT(x))/COUNT(x)得到。

VAR_SAMP(x)返回一系列數字在去NULL值之後的範例不同。由(SUM(x*x)-SUM(x)*SUM(X)/COUNT(x))/(COUNT(x)-1)得到。

VARIANCE([DISTINCT/ALL]col)偏移方差,返回COL的方差。

 

語法:
select col,group function(col) from table where  條件  group by col;
GROUP BY
必須:出現在查詢列表中的一個字段,但沒有出現在函數中,那麼這個字段必須要出現在GROUP BY 中。
可以:出現在GROUP BY 子句中的字段可以不出現在查詢列表中。
先排列,再運算。

WHERE 子句中不能使用 group function。

限制組必須使用 HAVING 子句。

語法:
select col,group function from table
where 條件//可以沒有條件限制
group by col
having group_condition //組過濾,在過濾以後,再進行分組計算。
order by col;                                                                                                                       
                                                                
組函數嵌套最多只能有兩層。
select max(avg(salary))
from employees
group by employee_id;


select * from tab;查詢一個用戶中的所有表。

 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章