Oracle学习(三):单行函数

1.知识点:可以对照下面的录屏进行阅读

SQL> --字符函数
SQL> --字符串的转换
SQL> select lower('hellO WORld') 转小写,upper('hellO WORld') 转大写,initcap('hello world') 首字母大写
  2  from dual;

SQL> --substr(a,b) 从a中,第b位开始取,取右边所有的字符
SQL> select substr('Hello World',4)  from dual;

SQL> --substr(a,b,c) 从a中,第b位开始取,取c位
SQL> select substr('Hello World',4,4)  from dual;

SQL> --length 字符数 lengthb 字节数
SQL> select length('Hello World') 字符数, lengthb('Hello World') 字节数
  2  from dual;

SQL> --instr 在母串中查找子串,找到返回下标(从1开始),否则返回0
SQL> select instr('Hello World','ll')  from dual;	

SQL> --lpad 左填充  rpad 右填充
SQL> select lpad('abcd',10,'*') 左,rpad('abcd',10,'*') 右	--向’abcd’字符串的左/右填充’*’,填充到整个字符串的长度为10
  2  from dual;

SQL> --trim 去掉前后指定的字符
SQL> select trim('H' from 'Hello WorldH') from dual;	--去掉 'Hello WorldH'中所有的’H’

SQL> --replace 替换指定位置的字符
SQL> select replace('Hello World','l','*') from dual;	--将'Hello World'中的’l’替换为’*’

SQL> --数字函数
SQL> --四舍五入,第一个参数为要进行四舍五入的数,第二个参数为保留的位数,大于0的为小数点后,小于0的为小数点前的
SQL> select ROUND(45.926, 2) 一,ROUND(45.926, 1) 二, ROUND(45.926, 0) 三,
  2         ROUND(45.926, -1) 四, ROUND(45.926, -2) 五
  3  from dual;

SQL> --截断,第一个参数为要进行截断的数,第二个参数为保留的位数,大于0的为小数点后,小于0的为小数点前的
SQL> select TRUNC(45.926, 2) 一,TRUNC(45.926, 1) 二, TRUNC(45.926, 0) 三,
  2         TRUNC(45.926, -1) 四, TRUNC(45.926, -2) 五
  3  from dual

SQL> --日期函数
SQL> --查询当前日期
SQL> select sysdate from dual;

SQL> --查询当前时间,具体到时分秒
SQL> select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss') from dual

SQL> --systimestamp时间戳,更精确
SQL> select systimestamp from dual;

SQL> --昨天 今天  明天
SQL> select (sysdate-1) 昨天, sysdate 今天, (sysdate+1) 明天 from dual;

SQL> --员工的工龄,
SQL> select ename,hiredate,(sysdate-hiredate) 天,(sysdate-hiredate)/7 星期,
  2         (sysdate-hiredate)/30 月,(sysdate-hiredate)/365 年
  3  from emp;

SQL> --日期不能进行相加
SQL> select hiredate+sysdate from emp;
select hiredate+sysdate from emp
            *
第 1 行出现错误:
ORA-00975: 不允许日期 + 日期 

SQL> --last_day:本月的最后一天
SQL> select last_day(sysdate) from dual;

SQL> --MONTHS_BETWEEN :计算两个时间之间相差的月份
SQL> select (sysdate-hiredate)/30 一,MONTHS_BETWEEN(sysdate,hiredate) 二   --计算工龄(粗略计算和精确计算)
  2  from emp;

SQL> --add_months:指定时间加上指定月份
SQL> select add_months(sysdate,114) from dual;		--查询当前时间加上114个月份后的时间

SQL> --next_day:指定日期的下一个日期
SQL> select next_day(sysdate,'星期二') from dual;	--从今天开始算,下一个星期二

SQL> --对日期进行四舍五入
SQL> select round(sysdate,'month') 一,round(sysdate,'year') 二 from dual;	--按月,年进行四舍五入

SQL> --隐式转换的前提: 被转换对象是可以转换的
SQL> --varchar2 or char ->number  ; varchar2 or char ->date ; number -> varchar2 ; date ->varchar2 ; 

