广州39期-何志谦 发表于 2022-3-6 11:11:04

索引

DDL==》数据库定义语言==》对表的定义,表字段进行操作==》creat(创建),alter table(修改表),drop(丢弃。删除表)
DML==》数据库操作语言==》对表中的数据操作进行操作==》增(insert into) 删(delete) 改(update....set) 查(select)


索引:index
为了提高查询性能都会增加索引(一般增加在常用的字段上======热字段)
索引是对表的字段生效,但是不能对整个表所有的字段都加索引,如果整个表所有字段都加索引就会丧失了索引的意义了,反而会导致系统的性能受到影响

索引注意:
1.创建索引的前提:表中有大量的数据(上万行),添加索引会对查询速度有明显的提升
2.不能对一个表的每个字段都添加索引,如果都添加就丧失了索引的意义,反而会消耗大量的内存或者磁盘的资源,通常只要对热字段(经常需要查询的字段)添加索引
3.索引的优先级,主键索引PRI>唯一索引UNI>普通索引MUL

索引的类型:3种
普通索引:index   (允许索引所在字段的值可以重复和为空,允许表中存在多个普通索引)
唯一索引:unique index   (允许索引所在字段的值为空,但不允许重复,允许表中存在多个唯一索引)
主键索引:primarykey(索引所在字段的值既不能为空也不能重复(当我们定义了主键约束时,其实就是定义主键索引,主键约束是主键索引的一个表征),一个表中只能有一个主键索引)

select *from grade;
desc grade

创建普通索引:
给单个字段创建普通索引
creat index aa on grade(class); ==>创建 普通索引aa 在grade表的class字段上
查看索引的情况:
show index from grade;==》展示 索引情况 来自于 grade表

给多个字段创建普通索引(创建联合索引)
creat index bb on grade(age,sex)==》创建 普通索引 bb在 grade 表的age 和sex字段上面


索引是一种表结构,所以可以通过alter table 的方式进行修改
alter table grade drop index bb;==>修改表 grade表 丢弃索引
通过alter table grade add index bb (age) ;==>修改表 grade表 添加普通索引bb 在age字段上

创建唯一索引:(注意,唯一索引字段的值不能重复)
create unique index cc on grade(name);==>创建唯一索引CC 在grade表上的name字段


通过alter table删除唯一索引
alter table grade drop index cc;==》修改表 grade 表删除索引cc
通过alter table 创建唯一索引
alter table grade add unique index ff(name);==>修改表grade表添加唯一索引 ff在name字段上

主键索引;
在创建主键的时候,主键索引就同时创建成功
desc grade ;

删除主键索引;
1.先删除自增长约束
alter table grade change sid sid int(4);
2.再删除主键索引
alter table grade drop primary key;

添加主键索引,;
alter table grade add primary key(sid);===>修改表 grade表 添加主键索引 在sid字段上
alter table grade drop primary key;==>删除grade 表的主键

添加主键索引的复合索引;
alter table grade add primary key(sid ,chinese);

--------------------------------------------------------------------------------
视图数据表 view
是一种虚拟表,不负责存储数据,是通过实际的基础表创建的,用来显示基础表的数据,数据是动态的生成的

为什么要使用视图view?
1.为了安全,在实际表中有些字段可能是保密的,那么就可以通过创建视图的方式,让用户操作视图从而避免对实际表的保密字段进行操作
2.为了方便操作,在数据库中,有些查询语句比较复杂,就可以对这些复杂的语句加工成视图表,就可以避免复杂的查询重复编写的出错

视图view特点:
1.视图是实际表(基础表)创建的虚拟表
2.视图是由列(字段)和行(值)组成,它的列可以是多个表中列
3.视图的创建和修改是不影响基础表
4.基础表的修改或者删除就会影响到视图表
5.基础表和视图中的数据是互相影响的,当一个视图是由复杂的查询创建出来时,不允许修改视图的数据

缺点:
1.视图的性能差,因为视图查询时本质上是对基础表进行查询
2.视图存在修改限制,当用户想修改视图里面的数据时,本质上需要先转化成对底层基础表的某些信息进行修改,如果视图的数据来源比较复杂时不允许修改的

