第6章 Oracle内置函数

target

了解常用的数值型函数
掌握常用的字符型函数
掌握常用的日期型函数
了解转换函数
掌握null函数
掌握集合函数
了解其他函数

1. 数值型函数

1.1绝对值

ABS(n)函数。用于返回绝对值。

SQL> SELECT ABS(100),ABS(-100),ABS('100') FROM DUAL;

  ABS(100)  ABS(-100) ABS('100')
---------- ---------- ----------
       100        100        100

1.2 取余

MOD(n2, n1)函数。该函数表示返回n2除以n1的余数。

SQL> SELECT MOD(5,2),MOD(8/3,5),MOD('10',5),MOD(-10,6),MOD(1,0) FROM DUAL;

  MOD(5,2) MOD(8/3,5) MOD('10',5) MOD(-10,6)   MOD(1,0)
---------- ---------- ----------- ---------- ----------
         1 2.66666667           0         -4          1

1.3 判断数值正负函数

SIGN(n)函数。返回参数n的符号。正数返回1,0返回0,负数返回-1。但如果n为BINARY_FLOAT或BINARY_DOUBLE类型时,n>=0或 n=NaN 函数会返回1。

SQL>  SELECT SIGN('9'), SIGN(-9), SIGN(0.00), SIGN(-2*'9') FROM DUAL;

 SIGN('9')   SIGN(-9) SIGN(0.00) SIGN(-2*'9')
---------- ---------- ---------- ------------
         1         -1          0           -1

1.4 三角函数

COS(n)函数。用于返回参数n的余弦,n为弧度表示的角度。

SQL> SELECT COS(3.1415926),COS('3.1415926') FROM DUAL;

COS(3.1415926) COS('3.1415926')
-------------- ----------------
            -1               -1

与此类函数类似的还有如下几个。

  • ACOS(n);返回n的反余弦值。
  • COSH(n);返回n的双曲余弦值,
  • SIN(n):返回n的正弦值。
  • SINH(n):返回n的双曲正弦值。
  • ASIN(n):返回n的反正弦值。
  • TAN(n):返回n的正切值。
  • TANH(n):返回n的双曲正切值,
  • ATAN(n):返回n的反正切值。

1.4 返回以指定数值为准整数的函数

(1) ceil(n)函数

其返回结果是大于等于输入参数的最小整数。

SQL> SELECT CEIL(10),CEIL('10.5'),CEIL(-10.2) FROM DUAL;

  CEIL(10) CEIL('10.5') CEIL(-10.2)
---------- ------------ -----------
        10           11         -10

(2) FLOOR(n)函数

其返回结果是小于或等于参数的最大整数。同CEIL函数相反。

SQL> select floor(10),floor('10.5'),floor(-10.2) from dual;

 FLOOR(10) FLOOR('10.5') FLOOR(-10.2)
---------- ------------- ------------
        10            10          -11

1.5 指数、对数函数

(1) SQRT(n)函数

该函数返回n的平方根。n为数字类型的时候不能为负数,将返回一个 实数,当n为BINARY_FLOAT或BINARY_DOUBLE类型时,n<0将返回Nan

SQL> SELECT SQRT(100),SQRT('53.9') FROM DUAL;

 SQRT(100) SQRT('53.9')
---------- ------------
        10   7.34166194

(2) POWER(n2,n1)函数

利用该函数可以得到n2的n1次幕的结果。这两个参数为任意数值,但如果n2为负数,那么n1必须为整数。

SQL> SELECT POWER(5,2),POWER('5',2),POWER(5.5,2.5),POWER(-5,2),5*5 FROM DUAL;

POWER(5,2) POWER('5',2) POWER(5.5,2.5) POWER(-5,2)        5*5
---------- ------------ -------------- ----------- ----------
        25           25     70.9425384          25         25

与其相近的函数有:

EXP(n)函数,表示返回e的n次幕,e为数学常量,e = 2.71828183 ...

(3) LOG(n1,n2)函数

该函数可以返回以n1为底n2的对数,n1是除1和0以外的任意正数。 n2为正数。

