视图、序列、DML

本文详细介绍了SQL中的视图创建、使用、修改及删除,强调了只读视图的特点,并通过实例展示了如何通过视图简化复杂查询。此外,还探讨了Oracle中的序列操作,包括创建序列、使用序列以及序列在DML操作中的应用。内容涵盖了数据库的增删改操作,如插入、删除和更新数据的方法。
摘要由CSDN通过智能技术生成

视图

--创建视图
--如果普通用户第一次创建视图提示没有权限,要使用管理员去修改权限
--使用grant create view to scott;
create view v_emp as select * from emp where deptno = 30;
--视图的使用
select * from v_emp;
--向视图中添加数据
insert into v_emp(empno,ename)values(1111,'values');
select * from v_emp;
--非只读视图可以通过视图向表中插入数据,只读视图不可以插入数据
create view v_emp2 as select * from emp with read only;
select * from v_emp2;
--只读属兔只提供查询需求,无法进行增删改操作
insert into v_emp2(empno,ename)values(1121,'values');
--删除视图
drop view v_emp2;
--当删除视图中的数据逇时候如果数据来源于多个基表,则此时不能全部进行删除,智能删除一个表中的数据 

--求平均薪水等级最低的部门,它的部门名称是什么,我们完全使用子查询
--1、求平均薪水
select e.deptno,avg(e.sal)from emp e group by e.deptno;
--2、求平均薪水的等级
select t.deptno, sg.grade
  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;
--3、求平均薪水等级最低的部门
select min(t.gd)from (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;
--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(t.gd)from (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);
    
--sql中有许多重复的sql子查询。可以通过视图将重复的语句抽象出来
create view v_deptno_grade as 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;
--使用视图替换
select d.dname, d.deptno
  from dept d
  join v_deptno_grade t
    on t.deptno = d.deptno
 where t.gd = (select min(t.gd) from v_deptno_grade t);

序列

在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 1
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;

DML

数据库的增删改操作:

--DML数据库操作语言
--增
--删
--改
/*
插入操作:
    元组值得插入
    查询结果的插入
*/
--最基本的插入方式
--insert into tablename values(val1,val2......)  将所有列中都插入数据
--insert into tablename(col1,col2...) values(val1,val2......)  将数据插入指定列
insert into emp values(1111,'haha','clerk',7902,to_date('2021-01-30','YYYY-MM-dd'),1000,500,10);
SELECT * FROM EMP;
--向部分列插入数据的时候,不是想向哪个列插入就插入的,要遵循创建表的时候定义的规范
insert into emp(empno,ename)values(1120,'lisa');
select * from emp;

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


/*
删除操作:
delete from tablename where condition

*/
--删除满足条件的数据
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 = 'lisa';
--更新多个列的值
update emp set job = 'teacher',mgr = 7902 where empno = 1120;
select * from emp;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值