Oracle_Day2(下)

Oracle learning_Day2(下)

本人学习视频用的是尚硅谷的,也在这里献上
视频链接:https://www.bilibili.com/video/BV17b411V75B?p=2
Oracle 数据库-sql plsql - Java 学习 - 尚硅谷

目录
  • Oracle learning_Day2(下)
    • 一、SQL中不同类型的函数
      • 1.图解SQL函数
      • 2.图解两种SQL函数
    • 二、单行函数
      • 1.字符函数
        • (1) 大小写控制函数
        • (2) 字符控制函数
      • 2.数字函数
      • 3.日期函数
        • 1.日期的数学运算:
        • 2.日期函数
      • 4.转换函数
        • 1.隐式数据类型转换
        • 2.显式数据类型转换
      • 5.通用函数
      • 6.条件表达式
    • 参考资料

一、SQL中不同类型的函数

1.图解SQL函数

Oracle_Day2(下)_第1张图片

2.图解两种SQL函数

Oracle_Day2(下)_第2张图片

二、单行函数

单行函数:

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

格式:

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

1.字符函数

字符函数又分为 **大小写控制函数 **和 字符控制函数

Oracle_Day2(下)_第3张图片

(1) 大小写控制函数

这类函数改变字符的大小写。

函数 作用 结果
LOWER('SQL Course') 结果变为小写 sql course
UPPER('SQL Course') 结果变为大写 SQL COURSE
INITCAP('SQL Course') 每个单词的首字母变为大写 Sql Course

举个例子:

--查找名字为higgins的列
SELECT employee_id, last_name, department_id
FROM employees
WHERE last_name = 'higgins';

--没有查找结果,可能是有字母大写
--此时通过LOWER函数将last_name的内容转换为小写
SELECT employee_id, last_name, department_id
FROM employees
WHERE LOWER(last_name) = 'higgins';

--也可以使用UPPER函数
SELECT employee_id, last_name, department_id
FROM employees
WHERE UPPER(last_name) = 'HIGGINS';

--也可以使用INITCAOP函数
SELECT employee_id, last_name, department_id
FROM employees
WHERE INITCAPlast_name) = 'Higgins';

(2) 字符控制函数

这类函数控制字符

函数 作用 结果
CONCAT('Hello', 'World') 将两个字符串连成一个字符串 HelloWorld
SUBSTR('HelloWorld',6,5) 设三个参数分别为a,b,c;将字符串a从第b位开始向后取c个长度的子串 world
LENGTH('HelloWorld') 返回字符串的长度 10
INSTR('HelloWorld', 'W') 设两个参数分别为a,b;返回字符b在字符串a中首次出现的位置 6
LPAD(salary,10,'*') 设三个参数分别为a,b,c;如果列a中的内容长度不足b,则向左填充字符c直至结果长度等于b **24000*
RPAD(salary, 10, '*') 设三个参数分别为a,b,c;如果列a中的内容长度不足b,则向右填充字符c直至结果长度等于b 24000***
TRIM('H' FROM 'HelloWorld') 设两个参数分别为a,b;去除字符串b首尾指定的字符b elloWorld
REPLACE(‘abcd’,’b’,’m’) 设三个参数a,b,c;将字符串a中的所有字符b替换为c amcd

举个例子:

SELECT employee_id, CONCAT(first_name, last_name) NAME, 
       job_id, LENGTH (last_name), 
       INSTR(last_name, 'a') "Contains 'a'?"
FROM employees
WHERE SUBSTR(job_id, 4) = 'REP';

部分输出结果:

Oracle_Day2(下)_第4张图片


2.数字函数

函数 作用
ROUND 四舍五入
TRUNC 截断
MOD 求余
  1. ROUND

格式:

--将参数a保留b位小数,四舍五入
--如果b为负数,则保留小数点前|b|位,四舍五入
--参数b缺省保留整数,四舍五入
ROUND(a,b)

举个例子:

--结果为123
SELECT ROUND(123.45) FROM DUAL;

--结果为123.5
SELECT ROUND(123.45, 1) FROM DUAL;

--结果为120
SELECT ROUND(123.45, -1) FROM DUAL;

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


  1. TRUNC

格式:

