数据库
首页 > 数据库> > Oracle学习——第二讲(函数)

Oracle学习——第二讲(函数)

作者:互联网

Oracle 通用表

/*

emp 表                             dept  部门表                 salgrade 表

empno 员工编号               deptno  部门编号          grade  工资等级

ename  员工姓名             dname  部门名称          losal    工资范围下限

job       职位                      loc 工作地点                 hisal   工资范围上限

mgr     经理编号

hiredate  入职日期

sal        薪金

comm  奖金

deptno  部门编号

*/

Oracle实例演练

1.字符型函数

 --upper(参数):转换成大写  注:参数可以为字符串,也可以为列的字段

    Select UPPER(ename)  --列的字段

    FROM emp

   

    SElect UPPER('ename')  --字符串

    from dual

   

    --lower(参数)  :转换成小写  注:参数可以为字符串,也可以为列的字段

   Select LOWER(ename)  --列的字段

    FROM emp

   

    --查找员工姓名为king的信息

    SELECT ename

    FROM  emp

    where upper(ename) = 'KING'

   

    --initcap(参数): 字符串转换为首字符大写,其余都小写  ( 注:参数可以为字符串,也可以为列的字段)

    SELECT initcap(ename)

    FROM emp

    

    --concat(参数1,参数2) :连接两个字符串

    SELECT concat('Hello', 'World')

    FROM dual   --dual:为虚表,利用oracle的引擎,完成计算,并显示内容

   

    --等同于||

    SELECT  'Hello'||'World' FROM dual

   

    --substr(s1,n1,n2)

    --s1:要操作的字符数据或字段

    --n1:要从第几位开始截取, n1若为负数,代表从倒数第几位开始截取

    --n2:截取长度, n2省略代表,字符有多长截取多长; n2若为负数,什么也截取不了

    --n2不能为负数

   

    --截取每个员工姓名中的第三个字符

    SELECT ename, substr(ename, 3,  1)

    FROM emp

   

    --查询员工姓名中第三个字符是‘R’的

    SELECT *

    FROM emp

    where substr(ename, 3,  1) ='R'

   

    --length(字符数据参数)

    --返回员工姓名字符的长度

   SELECT ename, length(ename)  

   FROM emp

  

   --instr(s1,s2,n1,n2)

   --功能:返回S2在s1中,第n1位开始,第n2次出现的位置

   --第3,4个参数,不写默认都是1

  

  --查找,在员工姓名中第一次出现‘A’的位置

  SELECT ename, INSTR(ename, 'A', 2,1)

  FROM emp

 

  --查找,员工姓名中第三个字符是'A"

  SELECT  ename

  FROM emp

  WHERE INSTR(ename, 'A', 2, 1) = 3

 

  --查找,员工姓名中,出现'A'的

  SELECT ename

  FROM emp

  WHERE INSTR(ename, 'A',1, 1) <> 0  --等同于 WHERE INSTR(ename, 'A') <> 0

 

  --LPAD(s1,n1,s2)

  --返回s1被s2从左面填充到n1长度后的字符串。

  SELECT LPAD('Hello', 10, 'World11212')

  FROM dual

 

  --RPAD(s1,n1,s2)

--返回s1被s2从右面填充到n1长度后的字符串。

SELECT RPAD('Hello', 15, 'World11212')

FROM dual

 

  --trim(s1  from s2)

  --功能:从s2中裁剪s1, 将s2中出现s1的字符的开头和结尾去掉(掐头去尾)

   SELECT Trim(' ' FROM '    He    llo     ')

   FROM dual

 

  SELECT TRim('s'  FROM 'ssfjdllkfjdlkfsss')

  FROM dual

  

   --replace(s1,s2,s3)

   --功能:将s1中的s2,用s3替换

   SELECT REplace('abc', 'b', 'd')

   FROM dual

      

2.数值型函数

    --round(n1, n2) :对n1进行四舍五入到小数点第n2位

       --n2为0,或者不写,都是四舍五入到整数位

       --n2若为负数,则精确到四舍五入到小数点前n2位

   SELECT ROUND(99.567, 2)

   FROM dual

  SELECT ROUND(99.567)

  FROM dual

 

  --trunc(n1, n2):截断函数,截取n1到小数点第n2位

  --n2为0,或者不写,都是截取到整数位

       --n2若为负数,则精确到截取到小数点前n2位

  SELECT TRUNC(99.567, 2)

  FROM dual

 

  --mod(n1, n2)

  --取余函数

  --对0取余,余数为被除数

  --对负数取余,取决于被除数的正负关系,

  --第一个数为正,无论第二个参数为正或负,都按正数处理

  --第一个数为负,无论第二个参数为正或负,都按负数处理

  SELECT mod(-300, -500)

  FROM dual

3.日期型函数

    --sysdate :返回系统当前日期

    SELECT SYSDATE

    FROM  dual

   

    --months_between: 返回两个日期间隔的月

    --计算四舍五入后的间隔月份

    SELECT ROUND(months_between(sysdate, '01-1月-2000'))

    from dual

   

    --add_months  :为日期添加月

    SELECT hiredate, add_months(hiredate, 6)

    from emp

   

    --next_day  :返回日期的最近的下一个星期几(星期一~星期日)

    SELECT next_day(sysdate, '星期五')

    from dual

   

    --last_day: 返回指定日期的当月的最后一天

    SELECT last_day(sysdate)

    FROM dual

   

    --round : 对日期的四舍五入(精确到...)

