初识数据库(函数)

函数

  --单行函数

    --函数: 能够接收参数,完成某些计算,并且返回结果

    --测试表: dual

    select * from dual

  --字符串函数

    --大小写转换函数

    --将 'I Love sql' 转换成大写、小写、首字母大写

    select UPPER('I Love sql'),lower('I Love sql'),initcap('I Love sql') from dual

  --字符串拼接

    -- 将 'I','Love','sql'连接到一起

    select 'I '||'Love '||'sql' from dual

    select concat (concat('I ','Love '),'sql') from dual

  --截取函数: substr(源字符串,m[,n])

    --m : 从源字符串的第几位开始截取

     --n :  从截取开始位置截取几位

    select substr('I Love sql',3,4) from dual

    select substr('I Love sql',-5) from dual

    select substr('I Love sql',-5,3) from dual

  --查询emp表中职位是以'MAN'结尾的员工信息

    select * from emp where substr(job,-3) = 'MAN'

  --查询首字母是'K'的员工信息

    select * from emp where substr(ename,1,1) = 'K'

  --字符串长度函数: length(p1)

    --返回'I Love sql'长度

    select length('I Love sql') from dual

  --返回子串在源字符串中的位置 : instr(源字符串,子串[ , m , [n] ] )

    --m: 从第几位开始查起

    --n:  第几次出现的下标位置

    select instr('I Love sql','L') from dual

    select instr('I Love sqL','L',4,1) from dual

    select instr('I Love sqL','L',1,2) from dual

    instr('192.168.101.123')

  --查询emp表中 员工名字至少含有一个'E'的员工

    select * from emp

    where instr(ename,'E',1,1) != 0

  --填充函数: LPAD() - 左侧填充、RPAD() - 右侧填充

    --LPAD(源字符串,m,子串)、RPAD(源字符串,m,子串)

    select lpad('abc',10,'*') from dual

  --查询员工的工资,1000,显示一个* ,2000,显示两个*

    select ename, lpad('*',sal/1000,'*')

    from emp

  --去掉函数: trim(字符 from 源字符串)

    --将源字符串头尾两端的字符去掉

    select trim('L' from 'LEVEL') from dual  --默认both

    select trim(leading'L' from 'LEVEL') from dual

    select trim(trailing'L' from 'LEVEL') from dual

    select trim(both'L' from 'LEVEL') from dual

  --替换函数

    --replace(源字符串,查找字符串,替换字符串)

    --将源字符串中的所有查找的字符串替换成替换字符串

    --将'I Love sql'中的'sql'替换成oracle

    select replace('I Love sql','ql','oracle') from dual

  --数字函数

    --四舍五入 : round(数据源,位数)

    select round(657.36,1) from dual

    select round(657.36,0) from dual

    select round(657.36,-1) from dual

  --截断函数 : trunc(数据源,位数)

    select trunc(657.32,1) from dual

    select trunc(657.32,-1) from dual

  --取余 mod(m,n)

    select mod(10,3) from dual

  --绝对值 abs(m)

    select abs(-5.2) from dual

  --日期函数

    --sysdate : 返回当前系统的时间,没有参数,不需要括号

    select sysdate from dual

  --months_between(p1,p2) 返回两个日期之前相差多少个月

    --查询emp表中所有员工工作了多少个月

    select months_between(sysdate,hiredate) from emp

    select months_between(hiredate,sysdate) from emp

  --计算自己的年龄

    select trunc(months_between(sysdate,'10-2月-1987')/12,2)

    from dual

  --add_months(指定的日期,n) 返回指定日期加 n个月的日期

    --计算emp表中每一个员工转正日期

    select add_months(hiredate,3) from emp

    --注意: 如果给定日期是某个月的最后一天,其结果也是这个月的最后一天

  --返回给定日期后七天内的星期几: next_day(给定日期,'星期几')

    select next_day(sysdate,'星期二') from dual

  --返回给定日期的当月的最后一天

    --last_day(给定日期)

    select last_day(sysdate) from dual

