4、Oracle 中的单行函数

最近项目要用到Oracle,奈何之前没有使用过,所以在B站上面找了一个学习视频,用于记录学习过程以及自己的思考。
视频链接:
【尚硅谷】Oracle数据库全套教程,oracle从安装到实战应用
如果有侵权,请联系删除,谢谢。

本文主要讲解以下几点:

  • SQL中不同类型的函数

  • 在 SELECT 语句中使用字符,数字,日期和转换函数

  • 使用条件表达式

1、SQL函数

DUAL 是一个‘伪表’,可以用来测试函数和表达式

1.1、两种 SQL 函数

  • 单行函数
  • 多行函数
1.1.1、单行函数

单行函数:

  • 操作数据对象
  • 接受参数返回一个结果
  • 只对一行进行变换
  • 每行返回一个结果
  • 可以转换数据类型
  • 可以嵌套
  • 参数可以是一列或一个值

function_name [(arg1, arg2,...)]

1.1.2、单行函数有哪些
  • 字符函数
  • 数值函数
  • 日期函数
  • 转换函数
  • 通用函数

2、字符函数

1、大小写控制函数

  • LOWER:所有字符转为小写
  • UPPER:所有字符换为大写
  • INITCAP:字符首字母大写,空格分割、下划线等分割符分开的字符都算
SELECT LOWER('JUST TEST'), UPPER('just test TT'), INITCAP('this is Test, wwww_y') FROM dual;   


执行结果:
LOWER('JUSTTEST')|UPPER('JUSTTESTTT')|INITCAP('THISISTEST,WWWW_Y')|
-----------------+-------------------+----------------------------+
just test        |JUST TEST TT       |This Is Test, Wwww_Y        |

2、字符控制函数

  • CONCAT:连接不同的字符串。注意不能指定连接符。
  • SUBSTR:截取字符。SUBSTR('string', start_index, length),从start_index位置开始,截取长度为length的字符。注意字符其实索引为1。
  • LENGTH:计算给定字符串长度
  • INSTR:计算给定字符首次出现在字符串中的索引位置。INSTR('string', '给定字符')
  • LPAD | RPAD:在长度未达到指定长度时,使用给定字符填充。LPAD(salary,10,'*'):*****24000
  • TRIM:截取给定字符串两边指定字符串
  • REPLACE:将字符串中指定字符串替换为给定字符串。REPLACE(‘abcd’,’b’,’m’): amcd
SELECT CONCAT('JUST', 'TEST'), SUBSTR('this is 测试案例', 9, 10), LENGTH('this is 测试案例'), INSTR('你好,未来', '未来') FROM dual;   

执行结果:
CONCAT('JUST','TEST')|SUBSTR('THISIS测试案例',9,10)|LENGTH('THISIS测试案例')|INSTR('你好,未来','未来')|
---------------------+-------------------------+--------------------+-------------------+
JUSTTEST             |测试案例                     |                  12|                  4|


SELECT LPAD('你好,未来', 10, '='), LPAD('你好,未来', 20, '='), TRIM('H' FROM 'HelloWorldhHHhH'),REPLACE('abcd','bc','你好')  FROM dual;   

执行结果:
LPAD('你好,未来',10,'=')|LPAD('你好,未来',20,'=')|TRIM('H'FROM'HELLOWORLDHHHHH')|REPLACE('ABCD','BC','你好')|
--------------------+--------------------+------------------------------+-------------------------+
你好,未来               |==========你好,未来     |elloWorldhHHh                 |a你好d                     |

3、数字函数

  • ROUND: 四舍五入。默认不保留小数点。
  • TRUNC: 截断。默认不保留小数点。
  • MOD: 求余

1、ROUND 函数

SELECT ROUND(435.45, 2), ROUND(435.45), ROUND(435.45, -2), ROUND(435.45, -1) FROM dual;

执行结果:

ROUND(435.45,2)|ROUND(435.45,2)|ROUND(435.45,-2)|ROUND(435.45,-1)|
---------------+---------------+----------------+----------------+
         435.45|         435|             400|             440|

2、TRUNC 函数

SELECT TRUNC(435.45, 2), TRUNC(435.45), TRUNC(435.45, -2), TRUNC(435.45, -1) FROM dual;

执行结果:

TRUNC(435.45,2)|TRUNC(435.45)|TRUNC(435.45,-2)|TRUNC(435.45,-1)|
---------------+-------------+----------------+----------------+
         435.45|          435|             400|             430|