-- ROUND(date,‘fmt')将date按照fmt指定的格式进行四舍五入,

--fmt为可选项,如果没有指定fmt,则默认为DD,将date四舍五入为最近的天。

--格式码:世纪CC,年YY,月MM,日DD,小时HH24,分MI,秒SS

--– TRUNC(date[,‘fmt’])将date按照fmt指定的格式进行截断,fmt为可选项,

--如果没有指定fmt,则默认为‘DD’,将date截取为最近的天。

    SELECT hiredate, ROUND(hiredate, 'MM')

    FROM emp

   

    --Trunc: 对指定日期进行截取

    SELECT hiredate, Trunc(hiredate,'MONTH')

    FROM emp

   

    --extract :提取日期中的指定年,月,日(day, month, year)

    SELECT hiredate, extract(DAY  from hiredate)

    from emp

    --查询12月份入职的

    SELECT *

    FROM emp

    WHERE extract(MONTH  from hiredate)  = 12

   

    --对当前日期进行加法: 天/小时/分钟

    SELECT sysdate, sysdate + 10 / 24 / 60

    FROM dual

   

3.数据类型转换(字符-日期-数值)

--(备注:字符可以和日期以及数值型进行互相转换)

     --to_char

     --1、转换日期

     select hiredate, to_char(hiredate, 'YYYY') "1"   --数字表示年份

     ,to_char(hiredate, 'YEAR') "2"     --全英文大写 表示年份

     ,to_char(hiredate, 'MM') "3"        --不带 ‘月’

     ,to_char(hiredate, 'MONTH') "4"   --带‘月’

     ,to_char(hiredate, 'DAY') "5"        --星期

     ,to_char(hiredate, 'DY') "6"       --星期

     ,to_char(hiredate, 'HH24:MI:SS AM') "7"

     ,to_char(hiredate, 'DD  "of" MONTH') "8"

     FROM emp

    

     --2、转换数值

     --$:显示美元符号

     --L:显示本地货币符号

     --. :显示小数点

     --,:显示千分符

     SELECT sal, to_char(sal, 'L99999,999.999')

     from emp

    

     --to_number(字符转数字)

     SELECT to_number('1234567.89', '9999999.99')

     FROM dual

    

     --to_date

        SELECT sysdate - to_date('01-1月-1981')

        from dual

       

        --进行日期相减(第二个参数需要对第一个日期参数进行解释)

        SELECT sysdate - to_date('1981年 1月 1日',  'YYYY"年" MONTH DD"日"')

         from dual

    

         --查找1981年入职的员工信息

         SELECT *

         FROM emp

         WHERE to_char(hiredate, 'YYYY') = '1981'

    

 --通用函数

 --NVL(参数1, 参数2) : 若参数1不为空返回参数1,否则返回参数2

 SELECT ename, NVL(to_char(mgr), '没有经理')

 FROM emp

 --NVL2(参数1,参数2,参数3):若参数1不为空返回参数2,否则返回参数3

 SELECT sal, comm, NVL2(comm, comm, 0)

 FROM emp

 --NULLIF(n1,n2): 如果n1, n2相等,返回空值;否则返回n1

 SELECT NULLIF(5 + 4, 3 * 3)

 FROM dual

 --COALESCE(参数多个) :功能:返回参数中第一个不为空的值

 SELECT sal, comm, COALESCE(comm, comm, 0)

 FROM emp

 --CASE 、 DECODE

 SELECT ename, deptno,(case deptno

                                                WHEN  10 THEN '销售部'

                                                   WHEN 20 THEN '技术部'

                                                      WHEN 30 THEN '管理部'

                                                        ELSE '小卖部 ' END) 部门名称

  FROM emp

 

  SELECT ename, deptno, DECODE(deptno,

                                                          10, '技术部',

                                                          20,'销售部',

                                                          30, '管理部',

                                                          '小卖不') 部门名称

   FROM emp

  

   --多表连接

   --查询员工姓名,工资,部门编号,部门名称,工作地点

   --”笛卡尔积现象“--一张表中所有行与另一张表中的所有行都发生连接的现象

   --产生原因:没有指定有效的连接条件

  

   --等值连接

   SELECT ename, sal, emp.deptno, dname, loc

   FROM emp, dept

   WHERE emp.deptno = dept.deptno

  

   --非等值连接(工资等级)

   SELECT ename, sal, grade

   FROM emp, salgrade

  WHERE sal BETWEEN losal AND hisal                                                   

   

  --多表连接   

    SELECT ename, sal, grade, d.deptno, dname, loc

    FROM emp e, dept d, salgrade

    WHERE e.deptno = d.deptno

    AND sal BETWEEN losal AND hisal

    AND grade >= 3

   

--外部连接(让那些按照连接条件匹配不上的信息,也显示出来)

--备注:不可两侧都有(+)

--查询员工姓名, 部门编号,部门名称,要求将没有员工的部门也显示出来

SELECT ename, d.deptno, dname 

FROM emp e, dept d

WHERE e.deptno(+) = d.deptno   --(左侧出空行,匹配右边:哪边缺数据,加(+)) 

--WHERE e.deptno = d.deptno(+)   --没有部门的员工

--插入一行数据

INSERT INTO emp(empno)  VALUES  (9999) 

  

--在员工表中查询出员工的工资,并计算应交税款:如果工资小于1000,税率为0,

--  如果工资大于等于1000并小于2000,税率为10%,

 --  如果工资大于等于2000并小于3000,税率为15%,

--   如果工资大于等于3000,税率为20%.

Select ename,sal,(case trunc(sal/1000)

                          When 0 then 0

                           When 1 then sal*0.1

                             When 2 then sal*0.15

                              Else sal*0.2 end) 应交税款

         From emp

   

   

    

   

 

标签:ename,函数,--,学习,emp,dual,Oracle,hiredate,SELECT
来源: https://blog.csdn.net/zhangchuan7758/article/details/122057197