类型转换

  --隐式转换 

    select * from emp where deptno = '10'

    select * from emp where deptno = 10

  --显式转换

    --可以确保sql语句的正确性

    --利用oracle 给提供的转换函数,把对应的数据类型进行转换

  --to_char(日期|数字, 'fmt') 字符串转换函数

    --查询当前系统的日期,格式2016-03-22,星期二

    select to_char(sysdate,'yyyy-mm-dd dy') from dual

  --查询当前系统的时间,格式 :时间格式 时:分:秒

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

  --查询当前系统时间

    --格式: xxxx年xx月xx日

    select to_char(sysdate,'yyyy"年"mm"月"dd"日"') from dual

  --数字转换成字符串

    --查询员工表中King的工资,格式要求以人民币的格式进行显示

    select to_char(sal,'L99,999.99') from emp where ename = 'KING'

  --查询emp表中在1980年12月17日入职的员工

    select * from emp where hiredate = to_date('1980-12-17','yyyy-mm-dd')

 

  select to_number('123') from dual

 

  --空值转换函数

    --1、nvl(p1,p2) 如果p1不为null, 则返回p1, 否则返回p2

      --查询员工表中,员工姓名,工资,年薪

      select ename,sal,sal*12+nvl(comm,0)

      from emp

    --2、nvl2(p1,p2,p3) 如果p1不为null, 则返回p2,否则返回p3

      select ename,sal,sal*12+nvl2(comm,comm,0)

      from emp

    --3、coalesce(p1,p2,p3,p4……) 返回第一个不为null的参数值

      select ename,sal,coalesce(sal+comm,sal,0)*12

      from emp

  --case 表达式

    --语法结构

    case 列 |表达式

     when 值1 then 返回值1

     when 值2 then 返回值2

     when 值3 then 返回值3

     when 值4 then 返回值4

     ... ...

     when 值n then 返回值n

     else 默认返回值

     end

  --需求: 查询员工表中 10部门下的员工信息,要求职位用中文输出

    select ename,job,(case job

        when 'CLERK' then '办事员'

        when 'SALESMAN' then '经理'

        when 'PRESIDENT' then '董事长'

          else '员工'

         end)

    from emp where deptno = '10'

  --decode 表达式

    语法结构

    默认返回值

    --decode(列 |表达式,值1,返回值,值2,返回值……,返回值n)

    select ename,job,decode(job,'CLERK','办事员','SALESMAN','经理','PRESIDENT','董事长','员工')

    from emp where deptno = '10'

多表查询

  --将多张表联合到一起进行查询

  --需要将表与表连接起来

  --将连接条件写到 from子句后面

  --查询emp表中 员工姓名,部门编号,以及部门名称

    select *

    from emp,dept

  --如果将两张表简单的连接起来,此时会产生笛卡尔积

  --为两张表创建关联字段,给与关联条件

  --关联字段 -> 侠义角度: 两个字段列名相同,数据类型相同,内容都在同一个范围里

  --广义角度: 两个列要有相同的意义

    select * from dept

 

    select ename,e.deptno

    from emp e,dept d

    where e.deptno = d.deptno

 

  --多表关联中

    --1、等值连接: 两个表的公共字段用 = 进行连接

    --2、不等值连接: 两个表的公共字段不用 = 进行连接

    --查询 员工姓名、工资、以及工资等级

     select ename, sal,grade

    from emp e,salgrade s

    where e.sal between s.losal and s.hisal

 

  --查询emp表中部门号 是 30 的员工姓名、工资、部门编号、以及工资等级、部门名称

    select e.ename,e.sal,e.deptno,s.grade,d.dname

    from emp e,dept d,salgrade s

    where e.deptno = d.deptno

    and e.sal between s.losal and s.hisal

    --注意 n个表进行连接时,至少需要 (n-1) 个条件,否则就会出现笛卡尔积

 

  --3、外连接: 用符号(+)做连接

    --(+)永远写在缺乏表的一端

    --如果要查询哪一张表的信息,对应的另外一张表就是缺乏表

    --查询各部门有哪些员工,即使这些部门没有员工

    select e.empno,e.deptno,d.dname

    from emp e,dept d

    where e.deptno (+)= d.deptno

    order by e.deptno

  --查询员工信息,即使这个员工没有部门

    select e.empno,e.deptno,d.dname

    from emp e,dept d

    where e.deptno = d.deptno(+)

    order by e.deptno

 

  --4、自连接 : 查询结果和查询条件都需要在同一张表中

    --查询员工表中和SMITH是同一部门的员工,不包含SMITH

    select e1.ename,e1.deptno

    from emp e1,emp e2 

    where e1.deptno = e2.deptno

    and e2.ename = 'SMITH'

    and e1.ename <> 'SMITH'

SQL99连接语法

  --1、CROSS JOIN : 交叉连接,生成笛卡尔积

    --查询员工表和部门表

    select emp.*,dept.*

    from emp cross join dept

   --2、natural join : 自然连接

    --用于连接两个具有相同列名以及相同类型的表

    --查询员工表和部门表

    select ename,dname

    from emp natural join dept

  --3、using 字节连接,需要写条件

    --查询员工表和部门表

    select *

    from emp join dept using(deptno)

  --4、on 子句连接,指定连接条件

    --查询员工表和部门表

    select *

    from emp join dept on(emp.deptno = dept.deptno)

  --5、left outer join : 左外连接,也称为左连接

    --显示查询结果,左边表的全部,和右边表符合条件的数据

    select *

    from emp left outer join dept

    on(emp.deptno = dept.deptno)

  --6、right outer join : 右外连接,也称为右连接

    --显示查询结果,右边表的全部,和左边表符合条件的数据

    select *

    from emp right outer join dept

    on(emp.deptno = dept.deptno)

  --7、full outer join : 全外连接

    --两个表的数据都显示出来

    select *

    from emp full outer join dept

    on(emp.deptno = dept.deptno)

  --8、inner join : 内连接,两个表中有匹配的数据显示出来

    select *

    from emp inner join dept

    on(emp.deptno = dept.deptno)

posted @ 2016-08-23 13:39  奔跑的咖啡豆  阅读(302)  评论(0编辑  收藏  举报