--将参数a保留b位小数,不四舍五入
--如果b为负数,则保留小数点前|b|位,不四舍五入
--参数b缺省保留整数,不四舍五入
TRUNC(a,b)

举个例子:

--结果为123
SELECT TRUNC(123.45) FROM DUAL;

--结果为123.4
SELECT TRUNC(123.45, 1) FROM DUAL;

--结果为120
SELECT TRUNC(123.45, -1) FROM DUAL;

  1. MOD

格式:

--求参数a除以参数b的余数
TRUNC(a,b)

举个例子

--结果为100
SELECT MOD(1600,300) FROM DUAL;

3.日期函数

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

1.日期的数学运算:

  • 在日期上加上或减去一个数字结果仍为日期。
  • 两个日期相减返回日期之间相差的天数。
    • 日期不允许做加法运算,无意义
  • 可以用数字除24来向日期中加上或减去天数。

举个例子:

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

输出结果

Oracle_Day2(下)_第5张图片


2.日期函数

函数 描述
MONTHS_BETWEEN 两个日期相差的月数
ADD_MONTHS 向指定日期中加上若干月数
NEXT_DAY 指定日期的下一个星期 * 对应的日期
LAST_DAY 本月的最后一天
ROUND 日期四舍五入
TRUNC 日期截断
  1. MONTHS_BETWEEN

格式:

--返回日期a和日期b之间相差的月份
MONTHS_BETWEEN(a,b)

举个例子:

--结果为9.29032258064516
 select months_between('1-10月-2020', '10-1月-2020') from dual;

  1. ADD_MONTHS

格式:

--返回日期a加上b个月之后的日期
--如果b为负数,则变为减去
ADD_MONTHS(a,b)

举个例子:

--结果为2020/7/1
select add_months('1-1月-2020', '6') from dual;

  1. NEXT_DAY

格式:

--返回最接近且大于日期a的星期b
NEXT_DAY(a,b)

举个例子:

--结果为2020/1/6
select next_day('1-1月-2020', '星期一') from dual;

  1. LAST_DAY

格式:

--返回日期a所处的月份的最后一天
LAST_DAY(a)

举个例子:

--结果为2020/2/29
select last_day('1-2月-2020') from dual;

  1. ROUND和TRUNC

格式:

作用与在字符函数中类似,用于四舍五入和截取

--以b为精度的对日期a进行四舍五入
ROUND(a,b)

--以b为精度的对日期a进行截取
TRUNC(a,b)

举个例子:

select round(sysdate, 'month'), round(sysdate, 'mm'), trunc(sysdate, 'hh')
from dual;

输出结果:

image-20200816152356694

TIP:关于日期格式化参数,可以参考这篇文章:ORACLE日期时间函数大全


4.转换函数

Oracle_Day2(下)_第6张图片

1.隐式数据类型转换

Oracle 自动完成下列转换:

源数据类型 目标数据类型
VARCHAR2 or CHAR NUMBER
VARCHAR2 or CHAR DATE
NUMBER VARCHAR2
DATE VARCHAR2

image-20200816154630399

例如:

--自动将日期和数字进行相加并返回日期
--结果为2020/8/18 1
select sysdate + '2' from dual;

2.显式数据类型转换

Oracle_Day2(下)_第7张图片

(1) TO_CHAR函数对日期的转换

使用 TO_CHAR 函数将日期转换成字符

  • 必须包含在单引号中而且大小写敏感

  • 可以包含任意的有效的日期格式。

  • 日期之间用逗号隔开。

格式:

--将日期date按照自定义格式format_model以字符串返回
TO_CHAR(date, 'format_model')

举个例子:

--结果为2020-08-16 04:27:11
SELECT TO_CHAR(sysdate, 'yyyy-mm-dd hh:mi:ss') FROM dual;

更多实际应用:

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

输出结果:

image-20200816164932928

TIP1:关于日期格式化参数,可以参考这篇文章:ORACLE日期时间函数大全

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

​ 例如:yyyymmdd --> 2020年8月16日


(2) TO_CHAR 函数对数字的转换

使用 TO_CHAR 函数将数字转换成字符

格式:

--将数字number按照自定义格式format_model以字符串返回
TO_CHAR(number, 'format_model')

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

字符 含义
9 数字
0
$ 美元符
L 本地货币符号
. 小数点
, 千位符

