乐趣区

关于oracle:Oracle基础之二oracle视图用户管理序列DML事务索引数据库设计三范式

一、视图

1、视图 (view), 也称虚构表,不占用物理空间,这个也是绝对概念,因为视图自身的定义语句还是要存储在数据字典里的。视图只有逻辑定义。 每次应用的时候,只是从新执行 SQL
2、视图是从一个或多个理论表中取得的,这些表的数据寄存在数据库中。那些用于产生视图的表叫做该视图的基表,一个视图也能够从另一个视图中产生
3、视图的定义存在数据库中,与此定义相干的数据并没有再存一份于数据库中。通过视图看到的数据寄存在基表中
4、视图看上去十分像数据库的物理表,对他的操作同任何其余的表一样,当通过视图批改数据时,实际上是在扭转基表中的数据,相同地,基表数据的扭转也会主动反映在由基表产生的视图中,因为逻辑上的起因,有些 Oracle 视图能够批改对应的基表,有些则不能(仅仅能查问)

1、创立视图,应用视图




-- 创立视图: 如果普通用户第一次创立视图,提醒没有权限,要应用管理员去批改权限
--grant create view to scott;
--revoke create from scott; 回收权限
create view v_emp as select * from emp where deptno = 30;
-- 视图的应用
select * from v_emp;
-- 向视图中增加数据
insert into v_emp(empno,ename) values(1111,'zhangsan');
select * from emp;
-- 如果定义的视图是非只读视图的话,能够通过视图向表中插入数据,如果是只读视图,则不能够插入数据
create view v_emp2 as select * from emp with read only;
select * from v_emp2;
-- 只读视图只提供查问的需要,无奈进行增删改操作
insert into v_emp2(empno,ename) values(1234,'lisi');
-- 删除视图
drop view v_emp2;
-- 当删除视图中的数据的时候,如果数据来源于多个基表,
-- 则此时不能全副进行删除,只能删除一个表中的数据

-- 求均匀薪水的等级最低的部门,他的部门名称是什么,咱们齐全应用子查问
--(1)求均匀薪水
select avg(sal) from emp group by deptno;
--(2)求均匀薪水的等级
select t.deptno,sg.grade gd from salgrade sg join (select deptno,avg(sal) vsal from emp group by deptno)t
on t.vsal between sg.losal and sg.hisal
--(3)求均匀薪水的等级最低的部门
select min(t1.gd) from (select t.deptno,sg.grade gd from salgrade sg join (select deptno,avg(sal) vsal from emp group by deptno)t
on t.vsal between sg.losal and sg.hisal)t1
--(4)求均匀薪水的等级最低的部门名称
select d.dname, d.deptno
  from dept d
  join (select t.deptno, sg.grade gd
          from salgrade sg
          join (select e.deptno, avg(e.sal) vsal from emp e group by e.deptno) t
            on t.vsal between sg.losal and sg.hisal) t
    on t.deptno = d.deptno
 where t.gd =
       (select min(t1.gd)
          from (select t.deptno, sg.grade gd
                  from salgrade sg
                  join (select deptno, avg(sal) vsal from emp group by deptno) t
                    on t.vsal between sg.losal and sg.hisal) t1)

-- 查看 SQL 语句能发现,sql 中有很多的反复的 sql 子查问,能够通过视图将反复的语句给形象进去
create view v_deptno_grade as select t.deptno,sg.grade gd from salgrade sg join (select deptno,avg(sal) vsal from emp group by deptno)t
on t.vsal between sg.losal and sg.hisal;
-- 应用视图替换
select d.dname, d.deptno
  from dept d
  join v_deptno_grade t
    on t.deptno = d.deptno
 where t.gd =
       (select min(t1.gd)
          from v_deptno_grade t1)

二、用户治理







三、序列



-- 在 Oracle 中如果要实现一个列的自增操作,必须要应用序列
/*
create sequence seq_name
increment by n  每次增长几
start with n  从哪个值开始增长
maxvalue n|no maxvalue  10^27 or -1 最大值
minvalue n|no minvalue  最小值
cycle|nocycle  是否循环
cache n|nocache   是否有缓存
*/

create sequence my_sequence
increment by 2
start with 1