SQL> select log(10,100),log(10.5,'100'),power(10,2) from dual;LOG(10,100) LOG(10.5,'100') POWER(10,2)----------- --------------- -----------          2      1.95850074         100

与其相近的函数有:

LN(n)函数,表示返回n的自然对数。n要求大于0。

1.6 四舍五入截取函数

(1) round函数

SQL> SELECT round(100.23456,4) ,round( 100.23456,2.56), round(155.23456,-2) FROM DUAL;

ROUND(100.23456,4) ROUND(100.23456,2.56) ROUND(155.23456,-2)
------------------ --------------------- -------------------
          100.2346                100.23                 200

(2) TRUNC 函数

该函数的具体原型是TRUNC(n,integer)。它把数值n根据 integer的值进行截取,截取时和integer的正负有关。

参数integer要求是整数,如果不是整数, 那么它将被自动截取为整数部分;当integer为正整数时,表示n将截取到integer位小数,如果 integer为负数,则截取到小数点左第integer位,被截取部分用0代替。

SQL> SELECT trunc(100.23456,4) , trunc(100.23456,2.56) , trunc(155.23456,-2) , trunc(155.23456) from dual;

TRUNC(100.23456,4) TRUNC(100.23456,2.56) TRUNC(155.23456,-2) TRUNC(155.23456)
------------------ --------------------- ------------------- ----------------
          100.2345                100.23                 100              155

2. 字符型函数

2.1 ASCII码与字符转换函数

(1) CHR函数

根据相应的字符集,把给定的ASII码转换为字符.

SQL> SELECT CHR(65) || CHR(66) || CHR(67) ABC, CHR(54678) FROM DUAL;

ABC CH
--- --
ABC 諙

(2) ASCII(char)函数

返回参数首字母的ASCII码值。与CHR函数相反。

SQL> select ascii('明'),ascii('Abc'),ascii('ABC'),ascii('A') from dual;

ASCII('明') ASCII('ABC') ASCII('ABC') ASCII('A')
----------- ------------ ------------ ----------
      50167           65           65         65

2.2 获取字符串长度函数

LENGTH函数。该函数可以得到指定字符串的长度,返回类型是数宇。

SQL> SELECT LENGTH('ABCDEftFGHI') FROM DUAL;

LENGTH('ABCDEFTFGHI')
---------------------
                   11

2.3 字符串截取函数

SUBSTR函数。该函数提供截取字符串的功能。

初始化位置为1,如果该值为负数,则表示从char的右边算起

🌰:

SQL> select substr('ABCDE你好FGHI',5,2),substr('ABCDE你好FGHI',-5,2) from dual;

SUB SUB
--- ---
E你 好F

2.4 字符串连接函数

CONCAT(char1 , char2)函数。该函数连接两个参数并返回。效果和连接符“II”相似。

SQL> SELECT CONCAT('我的','测试') A, '我的'||'测试' B FROM DUAL;

A        B
-------- --------
我的测试 我的测试

2.5 字符串搜索函数

INSTR函数。该函数可以让我们在指定 的字符串中捜索是否存在另一个字符串,返回搜索出来的位置。

搜索的开始位置,默认为1。

SQL> select instr('this is a 测试!','测'),instr('this is a 测试!','s',-1) from dual;

INSTR('THISISA测试!','测') INSTR('THISISA测试!','S',-1)
--------------------------- -----------------------------
                         11                             7

instr('this is a 测试!','s',-1)表示:从后向前搜索,s出现在字符串中的位置。

2.6 字母大小写转换函数

(1) UPPER(char)函数

该函数将指定的参数全部转换成大写字母。

SQL> SELECT UPPER('A'),UPPER('abed'),UPPER('this is a test') FROM DUAL;