举个例子:

--结果1,234,567.89
select to_char(1234567.89, '999,999,999.99')
from dual;

--结果001,234,567.890
select to_char(1234567.89, '000,000,000.000')
from dual;

--结果¥001,234,567.890
select to_char(1234567.89, 'L000,000,000.000')
from dual;

(3) TO_DATE 函数对字符的转换

使用 TO_DATE 函数将字符转换成日期

格式:

--将字符串char以日期返回
--char的日期格式应当与format_mordel日期格式一致
--若第二个参数缺省,则以默认格式转换
TO_DATE(char[,'format_model'])

举个例子:

--结果为2020/8/16 4:27:11
SELECT TO_DATE('2020年8月16日 04:27:11', 'yyyy"年"mm"月"dd"日"hh:mi:ss')
From dual;

(4) TO_NUMBER 函数对字符的转换

使用 TO_NUMBER 函数将字符转换成数字

格式:

--将字符char按照自定义格式format_model以数字返回
--char的日期格式应当与format_mordel数字格式一致
--若第二个参数缺省,则以默认格式转换
TO_NUMBER(char[, 'format_model'])

举个例子:

--结果为2020/8/16 4:27:11
SELECT TO_NUMBER('$001,234,567.890', '$000,000,000.000')
From dual;

5.通用函数

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

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

注:参数的类型 或者 参数所对应的列的类型 必须一致,否则应提前对参数进行类型转换


1.NVL 函数

格式:

--第一个参数指定列的名称,第二个参数指定转换的内容
NVL(expr1, expr2)

将空值转换成一个特定值

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

  • 函数的常用形式:

    • NVL(commission_pct,0)

    • NVL(hire_date,'01-JAN-97')

    • NVL(job_id,'No Job Yet')

举个例子:

--如果列commission_pct为空,则用0代替
SELECT last_name, salary, NVL(commission_pct, 0),
   (salary*12) + (salary*12*NVL(commission_pct, 0)) AN_SAL
FROM employees;

部分输出结果:

Oracle_Day2(下)_第8张图片


2.NVL2 函数

格式:

--若参数1所指定的列的内容不为空,返回参数2,否则返回参数3
NVL2(expr1, expr2, expr3)

用法与NVL函数类似

举个例子:

--如果列commission_pct不为空,用SAL+COMM代替;为空,则用SAL代替
SELECT last_name,  salary, commission_pct,
       NVL2(commission_pct, 'SAL+COMM', 'SAL') income
FROM employees WHERE department_id IN (50, 80);

部分输出结果:

Oracle_Day2(下)_第9张图片

3.NULLIF 函数

格式:

--若参数1和参数2相等返回NULL,不等返回参数1
NULLIF(expr1, expr2)

举个例子:

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

部分输出结果:

image-20200816193108927


4.COALESCE 函数

格式:

COALESCE (expr1, expr2, ..., exprn)
  • COALESCE 与 NVL 相比的优点在于 COALESCE 可以同时处理交替的多个值。
  • 如果第一个表达式为空,则返回下一个表达式,对其他的参数进行COALESCE 。

举个例子:

--如果列commission为空,输出salary,如果salary依然为空,输出10
SELECT last_name, commission_pct, salary,
       COALESCE(commission_pct, salary, 10) comm
FROM employees
ORDER BY commission_pct;

部分输出结果:

Oracle_Day2(下)_第10张图片


6.条件表达式

  • 在 SQL 语句中使用IF-THEN-ELSE 逻辑
  • 使用两种方法:
    • CASE 表达式
    • DECODE 函数

1.CASE表达式

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

--参数expr满足条件comparison_expr1则返回return_expr1
--满足条件comparison_expr2则返回return_expr2
--以此类推
--如果都不满足则返回else_expr
CASE expr WHEN comparison_expr1 THEN return_expr1
         [WHEN comparison_expr2 THEN return_expr2
          WHEN comparison_exprn THEN return_exprn
          ELSE else_expr]
END

举个例子:

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;

输出部分结果:

Oracle_Day2(下)_第11张图片

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;

部分输出结果:

Oracle_Day2(下)_第12张图片


参考资料

1.ORACLE日期时间函数大全 | cnblogs

你可能感兴趣的:(Oracle_Day2(下))