一、数据库视图
(一)什么是视图?
视图是一种虚拟存在的表,是一个逻辑表,本身并不包含数据。是由行和列组成的数据,他不在数据库中存储,而是在使用视图的时候引用基础表动态生成的。
(二)视图的特点
1、视图是由基本表产生的虚表
2、视图的列可以有多个基本表中的某些列组成
3、视图的创建和删除,不影响基本表
4、视图对内容的更新或者删除,直接影响基本表
5、当视图内容来自多个虚拟表时,则不允许删除
(三)视图的缺点:
1、性能差
把视图查询的结果转化成对基本表的查询,
2、修改限制
用户修改视图的数据,必须把它转化为对基本表的修改,简单的视图来说很简单,但是对于比较复杂的视图来说,可能是不允许修改
(四)视图的优点
1、提高查询效率 ;数据库中数据,查询非常复杂,创建视图可以避免多次编写sql语句出现的错误,
2、安全
公司中有些字段为保密字段,也可以通过创建视图来限制用户对某些字段进行操作
3、简单
不需要关心后面对应表的结构,
通常情况下,数据库是敏感,(脱敏测试) 不是每一个用户都能进行访问,但是某些用户需要读取某些表的部分数据,这时就可以定义指定条件的视图来限制用户只能访问其指定的列的数据,并提供一个视图接口进行访问,基于这种原理,大大简化查询语句编写以及复杂条件下的数据刷选,同时也延伸出视图中套用视图,因为视图是一个表,所有视图中引用视图从简化用户更复杂的数据筛选,用户只需要调用视图就可以得到经过复杂运算后的数据,提高开发效率同时也提高数据的安全性。
4、4.1创建视图
create view 视图名称 as (sql语句)
如:create view a as ( select name , incoming ,dept2 from emp) ;
4.2 查看视图
show create view 视图名
如:
show create VIEW b ;
4.3修改视图
alter view 视图名称 as (mysql语句)
4.4 删除视图
drop view 视图名称
4.5查询单表视图 内容
select * from 视图名
注意点:对视图的操作与对基本表的操作都:是一样的,两者任意一方的字段值被修改都会实时影响到对方(如:修改视图的字段值,会同步到基本表的字段值;修改表也会同步到视图)
(1)=视图改字段无法修改
#alter table b change name name16 char(20) ;
(2)修改视图值,原表也修改值
例题:update emp set age=100;
update b set name=kaifen;
二、索引
1、索引:是加速对表中数据的检索创建的一种分散的存储结构
2、定义:在关系型数据库中,索引是一种单独的,物理的对数据库表中一列或多列的值进行排序的存储结构,它是某个表中一列或多列的结合和相应的表中标识这些数据叶的逻辑指针清单。
3、索引的作用:
(1)快速取数
(2)保证数据记录的唯一性
(3)实现表与表之间的参照完整性
(4)在使用order by ,group 子句进行数据检索时,利用索引可以减少排序和分组的时间
4、优缺点:
(1)优点 :4.1.1加快检索速度
4.1.2 减少分组和排序的时间
4.1.3 加速表和表之间的连接
4.1.4创建唯一索引,保证数据库表中每一行数据的唯一性
(2)缺点:
4.2.1 索引要占物理空间
4.2.2 对表进行增、删、改、查 ,索引也要动态维护,降低数据的维护速度
5、索引的类型
普通索引 index (mul)
最基本的索引,没有任何的限制
主键索引 primary key (pri)
是一种唯一索引,不允许为空
唯一索引 unique (uni)
与主键索引类似:不同的就是,索引列的必训唯一,但允许有空值。
全文索引 fulltext
仅用于mylsam表,用于在一篇文章汇总,检索文本中信息,针对较大的数据,生成全文索引很耗空间,
组合索引
为了更多的提高mysql的效率可以建立组合索引,遵循"最左前缀"的原则
单列索引
聚焦索引
非聚焦索引
6、索引语句
(1)查询索引方法
1、1 show index from emp ;
1、2 show keys from emp ;
(2)创建索引 alter table
2.1普通索引:
方法一:alter table 表名 add index 索引名(列名);
#alter table emp add INDEX gz(name);
方法二:alter table 表名 add index (列名)
2.2唯一索引
方法一:alter table 表名 add unique 索引名(列名);
alter table dept add unique a(dept1) ;(索引名不同:
方法二:alter table 表名 add unique (列名)
alter table dept add unique(dept3) ;
2.3 主键索引
alter table 表名 add primary key (列名)
如:alter table dept add primary key ( dept1);
2.4全文索引
如: alter table emp add fulltext(dept2);
2.5多列索引(组合索引):
如:alter table emp add index (name ,age,dept2);
alter table emp add index a (name ,age,dept2);
7.删除索引:
7.1删除主键索引
alter table 表名 drop primary key;
如:
alter table dept drop primary key ;
7.2 删除普通索引
7.2.1 ALTER table dept drop index 索引名
ALTER table dept drop index dept3
7.2.2
8、create 建索引
单列创建:create index 索引名 on 表名(列名);
多列创建:create index 索引名 on 表名(列名1,列名2)
备注:只显示两个索引,不显示字段的索引
9、建表时用索引
如:create table xlh( id int primary key ,name char(20)
备注:
三、外键:
1、外键用来干什么?
让一张表的数据不要太过于冗余,在数据库中是对表的关系进行解耦,尽量让表记录的数据单一化。
2、外键的主要作用?
保持数据的完整性和一致性
3、外键约束:foreign key 表与表之间的约束
mysql数据库有两大数据库存储引擎:innodb和myisam (默认)
innodb 的类型查看:
查存储引擎:
show table status from “库名” where name="表名" ;
创表语句:
#create table mm (id int primary key , name VARCHAR(20))engine=innodb ;(父表)
#create table nn (sid int(10) PRIMARY key , sanme varchar(20),constraint fk_sid FOREIGN key(sid) references mm(id)) engine=innodb;(子表)
建表时外键的方法一:
格式:
constraint 外键名(自定义) FOREIGN key(子表的外键字段) references 父表(字段)
constraint fk_sid FOREIGN key(sid) references mm(id)
建表增加创建外键方法二:
格式:alter table 表名 add constraint 外键名 FOREIGN key(子表字段名) references de父表(父表的列名) ;
alter table sc add constraint zy FOREIGN key(sc_no) references dept(dept1) ;
alter table 表名 add 增加外键
constraint 外键名 指定外键名
FOREIGN key(子表字段名) 指定字段
references dept(dept1) 引用外部表的主键
删除主键
alter table +表名 +drop foreign key +外键名
alter table sc drop foreign key zy ;
注意点:
(1)外键不能修改,只能删除
(2)primary key == 主键 等价于 唯一 (UNIQUE) 且 非空 (NOT NULL)
因为 Mysql 里面的自增列, 必须要依赖一个 主键 或者 唯一的键。
所以你的 SQL 里面要有一个
PRIMARY KEY ( `id` )
如果不加 PRIMARY KEY ( `id` ) 的话, 结果将像下面这个样子:
mysql> CREATE TABLE tab (
-> id INT AUTO_INCREMENT,
-> val VARCHAR(10)
-> );
ERROR 1075 (42000): Incorrect table definition; there can be only one auto column and it must be defined as a key
ENGINE = InnoDB DEFAULT CHARSET = gbk AUTO_INCREMENT =1;
这行语句, 设置了3个表的属性
ENGINE = InnoDB 是设置表的引擎。 innoDB 引擎是比较新的, 支持外键 与 事务处理等特性。
CHARSET = gbk 是字符集
AUTO_INCREMENT =1 是那个 自增的 ID , 起始数值是 1
我把这样的表单写入数据库以后 留言板上的内容(中文)添加上去显示是“??”。
我查看结构的时候确实是gbk_chinese_ci 了
这个要调查一下,你的数据,是怎么插入的。
虽然你的数据库表的 字符编码, 是 gbk 了。
但是如果你的 数据,是通过 网页插入的, 而网页的编码是 utf8 之类的话。
那么最后保存的数据, 就可能是 ?? 了。
(2)父表和子表的关系:如果父表不存在的数据,在任何一张子表无法插入该数据相关的任何数据;
(3)两表关联,子表数据删除后,才能删除父表的对应数据