范式
-
1NF
确保每列的原子性(不可再分)
-
2NF
(1)宏观:
每一张表表达一件事 stu表 stuno name sex class tid tadg ttel
A B 依赖 决定
(2)微观:
除了主键以外的其他字段,都要依赖于主键
-
3NF
微观:除了主键以外的其他字段,都要依赖于主键 ,不要有传递
注意:第三范式 可以帮助规范数据库设计
好处:防止混乱、数据冗余
缺点:有些表难以拆分 SQL语句复杂 多表查询性能复杂
一般多使用第二范式
数据库表设计软件
-
PowerDesigner
-
https://www.fujieace.com/software/powerdesigner.html
-
创建模型
-
创建数据库表
-
设计数据库表
-
创建两张表
-
设计外键
-
保存
(1)保存PDM: Ctrl+S
(2)保存SQL语句:Ctrl+G
视图的概念
-
属于数据库对象之一,视图是一个逻辑表,它允许操作者从其它表或视图存取数据,视图本身不包含数据
-
视图 = 临时表
-
使用视图有以下优点:
• 提供附加的表安全级,限制存取基表的行或/和列集合。
• 隐藏数据复杂性。
• 简化用户数据查询和处理操作。
• 有利于数据交换操作。
创建视图
-
create view 视图名 as sql语句
create view mysyxview
as
select d.deptno 部门编号, e.empno,e.ename,sal,comm,d.dname from emp e,dept d where e.deptno=d.deptnyujvo and d.deptno=20 ;
-
优点:
(1)简化查询语句
select * from mysyxview ;
(2)增加了安全性,提供或组合一个可以分享给其他开发人员使用,避免安全信息遗漏
删除视图
- drop view 视图名 ;
视图授权
-
授予:通过sys 授予scott 创建视图权限
grant create view to 用户名 ;
-
撤销:
revoke create view from 用户名 ;
-
注意:如果在创建视图时,给某个字段起别名了,那么在视图中就只能识别别名而不识别原来的字段名了!!
-
update myempview2 set ename=‘ls’ where empno=8002 ;
应该改为: update myempview2 set ename=‘ls’ where 员工编号=8002 ;
修改视图
-
update 视图名 SQL语句;
-
update mysyxvie set ename=‘ls’ where empno =8002 ;
-
修改视图的时候(DML),会影响原表数据,因此一般不建议修改视图
只作为查询使用(DQL)!
修改视图的时候对应的原表也被修改了:
-
如果update操作涉及多表操作,则容易出现的异常,比如关键列!再次建议对视图只做查询,不做DML!!
视图:
-
(1)删除原有视图
Drop view myempview;
(2)重新创建视图
create view myempview2
as
select empno,ename,deptno from emp where deptno=20 ;
(3)此时在修改deptno=40 修改成功!
update myempview2 set deptno=40 where empno=8003 ;
但是此方法不太合理!!!!
-
建议加限制条件:
(1)设置限制:with check option ;
a.删除原有视图
Drop view myempview;
b.重新创建视图with check option
create view myempview2
as
select empno,ename,deptno from emp where deptno=20 with check option ;
c.此时在修改deptno=40 报错(子句违规)
update myempview2 set deptno=40 where empno=8002 ;
(2)设置只读:with read only ;(只能查询)
a.删除原有视图
b.重新创建视图 添加只读限制(with read only)
create view myempview2
as
select empno,ename,deptno from emp where deptno=20 with read only ;
c.此时增删改均会报错
使用视图的限制
-
当更新视图中的数据时,实际上是对表的内部数据进行更新。事实上, 当从视图中插入或者删除时,情况也是这样。
然而,某些视图是不能更新数据的,这些视图有如下的特征:
•有INTERSECT,UNION和MINUX等集合操作符的视图。
•有GROUP BY,CONNECT BY或者START WITH子句的视图。
•有诸如AVG,SUM或者MAX等组函数的视图。
•使用DISTINCT函数的视图。
•连接表的视图(其中有一些例外)。
案例
-
创建一个部门编号为20的所有员工信息的临时表
select d.deptno 部门编号, e.empno, e.ename, sal,comm, d.dname from emp e, dept d where e.deptno=d.deptno and d.deptno=20;
-
使用视图
(1)创建视图create view 视图名 as SQL语句
create view myempview2 as select d.deptno 部门编号, e.empno 员工编号, e.ename, sal,comm, d.dname from emp e, dept d where e.deptno=d.deptno and d.deptno=20;
-
操作视图 DML和操作表一样!
了解
-
视图只查看,最好不要DML!!!!