4、oracle-数据库对象

表的基本操作
基本的数据存储集合,由行和列组成。
表名和列名遵循如下命名规则:
必须以字母开头
必须在 1–30 个字符之间
必须只能包含 A–Z, a–z, 0–9, _, $, 和 #
必须不能和用户定义的其他对象重名
必须不能是Oracle 的保留字
Oracle默认存储表名是都是大写

表支持的类型
这里写图片描述
1 创建表

创建一个员工表t1,员工号id(整数),和姓名name(字符串)
        create table t1
        (
            id number,
            name varchar2(30)
        )


        varchar (30)   -可变长    最长还是30,hello是5 ,最后存储只占用5char (30)   -定长         hello是5   ,最后存储还是占用30
            charvarchar效率高

2 修改表


        alter table 表名 ....
        alter table 表名 add 列名 类型
        alter table 表名 rename column 列名 to 新列名
        alter table 表名 modify 列名 新类型
        alter table 表名 drop column 列名

        rename 表名 to 新表名  

        1 往t1表里边添加一列 email varchar(40)
            alter table t1 add email varchar(40)   --oracle 里边 varchar 和 varchar2是同一个类型

        2 修改t1表email列名为address
            alter table t1 rename column email to address

        3 修改t1表address列类型为varchar(50)
            alter table t1 modify address varchar(50)

        4 删除t1表address列
            alter table t1 drop column address

        5 修改t1表名为t2
            rename t1 to t2

3 另一种创建表的方式


        create table 表名 as select 语句

        1 创建一张表emp2,数据跟emp表一样
            create table emp2 as select * from emp   --备份

        2 创建一张表emp3,数据跟emp表一样,只有表结构,没有数据
            create table emp3 as select * from emp
            delete from emp3

            create table emp3 as select * from emp where 1=2  --返回是个空集,但是包括表结构


4 清空表

        truncate table 表名

        truncatedelete 的区别

            delete 逐条删除表“内容”,truncate 先摧毁表再重建

delete 和 truncate的区别

delete from 表名 (没有where 条件) 也可以清空一张表

1.delete 逐条删除表“内容”,truncate 先摧毁表再重建
(由于delete使用频繁,Oracle对delete优化后delete快于truncate)

2.delete 是DML语句truncate 是DDL语句DML语句可以闪回(flashback)和回滚rollback,DDL语句不可以闪回和回滚
(闪回: 做错了一个操作并且commit了,对应的撤销行为。了解)

3.由于delete是逐条操作数据,所以delete会产生碎片,truncate不会产生碎片。
(同样是由于Oracle对delete进行了优化,让delete不产生碎片)。两个数据之间的数据被删除,删除的数据——碎片,整理碎片,数据连续,行移动。

4.delete不会释放空间,truncate 会释放空间。用delete删除一张10M的表,空间不会释放。而truncate会。所以当确定表不再使用,应使用truncate。

5 删除表



        drop table 表名
        并没有马上删除表,而是放到了回收站里边recyclebin,这个回收站是oracle专有的
        查看回收站
            show recyclebin
        恢复表
            用到oracle的闪回技术 
            flashback table 表名 to 某个时间段
            flashback table 表名 to before drop


            flashback table emp2 to before drop

        彻底干掉表
            在回收站里边把表清掉
            purge table 表名
            purge recyclebin 清空回收站

            drop table 表名 purge   -- 彻底删除表