SQL> --显式转换
SQL> --number to_char character ; character to_number number ; date to_char character ; char to_date date ;
SQL> select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss"今天是"day') from dual;	--将date转为char

SQL> --to_char函数中经常使用的格式:9 数字;0 零;$ 美元符;L 本地货币;. 小数点;, 千位符;
SQL> --查询员工的薪水: 货币符号,两位小数,千位符
SQL> select sal, to_char(sal,'L9,999.99') from emp;

SQL> --通用函数
SQL> --nvl2(a,b,c) 当a=null时,返回c,否则返回b
SQL> select sal*12+nvl2(comm,comm,0)  from emp;

SQL> --nullif(a,b) 当a=b时,返回null,否则返回a
SQL> select nullif('abc','abc') from dual;

SQL> --COALESCE 从左至右找到第一个不为null的值,如果全为空,则返回空
SQL> select comm,sal,COALESCE(comm,sal) from emp;

SQL> --case语句:
SQL> --根据职位涨工资 总裁1000 经理800 其他400
SQL> select ename,job,sal 涨前薪水, case job when 'PRESIDENT' then sal+1000
  2                                          when 'MANAGER' then sal+800
  3                                          else sal+400
  4                                 end 涨后薪水
  5  from emp;

SQL> --decode:功能和case一样,第一个参数为表达式,之后每两个为一对:条件,值;最后一个为缺省值,相当于else的值
SQL> select ename,job,sal 涨前薪水,decode(job,'PRESIDENT',sal+1000,
  2                                           'MANAGER', sal+800,
  3                                                      sal+400)涨后薪水
  4  from emp;

2.在Sqlplus下实际执行的结果录屏:

SQL> --字符函数
SQL> select lower('hellO WORld') 转小写,upper('hellO WORld') 转大写,initcap('hello world') 首字母大写
  2  from dual;

转小写      转大写      首字母大写
----------- ----------- -----------
hello world HELLO WORLD Hello World                                             

SQL> host cls

SQL> --substr(a,b) 从a中,第b位开始取,取右边所有的字符
SQL> select substr('Hello World',4)  from dual;