3、MOD 函数

SELECT MOD(10, 9)  FROM dual;

执行结果:

MOD(10,9)|
---------+
        1|

4、日 期

Oracle 中的日期型数据实际含有两个值: 日期和时间。

SELECT last_name, hire_date
FROM   employees
WHERE  last_name like 'G%';


LAST_NAME|HIRE_DATE              |
---------+-----------------------+
Greenberg|1994-08-17 00:00:00.000|
Gee      |1999-12-12 00:00:00.000|
Greene   |1999-03-19 00:00:00.000|
Grant    |1999-05-24 00:00:00.000|
Geoni    |2000-02-03 00:00:00.000|
Gates    |1998-07-11 00:00:00.000|
Grant    |2000-01-13 00:00:00.000|
Gietz    |1994-06-07 00:00:00.000|

4.1、函数SYSDATE

返回:

  • 日期
  • 时间
SELECT SYSDATE  FROM dual;



SYSDATE                |
-----------------------+
2024-05-18 10:22:09.000|

4.2、日期的数学运算

  • 在日期上加上或减去一个数字结果仍为日期。

  • 两个日期相减返回日期之间相差的天数

  • 日期不允许做加法运算,无意义

  • 可以用数字除24来向日期中加上或减去天数。

SELECT last_name, (SYSDATE-hire_date)/7 AS WEEKS
FROM   employees
WHERE  department_id = 90;


LAST_NAME|WEEKS                                    |
---------+-----------------------------------------+
King     |1313.490419973544973544973544973544973545|
Kochhar  |  1799.6332771164021164021164021164021164|
De Haan  |1635.490419973544973544973544973544973543|

4.3、日期函数


5、转换函数

数据类型转换分为隐性和显性

5.1、隐式数据类型转换

Oracle 自动完成下列转换:

SELECT SYSDATE + 1, 12 + '12', '12' + '12' FROM dual;

执行结果:

SYSDATE+1              |12+'12'|'12'+'12'|
-----------------------+-------+---------+
2024-05-19 11:12:49.000|     24|       24|

5.2、显式数据类型转换

1、TO_CHAR函数对日期的转换

TO_CHAR(date, 'format_model')

格式:

  • 必须包含在单引号中而且大小写敏感
  • 可以包含任意的有效的日期格式。
  • 日期之间用逗号隔开。
SELECT TO_CHAR(sysdate,'yyyy-mm-dd hh:mi:ss') FROM dual;

执行结果:
TO_CHAR(SYSDATE,'YYYY-MM-DDHH:MI:SS')|
-------------------------------------+
2024-05-18 11:14:52                  |

2、日期格式的元素

格式 示例
YYYY 2004
YEAR TWO THOUSAND AND FOUR
MM 02
MONTH JULY
MON JUL
DY MON
DAY MONDAY
DD 02
  • 时间格式

  • 使用双引号向日期中添加字符

3、TO_CHAR 函数对日期的转换

SELECT last_name,
       TO_CHAR(hire_date, 'DD Month YYYY')
       AS HIREDATE
FROM   employees;


select employee_id,last_name,hire_date
from employees
where to_char(hire_date,'yyyy-mm-dd') = '1987-09-17'

4、TO_DATE 函数对字符的转换

  • 使用 TO_DATE :

  • 使用 TO_DATE 函数将字符转换为数字:
SELECT TO_DATE('2012年10月29日 08:10:21','yyyy"年"mm"月"dd"日"hh:mi:ss')
From dual;

执行结果:

TO_DATE('2012年10月29日08:10:21','YYYY"年"MM"月"DD"日"HH:MI:SS')|
----------------------------------------------------------+
                                   2012-10-29 08:10:21.000|

5、TO_CHAR函数对数字的转换

TO_CHAR(number, 'format_model')

下面是在TO_CHAR 函数中经常使用的几种格式:

6、TO_CHAR函数对数字的转换

SELECT TO_CHAR(salary, '$99,999.00') SALARY
FROM   employees
WHERE  last_name = 'Ernst';

执行结果:

SALARY     |
-----------+
  $6,000.00|

7、TO_NUMBER 函数对字符的转换

  • 使用 TO_NUMBER 函数将字符转换成日期:

TO_NUMBER(char[, 'format_model'])

  • 使用 TO_NUMBER :
SELECT TO_NUMBER('¥1,234,567,890.00','L999,999,999,999.99')
from dual