约束的种类

  1. Not Null 非空约束
    例如:人的名字,不允许为空。
  2. Unique 唯一性约束
    例如:电子邮件地址,不可以重复。
  3. Check 检查性约束
    如:人的性别,只能填男或者女;工作后薪水满足的条件应该大于0。
  4. Primary Key 主键约束
    主键是唯一标识表中某一行数据的列,主键约束隐含Not null + Unique。
    一个表只能有一个主键,但是主键可以是某一列,也可以是多列组成表的主键,比如说可以用员工名和部门号两列组成emp表的主键。将某两个列作为主键必须用表级约束
    constraint 约束名 primary key (列1,列2)
  5. Foreign Key 外键约束
    例如:部门表dept和员工表emp,不应该存在不属于任何一个部门的员工。用来约束两张表的关系。
    一个表(子表)的外键必须是其他某个表(父表)的具有唯一约束的列(一般都用主键),子表外键的值必须满足能在父表的列中存在,或者为NULL。
    这里边就涉及到一个问题,就是是父表的键值被删除,这时候子表里边的外键值应该怎么办?有以下三种方案:
    不允许删除(restrict默认)
    子表里边的数据跟着删除(cascade)
    子表里边的数据设置为空(set null)
    多数情况下,使用SET NULL方法,防止子表列被删除,数据出错。
    所以这里边也涉及到删除表的时候的顺序:
    1) 先将子表的内容删除,然后再删除父表。
    2) 将子表外键一列设置为NULL值,断开引用关系,然后删除父表。

这里写图片描述
在定义学生deptno列的时候,引用部门表的部门号一列作为外键,同时使用references设置级联操作——当删除dept表的deptno的时候,将student表的deptno置空。

【约束举例】:
create table student 
(
sid number constraint pk_student primary key, --学生Id主键约束
sname varchar2(20) constraint nn_student_name not null,--学生姓名非空约束
email varchar2(20) constraint un_student_email unique --学生邮件唯一约束
constraint nn_student_email not null,   --同时邮件可再设非空,没有“,”
age number constraint chk_student_age_min check(age > 10),  --学生年龄设置check约束
gender varchar2(6) constraint chk_student_gender check(gender in ('男', '女')),
deptno number constraint fk_student references dept (deptno) ON DELETE SET NULL
--参照dept表里面的deptno ON 设置 父表删除子表的操作
不允许删除(restrict默认)
子表里边的数据跟着删除(cascade)
子表里边的数据设置为空(set null)

)   
SQL>  desc student      查看student表各列的约束。

测试用例:
SQL>  insert into student values(1, 'Tom', '[email protected]', 20, '男', 10)      正确插入表数据。
SQL>  insert into student values(2, 'Tom', '[email protected]', 15, '男', 10)   
        违反un_student_email约束。
SQL>  insert into student values(3, 'Tom3', '[email protected]', 14, '男',100 )                   违反完整约束条件 (SCOTT.FK_STUDENT) - 未找到父项关键字

可以查看指定表(如student)的约束,注意表名必须大写。
SQL> select constraint_name, constraint_Type, search_condition  
      from user_constraints where table_name='STUDENT'    

6 表的约束


    创建约束的方式
        create table ...
        (
            列名 类型 [constraint 约束名] 约束的类型,

            constraint 约束名 约束类型(列名) 
        )

        唯一
            unique
        非空  
            not null
        检查
            check(cond)
        主键
            primary key
        外键
            references 表名(列名) [ on delete set null | cascade ]

视图
从表中抽出的逻辑上相关的数据集合。
通俗来说,可以把视图看成是虚拟的表,只是一个查询语句的结果。
所以:
1. 视图基于表。
2. 视图是逻辑概念。
3. 视图本身没有数据。

视图中使用DML的规定:                                                            
一:
当视图定义中包含以下元素之一时不能使用delete:
组函数
GROUP BY 子句
DISTINCT 关键字
ROWNUM 伪列
二:
    当视图定义中包含以下元素之一时不能使用update :
组函数
GROUP BY子句
DISTINCT 关键字
ROWNUM 伪列
列的定义为表达式
三:
    当视图定义中包含以下元素之一时不能使用insert :
组函数
GROUP BY 子句
DISTINCT 关键字
ROWNUM 伪列
列的定义为表达式
表中非空的列在视图定义中未包括
总结一句话:不通过视图做insertupdatedelete操作。因为视图提供的目的就是为了简化查询。
视图
    create view 视图名称 
    as
        select 语句

    1 创一个视图,用来观看10号部门的员工信息
        select * from emp where deptno = 10

        抽出一个视图
        create view v_emp_10 as select * from emp where deptno = 10

        使用视图——直接把视图当表使用就可以
        视图只是一个查询语句的结果,本身没有数据

        视图的优点:
            1 简化复杂查询
            2 限制数据的访问
        注意点:
            1 视图不提高查询性能
            2 不提倡修改视图的数据

    删除视图
        drop view 视图名

