zoukankan      html  css  js  c++  java
  • 数据库——Oracle(7)

    1 索引(二):索引是用来提高查询的效率。
      索引的优点和缺点:
      优点:索引可以提高查询的速度。
      缺点:创建索引会占用磁盘物理空间,而且添加索引,会减慢修改(insert,update,delete)数据速度。

    2 Oracle中专门用来执行外链接操作的SQL语句(仅限于Oracle中使用)
      1)内连接:只查询表中有关联关系的数据。
        案例:查询emp表中员工的编号,姓名,职位,上级领导的编号,姓名,职位,最后根据员工的编号进行降序排列
          select e.empno,e.ename,e.job,e.mgr,m.ename,m.job
          from emp e,emp m --e,员工表;m,领导表
          where e.mgr = m.empno
          order by e.empno desc
      2)外连接:在查询的时候可以以某一张表为主,查询该表中所有的数据,以及与之关联另外一张或者多张表中数据(常见)
        insert into emp(empno,ename) values(1111,'刘备')
        insert into emp(empno,ename) values(5555,'关羽')
        insert into emp(empno,ename) values(6666,'张飞')
        insert into dept values(50,'研发部门','北京')
        insert into dept values(60,'人事部门','上海')

        select e.empno,e.ename,e.hiredate,d.deptno,d.dname
        from emp e,dept d
        where e.deptno = d.deptno

      3) 在关联条件的位置(在要查询所有数据的条件的表的对面)使用(+)
        案例:查询emp表中所有员工的编号,姓名,职位,工资以及所属部门的编号,名称
          select e.empno,e.ename,e.job,e.sal,d.deptno,d.dname
          from emp e,dept d
          where e.deptno = d.deptno(+)
        案例:查询dept表中所有部门的所有信息以及该部门下员工的编号,姓名,职位,工资,入职时间,最后根据员工的入职时间进行降序排列。
          select d.*,e.empno,e.ename,e.job,e.sal,e.hiredate
          from dept d,emp e
          where d.deptno = e.deptno(+)
          order by hiredate desc
        案例:查询emp表中名字中不包含'S'的所有员工的编号,姓名,职位,工资以及该部门的名字和地址,最后根据员工的编号进行升序排列
          select e.empno,e.ename,e.job,e.sal,d.dname,d.loc
          from emp e,dept d
          where e.deptno = d.deptno(+) and e.ename not like '%S%'
          order by e.empno

        案例:查询emp表中所有员工的编号,姓名,工资,职位以及该工资的等级,该等级的最低工资,最后根据员工的编号进行升序排列。
          select e.empno,e.ename,e.sal,e.job,s.grade,s.losal
          from emp e,salgrade s
          where e.sal between s.losal(+) and s.hisal(+)
          order by e.empno asc
          select e.empno,e.ename,e.sal,e.job,s.grade,s.losal
          from emp e,salgrade s
          where e.sal >= s.losal(+) and e.sal <=s.hisal(+)
          order by e.empno asc
        案例:查询emp表中职业不是MANAGER和SALESMAN的所有员工的编号,姓名,职位,工资以及工资等级
          select e.empno,e.ename,e.job,e.sal,s.grade
          from emp e,salgrade s
          where e.sal between s.losal(+) and s.hisal(+) and e.job not in('MANAGER','SALESMAN')
        案例:查询emp表中所有员工的编号,姓名,职位,工资以及对应上级经理的编号,姓名,职位,工资,最后员工的编号进行降序排列。
          select e.empno,e.ename,e.job,e.sal,m.empno,m.ename,m.job,m.sal
          from emp e,emp m -- e,员工表;m,领导表
          where e.mgr = m.empno(+)
          order by e.empno desc

      4) 不能在关联条件的两端都加上(+),仅仅只能在一端加上(+)
        --反例
          select e.*,d.*
          from emp e,dept d
          where e.deptno(+) = d.deptno(+)
      5) 使用(+)实现外链接,只能在Oracle中使用。

    3 序列:Oracle中的一个数据库对象,可以通过序列自动的生成自增的数值,经常使用序列生成的数值作为主键所修饰的列的列值。
      1)创建序列:
        create sequence 序列名
        create sequence id_seq1
      2)nextval:第1次使用nextval生成数值默认的初始值,从第2次开始每次自增。
        select id_seq1.nextval from dual
        案例:创建一张表worker15,id number(4)主键,name varchar2(50)。创建一个序列id_seq2。往worker15表中插入任意的3条数据,使用id_seq2.nextval生成数值作为主键所在的列的列值。
          insert into worker15 values(id_seq2.nextval,'张三')
            create table worker15(
            id number(4) primary key,
            name varchar2(50)
          )
          create sequence id_seq2
          insert into worker15 values(id_seq2.nextval,'李世民')
          insert into worker15 values(id_seq2.nextval,'李靖')
          insert into worker15 values(id_seq2.nextval,'苏定方')

      3)currval:返回序列当前的值
        select id_seq2.nextval from dual
        select id_seq2.currval from dual

      4)序列的几个属性
        a)序列的初始值:第1次使用nextval生成数值

          start with 初始值,如果不设置初始值,默认的初始值是1。
        b)增长的步长:每次使用nextval的增量
          increment by 增量
        c)序列的最小值:
          minvalue 最小值
        d)序列的最大值:
          maxvalue 最大值

          create sequence id_seq3
          start with 1000
          increment by 100
          minvalue 1
          maxvalue 100000000000

          select id_seq3.nextval from dual


    4 事务:对数据库一系列连续的操作都封装在一起(一个事务内),要么一起成功,要么一起失败。
      1)commit和rollback
        create table worker16(
          id number(4) primary key,
          name varchar2(20),
          age number(3)
        );
        insert into worker16 values(1,'张无忌',23);
        insert into worker16 values(2,'任我行',32);
        insert into worker16 values(3,'杨过',19);

        commit:提交,确认表中的数据真实发生改变,在Oracle中只有提交事务以后,表中的数据才可以真实被修改(数据在底层真正被修改)
        rollback:回退(回滚),撤销未提交(没有commit)的操作

        insert into worker16 values(4,'郭靖',31);
        insert into worker16 values(5,'黄蓉',35);
        insert into worker16 values(6,'周芷若',21);

      2) 为什么需要使用事务(把一系列连续对数据库的操作封装在一起)?
        银行表
        编号 姓名 余额
        1 大哥 99999999999999999999999.99
        2 范冰冰 100.1
        1号转给2号100
        第1步:从1号账户减去100
          update 银行表 set 余额 = 余额 - 100
          where 编号 = 1

        停电了

        第2步:给2号账户加上100
          update 银行表 set 余额 = 余额 + 100
          where 编号 = 2
          commit
      总结:把加钱和减钱的操作封装在一个事务内,要么一起成功,要么一起失败。

    5 标准SQL外连接(可以在任何一款数据库中使用)
      1)左外连接查询:以左边的表为主,查询左表中所有的数据以及与之关联的右表中的数据
        格式:
          select 别名1.*/列名,别名2.*/列名
          from 左表 别名1 left (outer) join 右表 别名2
          on 关联条件
        案例:查询emp表中所有员工的编号,姓名,职位,工资以及所属部门的编号,名称
          select e.empno,e.ename,e.job,e.sal,d.deptno,d.dname
          from emp e left outer join dept d
          on e.deptno = d.deptno
        案例:查询dept表中所有部门的编号,名称以及该部门下员工的编号,姓名,职位,入职时间,最后根据入职时间进行降序排列
          select d.deptno,d.dname,e.empno,e.ename,e.job,e.hiredate
          from dept d left join emp e on d.deptno = e.deptno
          order by e.hiredate desc
        案例:查询emp表中所有员工的编号,姓名,职位,工资以及工资的等级,最后根据工资的等级进行升序排列。
          select e.empno,e.ename,e.job,e.sal,s.grade
          from emp e left join salgrade s on e.sal between s.losal and s.hisal
          order by s.grade
        案例:查询emp表中所有员工的编号,姓名,工资以及上级领导的编号,姓名,工资,最后根据员工的编号进行降序排列
          select e.empno,e.ename,e.sal,m.empno,m.ename,m.sal
          from emp e left join emp m on e.mgr = m.empno
          order by e.empno desc
        案例:查询emp表中名字中没有字母'K'的所有员工的编号,姓名,职位以及所在部门的编号,名称
          select e.empno,e.ename,e.job,d.deptno,d.dname
          from emp e left join dept d on e.deptno = d.deptno
          where e.ename not like '%K%'
      2) 右外连接查询:以右表为主,查询右表中所有的数据以及与之关联的左表中的数据
        格式:
          select 别名1.*/列名,别名2.*/列名
          from 左表 别名1 right (outer) join 右表 别名2 on 关联条件
        案例:查询dept表中所有部门的所有信息,以及与之关联的emp表中员工的编号,姓名,职位,工资
          select d.*,e.empno,e.ename,e.job,e.sal
          from emp e right join dept d on e.deptno = d.deptno
        案例:查询emp表中所有员工的编号,姓名,职位,工资以及该工资的等级和该等级的最高工资,最后根据员工的编号进行降序排列
          select e.empno,e.ename,e.job,e.sal,s.grade,s.hisal
          from salgrade s right join emp e on e.sal between s.losal and s.hisal
          order by e.empno desc
        案例:查询emp表中名字中不包含字母‘T’的所有员工的编号,姓名,工资,入职时间以及上级领导的编号,姓名,最后根据员工的编号进行升序排列
          select e.empno,e.ename,e.sal,e.hiredate,m.empno,m.ename
          from emp m right join emp e on m.empno = e.mgr
          where e.ename not like '%T%'
          order by e.empno asc
        案例:查询emp表中不是12月入职的所有员工的编号,姓名,职位,入职时间,工资,以及工资等级,最后根据入职时间进行降序排列,to_char(hiredate,'mm') = '12'

          select e.empno,e.ename,e.job,e.hiredate,e.sal,s.grade
          from salgrade s right join emp e on e.sal between s.losal and s.hisal
          where to_char(e.hiredate,'mm') != '12'
          order by e.hiredate desc
        案例:查询emp表中不在10号部门的所有员工的编号,姓名,职位,入职时间以及所在部门的所有信息
          select e.empno,e.ename,e.job,e.hiredate,d.*
          from dept d right join emp e
          on d.deptno = e.deptno
          where e.deptno <> 10

  • 相关阅读:
    20111013 18:32 女友刁钻无聊问题之标准答案
    20111013 17:40 学ACM有什么用
    typedef用法(1)
    深入C++的new(20111115 15:08 )
    用四个0算二十四点
    20111010 20:14 HDU 4021 (15数码)
    pku3020 Antenna Placement (解法1)
    C++箴言:理解typename的两个含义
    20110907 00:16 ubuntu 如何修改当前用户名
    vc6.0中添加msdn 20111105 11:52
  • 原文地址:https://www.cnblogs.com/KalosOwen/p/8570553.html
Copyright © 2011-2022 走看看