-- 应用
-- 留神,如果创立好序列只会,没有通过任何的应用,那么不能获取以后的值,-- 必须要先执行 nextval 之后能力获取以后值

-- 查看以后序列的值
select my_sequence.currval from dual;
-- 获取序列的下一个值
select my_sequence.nextval from dual;

insert into emp(empno,ename) values(my_sequence.nextval,'hehe');
select * from emp;

四、Insert Delete Update

1、数据更新





--DML: 数据库操作语言
-- 增
-- 删
-- 改
-- 在理论我的项目中,应用最多的是读取操作,然而插入数据和删除数据等同重要,而批改操作绝对较少
/* 插入:元组值的插入:查问后果的插入
*/
-- 最根本的插入方式
--insert into tablename values(val1,val2......)如果表名之后没有列名,那么只能将所有列都插入
--insert into tablename(col1,col2......) values(val1,val2......)能够指定向哪些列中插入数据
insert into emp values(2222,'haha','clerk',7902,to_date('2019-11-2','YYYY-MM-dd'),1000,500,10);
select * from emp;
insert into emp(empno,ename) values(3333,'wangwu');
-- 创立表的其余形式

-- 复制表构造同时复制表数据 不会复制束缚
create table emp2 as select * from emp;
-- 复制表构造不复制表数据,因为条件不满足 不会复制束缚
create table emp3 as select * from emp where 1=2;
-- 如果有一个汇合的数据,把汇合中的所有数据都挨条插入的话,效率如何?个别在实际操作中很少一条条插入,更多的是批量插入

/*
删除操作
delete from tablename where condition
*/
select * from emp2;
-- 删除满足条件的数据
delete from emp2 where deptno = 10;
-- 删除所有数据
delete from emp2;
--truncate, 跟 delete 有所不同,delete 在进行删除的时候通过事务
-- 而 truncate 不通过事务,一旦删除就是永恒删除,不具备回滚的操作
-- 不倡议应用,如果你手抖了呢
truncate table emp2;

/*
批改操作
update tablename set col1=val1,col2=val2 where condition
能够跟新或者批改满足条件的一个列或者多个列
*/

update emp set ename='heihei' where ename = 'hehe'
select * from emp;

五、事务

1、事务(Transaction)是一个操作序列,这些操作要么都做,要么都不做,是一个不可分割的单位,是数据库环境中的逻辑工作单位。
2、事务是为了保障数据库的完整性
3、事务不能嵌套
4、在 oracle 中,没有事务开始的语句。一个 Transaction 起始于一条 DML(Insert、Update 和 Delete)语句,完结于以下几种状况:

(1)用户显式执行 Commit 语句提交操作或 Rollback 语句回退
(2) 当执行 DDL(Create、Alter、Drop)语句事务主动提交
(3) 用户失常断开连接时,Transaction 主动提交
(4) 零碎解体或断电时事务主动回退

1、commit & Rollback

1、Commit 示意事务胜利地完结,此时通知零碎,数据库要进入一个新的正确状态,该事务对数据库的所有更新都以交付施行。每个 Commit 语句都能够看成是一个事务胜利的完结,同时也是另一个事务的开始。
2、Rollback 示意事务不胜利的完结,此时通知零碎,已产生谬误,数据库可能处在不正确的状态,该事务对数据库的更新必须被撤销,数据库应复原该事务到初始状态。每个 Rollback 语句同时也是另一个事务的开始。
3、一旦执行了 commit 语句,将目前对数据库的操作提交给数据库(理论写入 DB),当前就不能用 rollback 进行撤销。
4、执行 DDL,DCL 语句或从 SQL*PLUS 失常退出,都会主动执行 commit 命令
5、savepoint test01 保留点,当一个操作汇合中蕴含多条 sql 语句,然而只想让其中某局部胜利,某局部失败,就能够应用 savepoint
6、rollback to test01

2、acid



1、原子性(Atomicity)