3 序列



    create table t1 
    (
        id number primary key,
        name varchar2(30) 
    )
    insert into t1 values(1, 'aaa')
    insert into t1 values(2, 'bbb')
    insert into t1 values(3, 'ccc')
    ....
    让程序自己记住主键值,下次自动加1——序列

    创建序列:
        create sequence 序列名 

        create sequence myseq;
    序列的使用 :
        序列名.currval --获取序列当前值
        第 1 行出现错误:
        ORA-08002: 序列 MYSEQ.CURRVAL 尚未在此会话中定义


        结论:currval的使用不能早于第一次使用nextvalue


        序列名.nextval --获取序列下一个值

        nextval 在一条sql里边只取一次

    删除序列
        drop sequence 序列名
1.  序列是公有对象,所以多张表同时使用序列,会造成主键不连续。   如:[1, 2, 3, 4, 5, …, 20]
tableA: 1   2   4
tableB: 3   5               A、B表有可能主键不连续。

2.  回滚也可能造成主键不连续。   如:多次调用insert操作使用序列创建主键。但是当执行了rollback后再次使用insert借助序列创建主键的时候,nextval不会随着回滚操作回退。

3.  掉电等原因,也可能造成不连续。由于代表序列的数组保存在内存中,断电的时候内存的内容丢失。恢复供电时候,序列直接从21开始。

4 索引
索引使用的场景:
以下情况可以创建索引:
列中数据值分布范围很广
列经常在 WHERE 子句或连接条件中出现
表经常被访问而且数据量很大

下列情况不要创建索引:
表很小
列不经常作为连接条件或出现在WHERE子句中
查询的结果集占到表的95%及以上的数据
表经常更新


    原理:先按照某列,多列进行排序,记录好没行数据在主表的位置
        查询的时候先查索引,然后再到主表上面去拿数据
    创建索引
        create index 索引名 on 表名(列名1,列名2...)

    使用索引:
        其实我们只要创建索引和删除索引操作就行了,其他索引的管理数据库自动完成

        select * from emp where deptno = 10 

        select * from emp where job = ....  ---没有使用到索引


        问题
        创建索引 on emp( deptno , job)   
        select * from emp where job = ....  ---没有使用到索引
        select * from emp where job = ....   and deptno = ..  ---有使用到索引

        具有唯一约束的列,oracal都会自动创建索引(包括主键)



    删除索引
        drop index 索引名



    查看用户的数据库对象
        select * from user_数据库对象 
        select * from user_indexes;

5 同义词

1 为hr.employees表创建同义词
    create synonym 同义词 for 数据库对象

删除同义词
    drop synonym 同义词
synonym同义词:     
就是指表的别名。
如:scott用户想访问hr用户下的表employees。默认是不能访问的。需要hr用户为scott用户授权:
SQL>  sqplus hr/11      或       conn hr/11(已登录界面, 切换登陆)
SQL>  grant select on employees to scott       hr用户为scott用户开放了employees表的查询权限。
这时scott用户就可以使用select语句,来查询hr用户下的employees表的信息了。
SQL> select count(*) from hr. employees   (若用户名叫zhangsanfeng则zhangsanfeng.employees)

hr.employees名字过长,为了方便操作,scott用户为它重设别名:
SQL>  create synonym hremp for hr.employees;        为hr.employees创建了同义词。

如有权限限制,那么切换管理员登录,给scott用户添加设置同义词权限。
SQL>  conn / as sysdba          
SQL>  grant create synonym to scott    
SQL>  select count(*) from hremp    使用同义词进行表查询操作。

 ——同义词、视图 等用法在数据保密要求较高的机构使用广泛,如银行机构。好处是既不影响对数据的操作,同时又能保证数据的安全。

猜你喜欢

转载自blog.csdn.net/u014749668/article/details/82317951