U UPPE UPPER('THISISA
- ---- --------------
A ABED THIS IS A TEST

(2) LOWER(char)函数

该函数将指定的参数全部转换成小写字母。

SQL> SELECT LOWER('A'),LOWER('XBCD'),LOWER('THIS IS A TEST') FROM DUAL;

L LOWE LOWER('THISISA
- ---- --------------
a xbcd this is a test

(3) INITCAP(char)函数

该函数参数的所有单词首字母转换成大写字母。

SQL> SELECT INITCAP( 'this is a test' ) FROM DUAL;

INITCAP('THISI
--------------
This Is A Test

2.6 替换字符串函数

REPLACE 函数。

SQL> select replace('this is  a test','tes','resul') from dual;

REPLACE('THISISAT
-----------------
this is  a result

2.7 字符串填充函数

(1) RPAD函数

函数具体语法结构是RPAD(expr1,n[,expr2]),该函数功能是在字符串 expr1的右边用字符串expr2填充,直到整个字符串长度为n时为止。如果expr2不存在,则以空格填充。

SQL> SELECT RPAD('test' ,8, 'abcd' ),RPAD( 'test',15, 'abcd' ),RPAD('test',4, 'abcd') FROM DUAL;

RPAD('TE RPAD('TEST',15, RPAD
-------- --------------- ----
testabcd testabcdabcdabc test

(2) LPAD函数

函数具体语法结构是LPAD(exprl,n[,expr2]),该函数功能是在字符串exprl 的左边用字符串expr2填充,直到整个字符串长度为n时为止。如果expr2不存在,则以空格填 充。

SQL> SELECT LPAD( 'test',8, 'abcd'),LPAD( 'test' ,15, 'abcd'),LPAD( 'test',4, 'abcd') FROM DUAL;

LPAD('TE LPAD('TEST',15, LPAD
-------- --------------- ----
abcdtest abcdabcdabctest test

2.8 删除字符串首尾指定字符的函数

TRIM函数。

该函数将删除指定的前缀或尾随的字符,默认删除空格。其具体语法结构是:

TRIM([LEADING | TRAILING | BOTH][trim_character FROM] trim_source)

各参数介绍如下:

  • LEADING:删除trim_source的前缀字符。
  • TRAILING:删除trim_source的后缀字符。
  • BOTH:删除trim.source的前缀和后缀字符。
  • trim_character:删除的指定字符,默认删除空格。
  • trim_source:被操作的字符串。
SQL> SELECT TRIM(TRAILING 't' FROM 'test'),TRIM('  test   ') FROM DUAL;

TRI TRIM
--- ----
tes test

3. 日期型函数

3.1 系统日期、时间函数

(1) SYSDATE函数

该函数没有参数,可以得到系统的当前日期,是很常用的函数。

SQL> SELECT TO_CHAR(SYSDATE, 'YYYY-MM-DD HH24:MI:SS') 现在时刻 FROM DUAL;

现在时刻
-------------------
2021-06-10 22:30:50

(2) SYSTIMESTAMP函数

该函数没有参数,返回系统时间,该时间包含时区信息,精确到微秒。返回类型为带时区信息的TIMESTAMP类型。

SQL> select systimestamp from dual;

SYSTIMESTAMP
---------------------------------------------------------------------------
10-6月 -21 10.32.19.859000 下午 +08:00

3.2 为日期加上指定月份函数

ADD_MONTHS(date,integer)函数,将返回在指定的日期上加integer个月份数后的日期。各参数具体含义如下:

  • date:指定的日期。
  • integer:要加的月份数,该值如果为负数,则表示减去的月份数。
  • 该函数有些地方需要注意,当指定的日期是月的最后一天时,最后函数返回的结果也将是新月的最后一天。而如果新的月份比指定日期月份的天数少,则函数将自动回调有效日期
SQL> SELECT
  2  TO_CHAR(ADD_MONTHS(TO_DATE('2009-9-15','YYYY-MM-DD'),1), 'YYYY-MM-DD') A,
  3  TO_CHAR(ADD_MONTHS(TO_DATE('2009-9-15','YYYY-MM-DD'),3), 'YYYY-MM-DD') B,
  4  TO_CHAR(ADD_MONTHS(TO_DATE('2009-9-30','YYYY-MM-DD'),1),'YYYY-MM-DD') C,
  5  TO_CHAR(ADD_MONTHS(TO_DATE('2010-1-30','YYYY-MM-DD'),1),'YYYY-MM-DD') D
  6  From dual;

A          B          C          D
---------- ---------- ---------- ----------
2009-10-15 2009-12-15 2009-10-31 2010-02-28

3.3 返回指定月份最后一天函数

LAST_DAY(date)函数。该函数返回参数指定日期对应月份的最后一天。

SQL> SELECT LAST_DAY(SYSDATE) FROM DUAL;

LAST_DAY(SYSDA
--------------
30-6月 -21

3.4 返回指定日期后一周的日期函数

NEXT_DAY(date,char)函数。该函数返回当前日期向后的一周char的对应日期,char表示的是星期几,全称和缩写都允许。但必须有效。

SQL> SELECT SYSDATE,NEXT_DAY(SYSDATE, '星期一') FROM DUAL;

SYSDATE        NEXT_DAY(SYSDA
-------------- --------------
10-6月 -21     14-6月 -21

3.5 提取指定日期特定部分的函数

EXTRACT (datetime)函数。该函数可以从指定的时间当中提取到指定的日期部分,例如 :从给定的日期得到年、月、分等。

SQL> Select
  2  EXTRACT(YEAR FROM SYSDATE ) YEAR,
  3  EXTRACT(MINUTE FROM TIMESTAMP '2010-6-18 12:23:10 ' ) MIN,
  4  EXTRACT(SECOND FROM TIMESTAMP '2010-6-18 12:23:10 ' ) SEC
  5  FROM DUAL;

      YEAR        MIN        SEC
---------- ---------- ----------
      2021         23         10

3.6 得到两个日期之间的月份数

MONTHS_BETWEEN(date 1 ,date2)函数。该函数返回datel和date2之间的月份数。

函数两个参数都为日期型数据。当date1>date2时,如果两个参数表示日期是某月中的同一天,或它们都是某月中的最后一天,则该函数返回一整型数,否则,将返回小数。当dateL<date2时, 则返回一负值。

SQL> select
  2  MONTHS_BETWEEN(TO_DATE('2010-7-11', 'YYYY-MM-DD'), TO_DATE('2010-6-1','YYYY-MM-DD')) A,
  3  MONTHS_BETWEEN(TO_DATE('2010-5-31', 'YYYY-MM-DD'), TO_DATE('2010-4-30','YYYY-MM-DD')) B,
  4  MONTHS_BETWEEN(TO_DATE('2010-5-31', 'YYYY-MM-DD'), TO_DATE('2010-9-30','YYYY-MM-DD')) C
  5  from dual;

         A          B          C
---------- ---------- ----------
1.32258065          1         -4

3.7 日期四舍五入、截取函数

(1) ROUND(date[,fmt])函数

该函数将date舍入到fmt指定的形式。如果参数fmt被省略, 则date将被处理到最近的一天。

SQL> select
  2  TO_CHAR(ROUND(TO_DATE('2010-5-1 21:00:00','YYYY-MM-DD HH24:MI:SS')), 'YYYY-MM-DD HH24:MI:SS')
  3  FROM DUAL;

TO_CHAR(ROUND(TO_DA
-------------------
2010-05-02 00:00:00

(2) TRUNC(date[,fmt])函数

该函数将date截取到fmt指定的形式。如果fmt省略,则截取到最近的日期。

SQL> SELECT
  2  TO_CHAR(TRUNC(TO_DATE('2010-5-1 21:00:00', 'YYYY-MM-DD HH24:MI:SS')),'YYYY-MM-DD HH24:MI:SS')
  3  from dual;

TO_CHAR(TRUNC(TO_DA
-------------------
2010-05-01 00:00:00

4. 转换函数

转换函数可以完成不同数据类型之间的转换,是平常使用比较多的函数类型之一。

4.1 字符串转ASCII类型字符串函数

ASCIISTR(char)函数。该函数可将任意字符集的字符串转换为数据库字符集对应的ASCII 字符串。char为字符类型。

SQL> SELECT ASCIISTR('这是测试! ') FROM DUAL;

ASCIISTR('这是测试!')
--------------------------
\8FD9\662F\6D4B\8BD5\FF01

4.2 二进制转十进制函数

BIN_TO_NUM(data[,data..J)函数。该函数可以将二进制转换成对应的十进制。

SQL> SELECT BIN_TO_NUM(1),BIN_TO_NUM(1,0,0),BIN_TO_NUM(1,1,1) FROM DUAL;

BIN_TO_NUM(1) BIN_TO_NUM(1,0,0) BIN_TO_NUM(1,1,1)
------------- ----------------- -----------------
            1                 4                 7

4.3 数据类型转化

CAST(expr as type_name)函数。该函数是进行类型转换的,可以把expr参数转成 type_name类型。基本上用于数字与字符之间以及字符与日期类型之间的转换。

SQL> SELECT CAST('123' AS INTEGER) A, CAST(123 AS VARCHAR2(8)) B, CAST(SYSDATE AS VARCHAR2(12)) C FROM DUAL;

         A B        C
---------- -------- ------------
       123 123      10-6月 -21

4.4 字符串在字符集间转换函数

CONVERT函数。该函数用于把字符串从一个宇符集转到另一个字符集。函数的具体语法结构是

CONVERT(char,dest_char_sest[,source_char_set])

各参数的表示含义如下:

  • char:等待转换的字符。
  • dest_char_sest:转变后的字符集。
  • source_char_set:原字符集,如果没有该参数,则默认数据库实例字符集。
SQL> SELECT CONVERT('测试','ZHS16GBK') FROM DUAL;

CONV
----
测试

4.5 一切类型转化为字符型

TO_CHAR()函数。

SQL> select
  2  to_char(sysdate,'YYYY-MM-DD') A,
  3  to_char(sysdate,'HH24:MI:SS') B,
  4  to_char(12.34,'99.9') C,
  5  to_char(12.34) D
  6  from dual;

A          B        C     D
---------- -------- ----- -----
2021-06-10 23:50:17  12.3 12.34

4.6 字符转日期型函数

TO_DATE函数。该函数可将字符型数据转换成日期型数据。

SQL> SELECT TO_DATE('2010-7-1', 'YYYY-MM-DD') A FROM DUAL;

A
--------------
01-7月 -10

4.7 字符串转数字函数

TO_NUMBER函数。该函数将字符串转成数字。

SQL> SELECT TO_NUMBER('2456.304','9999.999') FROM DUAL;

TO_NUMBER('2456.304','9999.999')
--------------------------------
                        2456.304

4.8 全角转半角函数

TO_SINGLE_BYTE(char)函数。该函数将全角转为半角。

SQL> SELECT TO_SINGLE_BYTE('THIS IS A TBST') FROM DUAL;

TO_SINGLE_BYTE
--------------
THIS IS A TBST

5. NULL 函数

NULL函数是用来处理空值时比较好的选择。

5.1 返回表达式为NULL的函数

COALESCE(expr)函数。返回列表中第一个不为null的表达式。如果都为null,则返回一个null。

SQL> SELECT coalesce(null, 9-9,null) FROM DUAL;

COALESCE(NULL,9-9,NULL)
-----------------------
                      0

5.2 排除指定条件函数

lnnvl(condition)函数。该函数可以得到除了condition要求条件之外的数据,包括NULL 的条件,通常用于WHERE条件中。

🌰:将得到PRODUCTINFO表中数量低于70的产品, 并包含数量为NULL的数据。

select * from productInfo where lnnvl(quantity >= 70);

5.3 替换NULL值函数

NVL(expr1,expr2)函数。替换NULL值,表示如果expr1为NULL值,则返回expr2的值, 否则返回expr1的值。

该函数要求两个参数类型一致,至少相互间能进行隐式的转换,否则会 提示出错。

🌰:査询PRODUCTINFO表中的数量,如果记录中有该字段为空的,则用 0替换。

select productName,nvl(quantity,0),category from productInfo;

6. 集合函数

集合函数经常配合GROUP BYHAVING子句使用,当然它们也可以单独使用。

6.1 求平均值函数

AVG([distinct l all ]expr)函数。该函数可求取指定列的平均值,表示某组的平均值,返回数 值类型。各参数表示的具体含义如下:

  • distinct:去除重复的值。
  • all;表示所有的值,包括重复的值,也是默认值。
  • expr:表达式。只能是数值类型。
SQL> SELECT avg(ALL PRODUCTPRICE +100) FROM PRODUCTINFO;

AVG(ALLPRODUCTPRICE+100)
------------------------
              7384.71429

🌰:使用GROUP BY子句査询各类产品的平均价格。

SQL> SELECT AVG(ALL PRODUCTPRICE) FROM PRODUCTINFO GROUP BY CATEGORY;

AVG(ALLPRODUCTPRICE)
--------------------
          5665.66667
          9665.66667
                4999

🌰:查出价格大于2000的所有产品的平均价格。

SQL> select avg(all productPrice) from productInfo where productPrice > 2000;

AVG(ALLPRODUCTPRICE)
--------------------
          8165.66667

6.2 求记录数量函数

COUNT(* l [distinct ] [all ] expr )函数。该函数可以用来计算记录的数量或某列的个数。

函数 中必须指定列名,或全选使用星号。其中各参数表示的含义如下:

  • *:表示计算所有记录.
  • distinct:表示去除重复的记录。
  • all:代表所有的,是默认选项。
  • expr:要计算的对象,通常是表的列。

🌰:査询PRODUCTINFO表的所有记录数。

SELECT COUNT(*) FROM PRODUCTINFO;

🌰:査询PRODUCTINFO表的PRODUCTPRICE字段低于3000的不重复的记录数。

SELECT COUNT(distinct PRODUCTPRICE) FROM PRODUCTINFO WHERE PRODUCTPRICE < 3000;

6.3 返回最大、最小值函数

MAX( )函数。该函数可以返回指定列中的最大值,通常都用在WHERE子句中的子査询。

🌰:査询PRODUCTINFO表中价格最高的记录:

SELECT * FROM PRODUCTINFO
WHERE PRODUCTPRICE = (SELECT MAX(PRODUCTPRICE) FROM PRODUCTINFO );

同该函数效果相反但用法一致的有MIN( )函数,此函数获取指定列中的最小值。

6.4 求和函数

SUM( )函数。该函数不同于COUNT函数,它分组计算指定列的和,如果不使用分组,则函数默认把整个表作为一组。

🌰:计算不同类型产品的数量和。

SQL> SELECT SUM(QUANTITY), CATEGORY FROM PRODUCTINFO GROUP BY CATEGORY;

SUM(ALLQUANTITY) CATEGORY
---------------- ----------
              21 手机
              23 电视
              35 平板

7. 其他函数

7.1 返回登录名函数

USER函数。该函数返回当前会话的登录名。

SQL> SELECT USER FROM DUAL;

USER
------------------------------
SCOTT

7.2返回会话以及上下文信息函数

(1) USERENV(parameter)函数

返回当前会话的信息。

例如,当参数为Language时可以返 回当前会话对应的语言、字符集等。SESSIONID可返回当前会话ID。ISDBA可返回当前用户是否DBA。

🌰:返回当前用户是否DBA用户

SQL> SELECT USERENV('ISDBA') FROM DUAL;

USEREN
------
FALSE

(2) SYS_CONTEXT(namespace,parameter)函数

该函数可以得到Oracle已经创建的context, 名为USERENV的属性对应值。

🌰:获取当前会话对应的用户名

SQL> SELECT SYS_CONTEXT('USERENV','SESSION_USER') Session_User from dual;

SESSION_USER
--------------------------------------------------------------------------------
SCOTT

7.3 表达式匹配函数

DECODE函数。该函数的具体语法是:

DECODE(expr,search, result[,search 1, resultl] [,default])

该函数的执行过程是,当expr符合条件search时就返回result的值,该过程可以重复多个,如果最后没有匹配的结果,可以返回默认值default,注意它是一对一的匹配过程。

🌰:演示PRODUCTINFO中产品数景多于100的就显示“充足”,少于或等于100 则显示“不足”。

SQL> select productName,quantity,
  2  decode(sign(quantity-100),1,'充足',-1,'不足')
  3  from productInfo;

PRODUCTNAME            QUANTITY DECO
-------------------- ---------- ----
华为Mate40Pro                12 不足
华为P40Pro                    4 不足
华为荣耀10                    5 不足
华为MatePadPro               35 不足
华为智慧屏                   12 不足
华为智慧屏2代                 3 不足
华为智慧屏2代                 3 不足
华为智慧屏2代                 5 不足

已选择8行。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容