Oracle学习笔记(二)

SQL函数

     SQL函数分单行函数和多行函数俩种

一、单行函数

      单行函数是只操作数据库表中的一条记录并返回一条结果,这样的函数称为单行函数。若操作多条记录,则每条记录都会返回一个结果。

     单行函数分5大类:字符函数、数字函数、日期函数、转换函数、通用函数。

      dual是Oracle中的一个“伪表”

      1、大小写控制函数(字符函数)

                 lower      全部转为小写
                 upper     全部转为大写
                 initcap    每个单词的首字母转为大写

select lower('DO WHATEVER YOU WANT'),upper('do whaterver you want'),initcap('do whaterver you want')
from dual;
--输出结果:
--do whatever you want      DO WHATERVER YOU WANT      Do Whaterver You Want

select * from employees
where lower(last_name) = 'king'
--lower(last_name)是先把last_name转为小写,再与king比较
      2、字符控制函数(字符函数)
            concat     连接字符串
            substr     截取字符串
            length     获取字符串长度

select concat('hello','world'),substr('helloworld',2,4),length('helloworld')
from dual;
--输出结果:
--helloworld     ello     10
--上面substr的意思是从第二个字符开始,截取后面的4个字符,如果不写会截取后面的全部
--注意:Oracle里下标都是从1开始的
            instr        获取字符或字符串在某字符串中首次出现的下标位置
            lpad        左边补齐,即右对齐
            rpad        右边补齐,即左对齐
            trim         去除首尾字符,中间出现的则不能去除                          
            replace   替换字符

select instr('helloworld','l') from dual;
--输出结果:3
--如果查找的字符或字符串不存在则返回0

select last_name,lpad(salary,10,'0'),rpad(salary,10,'*')
from employees
--lpad是将工资右对齐,工资输出长度为10,不足10位的用*左边补齐
--rpad是将工资左对齐,工资输出长度为10,不足10位的用*右边补齐

select trim('h' from 'hhhehllohhworldhh') from dual;
--仅去除首尾的
--输出结果:ehllohhworld

select replace('abcdab','b','m') from dual;
--讲字符串中的b替换成m,替换的是字符串中所有存在的
--输出结果:amcdam      

       3、数字函数

             round    四舍五入

             trunc      截断,不管后面是什么都舍掉

             mod       求余,如 mod(12, 5) 结果为2

select round(10532.92,2),round(10532.92),round(10532.92, -2),round(10532.92, -3) from dual;
--round(10532.92,2):保留两位小数
--round(10532.92):取整
--round(10532.92, -2):即十位上进行四舍五入
--round(10532.92, -3):即百位上进行四舍五入
--输出结果:10532.92        10533        10500        11000

select trunc(10532.92,2), trunc(10532.92, 0),trunc(10532.92, -1) from dual;
--输出结果:10532.92        10532        10530

select mod(12,5) from dual;
--输出结果:2
      4、日期函数:

           Oracle中的日期型数据实际含有俩个值:日期和时间。默认的日期格式是DD-MON-RR(天月年)

          (1)日期的数学运算

                  * 日期与数字:在日期上加上或减去一个数字结果仍为日期

                  * 俩个日期相减返回日期之间相差的天数,但两个日期不能相加,日期可以和数字加减

                  * 可以用数字除24来向日期中加上或减去小时。

select sysdate-1,sysdate, sysdate+1,sysdate-1/24,sysdate-1/24/60 from dual;
--sysdate-1  昨天
--sysdate    今天
--sysdate+1  明天
--sysdate-1/24  当前时间减去一小时
--sysdate-1/24/60  当前时间减去一分钟   

select empName, sysdate-hireDate from employees;
--hireDate是员工入职时间,
--sysdate-hireDate,两个日期相见计算天数
          (2)日期函数

                   months_between:俩个日期相差的月数

                   add_months:向指定日期上加上或减去N个月

                   next_day:获取指定时间的下个星期N的日期时间

                   last_day:本月的最后一天

                   round:日期四舍五入

                   trunc:日期截断                  

select months_between(sysdate,hireDate) from employees
--会将sysdate减去hireDate,该函数返回的结果可以是正、负、0

select add_months(sysdate,2),add_months(sysdate,-3),next_day(sysdate,'星期六') from dual;
--next_day下个星期六的日期时间

select last_day(sysdate) from dual;
--查询本月的最后一天

select empName,hireDate from employees
where hireDate = last_day(hire-date)-1;
--查询是每个月倒数第二天入职的员工

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

