zoukankan      html  css  js  c++  java
  • Oracle-序列-存储过程-视图-索引-触发器

    1. 课程介绍
    • 1. 约束(掌握)
    • 2. 序列(掌握)
    • 3. 索引(掌握)
    • 4. 视图(掌握)
    • 5. 存储过程(掌握)
    • 6. 自定义函数(掌握)
    • 7. 触发器(掌握)
    1. 数据库对象的命名规则

    1、对象名称必须以字母开头

    2、有效的字符包括数字、字母和三个特殊字符(# _ $)

    3、不要使用oracle的保留字作为对象名称

    4、同一用户下的对象不能同名,即使是不同的对象类型

    5、1-30个字符之间

    1. ALTER TABLE  ddl语句

    3.1.  增加字段,添加外键约束

    ALTER TABLE table

    ADD    (column datatype [DEFAULT expr]

                         [, column datatype]...);

    3.2.  修改字段

    ALTER TABLE table

    MODIFY      (column datatype [DEFAULT expr]

                         [, column datatype]...);

    3.3.  删除字段

    ALTER TABLE table

    DROP  column        (columns);

    1. 约束

    4.1.  主键(唯一+非空),唯一,非空,外键,check(mysql不支持)

    1、NOT NULL  非空

    2、UNIQUE Key       唯一键

    3、PRIMARY KEY    主键(非空且唯一)

    4、FOREIGN KEY     外键

    5、CHECK                 检查

    4.2.  好处

    保存数据之前(jdbc层发出请求,直接在数据库插入)会验证数据是否正确

    只有保存成功,数据就正确

    4.3.  坏处

    影响插入修改的效率

    1. 约束的名称

    5.1.  创建表的时候添加列级约束

    SYS_C005456 由oracle自动取名

    5.2.  创建表的时候添加表级约束

    5.3.  创建表的时候添加表级外键约束

    5.4.  ALTER TABLE增加约束

    5.5.  软件公司怎样使用约束

    一般软件公司在开发阶段都添加约束,系统上线删除约束,从而提供性能

    1. 序列

    6.1.  作用

    处理主键的自动生成

    6.2.  Mysql主键

    自动自增AUTO_INCREMENT,自增的值存储到表的ddl语句

    6.3.  创建序列

    CREATE SEQUENCE [user.]sequence_name
    [increment by n]
    [start with n]
    [maxvalue n|]
    [minvalue n ];
    [cache]

         [NOCYCLE|CYCLE]

         INCREMENT BY: 指定序列号之间的间隔,该值可为正的或负的整数,但不可为0。序列为升序。忽略该子句时,缺省值为1。

         START WITH:指定生成的第一个序列号。在升序时,序列可从比最小值大的值开始,缺省值为序列的最小值。对于降序,序列可由比最大值小的值开始,缺省值为序列的最大值。

         MAXVALUE:指定序列可生成的最大值。

         MINVALUE:指定序列的最小值
              NOCYCLE:一直累加,不循环

         CYCLE:累加到最大值循环

    6.4.  获取主键的并发

    默认序列里面缓存20个,根据情况进行适当修改

    cache:默认值是20

          序列里的缓冲是大量并发提取序列值时提升性能的一种手段

    由于序列操作是原子操作,如果没有缓冲,序列的访问将只能由一个事务独占,独占期间阻塞其它事务的访问,且一定会涉及硬盘操作。这样如果有对一个序列的大量并发操作的话,系统性能将会下降。

    缓冲是指事先成批的提取序列值,缓冲在内存中,供多个事务同时访问(每个事务占一个缓冲的序列值),且访问期间如果没有用尽缓冲是不用写硬盘的,可在大幅度提高并发访问序列的性能。但带来的问题是序列值可能不连续(但肯定保证唯一),如并发访问序列值后有些事务回滚等操作,都会带来缓冲序列值的不连续或丢失

    6.5.  怎样使用序列

    insert into employees_test(id,fullname)

    values (seq_test.nextval,'xxxxxx0000');

    6.6.  建议

    一般一个表对应一个序列

    6.7.  查看用户定义的序列
    select t.sequence_name,t.min_value,t.max_value,

                       t.increment_by  from user_sequences t

    6.8.  修改序列

    alter sequence SEQ_TEST

    cache 50;

    6.9.  删除序列

    DROP SEQUENCE [user.]sequence_name;

    1. 索引

    7.1.  作用

    方案(schema)中的一个数据库对象

    在数据库中用来加速对表的查询

    通过使用快速路径访问方法快速定位数据,减少了磁盘的I/O

    与表独立存放,由 Oracle数据库自动维护

    索引类似于一本书的目录

    7.2.  自动创建的索引

    如果表创建了主键,或者创建唯一约束,自动创建一个唯一索引

    7.3.  哪些值可以创建索引?

    1,外键一般要创建索引

    2,经常使用的查询条件(放到where后面的)要创建索引。

    如果使用like ‘%’操作,有些查询不会使用索引。

    like 'a%  'a_'会使用索引

    like  '%a'不会使用索引,可以通过把'a%'         name=abc      name=cba

    select * from employees where reverse(name) like reverse('%abc');

    like '%a%' 不会使用索引,造成全表扫描,看数据库表的数量的大小,500万以下

    dba:晚上加班,分库(读数据库,写数据库)分表(往年数据变成一张只读表,今年的数据也是一张表)

    3,索引不是越多越好(建立一个索引,使insert速度慢3倍,在加一个在慢2倍)

    4,不要在可选值很少的属性上面创建索引:性别等;

    5、对于那些定义为text, image和bit数据类型的列不应该增加索引

    6、当修改性能远远大于检索性能时,不应该创建索引(分库分表:把往年查询的数据放到一个只读的表空间)

    7.4.  手动创建索引

    在一列或者多列上创建索引.

     CREATE INDEX index

     ON table (column[, column]...);

    7.5.  删除索引

    1. 视图

    视图也就是虚表,实际上视图就是一个命名的查询,用于改变基表数据的显示。

    8.1.  作用

    可以限制对数据的访问

    可以使复杂的查询变的简单

    提供了数据的独立性

    提供了对相同数据的不同显示

    可以提供查询性能,直接运行在数据库服务器

    8.2.  创建视图

    8.3.  行内视图

    行内视图是在SQL语句中使用的一个带有别名的子查询.

    在主查询FROM 子句中的子查询就是行内视图.

    行内视图不是数据库的对象,所以不需要显式的创建.

    1. 表空间

    就算有建表的权限,也不能建表,因为没有使用表空间的权限

    一般来讲,普通用户都是使用USERS表空间,也可以自己创建

    9.1.  默认有那些表空间

    9.2.  逻辑概念

    9.3.  物理概念

    9.4.  表空间的作用

    1.控制数据库占用的磁盘空间;

    2、Dba可以将不同类型的数据对象部署到不同的位置,这样有利于提高i/0性能,并有得于备份和恢复管理;

    9.5.  创建表空间

    表空间包含段,段包含区,区包含块

    Create tablespace ts1 datafile 'd:xxx.xml' size 20m uniform size 128k

    Uniform表示区的大小为128K。

    每个文件有一定的限制,不要超过500M/1G。

    9.6.  建表的时候,指定放置在表空间

    Create table test1(id number(4),name varchar2(50)) tablespace ts1;

    9.7.  授予it拥有ts1的表空间权限

    System登录

    ALTER USER "IT" 

        QUOTA UNLIMITED

        ON "TS1"

    9.8.  疯狂复制

    9.9.  扩容表空间

    9.9.1.   增加新的数据文件    原文件已经500M/1G

    Alter tablespace ts1 add datafile 'd:data0102.dat' size 20m;

    9.9.2.   增加已有的数据文件

    Alter database datafile 'd:xxx.xml' resize 50m;

    9.9.3.   自动扩展

    ALTER DATABASE

        DATAFILE 'D:TESTDATA1.DBF' AUTOEXTEND

    ON NEXT  512K MAXSIZE  1024M

    9.10.         如果原来存储的位置,空间不够

    先移动XXX.XML移动到其他有空间盘

    9.10.1.        脱机

    Alter tablespace ts1 offline;

    9.10.2.        剪切到其他有空间盘

    Ctrl+x  Ctrl+v

    9.10.3.        修改存储位置

    ALTER DATABASE

    RENAME FILE 'D:XXX.XML' TO 'e:XXX.XML'

    9.10.4.        联机

    Alter tablespace ts1 online;

    9.10.5.        扩容

    ALTER DATABASE

        DATAFILE 'E:XXX.XML' AUTOEXTEND

    ON NEXT  20M MAXSIZE  1024M;

    1. 存储过程

    10.1.         为什么需要存储过程-提高性能

    转账业务:在同一个银行之间进行转账

    2个账户,没有被冻结,是否有余额

    A.2个账户是否存在   2条select语句

    B.是否被冻结         就用上面

    C.是否有余额         就用上面

    D.转账               2条update语句

    Jdbc:建立连接,实例化语句,发出sql,关闭资源  跑4次

    把上面的所有业务逻辑,在数据库里面相当于封装到一个方法,存储过程

    步骤A:

    在存储过程发出2条sql,

    把sql语句的结果加入一个数据库的游标对象CURSOR(类似于java.sql.ResultSet)里面

    如果能够遍历游标对象,跳到步骤B

    否:返回账户不存在

    步骤B:

    发出2个update请求,进行转账

    Jdbc:建立连接,实例化语句,发出sql,关闭资源  跑1次

    10.2.         创建存储过程语法

    10.3.         创建一个没有返回值的存储过程

    10.4.         创建一个有返回值的存储过程

    有返回值的存储在命令窗体不能执行

    10.5.         Java调用存储过程

     

    1. 自定义函数(必须要有返回值)

    11.1.         语法

    11.2.         自定义函数里面不能写dml语句

    函数中不允许DML语句

    形参必须为IN

    11.3.         Java调用函数

    1. 触发器

    监控如果发出了insert语句或者update、delete语句,触发一个事情

    12.1.         分类

    12.2.         语句级触发器

    一个dml语句,只触发一次

    12.3.         行级触发器

    一个dml语句,可以触发多次

    Update 更新,delete 删除 12行,触发12次

    12.4.         模式触发器

    当前用户受限制:必须先删除模式触发器

    system管理员不受限制

    1. 见多识广800条sql

    13.1.         子查询分类

    如果子查询里面需要用到主查询的表进行关联查询,就叫相关子查询

    13.1.1.        相关子查询

    子查询不能单独执行

    Select * from table1 a

    Where salary >(select avg(salary) from  table b where a.xxid=b.id)

    13.1.2.        无关子查询

    子查询可以单独执行

    Select * from table

    Where salary >(select avg(salary) from  table)

    13.2.         神奇函数

    13.3.         横向汇总和纵向汇总

    1. 课程总结

    14.1.         重点

    1. 约束
    2. 序列
    3. 索引
    4. 视图
    5. 存储过程
    6. 触发器
    7. 自定义函数
  • 相关阅读:
    java基础(二):补充
    java基础(二):变量和数据类型
    C基础系列(一)
    java基础(一)
    循环小数(Repeating Decimals)
    DNA序列(DNA Consensus String)
    sqlserver~创建函数
    docker简介和安装
    JMeter(6)、实现Java请求
    JMeter(5)、测试数据库
  • 原文地址:https://www.cnblogs.com/Src-z/p/11218889.html
Copyright © 2011-2022 走看看