SUBSTR('
--------
lo World                                                                        

SQL> --substr(a,b,c) 从a中,第b位开始取,取c位
SQL> select substr('Hello World',4,4)  from dual;

SUBS
----
lo W                                                                            

SQL> host cls

SQL> --length 字符数 lengthb 字节数
SQL> select length('Hello World') 字符数, lengthb('Hello World') 字节数
  2  from dual;

    字符数     字节数
---------- ----------
        11         11                                                           

SQL> ed
已写入 file afiedt.buf

  1  select length('北京') 字符数, lengthb('北京') 字节数
  2* from dual
SQL> /

    字符数     字节数
---------- ----------
         2          4                                                           

SQL> host cls

SQL> --instr 在母串中查找子串,找到返回下标(从1开始),否则返回0
SQL> select instr('Hello World','ll')  from dual;

INSTR('HELLOWORLD','LL')
------------------------
                       3                                                        

SQL> host cls

SQL> --lpad 左填充  rpad 右填充
SQL> select lpad('abcd',10,'*') 左,rpad('abcd',10,'*') 右
  2  from dual;

左         右
---------- ----------
******abcd abcd******                                                           

SQL> host cls

SQL> --trim 去掉前后指定的字符
SQL> select trim('H' from 'Hello WorldH') from dual;

TRIM('H'FR
----------
ello World                                                                      

SQL> select replace('Hello World','l','*') from dual;

REPLACE('HE
-----------
He**o Wor*d                                                                     

SQL> host cls

SQL> --数字函数
SQL> select ROUND(45.926, 2) 一,ROUND(45.926, 1) 二, ROUND(45.926, 0) 三
  2         ROUND(45.926, -1) 四, ROUND(45.926, -2) 五
  3  from dual;
       ROUND(45.926, -1) 四, ROUND(45.926, -2) 五
       *
第 2 行出现错误:
ORA-00923: 未找到要求的 FROM 关键字 

SQL> ed
已写入 file afiedt.buf

  1  select ROUND(45.926, 2) 一,ROUND(45.926, 1) 二, ROUND(45.926, 0) 三,
  2         ROUND(45.926, -1) 四, ROUND(45.926, -2) 五
  3* from dual
SQL> /

        一         二         三         四         五
---------- ---------- ---------- ---------- ----------
     45.93       45.9         46         50          0                          

SQL> ed
已写入 file afiedt.buf

  1  select TRUNC(45.926, 2) 一,TRUNC(45.926, 1) 二, TRUNC(45.926, 0) 三,
  2         TRUNC(45.926, -1) 四, TRUNC(45.926, -2) 五
  3* from dual
SQL> /

        一         二         三         四         五
---------- ---------- ---------- ---------- ----------
     45.92       45.9         45         40          0                          

SQL> host cls

SQL> --日期函数
SQL> select sysdate from dual;

SYSDATE
--------------
22-10月-12                                                                      

SQL> select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss') from dual
  2  ;

TO_CHAR(SYSDATE,'YY
-------------------
2012-10-22 15:39:21                                                             

SQL> select systimestamp from dual;

SYSTIMESTAMP
---------------------------------------------------------------------------
22-10月-12 03.40.05.406000 下午 +08:00                                          

SQL> host cls

SQL> select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss') from dual;

TO_CHAR(SYSDATE,'YY
-------------------
2012-10-22 15:40:33                                                             

SQL> select to_char(systimestamp,'yyyy-mm-dd hh24:mi:ss*ff') from dual;

TO_CHAR(SYSTIMESTAMP,'YYYY-MM
-----------------------------
2012-10-22 15:40:47*218000                                                      

SQL> --systimestamp时间戳
SQL> --昨天 今天  明天
SQL> select (sysdate-1) 昨天, sysdate 今天, (sysdate+1) 明天 from dual;

昨天           今天           明天
-------------- -------------- --------------
21-10月-12     22-10月-12     23-10月-12                                        

SQL> --员工的工龄
SQL> select ename,hiredate,(sysdate-hiredate) 天,(sysdate-hiredate)/7 星期,
  2         (sysdate-hiredate)/30 月,(sysdate-hiredate)/365 年
  3  from emp;

ENAME      HIREDATE               天       星期         月         年
---------- -------------- ---------- ---------- ---------- ----------
SMITH      17-12月-80     11632.6571 1661.80815 387.755235 31.8702933
ALLEN      20-2月 -81     11567.6571 1652.52244 385.588569 31.6922111
WARD       22-2月 -81     11565.6571 1652.23672 385.521902 31.6867317
JONES      02-4月 -81     11526.6571 1646.66529 384.221902 31.5798824
MARTIN     28-9月 -81     11347.6571 1621.09387 378.255235 31.0894714
BLAKE      01-5月 -81     11497.6571 1642.52244 383.255235 31.5004303
CLARK      09-6月 -81     11458.6571 1636.95101 381.955235  31.393581
SCOTT      13-7月 -87     9233.65706 1319.09387 307.788569 25.2976906
KING       17-11月-81     11297.6571 1613.95101 376.588569 30.9524851
TURNER     08-9月 -81     11367.6571 1623.95101 378.921902 31.1442659
ADAMS      13-7月 -87     9233.65706 1319.09387 307.788569 25.2976906           

ENAME      HIREDATE               天       星期         月         年
---------- -------------- ---------- ---------- ---------- ----------
JAMES      03-12月-81     11281.6571 1611.66529 376.055235 30.9086495
FORD       03-12月-81     11281.6571 1611.66529 376.055235 30.9086495
MILLER     23-1月 -82     11230.6571 1604.37958 374.355235 30.7689235           

已选择14行。

SQL> select hiredate+sysdate from emp;
select hiredate+sysdate from emp
               *
第 1 行出现错误:
ORA-00975: 不允许日期 + 日期 

SQL> host cls

SQL> select last_day(sysdate) from dual;

LAST_DAY(SYSDA
--------------
31-10月-12                                                                      

SQL> --MONTHS_BETWEEN 计算工龄
SQL> select (sysdate-hiredate)/30 一,MONTHS_BETWEEN(sysdate,hiredate) 二
  2  from emp;

        一         二
---------- ----------
387.755329 382.182577
385.588662 380.085802
385.521996        380
384.221996 378.666448
378.255329 372.827738
383.255329 377.698706
381.955329 376.440641
307.788662 303.311609
376.588662 371.182577
378.921996 373.472899
307.788662 303.311609                                                           

        一         二
---------- ----------
376.055329 370.634189
376.055329 370.634189
374.355329 368.989028                                                           

已选择14行。

SQL> host cls

SQL> --114月后
SQL> select add_months(sysdate,114) from dual;

ADD_MONTHS(SYS
--------------
22-4月 -22                                                                      

SQL> --从今天开始算(2012.10.22星期一),下一个星期一
SQL> select next_day(sysdate,'星期一') from dual;

NEXT_DAY(SYSDA
--------------
29-10月-12                                                                      

SQL> --从今天开始算(2012.10.22星期一),下一个星期二
SQL> select next_day(sysdate,'星期二') from dual;

NEXT_DAY(SYSDA
--------------
23-10月-12                                                                      

SQL> host cls

SQL> --对日期进行四舍五入
SQL> select round(sysdate,'month') 一,round(sysdate,'year') 二 from dual;

一             二
-------------- --------------
01-11月-12     01-1月 -13                                                       

SQL> --隐式转换的前提: 被转换对象是可以转换的
SQL> host cls

SQL> --显式转换
SQL> --2012-10-22 16:24:13 今天是星期一
SQL> select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss"今天是"day') from dual;

TO_CHAR(SYSDATE,'YYYY-MM-DDHH24:MI
----------------------------------
2012-10-22 16:25:52今天是星期一                                                 

SQL> --查询员工的薪水: 货币符号,两位小数,千位符
SQL> select sal, to_char(sal,'L9,999.99') from emp;

       SAL TO_CHAR(SAL,'L9,999
---------- -------------------
       800            ¥800.00
      1600          ¥1,600.00
      1250          ¥1,250.00
      2975          ¥2,975.00
      1250          ¥1,250.00
      2850          ¥2,850.00
      2450          ¥2,450.00
      3000          ¥3,000.00
      5000          ¥5,000.00
      1500          ¥1,500.00
      1100          ¥1,100.00                                                  

       SAL TO_CHAR(SAL,'L9,999
---------- -------------------
       950            ¥950.00
      3000          ¥3,000.00
      1300          ¥1,300.00                                                  

已选择14行。

SQL> host cls

SQL> --通用函数
SQL> --nvl2(a,b,c) 当a=null时,返回c,否则返回b
SQL> select sal*12+nvl2(comm,comm,0)  from emp;

SAL*12+NVL2(COMM,COMM,0)
------------------------
                    9600
                   19500
                   15500
                   35700
                   16400
                   34200
                   29400
                   36000
                   60000
                   18000
                   13200                                                        

SAL*12+NVL2(COMM,COMM,0)
------------------------
                   11400
                   36000
                   15600                                                        

已选择14行。

SQL> host cls

SQL> --nullif(a,b) 当a=b时,返回null,否则返回a
SQL> select nullif('abc','abc') from dual;

NUL
---                                                                             

SQL> select nullif('abc','abdc') from dual;

NUL
---
abc                                                                             

SQL> host cls

SQL> -- ¥1,600.00
SQL>  ¥1,250.00
SP2-0042: 未知命令 "¥1,250.00" - 其余行忽略。
SQL>  ¥2,975.00
SP2-0042: 未知命令 "¥2,975.00" - 其余行忽略。
SQL>  ¥1,250.00
SP2-0042: 未知命令 "¥1,250.00" - 其余行忽略。
SQL>  ¥2,850.00
SP2-0042: 未知命令 "¥2,850.00" - 其余行忽略。
SP2-0044: 要获取已知命令的列表, 请输入 HELP;
输入 EXIT 可退出。
SQL>  ¥2,450.00
SP2-0042: 未知命令 "¥2,450.00" - 其余行忽略。
SQL>  ¥3,000.00
SP2-0042: 未知命令 "¥3,000.00" - 其余行忽略。
SQL>  ¥5,000.00
SP2-0042: 未知命令 "¥5,000.00" - 其余行忽略。
SQL>  ¥1,500.00
SP2-0042: 未知命令 "¥1,500.00" - 其余行忽略。
SP2-0044: 要获取已知命令的列表, 请输入 HELP;
输入 EXIT 可退出。
SQL> host cls

SQL> --COALESCE 从左至右找到第一个不为null的值
SQL> select comm,sal,COALESCE(comm,sal) from emp;

      COMM        SAL COALESCE(COMM,SAL)
---------- ---------- ------------------
                  800                800
       300       1600                300
       500       1250                500
                 2975               2975
      1400       1250               1400
                 2850               2850
                 2450               2450
                 3000               3000
                 5000               5000
         0       1500                  0
                 1100               1100                                        

      COMM        SAL COALESCE(COMM,SAL)
---------- ---------- ------------------
                  950                950
                 3000               3000
                 1300               1300                                        

已选择14行。

SQL> host cls

SQL> --根据职位涨工资 总裁1000 经理800 其他400
SQL> select ename,job,sal
  2  from emp;

ENAME      JOB              SAL
---------- --------- ----------
SMITH      CLERK            800
ALLEN      SALESMAN        1600
WARD       SALESMAN        1250
JONES      MANAGER         2975
MARTIN     SALESMAN        1250
BLAKE      MANAGER         2850
CLARK      MANAGER         2450
SCOTT      ANALYST         3000
KING       PRESIDENT       5000
TURNER     SALESMAN        1500
ADAMS      CLERK           1100                                                 

ENAME      JOB              SAL
---------- --------- ----------
JAMES      CLERK            950
FORD       ANALYST         3000
MILLER     CLERK           1300                                                 

已选择14行。

SQL> select ename,job,sal 涨前薪水, case job when 'PRESIDENT' then sal+1000
  2                                          when 'MANAGER' then sal+800
  3                                          else sal+400
  4                                 end 涨后薪水
  5  from emp;

ENAME      JOB         涨前薪水   涨后薪水
---------- --------- ---------- ----------
SMITH      CLERK            800       1200
ALLEN      SALESMAN        1600       2000
WARD       SALESMAN        1250       1650
JONES      MANAGER         2975       3775
MARTIN     SALESMAN        1250       1650
BLAKE      MANAGER         2850       3650
CLARK      MANAGER         2450       3250
SCOTT      ANALYST         3000       3400
KING       PRESIDENT       5000       6000
TURNER     SALESMAN        1500       1900
ADAMS      CLERK           1100       1500                                      

ENAME      JOB         涨前薪水   涨后薪水
---------- --------- ---------- ----------
JAMES      CLERK            950       1350
FORD       ANALYST         3000       3400
MILLER     CLERK           1300       1700                                      

已选择14行。

SQL> select ename,job,sal 涨前薪水,decode(job,'PRESIDENT',sal+1000,
  2                                           'MANAGER', sal+800,
  3                                                      sal+400)涨后薪水
  4  from emp;

ENAME      JOB         涨前薪水   涨后薪水
---------- --------- ---------- ----------
SMITH      CLERK            800       1200
ALLEN      SALESMAN        1600       2000
WARD       SALESMAN        1250       1650
JONES      MANAGER         2975       3775
MARTIN     SALESMAN        1250       1650
BLAKE      MANAGER         2850       3650
CLARK      MANAGER         2450       3250
SCOTT      ANALYST         3000       3400
KING       PRESIDENT       5000       6000
TURNER     SALESMAN        1500       1900
ADAMS      CLERK           1100       1500                                      

ENAME      JOB         涨前薪水   涨后薪水
---------- --------- ---------- ----------
JAMES      CLERK            950       1350
FORD       ANALYST         3000       3400
MILLER     CLERK           1300       1700                                      

已选择14行。

SQL> spool off

Oracle学习(三):单行函数,布布扣,bubuko.com

时间: 2024-10-05 09:46:47

Oracle学习(三):单行函数的相关文章

oracle学习笔记单行函数

单行函数 只对一行进行变换  每行返回一个结果 单行函数分 字符.数值.日期.转换.通用 字符函数:大小写控制函数.字符控制函数 大小写控制函数:lower, upper, initcap 字符控制函数:concat,substr,length,instr,lpad|rpad,trim,replace lower,upper,initcap select lower('SQL') from dual; --结果 sql select upper('sql') from dual; --结果 SQ

Oracle的基本学习(三)—单行函数

一.字符函数   1.大小写控制函数 --lower:使字母变为小写-- --upper:使字母变为大写-- --initcap:使字符的第一个字母变为大写-- select lower('ABC'), upper('sql'), initcap('HeLlo SQL') from dual; select employee_id, department_id,last_name, salary from employees where lower(last_name)='king';   2.

Oracle中的单行函数

Oracle中的单行函数 1 字符函数 UPPER()--将字符串转换为大写 SELECT UPPER('abc') FROM dual; LOWER()-将字符串转换为小写 SELECT LOWER('ABC') FROM dual; INITCAP()-首字母大写,其它字母小写. SELECT INITCAP('hello') FROM dual; REPLACE()-将指定的字符/字符串替换 SELECT REPLACE('abcd efg','cd','XXX') FROM dual;

Oracle系列四 单行函数查询语句

单行函数 操作数据对象 接受参数返回一个结果 只对一行进行变换 每行返回一个结果 可以转换数据类型 可以嵌套 参数可以是一列或一个值 包含:字符,数值,日期,转换,通用 字符函数 1.大小写控制函数:这类函数改变字符的大小写. LOWER('SQL Course') sql course UPPER('SQL Course') SQL COURSE INITCAP('SQL Course') Sql Course 示例: SELECT employee_id, last_name, depart

oracle之3单行函数之条件表达式

单行函数之条件表达式 Case表达式: 例如: 也可以在条件判断的when中写表达式 Decode函数: 例如: 原文地址:https://www.cnblogs.com/txf0324/p/11038070.html

JS学习三(函数)

[函数的声明格式] 1.函数的声明格式: function 函数名(参数1,参数2,...){ 函数体代码 return 返回值: } 函数的调用: ① 直接调用:函数名(参数1的值,参数2的值,....); ② 时间调用方式:直接在html标签中,使用事件名="函数名()" <button ondblclick="saySth('哈哈哈','yellow')">点击按钮,打印内容</button> 2.函数的注意事项: ① 函数名必须符合小

ORACLE学习05-单行函数

一.字符函数 1,字符串转换 -- lower() 将字符串转成小写 select lower('HELLO WORLD') from dual;   -- upper() 将字符串转大写 select upper('hello world') from dual;   -- initcap() 将字符串首字母大写 select initcap('hEllo woRld') from dual; 2,字符串截取 -- substr(a,b) 从a中,第b位开始取,取右边所有的字符 select

oracle学习 三(持续更新中)

关于ora 01219问题的解决 之前学习oracle的时候练习去建立表空间,建了很多之后手动删除了,之后再使用自己创建的用户名登陆数据库就会造成数据库 ORA-01031: ORACLE initialization or shutdown in progress 这个错误,查了多方的资料之后,发现你可能需要使用DOS去真正的删掉那几个表空间,这样才能继续使用你的用户名和密码登陆 方法如下: 1. 运行输入:sqlplus /nolog 2. 以sysdba的角色登录:connect sys/

php学习三:函数

1.  php中的函数和js中的区别 在php中,函数的形参可以给一个默认值,若有实参的传递则函数使用传递过来的参数,没有的话显示默认值 代码如下: function showSelf($name="房明"){ echo "{$name}今年十八岁<br>"; }; //函数的调用 showSelf();  2.   判断函数是否存在,function_exists(函数名) 代码如下: if(function_exists("showSelf