程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> Oracle數據庫 >> 關於Oracle數據庫 >> OraclePL/SQL單行函數和組函數詳解

OraclePL/SQL單行函數和組函數詳解

編輯:關於Oracle數據庫
正在看的ORACLE教程是:OraclePL/SQL單行函數和組函數詳解。 1  函數是一種有零個或多個參數並且有一個返回值的程序。在SQL中Oracle內建了一系列函數,這些函數都可被稱為SQL或PL/SQL語句,函數主要分為兩大類:
  2
  3   單行函數
  4
  5   組函數
  6
  7  本文將討論如何利用單行函數以及使用規則。
  8
  9  SQL中的單行函數
 10
 11  SQL和PL/SQL中自帶很多類型的函數,有字符、數字、日期、轉換、和混合型等多種函數用於處理單行數據,因此這些都可被統稱為單行函數。這些函數均可用於SELECT,WHERE、ORDER BY等子句中,例如下面的例子中就包含了TO_CHAR,UPPER,SOUNDEX等單行函數。
 12
 13SELECT ename,TO_CHAR(hiredate,'day,DD-Mon-YYYY')
 14FROM emp
 15Where UPPER(ename) Like 'AL%'
 16ORDER BY SOUNDEX(ename)
 17
 18  單行函數也可以在其他語句中使用,如update的SET子句,INSERT的VALUES子句,DELET的WHERE子句,認證考試特別注意在SELECT語句中使用這些函數,所以我們的注意力也集中在SELECT語句中。
 19
 20  NULL和單行函數
 21
 22  在如何理解NULL上開始是很困難的,就算是一個很有經驗的人依然對此感到困惑。NULL值表示一個未知數據或者一個空值,算術操作符的任何一個操作數為NULL值,結果均為提個NULL值,這個規則也適合很多函數,只有CONCAT,DECODE,DUMP,NVL,REPLACE在調用了NULL參數時能夠返回非NULL值。在這些中NVL函數時最重要的,因為他能直接處理NULL值,NVL有兩個參數:NVL(x1,x2),x1和x2都式表達式,當x1為null時返回X2,否則返回x1。
 23
 24  下面我們看看emp數據表它包含了薪水、獎金兩項,需要計算總的補償
 25
 26column name emp_id salary bonus
 27
 28key type pk
 29nulls/unique nn,u nn
 30fk table
 31datatype number number number
 32length 11.2 11.2
 33
 34  不是簡單的將薪水和獎金加起來就可以了,如果某一行是null值那麼結果就將是null,比如下面的例子:
 35
 36update emp
 37set salary=(salary+bonus)*1.1
 38
 39  這個語句中,雇員的工資和獎金都將更新為一個新的值,但是如果沒有獎金,即 salary + null,那麼就會得出錯誤的結論,這個時候就要使用nvl函數來排除null值的影響。
 40所以正確的語句是:
 41
 42update emp
 43set salary=(salary+nvl(bonus,0)*1.1
 44
 45  單行字符串函數
 46
 47  單行字符串函數用於操作字符串數據,他們大多數有一個或多個參數,其中絕大多數返回字符串
 48
 49  ASCII()
 50  c1是一字符串,返回c1第一個字母的ASCII碼,他的逆函數是CHR()
 51
 52SELECT ASCII('A') BIG_A,ASCII('z') BIG_z FROM emp
 53
 54BIG_A BIG_z
 5565 122
 56
 57  CHR(<i>)[NCHAR_CS]
 58  i是一個數字,函數返回十進制表示的字符
 59
 60select CHR(65),CHR(122),CHR(223) FROM emp
 61
 62CHR65 CHR122 CHR223
 63A z B
 64
 65  CONCAT(,)
 66  c1,c2均為字符串,函數將c2連接到c1的後面,如果c1為null,將返回c2.如果c2為null,則返回c1,如果c1、c2都為null,則返回null。他和操作符||返回的結果相同
 67
 68select concat('slobo ','Svoboda') username from dual
 69
 70username
 71
 72slobo Syoboda
 73
 74
 75  INITCAP()
 76  c1為一字符串。函數將每個單詞的第一個字母大寫其它字母小寫返回。單詞由空格,控制字符,標點符號限制。
 77
 78select INITCAP('veni,vedi,vici') Ceasar from dual
 79
 80Ceasar
 81
 82Veni,Vedi,Vici
 83
 84
 85  INSTR(,[,<i>[,]])
 86  c1,c2均為字符串,i,j為整數。函數返回c2在c1中第j次出現的位置,搜索從c1的第i個字符開始。當沒有發現需要的字符時返回0,如果i為負數,那麼搜索將從右到左進行,但是位置的計算還是從左到右,i和j的缺省值為1.
 87
 88select INSTR('Mississippi','i',3,3) from dual
 89
 90INSTR('MISSISSIPPI','I',3,3)
 91
 9211
 93
 94select INSTR('Mississippi','i',-2,3) from dual
 95
 96INSTR('MISSISSIPPI','I',3,3)
 97
 982
 99
100
101  INSTRB(,[,i[,j])
102  與INSTR()函數一樣,只是他返回的是字節,對於單字節INSTRB()等於INSTR()
103
104  LENGTH()
105  c1為字符串,返回c1的長度,如果c1為null,那麼將返回null值。
106
107select LENGTH('Ipso Facto') ergo from dual
108
109ergo
110
11110
112
113  LENGTHb()
114  與LENGTH()一樣,返回字節。
115
116  lower()
117  返回c的小寫字符,經常出現在where子串中
118
119select LOWER(colorname) from itemdetail WHERE LOWER(colorname) LIKE '%white%'
120
121COLORNAME
122
123Winterwhite
124
125
126  LPAD(,<i>[,])
127  c1,c2均為字符串,i為整數。在c1的左側用c2字符串補足致長度i,可多次重復,如果i小於c1的長度,那麼只返回i那麼長的c1字符,其他的將被截去。c2的缺省值為單空格,參見RPAD。
128
129select LPAD(answer,7,'') padded,answer unpadded from question;
130
131PADDED UNPADDED
132
133Yes Yes
134NO NO
135Maybe maybe
136
137
138  LTRIM(,)
13

[1] [2] [3] [4] 下一頁

正在看的ORACLE教程是:OraclePL/SQL單行函數和組函數詳解。9  把c1中最左邊的字符去掉,使其第一個字符不在c2中,如果沒有c2,那麼c1就不會改變。
140
141select LTRIM('Mississippi','Mis') from dual
142
143LTR
144
145ppi
146
147  RPAD(,<i>[,])
148  在c1的右側用c2字符串補足致長度i,可多次重復,如果i小於c1的長度,那麼只返回i那麼長的c1字符,其他的將被截去。c2的缺省值為單空格,其他與LPAD相似
149
150  RTRIM(,)
151  把c1中最右邊的字符去掉,使其第後一個字符不在c2中,如果沒有c2,那麼c1就不會改變。
152
153  REPLACE(,[,])
154  c1,c2,c3都是字符串,函數用c3代替出現在c1中的c2後返回。
155
156select REPLACE('uptown','up','down') from dual
157
158REPLACE
159
160downtown
161
162  STBSTR(,<i>[,])
163  c1為一字符串,i,j為整數,從c1的第i位開始返回長度為j的子字符串,如果j為空,則直到串的尾部。
164
165select SUBSTR('Message',1,4) from dual
166
167SUBS
168
169Mess
170
171
172  SUBSTRB(,<i>[,])
173  與SUBSTR大致相同,只是I,J是以字節計算。
174
175  SOUNDEX()
176  返回與c1發音相似的詞
177
178select SOUNDEX('dawes') Dawes SOUNDEX('daws') Daws, SOUNDEX('dawson') from dual
179
180Dawes Daws Dawson
181
182D200 D200 D250
183
184  TRANSLATE(,,)
185  將c1中與c2相同的字符以c3代替
186
187select TRANSLATE('fumble','uf','ar') test from dual
188
189TEXT
190
191ramble 
192
193  TRIM([[]] from c3)
194  將c3串中的第一個,最後一個,或者都刪除。
195
196select TRIM(' space padded ') trim from dual
197
198TRIM
199
200space padded
201
202  UPPER()
203  返回c1的大寫,常出現where子串中
204
205select name from dual where UPPER(name) LIKE 'KI%'
206
207NAME
208
209KING
210
211  單行數字函數
212
213  單行數字函數操作數字數據,執行數學和算術運算。所有函數都有數字參數並返回數字值。所有三角函數的操作數和值都是弧度而不是角度,oracle沒有提供內建的弧度和角度的轉換函數。
214
215  ABS()
216  返回n的絕對值
217
218  ACOS()
219  反余玄函數,返回-1到1之間的數。n表示弧度
220
221select ACOS(-1) pi,ACOS(1) ZERO FROM dual
222
223PI ZERO
224
2253.14159265 0 
226
227  ASIN()
228  反正玄函數,返回-1到1,n表示弧度
229
230  ATAN()
231  反正切函數,返回n的反正切值,n表示弧度。
232
233  CEIL()
234  返回大於或等於n的最小整數。
235
236  COS()
237  返回n的余玄值,n為弧度
238
239  COSH()
240  返回n的雙曲余玄值,n 為數字。
241
242select COSH(<1.4>) FROM dual
243
244COSH(1.4)
245
2462.15089847
247
248  EXP()
249  返回e的n次冪,e=2.71828183.
250
251  FLOOR()
252  返回小於等於N的最大整數。
253
254  LN()
255  返回N的自然對數,N必須大於0
256
257  LOG(,)
258  返回以n1為底n2的對數
259
260  MOD()
261  返回n1除以n2的余數,
262
263  POWER(,)
264  返回n1的n2次方
265
266  ROUND(,)
267  返回捨入小數點右邊n2位的n1的值,n2的缺省值為0,這回將小數點最接近的整數,如果n2為負數就捨入到小數點左邊相應的位上,n2必須是整數。 [NextPage]
268
269select ROUND(12345,-2),ROUND(12345.54321,2) FROM dual
270
271ROUND(12345,-2) ROUND(12345.54321,2)
272
27312300 12345.54
274
275  SIGN()
276  如果n為負數,返回-1,如果n為正數,返回1,如果n=0返回0.
277
278  SIN()
279  返回n的正玄值,n為弧度。
280
281  SINH()
282  返回n的雙曲正玄值,n為弧度。
283
284  SQRT()
285  返回n的平方根,n為弧度
286
287  TAN()
288  返回n的正切值,n為弧度
289
290  TANH()
291  返回n的雙曲正切值,n為弧度
292
293  TRUNC(,)
294  返回截尾到n2位小數的n1的值,n2缺省設置為0,當n2為缺省設置時會將n1截尾為整數,如果n2為負值,就截尾在小數點左邊相應的位上。
295
296  單行日期函數
297
298  單行日期函數操作DATA數據類型,絕大多數都有DATA數據類型的參數,絕大多數返回的也是DATA數據類型的值。
299
300  ADD_MONTHS(,<i>)
301  返回日期d加上i個月後的結果。i可以使任意整數。如果i是一個小數,那麼數據庫將隱式的他轉換成整數,將會截去小數點後面的部分。
302
303  LAST_DAY()
304  函數返回包含日期d的月份的最後一天
305
306  MONTHS_BETWEEN(,)
307  返回d1和d2之間月的數目,如果d1和d2的日的日期都相同,或者都使該月的最後一天,那麼將返回一個整數,否則會返回的結果將包含一個分數。
308
309  NEW_TIME(,,)
310  d1是一個日期數據類型,當時區tz1中的日期和時間是d時,返回時區tz2中的日期和時間。tz1和tz2時字符串。
311
312  NEXT_DAY(,)
313  返回日期d後由dow給出的條件的第一天,dow使用當前會話中給出的語言指定了一周中的某一天,返回的時間分量與d的時間分量相同。
314
315select NEXT_DAY('01-Jan-2000','Monday') "1st Monday",NEXT_DAY('01-Nov-2004','Tuesday')+7 "2nd Tuesday") from dual;
316
3171st Monday 2nd Tuesday
318
31903-Jan-2000 09-Nov-2004 
320
321  ROUND([,])
322  將日期d按照fmt指定的格式捨入,fmt為字符串。
323
324  SYADATE
325  函數沒有參數,返回當前日期和時間。
326
327  TRUNC([,])
328  返回由fmt指定的單位的日期d.
329
330  單行轉換函數
331
332

上一頁  [1] [2] [3] [4] 下一頁

正在看的ORACLE教程是:OraclePL/SQL單行函數和組函數詳解。  單行轉換函數用於操作多數據類型,在數據類型之間進行轉換。
333
334  CHARTORWID()
335  c 使一個字符串,函數將c轉換為RWID數據類型。
336
337SELECT test_id from test_case where rowid=CHARTORWID('AAAA0SAACAAAALiAAA') 
338
339  CONVERT(,[,])
340  c尾字符串,dset、sset是兩個字符集,函數將字符串c由sset字符集轉換為dset字符集,sset的缺省設置為數據庫的字符集。
341
342  HEXTORAW()
343  x為16進制的字符串,函數將16進制的x轉換為RAW數據類型。
344
345  RAWTOHEX()
346  x是RAW數據類型字符串,函數將RAW數據類轉換為16進制的數據類型。
347
348  ROWIDTOCHAR()
349  函數將ROWID數據類型轉換為CHAR數據類型。
350
351  TO_CHAR([[,)
352  x是一個data或number數據類型,函數將x轉換成fmt指定格式的char數據類型,如果x為日期nlsparm=NLS_DATE_LANGUAGE 控制返回的月份和日份所使用的語言。如果x為數字nlsparm=NLS_NUMERIC_CHARACTERS 用來指定小數位和千分位的分隔符,以及貨幣符號。
353
354NLS_NUMERIC_CHARACTERS ="dg", NLS_CURRENCY="string"
355
356  TO_DATE([,[,)
357  c表示字符串,fmt表示一種特殊格式的字符串。返回按照fmt格式顯示的c,nlsparm表示使用的語言。函數將字符串c轉換成date數據類型。
358
359  TO_MULTI_BYTE()
360  c表示一個字符串,函數將c的擔子截字符轉換成多字節字符。
361
362  TO_NUMBER([,[,)
363  c表示字符串,fmt表示一個特殊格式的字符串,函數返回值按照fmt指定的格式顯示。nlsparm表示語言,函數將返回c代表的數字。
364
365  TO_SINGLE_BYTE()
366  將字符串c中得多字節字符轉化成等價的單字節字符。該函數僅當數據庫字符集同時包含單字節和多字節字符時才使用
367
368  其它單行函數
369
370  BFILENAME(
371,)
372  dir是一個directory類型的對象,file為一文件名。函數返回一個空的BFILE位置值指示符,函數用於初始化BFILE變量或者是BFILE列。
373
374  DECODE(,,[,,,[])
375  x是一個表達式,m1是一個匹配表達式,x與m1比較,如果m1等於x,那麼返回r1,否則,x與m2比較,依次類推m3,m4,m5.直到有返回結果。
376
377  DUMP(,[,[,[,]]])
378  x是一個表達式或字符,fmt表示8進制、10進制、16進制、或則單字符。函數返回包含了有關x的內部表示信息的VARCHAR2類型的值。如果指定了n1,n2那麼從n1開始的長度為n2的字節將被返回。
379
380  EMPTY_BLOB()
381  該函數沒有參數,函數返回 一個空的BLOB位置指示符。函數用於初始化一個BLOB變量或BLOB列。
382
383  EMPTY_CLOB()
384  該函數沒有參數,函數返回 一個空的CLOB位置指示符。函數用於初始化一個CLOB變量或CLOB列。
385
386  GREATEST()
387  exp_list是一列表達式,返回其中最大的表達式,每個表達式都被隱含的轉換第一個表達式的數據類型,如果第一個表達式是字符串數據類型中的任何一個,那麼返回的結果是varchar2數據類型, 同時使用的比較是非填充空格類型的比較。
388
389  LEAST()
390  exp_list是一列表達式,返回其中最小的表達式,每個表達式都被隱含的轉換第一個表達式的數據類型,如果第一個表達式是字符串數據類型中的任何一個,將返回的結果是varchar2數據類型, 同時使用的比較是非填充空格類型的比較。
391
392  UID
393  該函數沒有參數,返回唯一標示當前數據庫用戶的整數。
394
395  USER
396  返回當前用戶的用戶名
397
398  USERENV()
399  基於opt返回包含當前會話信息。opt的可選值為:
400
401  ISDBA    會話中SYSDBA腳色響應,返回TRUE
402  SESSIONID  返回審計會話標示符
403  ENTRYID   返回可用的審計項標示符
404  INSTANCE  在會話連接後,返回實例標示符。該值只用於運行Parallel 服務器並且有 多個實例的情況下使用。
405  LANGUAGE  返回語言、地域、數據庫設置的字符集。
406  LANG    返回語言名稱的ISO縮寫。
407  TERMINAL  為當前會話使用的終端或計算機返回操作系統的標示符。
408
409  VSIZE()
410  x是一個表達式。返回x內部表示的字節數。
411
412  SQL中的組函數
413
414  組函數也叫集合函數,返回基於多個行的單一結果,行的准確數量無法確定,除非查詢被執行並且所有的結果都被包含在內。與單行函數不同的是,在解析時所有的行都是已知的。由於這種差別使組函數與單行函數有在要求和行為上有微小的差異.
415
416  組(多行)函數
417
418  與單行函數相比,oracle提供了豐富的基於組的,多行的函數。這些函數可以在select或select的having子句中使用,當用於select子串時常常都和GROUP BY一起使用。
419
420  AVG([{DISYINCT|ALL}])
421  返回數值的平均值。缺省設置為ALL.
422
423SELECT AVG(sal),AVG(ALL sal),AVG(DISTINCT sal) FROM scott.emp
424
425AVG(SAL) AVG(ALL SAL) AVG(DISTINCT SAL)
426
4271877.94118 1877.94118 1916.071413
428
429
430  COUNT({*|DISTINCT|ALL} )
431  返回查詢中行的數目,缺省設置是ALL,*表示返回所有的行。
432
433  MAX([{DISTINCT|ALL}])
434  返回選擇列表項目的最大值,如果x是字符串數據類型,他返回一個VARCHAR2數據類型,如果X是一個DATA數據類型,返回一個日期,如果X是numeric數據類型,返回一個數字。注意distinct和all不起作用,應為最大值與這兩種設置是相同的。
435
436  MIN([{DISTINCT|ALL}])
437  返回選擇列表項目的最小值。
438
439  STDDEV([{DISTINCT|ALL}])
440  返回選者的列表項目的標准差,所謂標准差是方差的平方根。
441
442  SUM([{DISTINCT|ALL}])
443  返回選擇列表項目的數值的總和。
444
445  VARIANCE([{DISTINCT|ALL}])
446  返回選擇列表項目的統計方差。
447
448  用GROUP BY給數據分組
449
450  正如題目暗示的那樣組函數就是操作那些已經分好組的數據,我們告訴數據庫用GROUP BY怎樣給數據分組或者分類,當我們在SELECT語句的SELECT子句中使用組函數時,我們必須把為分組或非常數列放置在GROUP BY子句中,如果沒有用group by進行專門處理,那麼缺省的分類是將整個結果設為一類。
451
452select stat,counter(*) zip_count from zip_codes GROUP BY state;
453
454ST ZIP_COUNT
455-- ---------
456AK 360
457AL 1212
458AR 1309
459AZ 768
460CA 3982
461
462  在這個例子中,我們用state字段分類;如果我們要將結果按照zip_codes排序,可以用ORDER BY語句,ORDER BY子句可以使用列或組函數。
463
464sel

上一頁  [1] [2] [3] [4] 下一頁

正在看的ORACLE教程是:OraclePL/SQL單行函數和組函數詳解。ect stat,counter(*) zip_count from zip_codes GROUP BY state ORDER BY COUNT(*) DESC;
465
466ST COUNT(*)
467-- --------
468NY 4312
469PA 4297
470TX 4123
471CA 3982
472
473  用HAVING子句限制分組數據
474
475  現在你已經知道了在查詢的SELECT語句和ORDER BY子句中使用主函數,組函數只能用於兩個子串中,組函數不能用於WHERE子串中,例如下面的查詢是錯誤的 :
476
477錯誤
478SELECT sales_clerk,SUN(sale_amount) FROM gross_sales WHERE sales_dept='OUTSIDE' AND SUM(sale_amount)>10000 GROUP BY sales_clerk
479
480
481  這個語句中數據庫不知道SUM()是什麼,當我們需要指示數據庫對行分組,然後限制分組後的行的輸出時,正確的方法是使用HAVING語句:
482
483SELECT sales_clerk,SUN(sale_amount)
484FROM gross_sales
485WHERE sales_dept='OUTSIDE'
486GROUP BY sales_clerk
487HAVING SUM(sale_amount)>10000;
488
489  嵌套函數
490
491  函數可以嵌套。一個函數的輸出可以是另一個函數的輸入。操作數有一個可繼承的執行過程。但函數的優先權只是基於位置,函數遵循由內到外,由左到右的原則。嵌套技術一般用於象DECODE這樣的能被用於邏輯判斷語句IF.THENELSE的函數。
492
493  嵌套函數可以包括在組函數中嵌套單行函數,或者組函數嵌套入單行函數或組函數中。比如下面的例子:
494
495SELECT deptno, GREATEST(COUNT(DISTINCT job),COUNT(DISTINCT mgr) cnt,
496COUNT(DISTINCT job) jobs,
497COUNT(DISTINCT mgr) mgrs
498FROM emp
499GROUP BY deptno;
500
501DEPTNO CNT JOBS MGRS
502------ --- ---- ----
50310 4 4 2
50420 4 3 4
50530 3 3 2

上一頁    

上一頁  [1] [2] [3] [4] 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved