视图
1、什么是视图?
是一个虚拟的表(逻辑表),它不在数据库中以存储数据的形式保存(本身不包含数据),还是
在使用视图的时候动态生成
3.视图的作用
1.数据库中数据的查询非常复杂,例如多表,子查询,编写语句较多,并且这种查询常被重复使用,那么我们就可以创建视图,避免每次写sql语句会错误,也提高了查询的效率
2.为了安全,在公司中,有些字段为保密字段,那么可以创建视图,限制对某些字段的操作。
3、视图的缺点
3.1性能差
把视图查询的结果转化成对表的查询
3.2 修改限制
修改视图数据,必须把它转化为对基础的修改
4、视图的优点
1、提高查询效率,
在数据库中非常复杂的数据,可以 创建视图避免多次编写sql语句出现的错误
2、安全
公司有些字段为保密字段,也可以通过创建视图来限制用户对某些字段进行操作
3、简单
不需要关系后面对应的表结构
脱敏测试(加密测试)
通常情况下,数据库是敏感,(脱敏测试)不是每一个人用户都能进行访问,但是某些用户需要读取某些表中的部分数据,这是就可以定有指定条件的试图来限制用户只能访问其指定的列的数据,并提供一个视图接口进行访问。
基于这种原理,大大简化查询语句以及便携复杂条件下的数据筛选,同事也延伸出视图中套用视图,因为视图是一个表,多有视图引用视图从简化用户更复杂的数据筛选,用户只需要调用视图就可以得到经过复杂运算后的数据,提高开发效率同事也提高数据的安全性。
举例:用户对接时把需要的字段提取出来,做为一个视图,给对方查询;(视图,可以为单表,可以为对表,可以是一个结果)
对方查询每次都是建好的视图的结果;
(1)show tables 显示所有的表;(先去查看数据看中表)
(2)、格式:create view 视图名 as (sql语句);创建视图 (创建视图)
create view ba002 as ( select * from emp ,dept where dept.dept1=emp.dept2 )
(3)、drop view 视图名 ; 删除视图
(4)show create view ba002 ;查看视图(包括建表语句,视图名,编码格式)
(5) select * from 视图名 ; 查看视图所有内容
举例:我是m系统, a是支付宝,b是微信,c是银联 ,对数据权限限制不一样
可以建立三个个不同视图,
对接支付宝给字段:例如
第一个视图:b微信只能查询我的数据库的 ename,mgr,dname,job
create view hz as( select ename,mgr,dname,job from emp ,dept where dept.deptno=emp.deptno)
第二个视图:a支付宝只能查询我的数据库的 ename,mgr,dname
create view hz1 as( select ename,mgr,dname,job from emp ,dept where dept.deptno=emp.deptno)
第三个视图:c银行只能查询我的数据库的 ename,mgr,dname满足deptno为20
create view hz2 as( select ename,mgr,dname,job from emp ,dept where dept.deptno=emp.deptno and emp.deptno=20)
注意点:
2. 视图的特点
2.1 视图时由基本表产生的虚表
2.2 视图的创建和删除不影响基础表
2.3 视图的更新和删除直接影响基础表
2.4 当视图内容来源于多个虚拟表表结构不能删除
2.5 视图不能修改表的字段,
案例2.2
2.2.1创建 视图:(不影响基础表)
create view hz1 as( select ename,mgr,dname,job from emp ,dept where dept.deptno=emp.deptno)
2.2.2删除视图 (不影响基础表)
drop view hz1;
案例2.3
2.3.1
情况1:删除值(单表视图能删除视图中的数据)
delete from hz004 where ename="smith"
情况2:删除值(合表视图不能删除:报错 Can not delete from join view 'hz002.hz'";)
delete from hz where dname="会计部
2.3.2 更新值:视图修改字段值,基本表也会修改字段值
update hz set mgr=8888 where ename="clark";
2.3.3 清空值:视图清空字段值,基本表也会清空字段值
update hz set mgr=null where ename="clark";
案例2.4当视图内容来源于多个虚拟表表结构不能删除(报错:不是基础表)
alter table hz drop ename;
案例2.5 无法修改视图字段,报错不是基础表
alter table hz change ename name varchar(10);
----------------------------------------------------------------------------------------------------------------------
索引
1.什么是索引 ?
一个索引是存储在表中的数据结构,索引在表的列名上创建。
索引中包含了一个列的值,这些值保存在一个数据结构中。
重点:索引是一种数据结构
2 索引的作用
2.1保证数据记录的唯一性
2.2实现表与表之间的参照完整性
2.3 减少排序和分组的时间 ;(例如在使用0rder by,group by 查询语句进行数据检索时)
2.4可以利用索引快速访问数据库中的特定信息.(重点)
3、索引的缺点:
3.1 索引要占物理空间
3.2 对表进行增,删,改,查,索引也要动态维护,降低数据的微幅速度;
4.索引分类
4.1索引查询语句:
查询方法一:格式:show index from 表名 ;
案例:show index from student2 ;
查询方法二:show keys form 表名 ;
案例:show keys form 表名 ;
4.2表结构查询:查看索引
格式:desc 表名
案例:DESC student2 ;
4.2 创建索引 (创建索引都在表中 alter table)
第一种方式创建索引:
4.2.1 普通索引 index 在表结构中显示(mnl)
最基本的索引,没有任何限制
格式一:
alter table 表名 add index 索引名(字段名)注意:有括号
alter table emp add index name_index(name)
格式二:alter table 表名 add index (字段名 );
alter table emp add index (sex );
表结构中显示mul
3.2 唯一索引 unique ( uni)
是一种表示唯一,可以有多列(理解为:唯一索引在一个表中可以有多个),可以为空
比如:一张表中,身份证唯一,手机号唯一,可以为空,可以有多个字段为唯一;
唯一索引格式一:
alter table 表名 add unique 索引名(字段名 );
案例:alter table student2 add UNIQUE weiyi(mobile);
唯一索引格式二:
alter table 表名 add unique (字段名 );
案例:alter table student2 add UNIQUE (chinese);
唯一索引在表结构中的显示:
3.3 主键索引 primary key (pri)
主键索引,列唯一性(理解为:一个表中只有一个唯一索引),不能为空
添加索引:alter table 表名 add primary key(字段名)
案例:alter table student2 add primary key (id)
主键在表结构中显示pri
注意:只能创建一个主键,两个就(报错: Multiple primary key defined)
第一条执行成功:diyialter table student2 add primary key (id)
第二条执行报错:alter table student2 add primary key (mobile)
3.4 全文索引 fulltext (拓展知识)
3.5 组合索引 (拓展知识)
3.6 单列索引 (拓展知识)
3.7 聚焦索引 (拓展知识)
3.8 非聚焦索引 (拓展知识)
删除索引:
1、删除主键索引
格式:alter table 表名 drop primary key
例题:alter table student2 drop primary key ;
2、普通索引删除和唯一索引
格式:alter table 表名 drop INDEX 索引名
例题:alter table student2 drop index weiyi ;
--------------------------------------------------------------------------------------
第二方式创建索引:
create 创建索引
格式:create index 索引名 on 表名(字段名)
例题:create index bb on student2(age)
多列创建:
create index aa on dept(字段名1,字段名2,字段名3,,,等)
案例:create index cc on student2(english,math) ;
--------------------------------------------------------------------------------
第三种方式创建索引(前面我们学习创表的时候已经讲了)
3、建表时用索引
格式:create table aa(id int(10) primary key ,name varchar(20) is not null )
-----------------------------------------------------------------------------------------------------
外键
外键定义:
让一张表记录的数据不要太过于冗余,在数据库中对表的关系进行解耦,尽量让表的数据单一化。
外键作用:保存数据的一致性和完整性。
mysql 数据库中有两大数据库存储引擎:
innodb myisam(默认)
我们使用外键的数据库必须是innodb 类型。
注意点: 数据库类型必须是INNODB类型,MYSIAM类型不支持使用外键(默认的格式)
建立外键的两种方法:
外键约束:foreign key
查看已经建好的外键方法:
1、navicat 中打开数据库,查看数据表,查看设计表,选择查看外键
2、show create table 表名 查看创建表的具体信息
------------------------------------------------------------------------------------------------------
第一种方法:表已经建好在建外键
创建一个外键
格式:alter table 表名 add constraint 外键名 foreign key(子表字段) references 父表( 父表字段)
alter table 修改表
add 添加外键
constraint 外键名 指定外键名
foreign key (子表字段) 指定字段
references 父表(父表字段) 引用外部表的主键例题:
alter table bb add CONSTRAINT fk_a
foreign key(sid) references aa(id) ;
删除一个外键
alter table 表名 drop foreign key 外键名
--------------------------------------------------------------------------------------------------------------
第二种方法:
建表直接建立外键:
格式:
create table 表名 (字段 字符类型(字符宽度) primary key ,(字段2 字段类型2(字符宽度3),constraint 外键名 foreign key(子表字段) references 父表(父表的字段))engine=innodb default charset=utf8;
#父表
create table ab (id int(10) primary key , name varchar(20)) engine=innodb default charset=utf8 ;
#子表
create table cd (sid int(10) primary key ,sname varchar(20),constraint fk_sid foreign key(sid) references ab(id))engine=innodb default charset=utf8;
点:
1、父表和子表的关系:
父表不存在的数据,在任何一张子表无法插入该数据相关的任何数据
2、两表关联,子表数据删除后,才能删除父表,对应的数据
3、外键不能修改,只能删除
公司为什么要用外键?
数量大,造成数据重复,新旧表维护成本大,使用外键让公司数据进行分类和管理,让基础数据放在主表上,子表单一化,这样避免数据的冗余。
以上案例:
第一:
1.1、在子表插入数据,父表不存在的数据(场景:父表和子表都为空数据,子表 无法插入数据,父表可以插入数据)
子表:INSERT into hzb VALUES (1,"a") (报错无法插入数据)
报错:Cannot add or update a child row: a foreign key constraint fails (`hz`.`hzb`, CONSTRAINT `fk_a` FOREIGN KEY (`sid`) REFERENCES `hza` (`id`))
第一步:父表:INSERT into hza VALUES (1,"a") (父表插入数据成功)
第二步:子表插入数据(一定是外键字段存在的数据)
INSERT into hzb VALUES (1,"b")
第二:情况:父表删除数据,需要先删除子表数据
场景一(父表中直接删除外键关联数据,直接报错):
delete from hza where id=1 ;
报错内容: Cannot delete or update a parent row: a foreign key constraint fails (`hz`.`hzb`, CONSTRAINT `fk_a` FOREIGN KEY (`sid`) REFERENCES `hza` (`id`))
场景二:(先删除子表,在删除父表,成功)
第一步:删除子表语句:delete from hzb where sid=1 ;
第二步:删除父表语句:delete from hza where id=1 ;
第三:删除外键,外键不能修改
alter table hzb drop foreign key fk_a ;