一个原子事务要么残缺执行,要么罗唆不执行。这意味着,工作单元中的每项工作都必须正确执行,如果有任一工作执行失败,则整个工作单元或事务就会被终止,即此前对数据所作的任何批改都将被撤销,如果所有工作都被胜利执行,事务就会被提交,即对数据所作的批改将会是永久性的
2、一致性(Consistency)
始终性代表了底层数据存储的完整性,他必须由事务零碎和利用开发人员独特来保障,事务零碎通过保障事务的原子性,隔离性和持久性来满足这一要求,利用开发人员则须要保障数据库有适当的束缚(主键,援用完整性等),并且工作单元中所实现的业务逻辑不会导致数据的不统一(即,数据预期所表白的事实业务状况不相一致)。例如:在一次转账过程中,从某一账户中扣除的金额必须与另一账户中存入的金额相等。支付宝账号 100,你读到余额要取,有人向你转 100,然而事务没提交,(这时候你读到的余额应该是 100,而不是 200),这种就是一致性

3、隔离性(Isolation)

隔离性意味着事务必须在不烦扰其余过程或事务的前提下独立执行。换言之,在事务或工作单元执行结束之前,其所拜访的数据不能受零碎其余局部的影响

4、持久性(Durability)

持久性示意在某个事务的执行过程中,对数据所作的所有改变都必须在事务胜利完结前保留至某种物理存储设备,这样能够保障,所作的批改在任何零碎瘫痪时不至于失落

3、隔离级别

1、read uncommited

脏读问题:读到他人未提交的数据
不可反复读
幻读

2、read commited

解决了脏读问题,然而存在不可反复读和幻读问题:在同一个事务中执行两次查问,失去的后果不一样,第一次查问的时候,他人还没提交,读到的是他人提交之前的数据,第二次查问的时候读到他人提交后的数据,两次后果不统一,叫不可反复读

3、repeatable read

解决了脏读和不可反复读,然而存在幻读问题:在同一个事务中查问 n 次,后果也是统一的,这个时候即便其余的事务批改并提交了数据,该事务也查问不到,只有将该事务提交之后,从新查问,能力查到他人批改的数据

幻读:在此隔离级别下,在同一个事务的执行过程中,如果其余的事务提交了数据,该事务也读取不到,那么如果他人插入了一条数据,该事务中是不晓得的,如果该事务也插入一条雷同的数据,会呈现谬误(主键反复),但在该事务中却不晓得这条数据曾经存在(难道是我产生幻觉了吗),这叫幻读

4、序列化

解决了所有问题,然而效率极低

5、总结
当初学习的是数据库级别的事务,须要把握的就是事务的隔离级别和产生的数据不统一的状况,后续会学习申明式事务及事务的流传个性以及分布式事务,前面学到了再来补充

五、建表

1、罕用数据类型

2、表的创立




3、束缚



创立表的时候能够给表中的数据增加数据校验规定,这些规定称之为束缚
束缚分为 5 大类:

1、not null: 非空束缚,插入数据的时候某些列不容许为空
2、unique key: 惟一键束缚,能够限定某一个列的值是惟一的,惟一键的列个别被用作索引列
3、primary key: 主键:非空且惟一,任何一张表个别状况下最好有主键,用来惟一的标识一行记录
4、foreign key:外键,当多个表间接有关联关系(一个表的某个列的值依赖于另一个表的某个值)的时候,须要应用外键
5、check 束缚: 能够依据用户本人的需要去限定某些列的值

示例

--DDL
-- 创立表
create table student(stu_id number(10),
name varchar2(20),
age number(3),
hiredate date,
grade varchar2(10) default 1,
classes varchar2(10),
email varchar2(50)
);
insert into student values(20191109,'zhangsan',22,to_date('2019-11-09','YYYY-MM-DD'),'2','1','123@qq.com');
insert into student (stu_id,name,age,hiredate,classes,email)
values(20191109,'zhangsan',22,to_date('2019-11-09','YYYY-MM-DD'),'2','123@qq.com');

select * from student; 
-- 正规的表构造波及须要应用第三方工具 Powerdesigner
-- 再增加表的列的时候,不能允许设置成 not null
alter table student add address varchar2(100);
alter table student drop column address;
alter table student modify(email varchar2(100));
-- 表重命名
rename student to stu;
-- 删除表
-- 在删除表的时候,常常回遇到多个表关联的状况,多个表关联的时候不能随便删除,须要应用级联删除
--cascade: 如果 A,B,A 中的某一个字段跟 B 表中的某一个字段做关联,那么在删除表 A 的时候,须要先将表 B 删除
--set null: 在删除的时候,把表的关联字段设置成 null
drop table stu ;

-- 束缚
/*
创立表的时候能够给表中的数据增加数据校验规定,这些规定称之为束缚
束缚分为 5 大类:
not null: 非空束缚,插入数据的时候某些列不容许为空
unique key: 惟一键束缚,能够限定某一个列的值是惟一的,惟一键的列个别被用作索引列
primary key: 主键:非空且惟一,任何一张表个别状况下最好有主键,用来惟一的标识一行记录
foreign key:外键,当多个表间接有关联关系(一个表的某个列的值依赖于另一个表的某个值)的时候,须要应用外键
check 束缚: 能够依据用户本人的需要去限定某些列的值
*/
create table stu(stu_id number(10) primary key,
name varchar2(20) not null,
age number(3) check(age >0 and age<126),
hiredate date,
grade varchar2(10) default 1,
classes varchar2(10),
email varchar2(50) unique,
deptno number(2),
FOREIGN KEY(deptno) REFERENCES dept(deptno)
);

insert into stu 
values(20191109,'zhangsan',22,to_date('2019-11-09','YYYY-MM-DD'),'2','1','123@qq.com',10);

-- 古创立表的时候没有增加外键束缚,能够通过批改表增加
alter table stu add constraint fk_0001 foreign key(deptno) references dept(deptno)

六、索引

1、介绍

1、索引是为了放慢对数据的搜寻速度而设立的。索引是计划(schema)中的一
个数据库对象, 与表独立寄存.
2、索引的作用:在数据库中用来减速对表的查问, 通过应用疾速门路拜访办法
疾速定位数据, 缩小了磁盘的 I /O
3、Sql 中的索引是非显示索引,也就是在索引创立当前,在用户撤销它之前不
会在用到该索引的名字,然而索引在用户查问时会主动起作用。
4、索引的创立有两种状况

(1). 主动: 当在表上定义一个 PRIMARY KEY 或者 UNIQUE 约束条件时,Oracle 数据库主动
创立一个对应的惟一索引.
(2). 手动: 用户能够创立索引以减速查问

2、开发中索引的要点

  1. 索引改善检索操作的性能,但升高数据插入、批改和删除的性能。在执行这些操作时,DBMS 必须动静地更新索引。
  2. 索引数据可能要占用大量的存储空间。
  3. 并非所有的数据都适宜于索引。唯一性不好的数据(如省)从索引的到的益处不比具备更多可能值的数据(如姓名)从索引失去的益处多。
  4. 索引用于数据过滤和数据排序。如果你常常以某种特定的程序排序数据,则该数据可能是索引的备选。
  5. 能够在索引中定义多个列(如省加城市),这样的索引只在以省加城市的程序排序时有用。如果想按城市排序,则这种索引没有用途。

3、操作

1、在一列或者多列上创立索引.

CREATE INDEX index ON table (column[, column]…);

2、上面的索引将会进步对 EMP 表基于 ENAME 字段的查问速度.

CREATE INDEX emp_last_name_idx
ON emp (ename)

3、通过 DROP INDEX 命令删掉一个索引.

DROP INDEX index;

4、删掉 UPPER_LAST_NAME_IDX 索引.

DROP INDEX upper_last_name_idx;

4、示例

-- 索引:放慢数据的检索
-- 创立索引
create index i_ename on emp(ename);
-- 删除索引
drop index i_ename;

七、三范式

在设计和数据库无关的零碎时,数据库表的设计至关重要,这些设计关系整个零碎的架构,须要精心的认真思考。
数据库的设计次要蕴含了设计表构造和表之间的分割,在设计的过程中,有一些规定应该恪守
总的来说,三范式产生是为了解决数据冗余问题

1、第一范式

第一范式(确保每列放弃原子性)

第一范式是最根本的范式。如果数据库表中的所有字段值都是不可合成的原子值,就阐明该数据库表满足了第一范式。

第一范式的正当遵循须要依据零碎的理论需要来定。比方某些数据库系统中须要用到“地址”这个属性,原本间接将“地址”属性设计成一个数据库表的字段就行。然而如果零碎常常会拜访“地址”属性中的“城市”局部,那么就非要将“地址”这个属性从新拆分为省份、城市、具体地址等多个局部进行存储,这样在对地址中某一部分操作的时候将十分不便。这样设计才算满足了数据库的第一范式,如下表所示。

在任何一个关系数据库中,第一范式(1NF)是对关系模式的根本要求,不满足第一范式(1NF)的数据库就不是关系数据库。

所谓第一范式(1NF)是指数据库表的每一列都是不可分割的根本数据项,同一列中不能有多个值,即实体中的某个属性不能有多个值或者不能有反复的属性。如果呈现反复的属性,就可能须要定义一个新的实体,新的实体由反复的属性形成,新实体与原实体之间为一对多关系。在第一范式(1NF)中表的每一行只蕴含一个实例的信息。例如,对于员工信息表,不能将员工信息都放在一列中显示,也不能将其中的两列或多列在一列中显示;员工信息表的每一行只示意一个员工的信息,一个员工的信息在表中只呈现一次。简而言之,第一范式就是无反复的列

所谓第一范式(1NF)是指数据库表的每一列都是不可分割的根本数据项,同一列中不能有多个值,即实体中的某个属性不能有多个值或者不能有反复的属性。如果呈现反复的属性,就可能须要定义一个新的实体,新的实体由反复的属性形成,新实体与原实体之间为一对多关系。在第一范式(1NF)中表的每一行只蕴含一个实例的信息。

在任何一个关系数据库中,第一范式(1NF)是对关系模式的根本要求,
不满足第一范式(1NF)的数据库就不是关系数据库。

列不可分。

2、第二范式

第二范式(确保表中的每列都和主键相干)

第二范式在第一范式的根底之上更进一层。第二范式须要确保数据库表中的每一列都和主键相干而不能只与主键的某一部分相干(次要针对联结主键而言)。也就是说在一个数据库表中,一个表中只能保留一种数据,不能够把多种数据保留在同一张数据库表中。

第二范式(2NF)是在第一范式(1NF)的根底上建设起来的,即满足第二范式(2NF)必须先满足第一范式(1NF)。第二范式(2NF)要求数据库表中的每个实例或行必须能够被惟一地区分。为实现辨别通常须要为表加上一个列,以存储各个实例的惟一标识。要求实体的属性齐全依赖于主关键字。

不能局部依赖。即:一张表存在组合主键时,其余非主键字段不能局部依赖

第二范式(2NF)要求实体的属性齐全依赖于主关键字。所谓齐全依赖是指不能存在仅依赖主关键字一部分的属性,如果存在,那么这个属性和主关键字的这一部分应该分离出来造成一个新的实体,新实体与原实体之间是一对多的关系。为实现辨别通常须要为表加上一个列,以存储各个实例的惟一标识。简而言之,第二范式就是非主属性非局部依赖于主关键字

3、第三范式

满足第三范式(3NF)必须先满足第二范式(2NF)。简而言之,第三范式(3NF)要求一个数据库表中不蕴含已在其它表中已蕴含的非主关键字信息。例如,存在一个部门信息表,其中每个部门有部门编号(dept_id)、部门名称、部门简介等信息。那么员工信息表中列出部门编号后就不能再将部门名称、部门简介等与部门无关的信息再退出员工信息表中。如果不存在部门信息表,则依据第三范式(3NF)也应该构建它,否则就会有大量的数据冗余。简而言之,第三范式就是属性不依赖于其它非主属性

第三范式须要确保数据表中的每一列数据都和主键间接相干,而不能间接相干。

比方在设计一个订单数据表的时候,能够将客户编号作为一个外键和订单表建设相应的关系。而不能够在订单表中增加对于客户其它信息(比方姓名、所属公司等)的字段。如上面这两个表所示的设计就是一个满足第三范式的数据库表

满足第三范式(3NF)必须先满足第二范式(2NF)。简而言之,第三范式(3NF)要求一个数据库表中不蕴含已在其它表中已蕴含的非主关键字信息。

在第二范式的根底上,数据表中如果不存在非关键字段对任一候选关键字段的传递函数依赖则合乎第三范式。

不能存在传递依赖。即:除主键外,其余字段必须依赖主键

4、总结

▪ 第一范式
– 列不可分
▪ 第二范式
– 列必须间接依赖主键
▪ 第三范式
– 传递依赖
▪ 表外面的列不能呈现其它表的非主键字段

退出移动版