zoukankan      html  css  js  c++  java
  • Oracle笔记(十二) 集合、序列

    Oracle笔记(十二) 集合、序列

    一、集合

    在数学的操作之中存在交、差、并、补的概念,而在数据的查询中也存在此概念,有如下几个连接符号:

    • UNION连接两个查询,相同的部分不显示;
    • UNION ALL连接两个查询,相同的部分显示;
    • INTERSECT返回两个查询中的相同部分;
    • MINUS返回两个查询中的不同部分;

    为了验证以上的操作,下面创建一张只包含20部门雇员信息的表:

    CREATE TABLE emp20 AS SELECT * FROM emp WHERE deptno=20;

    范例:验证UNION

    SELECT * FROM emp
      UNION
    SELECT * FROM emp20;

    范例:验证UNION ALL

    SELECT * FROM emp
      UNION ALL
    SELECT * FROM emp20;

    范例:验证INTERSECT

    SELECT * FROM emp
      INTERSECT
    SELECT * FROM emp20;

    范例:验证MINUS

    SELECT * FROM emp
      MINUS
    SELECT * FROM emp20;

    在之前讲解分组的时候曾经留过一道未完成的题目:所有领取奖金的人求出平均工资,所有不领取奖金的人求出平均工资,当时的实现代码如下:

    SELECT comm,AVG(sal)
    FROM emp
    GROUP BY comm;

    这种问题下只能依靠查询的连接操作,准备两个查询:

    • 第一个查询负责查询出所有领取奖金的雇员平均工资;
    • 第二个查询负责查询出所有不领取奖金的雇员平均工资;
    SELECT 'UNCOMM',AVG(sal) FROM emp WHERE comm IS NULL
      UNION
    SELECT 'COMM',AVG(sal) FROM emp WHERE comm IS NOT NULL;

    对于这种连接查询,只需要清楚其概念即可。

    二、序列

    在许多的数据表之中都存在一种称为自动增长列的操作,但是在Oracle之中,这种自动增长列并不是自动控制的,而是需要用户手工的控制,这样做主要是为了开发方便,创建序列的语法如下:

    CREATE SEQUENCE sequence
     
    [INCREMENT BY n] [START WITH n]
     
    [{MAXVALUE n|NOMAXVALUE}]
     
    [{MINVALUE n|NOMINVALUE}]
     
    [{CYCLE|NOCYCLE}]
     
    [{CACHE n|NOCACHE}];

    范例:创建序列

    CREATE SEQUENCE myseq;

    当一个序列创建完成之后 ,可以通过以下两种方式访问序列:

    • 序列名称.nextval:让序列增长到下一个内容;
    • 序列名称.currval:取得当前序列的内容;

    范例:验证序列的操作

    SELECT myseq.currval FROM dual;

    可是直接执行上面的程序会发出如下的错误提示:“ORA-08002: 序列 MYSEQ.CURRVAL 尚未在此会话中定义”

    在Oracle之中如果要想操作currval,则首先必须使用nextval;

    SELECT myseq.nextval FROM dual;
    SELECT myseq.currval FROM dual;

    序列一般都作为主键使用,例如,下面定义一张表:

    DROP TABLE mytab PURGE;
    CREATE TABLE mytab (
        id NUMBER PRIMARY KEY,
        name VARCHAR2(20) NOT NULL
    );

    现在向mytab表中增加数据:

    INSERT INTO mytab(id,name) VALUES(myseq.nextval,'姓名');

    一定要记住,这个过程都是由用户自己手工进行的,不能自动完成。

    在默认情况下,序列从0开始,每次增长1,那么现在也可以修改;

    范例:创建序列,从10开始,每次增长2

    DROP SEQUENCE myseq;
    CREATE SEQUENCE myseq INCREMENT BY 2 START WITH 10;

    范例:希望定义一个序列,这个序列可以在1、3、5、7、9之间循环出现;

    DROP SEQUENCE myseq;
    CREATE SEQUENCE myseq INCREMENT BY 2 START WITH 1 MAXVALUE 10 MINVALUE 1 CYCLE NOCACHE;

    关于序列中的CACHE解释:

          在Oracle数据库之中,由于序列被经常使用到,所以Oracle为了揽性能,将序列的操作形式做了如下的处理。

          准备了一块空间,这个空间之中,为用户准备好了若干个已经生成好的序列,每次操作的时候都是从这块空间之中取出序列的内容,但是这样有一个问题,如果现在数据库的实例关闭了,那么保存在这块空间中的内容就有可能消失了,但是虽然消失了,可是数据库已经增长好了,这样就会出现跳号的事情,而如果要想取消掉这种问题,则最好的方式是将序列设置为不缓存,使用NOCACHE声明。

     

  • 相关阅读:
    Django学习笔记(16)——扩展Django自带User模型,实现用户注册与登录
    Django学习笔记(15)——中间件
    JAVA—API和SPI概念
    mybatis 映射器(mappers) 配置说明 加载映射文件方式
    Java的三种代理模式
    如何选择分布式事务形态(TCC,SAGA,2PC,补偿,基于消息最终一致性等等)
    什么是分布式系统中的幂等性
    js date 前一天
    getCanonicalFile与getAbsoluteFile区别
    Mybatis 示例之 SelectKey
  • 原文地址:https://www.cnblogs.com/liuyangv/p/7816469.html
Copyright © 2011-2022 走看看