oracle使用(七)_视图_数据增删改查

  1. 视图(view)

2.序列

  1. update,insert,delete

  2. 事务(ACID)

  3. 建表(三范式)

  4. 约束

视图(view)特点:
1)虚拟表(sql查询结果也是虚拟表,但不是视图),不占物理空间,视图的本身的定义语句,要存储在数据字典里,视图只是逻辑定义,每次使用视图只是重新执行sql,所以每次都能获取基表最新数据
2)视图可以是从一个或者多个实际表中获得的,产生视图的表叫基表,也可以从视图中产生

  1. 视图定义存在于数据库中,但相关数据并没有再存一份,视图中查看到的数据,存在于基表中
  2. 视图很像实际的表,对它的操作同普通表一样,通过视图修改的数据,实际上是改变基表,基表数据变化,基于此的视图数据也会变化,只读视图不会修改基表中数据,不是只读视图会修改基表数据

--创建视图 v_emp
create view v_emp as select * from emp;

oracle数据库:
物化视图:实际存在的视图,占物理空间
物化视图的2种类型:
on demand 和on commit ,区别在刷新时机的不同on demand 仅在物化视图需要更新时才刷新视图,on commit 一旦基表有更新,立即刷新视图

触发器 trigger,监控基表更新或者日志

oracle使用视图必须管理员授权,否则提示无权限

  1. sqlplus /nolog
  2. conn sys/管理员账号@orcl as sysdba;
  3. grant create view,create table to scott;(授权)/revoke create view from scott;(取消权限)
    4.create view v_emp as select * from emp where deptno = 30;
  4. 使用视图和普通表没区别 select * from v_emp;
    -- plsql中 向视图中添加数据,F8需要提交事务执行后,F10表示提交事务,shift+F10表示回滚
    -- F8执行后没有执行F10,只能在当前终端查询到数据
    insert into v_emp (empno,ename) values(1111,'张三');

--创建只读视图
create view v_emp2 as select * from emp with read only;
--只读视图无法插入数据
insert into v_emp2 (empno,ename) values(1234,'Lisi');
-- 删除视图
drop view v_emp2;
--当删除视图中数据时,如果数据来源多个基表,每次只能删除一个表的数据

-- 求平均薪水等级最低的部门的名称(分而治之就好)
select * from salgrade;

-- 求部门的平均薪水
select e.deptno, avg(e.sal) from emp e group by e.deptno;

--求部门的平均薪水等级
select t.deptno,sg.grade gd from salgrade sg join (select e.deptno, avg(e.sal) avgsal from emp e group by e.deptno) t on t.avgsal between sg.losal and sg.hisal;

-- 求最低平均薪水等级
select min(t.gd) m_gd from (select t.deptno,sg.grade gd from salgrade sg join (select e.deptno, avg(e.sal) avgsal from emp e group by e.deptno) t on t.avgsal between sg.losal and sg.hisal) t;

-- 求平均薪水等级最低的部门的名称,将这几次查询结果连接起来
select d.deptno,d.dname
from dept d
join (select t.deptno, sg.grade gd
from salgrade sg
join (select e.deptno, avg(e.sal) avgsal
from emp e
group by e.deptno) t
on t.avgsal between sg.losal and sg.hisal) t
on d.deptno = t.deptno join (select min(t.gd) m_gd from (select t.deptno,sg.grade gd from salgrade sg join (select e.deptno, avg(e.sal) avgsal from emp e group by e.deptno) t on t.avgsal between sg.losal and sg.hisal) t
) t1 on t.gd = t1.m_gd;

-- 又因为最低平均薪水等级返回单行单列(单行子查询),可直接使用比较运算符
select d.deptno,d.dname
from dept d
join (select t.deptno, sg.grade gd
from salgrade sg
join (select e.deptno, avg(e.sal) avgsal
from emp e
group by e.deptno) t
on t.avgsal between sg.losal and sg.hisal) t
on d.deptno = t.deptno where t.gd = (select min(t.gd) m_gd from (select t.deptno,sg.grade gd from salgrade sg join (select e.deptno, avg(e.sal) avgsal from emp e group by e.deptno) t on t.avgsal between sg.losal and sg.hisal) t);

--查看sql发现,有重复子查询,可通过视图将重复语句抽象出来
select * from v_deptno_grade;

drop view v_deptno_grade;

create view v_deptno_grade as select t.deptno, sg.grade gd
from salgrade sg
join (select e.deptno, avg(e.sal) avgsal
from emp e
group by e.deptno) t
on t.avgsal between sg.losal and sg.hisal;

--使用视图替换
select d.deptno, d.dname
from dept d
join v_deptno_grade t
on d.deptno = t.deptno
where t.gd =
(select min(t.gd) m_gd
from v_deptno_grade t);

创建用户

  1. sqlplus /nolog
  2. conn sys/管理员名@orcl as sysdba;
  3. create user 用户名 identified by 密码 (此时还不能以此用户进行连接)
  4. grant create session to 用户名; (此后连接才能成功)

序列(sequence)
mysql有autoincrement 自动递增,oracle用序列实现自动递增的数列

--在oracle中如果需要完成一个列的自增操作,必须要使用序列
/*
create sequence seq_name
increment by n 每次增长几
start with n 从哪个值开始增长
maxvalue n|nomaxvalue 10^27 or -1 最大值
minvalue n|no minvalue 最小值
cycle|nocycle 是否有循环
cache n|nocache 是否有缓存
*/
-- oracle实现自增序列只能序列
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,'王五');
select * from emp;

https://www.cnblogs.com/fan-yuan/p/7879353.html
SQL语言共分为四大类:数据查询语言DQL,数据操纵语言DML,数据定义语言DDL,数据控制语言DCL。

  1. 数据查询语言DQL基本结构是由SELECT子句,FROM子句,WHERE子句组成的查询块:SELECT <字段名表>FROM <表或视图名>WHERE <查询条件>

  2. 数据操纵语言DML主要有三种形式:

  1. 插入:INSERT
  2. 更新:UPDATE
  3. 删除:DELETE
    数据操作(DML)
  1. 数据定义语言DDL
    数据定义语言DDL用来创建数据库中的各种对象-----表、视图、索引、同义词、聚簇等如:CREATE TABLE / VIEW / INDEX / SYN / CLUSTER| 表 视图 索引 同义词 簇。DDL操作是隐性提交的,没有事务!不能rollback

  2. 数据控制语言DCL
    数据控制语言DCL用来授予或回收访问数据库的某种特权,并控制数据库操纵事务发生的时间及效果,对数据库实行监视等。如:

  1. GRANT:授权。
  2. ROLLBACK [WORK] TO [SAVEPOINT]:回退到某一点。回滚---ROLLBACK回滚命令使数据库状态回到上次最后提交的状态。其格式为:SQL>ROLLBACK;
  3. COMMIT [WORK]:提交。在数据库的插入、删除和修改操作时,只有当事务在提交到数据库时才算完成。在事务提交前,只有操作数据库的这个人才能有权看到所做的事情,别人只有在最后提交完成后才可以看到。提交数据有三种类型:显式提交、隐式提交及自动提交。下面分别说明这三种类型。
    (1) 显式提交
    用COMMIT命令直接完成的提交为显式提交。其格式为:SQL>COMMIT;

(2) 隐式提交
用SQL命令间接完成的提交为隐式提交。这些命令是:ALTER,AUDIT,COMMENT,CONNECT,CREATE,DISCONNECT,DROP,EXIT,GRANT,NOAUDIT,QUIT,REVOKE,RENAME。

(3) 自动提交
若把AUTOCOMMIT设置为ON,则在插入、修改、删除语句执行后,系统将自动进行提交,这就是自动提交。其格式为:SQL>SET AUTOCOMMIT ON;

/*
插入操作:
元组值的插入(一组值)
查询结果的插入
*/
--最基本的插入方式
--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);

-- 创建表的其他方式
--复制表同时复制表数据,但不会复制表约束
create table emp2 as select * from emp;

--复制表但不复制数据,同时不复制表约束
create table emp3 as select * from emp where 1=2;

select * from emp2;

select * from emp3;

-- 删除操作
-- 删除一条记录
delete from emp2 where deptno = 10;

-- 删除所有记录
delete from emp2;

--删除所有记录,而且没有事务,效率高,不可回滚,不建议使用
truncate table emp2;

/*
修改操作:
update tablename set col = val1,col2 = val2 where condition;
可以更新或者修改满足条件的一个列或者多个列
*/
--更新单列
update emp set ename = 'heihei' where ename = 'hehe';
--更新多个列的值
update emp set job='teacher',mgr=7902 where empno = 15;

你可能感兴趣的:(oracle使用(七)_视图_数据增删改查)