执行结果:

TO_NUMBER('¥1,234,567,890.00','L999,999,999,999.99')|
----------------------------------------------------+
                                          1234567890|

6、通用函数

这些函数适用于任何数据类型,同时也适用于空值:

  • NVL (expr1, expr2)
  • NVL2 (expr1, expr2, expr3)
  • NULLIF (expr1, expr2)
  • COALESCE (expr1, expr2, ..., exprn)

6.1、NVL 函数

将空值转换成一个已知的值

可以使用的数据类型有日期、字符、数字。

函数的一般形式:

  • NVL(commission_pct,0)
  • NVL(hire_date,'01-JAN-97')
  • NVL(job_id,'No Job Yet')
SELECT commission_pct, last_name, nvl(commission_pct, '0')  FROM EMPLOYEES e ;

执行结果:

COMMISSION_PCT|LAST_NAME  |NVL(COMMISSION_PCT,'0')|
--------------+-----------+-----------------------+
              |King       |                      0|
              |Kochhar    |                      0|
              |De Haan    |                      0|



SELECT last_name, salary, NVL(commission_pct, 0),
   (salary*12) + (salary*12*NVL(commission_pct, 0)) AN_SAL
FROM employees;

6.2、NVL2 函数

NVL2 (expr1, expr2, expr3)

NVL2 (expr1, expr2, expr3) : expr1不为NULL,返回expr2;为NULL,返回expr3。

类似于三元表达式:exp1 != null ? exp2 : exp3


SELECT last_name,  salary, commission_pct,
       NVL2(commission_pct, 
            'SAL+COMM', 'SAL') income
FROM   employees WHERE department_id IN (50, 80);

6.3、NULLIF 函数

NULLIF (expr1, expr2) : 相等返回NULL,不等返回expr1

SELECT first_name, LENGTH(first_name) "expr1", 
       last_name,  LENGTH(last_name)  "expr2",
       NULLIF(LENGTH(first_name), LENGTH(last_name)) result
FROM   employees;

6.4、COALESCE 函数

  • COALESCE 与 NVL 相比的优点在于 COALESCE 可以同时处理交替的多个值。
  • 如果第一个表达式为空,则返回下一个表达式,对其他的参数进行COALESCE 。
SELECT   last_name,
         COALESCE(commission_pct, salary, 10) comm
FROM     employees
ORDER BY commission_pct;

7、条件表达式

在 SQL 语句中使用IF-THEN-ELSE 逻辑
使用两种方法:

  • CASE 表达式
  • DECODE 函数

7.1、CASE 表达式

在需要使用 IF-THEN-ELSE 逻辑时:

CASE expr WHEN comparison_expr1 THEN return_expr1
         [WHEN comparison_expr2 THEN return_expr2
          WHEN comparison_exprn THEN return_exprn
          ELSE else_expr]
END

-- 查询部门号为 10, 20, 30 的员工信息, 若部门号为 10, 则打印其工资的 1.1 倍, 20 号部门, 则打印其工资的 1.2 倍, 30 号部门打印其工资的 1.3 倍数

SELECT last_name, job_id, salary,
       CASE job_id WHEN 'IT_PROG'  THEN  1.10*salary
                   WHEN 'ST_CLERK' THEN  1.15*salary
                   WHEN 'SA_REP'   THEN  1.20*salary
       ELSE      salary END     "REVISED_SALARY"
FROM   employees;

7.2、DECODE 函数

在需要使用 IF-THEN-ELSE 逻辑时:

DECODE(col|expression, search1, result1 ,
      			   [, search2, result2,...,]
      			   [, default])
SELECT last_name, job_id, salary,
       DECODE(job_id, 'IT_PROG',  1.10*salary,
                      'ST_CLERK', 1.15*salary,
                      'SA_REP',   1.20*salary,
              			    salary)
       REVISED_SALARY
FROM   employees;

使用decode函数的一个例子:

SELECT last_name, salary,
       DECODE (TRUNC(salary/2000, 0),
                         0, 0.00,
                         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;

8、嵌套函数

  • 单行函数可以嵌套。
  • 嵌套函数的执行顺序是由内到外

SELECT last_name,
       NVL(TO_CHAR(manager_id), 'No Manager')
FROM   employees
WHERE  manager_id IS NULL;
posted @ 2024-05-18 12:22  画个一样的我  阅读(9)  评论(0编辑  收藏  举报