创建视图(可以理解为对基础表的数据进行复杂)
select *from grade;
create view dcs as(select name,chinese,math from grade);==>创建视图 dcs根据 查询grade表的name,chinese,math,字段的值 得到

show tables==>展示当前库中所有的表(包括基础表和视图表)
select *from dcs;==>对视图表dcs表进行查询,得到的结果本质上就是select ,name,chinese,math from grade
show create view dcs;==>查看视图dcs的结构
对视图表中的数据操作可以直接使用 增删改查
insert into dcs(name) values('xiaomai');
update dcs set chinese=88 where name='xiaomai';
delete from dcs where name='lisi'
对基础表中的数据进行修改,也会影响到视图
delete from grade where sid=1;

创建一个通过多表查询获取的视图表
create view duobiao as(select *from dept left join emp on dept.dept1=emp.dept2);
select *from duobiao;

删除视图
drop view duobiao;

查看当前库中有哪些视图

--------------------------------------------------------------------------------
外键约束 foreign key
外键约束,约束的是表和表之间的关系,目的为了保持数据的一致性,完整性
使用外键的表,必须是数据引擎为innodb的
把一个表B的某个字段约束到另一个表A的某个字段中,
1.当表A字段不存在值时,表B不能进行添加对应的值
2.当表B字段存在时,表A对应的值不能改变

现在创建两个表DCS1和DCS2
dcs1===>主表父表
create table dcs1(id int(4) primary key,name varchar(20)) engine=innodb;


dcs2;==>从表子表
creat table dcs2(                                       ====》创建表dcs2表
sid int(4) primary key,sname varchar(20),    ====》包含字段sid 类型为int(4)主键约束,字段sname类型varchar(20)
constraint gz foreign key(sid) references dcs1(id)   ====》创建约束名称gz外键定义在sid 引用dcs1表的id字段
) engine=innodb ;                                        ======》数据引擎为innodb

constraint gz 约束名称为gz                      =====>约束名称为gzps:外键的名称
foreign key(sid) 外键定义在本表中的sid   =====》外键定义在本表中的sid ===》外键加载这个sid字段上
references dcs1(id) 引用的是dcs1表中的id字段==》dcs1表变成了该表的主表,主表的id字段对应着子表中sid字段
sid字段的值就受到dcs1表中id字段的约束
如果id的值不存在,那么sid就不能添加对应的值
如果sid已经添加了,那么id不能被删除
id和sid就不能随意改变了

往两张表添加数据:
要先对主表进行添加
insert into dcs1(id,name) values(1,'xiaomai');
select *from dcs1;
才可以对从表添加相同的值
insert into dcs2(sid,sname) values(1,'damai');
select *from dcs2;

异常的添加:
直接对从表添加主表不存在的数据
insert into dcs2(sid,sname) values(2,'damai1');----报错

异常的更新;
更新主表,当主表的数据被从表引用,不能直接更新或者删除主表的数据。
update dcs1 set id=3 where id=1
delete from dcs1 where id=1;
更新子表,当子表没有对应的数据可以被子表引用,子表是不能更新到对应的值的
update dcs2 set sid=2 where sid=1;
如果需要删除或者修改主表的数据,就要先删除子表引用的数据
delete from dcs2 where sid=1;
update dcs1 set id=3 where id=1;
select *from dcs1;
delete from dcs1;

总结:
1.主表不存在的数据,在相关的从表无法插入与之相关的数据
2.对主表进行删除或者更新,会导致主表没有了外键值时,那么执行会报错
3.对子表进行更新或者插入数据时,如果主表没有这个外键值,那么执行会报错
4.如果要删除主表的信息,需要先确认从表是否存在,如果从表存在,要先删除从表对应的数据

删除外键约束:
alter table dcs2 drop foreign key gz;==>修改表dcs2表 丢弃 外键 gz;

添加外键约束
alter table dcs2 add constraint gzdcs foreign key(sid) references dcs1(id);
==>修改表 dcs2 添加 约束 名称gzdcs 外键在sid 字段上 引用dcs1表的id字段
注意:添加外键时,需要确保从表和主表数据的一致性,否则添加失败。


页: [1]
查看完整版本: 索引