• Oracle数据库基本操作(一) —— Oracle数据库体系结构介绍、DDL、DCL、DML


    一、Oracle数据库介绍

    1、基本介绍

      Oracle数据库系统是美国ORACLE公司(甲骨文)提供的以分布式数据库为核心的一组软件产品,是目前最流行的客户/服务器(CLIENT/SERVER)或B/S体系结构的数据库之一。

    2、Oracle数据库的体系结构

      ①数据库:database

      Oracle数据库是数据的物理存储。这包括(数据文件ORA或DBF、控制文件、联机日志、参数文件)。Oracle数据的概念和其他数据库不一样,这里的数据库是一个操作系统只有一个库。可以看做是Oracle就只有一个大数据库。

      ②实例

      一个Oracle实例(Oracle Instance)有一系列的后台进程和内存结果组成。一个数据库可以有N个实例。

      ③数据文件(dbf)

      数据文件是数据库的物理存储单位。数据库的数据是存储在表空间中的,真正是在某一个或者多个数据文件中。而一个表空间可以由一个或多个数据文件组成,一个数据文件只能属于一个表空间。一旦数据文件被加入某个表空间后,就不能删除这个文件,如果要删除某个数据文件,只能删除其所属与的表空间才行。

      ④表空间

      表空间是Oracle对物理数据库上相关数据文件(ORA或者DBF文件)的逻辑映射。一个数据库在逻辑上被划分成一到若干个表空间,每个表空间包含了在逻辑上相关联的一组结构。每个数据库至少有一个表空间(称之为system表空间)。

      每个表空间由同一磁盘上的一个或多个文件组成,这些文件叫数据文件(datafile)。一个数据文件只能属于一个表空间。

      ⑤用户

      用户是在实例下建立的。不同实例中可以建相同名字的用户。

      注:表的数据,是有用户放入某个表空间的,而这个表空间会随机吧这些表数据放到一个或者多个数据文件中。

      由于Oracle的数据库不是普通的概念,Oracle是由用户和表空间对数据进行管理和存放的。但是表不是有表空间去查询的,而是由用户去查的。因为不同用户可以在同一个表空间建立同一个名字的表,这里区分就是用户了。

      

      Oracle数据库【地球】可以有多个实例【亚洲、欧洲等等】,而每个实例【亚洲】可以分为多个表空间(逻辑上,人为的)【中国、印度、巴基斯坦等等】,每个表空间可以存在多个用户【中国(表空间),省政府(用户)】,每个用户【【省政府】管理该表空间下的指定数据文件【下辖土地】。

    二、Oracle数据库基本操作

      DDL ( Data Definition Language 数据定义语言)语句:用来定义数据库对象(库、表、列等),创建、删除、修改库、表结构。

      DML(Data Manipulation Language 数据操作语言 ) 语言:用来定义数据库记录(数据),增、删、改表记录;

      DCL(Data Control Language 数据控制语言)语言:用来调用访问权限和安全级别;

      DQL(Data Query Language 数据查询语言)语言:用来查询记录(数据);

    (一)DDL语句管理表

      假设要开发一个项目: 1. 创建表空间 2. 创建用户(授权) 3. 用户去建表

      1、创建表空间(由管理员账号创建)

      语法:

    create tablespace 表空间的名称
    datafile '存放的位置' //指定表空间对应的数据文件存放位置
    size 初始大小 
    autoextend on //自动增长,当表空间存储都占满时,自动增长
    next 每次增长多少

      示例:

    create tablespace mallproject
    datafile 'c:mallproject.dbf'
    size 100m
    autoextend on
    next 10m;

    --删除表空间
    drop tablespace mallproject;

      2、创建用户

      ①创建用户语法:

    create user 用户名 identified by 密码 default tablespace mallproject

      密码必须不能以数字及特殊开头。

      示例:

    create user zhansan identified by zs123 default tablespace mallproject;

      ②用户授权:

    --授权DCL:grant
    --授权zhansan拥有创建会话权限
    grant create session to zhansan;

      Oracle 中已存在三个重要的角色:connect角色(是授予最终用户的典型权利,最基本的),resource角色(是授予开发人员的),dba角色(拥有全部特权,是系统最高权限,只有DBA才可以创建数据结构,并且系统权限也需要DBA授出,且DBA用户可以操作全体用户的任意基表,包括删除)。

    -- 授予角色
    grant dba to zhansan;
    -- 登录zhansan账号,可操作任意用户的表
    select * from scott.emp;

      ③撤销已经授予的权限语法

    revoke {system privilege | role | all [privileges] } [,{system privilege | role | all [privileges] }...] from {user | role} [,{{user | role}}]...;

      ④删除用户及用户下的数据

    drop user 用户名 cascade;
    -- 删除zhansan用户及其下的数据
    drop user ZHANSAN cascade;

      3、创建表

      ①语法:

    create table 表名(
           列名 列的类型 [列的约束],
           列名 列的类型 [列的约束]
    );

      ②列的类型:

      • varchar2(总长度) : 表示的可变长度字符串,但是不能超过最大长度
        • varchar2(10) : 占5个长度字符
      • char(总长度) : 表示的固定的长度字符串
        • char(10) : 不满10个字符, 以空格补齐10
      • number(总长度,小数位数): 表示的数字类型
      • date : 年月日时分秒
      • timestamp : 时间戳 表示的时间更加精确可信
      • LONG : 大文本的类型 最大可存2G
      • CLOB : Character Large Object 字符大对象, 最大可存4G
      • BLOB : Binary Large Object 二进制大对象 , 最大可存4G
        • 用户头像 ---> 100kb

      ③示例:

    create table person(
        pid number,
        pname vachar2(20),
        age number,
        sal number(10,2)
    );

       ④使用子查询创建表

    --使用子查询创建表
    --相当于是复制表,结构和表中的数据
    create table emp as select * from scott.emp;--只复制表结构
    create table emp1 as select * from scott.emp where 1=2;

      4、修改表

      ①添加语法:

    alter table 表名称 add(列名1 类型 [default 默认值],列名2 类型 [default 默认值]....)

      ②修改语法:

    alter table 表名称 modify(列名1 类型 [default 默认值],列名2 类型 [default 默认值]....)

      ③修改列名:

    alter table 表名称 rename column 列名1 to 列名2;

      ④示例:

    -- 添加列
    alter table person add sex VARCHAR2(10);
    -- 同时添加多列
    ALTER TABLE person ADD(
        mobile VARCHAR2(10),
        adddress VARCHAR2(100)
    );
    -- 重定义列
    alter table person modify mobile number;
    -- 修改列名
    alter table person rename column sex to gerder;
    -- 删除列
    delete table person drop column address;
    -- 修改表名
    rename person to p;

      ⑤添加与删除外键约束语法

    1 -- 添加外键语法
    2 alter table t_student1 add constraint 外键名 foreign key(作为外键的列名) references t_class1(主键的列名);
    3 -- Oracle 语法
    4 alter table t_student1 drop constraint 外键名;

      5、删除表

    -- 删除表
    drop table p;

      6、约束

    ①表的五大约束:

      • 主键约束: primary key 非空并且唯一
      • 唯一约束: unique 唯一可以为空
      • 非空约束: not null 不能为空
      • 检查约束: check(条件), mysql支持这个语法,但是没有效果
      • 外键约束: 约束从表中记录必须是参考主表中的记录
        • 强制删除表
        • 级联删除

    ②示例:

    create table person(
        pid number primary key,
        pname varchar2(20) unique,
        age number not null,
        gender varchar2(10) check(gender in('',''))
    );
    -- 报 ORA-02290: check constraint (ZHANSAN.SYS_C005421) violated 错
    insert into person values(1,'zs',18,'');
    /*
        外键约束: 约束从表中记录必须是参考主表中的记录   
                       商品表 -----> 分类表ID
    */
    -- 分类表
    create table category(
           cid number primary key,
           cname varchar2(20)
    );
    -- 商品表
    create table product(
           pid number primary key,
           pname varchar2(20),
           cno number
    );
    -- 添加外键约束
    alter table product add foreign key(cno) references category(cid);
    insert into category values(1,'手机数码'); 
    insert into product values(1,'锤子手机',1);

    -- 强制删除category表(不建议使用)
    --
    先解除外键约束,然后再删除自己
    drop table category cascade constraint;

    -- 级联删除
    alter table product add foreign key(cno) references category(cid) on delete cascade;

    insert into category values(1,'手机数码');
    insert into category values(2,'鞋靴箱包');
    insert into product values(1,'锤子手机',1);
    insert into product values(2,'耐克跑鞋',2);

    -- 级联删除:删除category 中的1号记录,级联删除
    --
    删除主表中记录的时候,会先去删除从表中对应的记录,然后再删除主表中记录
    delete from category where cid = 1;

     (二)DML(详细请参考MySQL基本操作篇)

      1、插入记录

    -- 使用子查询插入记录
    insert into emp select * from scott.emp where deptno=10;

      2、更新记录

      语法:

    update 表名 set 列名 = 列的值 [where 条件]

      3、删除记录

      delete和truncate的区别:

    delete truncate
     逐条删除数据  先删除表然后再创建表
    DML DDL
    支持事务 不支持事务
    删除数据可以回滚 不能回滚
      删除所有记录,执行效率高

      4、事务

      ①事务的概念:一组SQL操作,要么都成功,要么都失败。

        ②事务的特型:ACID

      • 原子性: 事务是最小不可分割的单元
      • 一致性: 事务执行前后,数据的状态要保持一致
      • 隔离性: 一个事务在执行的时候,不受其它事务影响
      • 持久性: 事务一旦提交,数据就持久的保存到磁盘上

      ③若不考虑事务的隔离级别,会出现什么问题: 脏读, 不可重复读, 虚读/幻读

      • 脏读 : 一个事务读取到了另一个事务未提交的数据
      • 不可重复读: 一个事务多次读取,前后数据不一致(update)
      • 虚读/幻读: 一个事务多次读取,前后数据不一致(insert)

      ④隔离级别:

        mysql:

      • READ UNCOMMITTED 读取未提交 问题: 脏读, 不可重复读, 虚读
      • READ COMMITTED 读取已提交 问题:不可重复读, 虚读
      • REPEATABLE READ 可重复读 问题: 虚读
      • SERIALIZABLE 串行化,一个事务在执行的时候,其它事务处于等待状态 没有问题

        Oracle:

      • READ COMMITTED (默认)
      • SERIALIZABLE
      • READ ONLY

      ⑤事务的保存点: savepoint 保存点的名称

         事务回滚到保存点: rollback to 保存点

         应用场景——数据迁移: 1000万条 1--50万设置保存点--100万 事务

       示例:

    create table louceng(
        lou number primary key
    );
    
    BEGIN
    -- 业务层
        INSERT INTO louceng VALUES(1) ; 
        INSERT INTO louceng VALUES(2) ; 
        INSERT INTO louceng VALUES(3) ; 
        SAVEPOINT sanlou ; 
        INSERT INTO louceng VALUES(4) ; 
        INSERT INTO louceng VALUES(4) ; 
        INSERT INTO louceng VALUES(5) ; 
        COMMIT ; 
    EXCEPTION 
    -- 处理异常
        WHEN others THEN
            ROLLBACK TO sanlou ; 
            COMMIT;
    END ;
    
    select * from louceng;

           

  • 相关阅读:
    管理页面的类 PageHelper
    接下来打算写一下visual stuido 2013使用git进行远端管理。
    转一下网上找来的tortoise git不用每次都输入邮箱和密码的方法。备查看
    tortoise git使用 git版本库的rsa key来进行ssh连接
    2015年4月1日 14:36:56 EF 主从表更新
    Oop分析方法
    Knative 实战:基于 Knative Serverless 技术实现天气服务-下篇
    超大规模商用 K8s 场景下,阿里巴巴如何动态解决容器资源的按需分配问题?
    从零开始入门 K8s | 可观测性:你的应用健康吗?
    Knative 暂时不会捐给任何基金会 | 云原生生态周报 Vol. 22
  • 原文地址:https://www.cnblogs.com/gdwkong/p/8502710.html
Copyright © 2020-2023  润新知