Oracle数据库之第三篇

2019-10-05  本文已影响0人  小小一技术驿站
/*
   起别名使用双引号  处理特殊字符使用
   数据库里的字符串都是使用单引号
    */
    /*
       DDL语句  是数据定义语言 使用语句创建数据库的对象
       表空间  是实例分配的一块空间 用于开发使用
       创建语法:  create tablespace 表空间名
                   datafile 文件的路径
                   size  文件大小
                   autoextend on
                   next 扩展大小
    */
    --演示表空间创建  需要使用管理员操作
    create tablespace baidu
    datafile 'c:\baidu.dbf'---linux系统 
    size 100m
    autoextend on
    next 10m
    ---------------------------------
    /*
      开发使用管理员创建分配的用户
      用户的创建
         create  user 用户名
         identified by 密码
         default tablespace 表空间名
         
    */
    ---创建用户  
    create user baidu
    identified by baidu
    default tablespace baidu
    --创建完成用户 登陆测试 缺少权限
    /*
      授权语法:
         grant 权限 to  用户
      权限的分类
         connect   连接的权限可以连接数据库
         resource  高级一点的权限 可以建表
         dba       最高级的权限 相当于管理员
    */
    ---授权connect给baidu用户 测试登陆
    grant connect to baidu
    --授予dba权限 
    grant dba to baidu
    ------
    create table p(
           pid number(9),
           pname varchar(10)
    )
    ---------------------------------------------------------------
    ---plsql developer 图形化工具  instanclient
    /*
      对表结构的设计
         表中含有多少个字段 根据需求来
         表中字段都是什么数据类型
         主键外键  约束
         
         数据类型
            数值类型
               int  double  bigint  --mySql支持的数据类型
               number(16,v2) v1是数值的总长度  v2是数值的小数位数 默认为0
                      number(6,2)---9999.99 
            字符类型
               char()     --固定长度的字符类型 char(20) zs
                          实际长度是 2 占用空间 20个长度
               varchar()  --可变长度的字符类型 varchar(20) zs 张三 utf8 6 gbk 4
                          实际长度是 2 占用空间 2个长度
               varchar2() --可变长度的字符类型 varchar(20) zs 张三 utf8 6 gbk 4
                          实际长度是 2 占用空间 2个长度  推荐使用
            日期类型
               date       mySql格式  yyyy-mm-dd  
                          oracle 格式 yyyy-mm-dd hh:mi:ss 
                          
               datetime   mySql格式  yyyy-mm-dd  hh:mi:ss 
                          oracle 格式 yyyy-mm-dd hh:mi:ss 精确到后面的9位纳秒
                          
            大文本类型  
                        clob  字符类型大文本 最大支持4G的长度
                              数据库存放网页的源代码
                        
                        blob  二进制类型大文本  最大支持4G的长度
                        
                        long  长文本 最大支持2g的长度
                                 
    */
    /*
      约束
         主键约束 primary key  非空加唯一
         外键约束 foreign key  
         唯一约束 unique       唯一
         非空约束 not null     非空
         检查约束 check (gender in (0,1))  判断数值是否违反表达式 
      手动使用关键字指定约束  constraint 约束名称  约束类型(列)
    */
    ---使用数据类型和约束建表操作
    create table person(

           pid number(11) ,
           pname varchar2(11) not null,
           phone varchar2(11) unique,
           gender number(1) check (gender in (0,1)),
           constraint pk_person_pid primary key(pid)             
    )
    ---插入数据测试约束  oracel事务必须手动选择提交或者回滚
    insert into person values(1,'zs','11122223333',1);
    insert into person values(1,'zs','11122223333',1);--违反主键约束
    insert into person values(2,'zs','11122223333',1);--违反唯一约束
    insert into person values(2,'zs','11122224444',1);
    insert into person values(3,null,'11122225555',1);--违反非空约束
    insert into person values(3,'','11122225555',1);  --空串违反非空约束
    insert into person values(3,' ','11122225555',1);
    insert into person values(4,'zs','11122226666',3);--违反检查约束
    insert into person values(4,'zs','11122226666',0);
    commit;
    /*
      表结构的修改
        增加一列  alter table 表名 add(列名 数值类型)
        修改一列  alter table 表名 modify(列名 数值类型)
        重命名列  alter table 表名 rename column 旧列名 to 新列名
        删除一列  alter table 表名 drop column 列名
    */
    --给person表增加地址一列
    alter table person add(address varchar2(20));
    --修改address为char 类型 10个长度
    alter table person modify(address char(10));
    alter table person modify(pname number(11));  --列如有有数据不可以修改类型 报错
    --重命名gender性别为sex
    alter table person rename column gender to sex 
    --删除地址address
    alter table person drop column  address
    /*
       DML语句 数据操作语言 对表中数据做增删改
           插入数据  insert into 表名 values(.....)
                     insert into person values(1,'zs',1); --不能插入 列数量不匹配
                     insert into person(pid,pname,sex) values(1,'zs',1); --指定列名插入数据
           修改数据
                     update 表名 set 列名=值 where 条件 修改满足条件的记录
           删除数据
                     delete from 表名  where 条件 删除匹配的数据
                     
                     delete from 表名  删除所有记录  一条条删除
                                       效率低 可以加条件
                     truncate table 表名 摧毁表结构 再重建表结构
                                     效率高  不能加条件
    */
    --想使用emp表的数据做测试
    select  * from emp;  
    --创建表的同时拷贝表的数据  scott用户下的emp
    create table emp  as select * from scott.emp;
    --修改SMITH用户更改名称为SSSS
    update emp set ename='SSSS' where ename='SMITH';
    commit;
    /*
      存在主外键的情况下 直接删除主表的记录
       一、     1.先删除从表记录
                2.再删除主表记录
       二、级联删除  on delete  cascade
       三、直接删除主表
       
    */
    --创建主表订单 orders表
    create table orders(
           oid number(11) primary key,
           oname varchar2(11) ,
           oprice number(6,2)
    )
    --创建字表订单明细表 order_detail
    create table order_detail(
           detail_id number(11) primary key,
           detail_name varchar2(11) ,
           detail_price number(6,2),
           oid number(11),
           constraint fk_detail_oid foreign key(oid) references orders(oid)
                               -- on delete cascade
    )
    --插入主表和从表的记录
    insert into orders values(1,'订单1',1000);
    --insert into order_detail values(1,'订单1',1000,2);--违反外键约束
    insert into order_detail values(1,'订单1',1000,1);
    commit;
    ----
    select * from orders;
    select * from order_detail;
    ----直接删除主表记录测试
    delete from orders where oid=1;
    delete from order_detail where detail_id = 1;
    commit;
    drop table order_detail;
    --直接删除主表 强制删除  不建议使用
    drop table orders  cascade constraint

    /*
      事务 作为一个逻辑操作单元 执行的任务全部成功,或者全部失败
          特性:ACID (原子性 持久性 隔离性 一致性)
          没有隔离级别  脏读 幻读 不可重复读
          调整隔离级别
              oracel数据库隔离级别 READ COMMITED ,SERIALIZABLE,READ ONLY
              默认隔离级别是READ COMMITED
      事务的保存点:
          事务保存点的概念: 保存起执行成功的任务
             意义:可以保证执行成功的任务正常提交
          使用方法:
             声明事务保存点 savepoin 保存点名
             出现错误回滚到保存点  rollback to 保存点
             再继续提交     commit
       spring管理事务 在servie层切入点 
                  
    */
    declare
       
    begin
      insert into orders values(1,'订单1',1000);
      insert into orders values(2,'订单1',1000);
      insert into orders values(3,'订单1',1000);
      insert into orders values(4,'订单1',1000);
      insert into orders values(5,'订单1',1000);
      savepoint s1; --声明保存点
      insert into orders values(6,'订单1',1000);
      insert into order_detail values(1,'订单1',1000,100);
      commit;
    exception
      when others then
        rollback to s1;
        commit;
    end;

    /*
     数据库其余对象  
        视图 是一个虚拟的表 不存放数据 数据来源为原始表
            意义是: 为了数据的安全
                     为了权限的细分
        创建视图 查看特定的数据
           create view 视图名 as select * from 表
    */
    --查看员工信息
    select * from emp;
    --创建视图
    create view emp_view as select empno,ename,job,deptno from emp;
    --查询视图
    select * from emp_view
    --修改视图
    update emp_view set ename='SMITH' where ename='SSSS';
    commit;
    --创建只读的视图
    create view e_view as select empno,ename,job,deptno from emp with read only
    update e_view set ename='SSSS' where ename='SMITH';
    commit;
    /*
      序列 是oracle数据生成的一系列数值 用来实现 (序列是对象,所以有属性)
           表中记录id的自增长 
      创建序列
           create sequence 序列名称
      序列的属性
          nextval  --下一个值
          currval  --当前值
          
      create sequence sequence
        [INCREMENT BY n]  表示自增长,每次增长n个
        [START WITH n]    表示初始值,n就是初始值.
        [{MAXVALUE n | NOMAXVALUE}]  表示最大值
        [{MINVALUE n | NOMINVALUE}]  表示最小值
        [{CYCLE | NOCYCLE}]          表示循环  表示如果设置了最大值,当数字达到最大值以后,会进行循环的设置值,这个不适用于自动增长的主键(非空唯一的)
        [{CACHE n | NOCACHE}]        表示缓存,表示缓存n个,如果n是10,表示一次缓存10个序列.
    */
    --创建序列
    create sequence order_sequence 

    select order_sequence.nextval from dual; --序列默认值从1开始 nextval生成不会因为插入失败回退
    select order_sequence.currval from dual; --查看当前值 必须先生成nextval

    insert into orders values(order_sequence.nextval,'订单1',1000);
    commit;

    /*
      索引 理解为一本书的目录 
           没有目录找到特定章节 费时很长
           
           意义:为了提升查询数据的速度(通过id,创建树结构,来提升查询效率)
           前提 : 只有数据量非常大的情况下 才有意义
      创建索引
         单行索引  create  index 索引名称 on 表(列)
         复合索引  create  index 索引名称 on 表(列,列2)
           
      create index index_order on orders(oname)
        创建索引是在数据库中创建索引结构,放的是索引的列的数值rowid,将oname的数值按照从小到大的排序,
        当where oid = 139,通过条件去索引结构定义记录的位置,数据库会通过rowid真实地址去查找数据.
        优点 : 提升查询速度.
        缺点 : 占用空间.
            增删改数据效率降低,需要更新索引结构,如果表中有主键和唯一约束会自动创建索引.
            
        索引使用规范 : 用在于列的数值重复数据很少情况.例如 : 当gender列都是1,会影响索引的查询效率
        索引分类 : 常用的是 unique唯一索引,normal普通索引.
           
    */
    --创建大数据量的表
    --序列生成的属性 在同一sql语句中只会生成一次
    declare

    begin
      for i in 1..5000000 loop
        insert into orders values(order_sequence.nextval,'订单'||order_sequence.nextval,1000);
        commit;
      end loop; 
    end;
    select count(*) from orders
    --先查询数据 记录耗时
    select * from orders where oname='订单3333333' --2.234  15 18 19
    --创建索引 
    create index index_order on orders(oname)   --一分多钟
    --创建索引后 查询同样的记录 耗时
    select * from orders where oname='订单3333333'  ---0.204
    --多个条件作为查询 不是触发单行索引
    select * from orders where oname='订单3333333'  and oprice=1000
    --自动创建索引,根据oid创建的.
    select * from orders where oid=4444444
    /*
      rowid 是数据库在保存数据时候 生成的真实物理地址
      区别rownum  是一个伪列 是在查询数据时候才会生成的,可变
          rowid  是插入数据就已经生成了 固定的物理地址 唯一不变 
    */
    --通过以下查询,可以对表进行直接修改.
    select rowid,emp.* from emp;


    /*
     同义词  可以理解为一个对象的别名
          意义: 为了数据的安全
                 为了权限的细分
     创建同义词 
          create synonym 同义词名 for 用户.对象 
          oracel的from后面可以跟同义词,视图,表,这三种对象.
    */
    --查询员工表
    select * from scott.emp;
    create synonym syn_emp for scott.emp;
    ---查询同义词
    select * from syn_emp

    /*
      
      数据库的导入导出
      
       1.为了数据安全      备份和还原使用
       
       2.为了服务器的迁移  把以前旧服务器的整个数据库迁移到新服务器
       
       3.开发人员的操作  是为了部署项目导入表结构
               
               开发是在测试环境  开发完成 需要上线
               代码 上传到服务器 tomcat
               开发的数据库表  上传到服务器数据库
                     去数据库建表 直接new  有风险
                     公司里一般都是 导出新建的表结构 通过命令运行
       导入导出实现
          通过命令行导入导出  需要安装oracel数据库服务器
               导出命令  exp
                  整个数据库导入  exp 用户名/密码 file=文件.dmp full = y
                  按照用户导出    exp 用户名/密码 owner= 用户 file=文件.dmp
                  按照表来导出    exp 用户名/密码 file=文件.dmp tables=表名,表名2
               导入 将exp 换成 imp
          通过图形化工具导入导出
              tools --export user objects  导出表结构 不能备份数据 包含所有的对象
              
              tools --exprot tables  导出表可以备份结构和数据 默认情况只能备份数据
                      oracel数据库格式 .dmp文件  服务器才能做
                      sql文件格式     .sql文件  
                      图形化工具格式  .pde文件 
       
    */
上一篇下一篇

猜你喜欢

热点阅读