alter session set NLS_DATE_FORMAT='yyyy-mm-dd'; 
-- 修改当前session的日期格式
      5、转换函数:

         (1)隐式数据类型转换,Oracle自动完成varchar2或char与date或数字之间的转换

                    

         (2)显式数据类型转换

                  * to_char:日期或数字转换 成字符串

                  *to_date:字符串转换成日期

                  *to_number:字符串转换成数字

                  下面是to_char和to_number函数经常使用的几种格式:

                      Oracle学习笔记(二)_第1张图片

select hireDate from employees
where to_char(hireDate,'yyyy-mm-dd') = '1994-7-6'--日期转换成字符串
or to_date('1994-7-7','yyyy-mm-dd') = hireDate--字符串转换成日期

select to_char(123456.89,'999,999,999.99'),to_char(123456.89,'L999,999,999.99'),to_number('$123,456.89','$999,999,999.99')
from dual;
--数字与字符串的转换
--L999,999,999.99:这个是数字转换的格式,可以用9或0

      6、通用函数

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

          NVL(expr1, expr2):滤空函数,不为Null返回本身的值,expr1为Null时返回expr2

          NVL(expr1, expr2, expr3):不为Null返回expr2,expr1为Null时返回expr3

          NULLIF(expr1, expr2):expr1等于expr2返回Null,不等返回expr1

          COALESCE(expr1, expr2, ... exprn):若expr1为Null,则返回expr2,若expr2也为Null则返回exprn

select empName,salary*12*(1+nvl(commission,0))
from employees;
--若commission(奖金)为Null返回0,不为Null就是本身的值

select empName,nvl2(commission,commission*0.015,0.01)
from employees;
--若奖金不为Null返回commission*0.015,为Null返回0.01

select firstName,lastName,nullif(length(firstName),length(lastName))
from employees;
--如果firstName与lastName的长度相等返回Null,不等返回firstName的长度

select empName,coalesce(commission,salary,10)
from employees;
--如果commission为Null,返回salary,若salary也为Null则返回10

      7、条件表达式

           (1) CASE ... WHEN ... THEN ...ELSE ...END

select empName,deptId,
case deptId 
     when 10 then salary * 1.1
     when 20 then salary * 1.2
     else salary * 1.3
end new_salary
from employees
where deptId in(10,20,30);
--查询部门号为10,20,30的员工信息,若部门号为10,则打印其工资的1.1倍
--若部门号20,则打印其工资的1.2倍,若部门号30,则打印其工资的1.3倍
--PS:new_salary 是别名
          (2)DECODE
select empName,deptId,
decode(deptId,
       10,salary * 1.1,
       20,salary * 1.2,
       salary
) new_salary
from employees
where deptId in(10,20,30);
--deptId为10时工资为salary * 1.1,20号部门工资为salary * 1.2,30号部门为salary

二、多行函数

       多行函数是操作数据库表中多条记录返回一条结果。不能在WHERE子句中使用组函数,可以在HAVING子句中使用组函数

      1、组函数

         (1)AVG(平均值)

         (2)COUNT(总数)

                  COUNT(expr):返回expr不为空的记录总数

                  COUNT(DISTINCT expr):返回expr非空且不重复的记录总数

         (3)MAX(最大值)

         (4)MIN(最小值)

         (5)SUM(总和)

       组函数忽略空值,可以使用NVL函数,使组函数无法忽略空值

         max和min里的参数类型可以是number、varchar、date
         avg和sum里的参数类型只能是number
         组函数计算的都是非空的

     2、GROUP BY(分组函数)

        (1)在SELECT中查询的列一定要在group by中出现,而在group by中出现的,在Select中不一定全写上       

        (2)GROUP BY子句中可以按一个列或多个列进行分组,参与分组的多个列有一个不相同就是不同的组,例如按姓名和年龄分组,必须姓名和年龄一致才算一组

       (3)一般如带“每个”关键字的就表示需要进行分组,如:找出每个部门的平均工资,需要按部门进行分组

     3、Having(过滤分组)

       (1)Having,是分完组后再进行过滤,只显示符合条件的结果。
        (2)在Group by与Having中都不可以使用别名。
        (3)Having与Where的区别
                 Having是是分完组后再进行过滤。
                 Where是先过滤,再进行分组操作。
                 不能在WHERE子句中使用组函数,可以在HAVING子句中使用组函数                

                  如果可以,尽量写Where条件,不写Having。

       (4)顺序

              Select...From...Where...

              Group by ...Having...
              Order by...




你可能感兴趣的:(Oracle学习笔记(二))