- 视图(view)
2.序列
update,insert,delete
事务(ACID)
建表(三范式)
约束
视图(view)特点:
1)虚拟表(sql查询结果也是虚拟表,但不是视图),不占物理空间,视图的本身的定义语句,要存储在数据字典里,视图只是逻辑定义,每次使用视图只是重新执行sql,所以每次都能获取基表最新数据
2)视图可以是从一个或者多个实际表中获得的,产生视图的表叫基表,也可以从视图中产生
- 视图定义存在于数据库中,但相关数据并没有再存一份,视图中查看到的数据,存在于基表中
- 视图很像实际的表,对它的操作同普通表一样,通过视图修改的数据,实际上是改变基表,基表数据变化,基于此的视图数据也会变化,只读视图不会修改基表中数据,不是只读视图会修改基表数据
--创建视图 v_emp
create view v_emp as select * from emp;
oracle数据库:
物化视图:实际存在的视图,占物理空间
物化视图的2种类型:
on demand 和on commit ,区别在刷新时机的不同on demand 仅在物化视图需要更新时才刷新视图,on commit 一旦基表有更新,立即刷新视图
触发器 trigger,监控基表更新或者日志
oracle使用视图必须管理员授权,否则提示无权限
- sqlplus /nolog
- conn sys/管理员账号@orcl as sysdba;
- grant create view,create table to scott;(授权)/revoke create view from scott;(取消权限)
4.create view v_emp as select * from emp where deptno = 30; - 使用视图和普通表没区别 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);
创建用户
- sqlplus /nolog
- conn sys/管理员名@orcl as sysdba;
- create user 用户名 identified by 密码 (此时还不能以此用户进行连接)
- 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。
数据查询语言DQL基本结构是由SELECT子句,FROM子句,WHERE子句组成的查询块:SELECT <字段名表>FROM <表或视图名>WHERE <查询条件>
数据操纵语言DML主要有三种形式:
- 插入:INSERT
- 更新:UPDATE
- 删除:DELETE
数据操作(DML)
数据定义语言DDL
数据定义语言DDL用来创建数据库中的各种对象-----表、视图、索引、同义词、聚簇等如:CREATE TABLE / VIEW / INDEX / SYN / CLUSTER| 表 视图 索引 同义词 簇。DDL操作是隐性提交的,没有事务!不能rollback数据控制语言DCL
数据控制语言DCL用来授予或回收访问数据库的某种特权,并控制数据库操纵事务发生的时间及效果,对数据库实行监视等。如:
- GRANT:授权。
- ROLLBACK [WORK] TO [SAVEPOINT]:回退到某一点。回滚---ROLLBACK回滚命令使数据库状态回到上次最后提交的状态。其格式为:SQL>ROLLBACK;
- 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;