mysql之视图 视图表是一个虚拟表(逻辑表),他不在数据库中以存储数据的形式保存(本身不包含数据),还是在使用视图的时候动态生成 =========================================================== 视图的作用 1、数据库中的数据的查询非常复杂,例如多表,子查询,编写语句较多、并且这种查询常被重复使用,那么我们就可以创建视图,避免每次写sql语句会错误,也提高了查询的效率。 2、为了安全,在公司中有些字段为保密字段,那麽可以创建视图,限制对某些字段的操作。 =========================================================== 视图的优缺点 优点 1、在数据库中非常复杂的数据,可以通过创建视图避免多次编写sql语句出现的错误。 2、安全 公司有些保密字段,可以通过创建视图来限制用户对某些字段来进行操作。 3、简单 不需要关心后面对应的表结构。 缺点 1、性能差 把视图查询结果转换成表的查询 2、修改权限 修改视图数据,必须把它转化为对应基础表的修改 脱敏测试(就叫加密测试) 通常情况下,数据库是敏感,(脱敏测试)部署每一个用户都能进行访问,但是某些用户需要读取表中部分数据,这是就可以指定条件创建视图来限制用户只能访问指定的数据,并提供一个视图接口进行访问。 =========================================================== 视图的使用 1、查看数据库中所有的表 show tabls 2、创建视图 create view 视图名 as (sql语句) 3、删除视图 drop viem 视图名 4、查看视图 show create viem 视图名 5、查看视图所有内容 select * from 视图名 6、创建视图后就不需要重复和表,语句简单——视图就是合表,可以简化查询语句 ========================================================== 视图的特点 1、视图是由基本表产生的虚拟表 2、视图的创建和删除不影响基础表 3、视图的数据更新和删除数据直接影响基础表 4、视图内容来源于多个虚拟表结构不能删除 5、视图不能修改表字段 6、基础表修改数据,视图表自动也修改 7、基础表修改字段,视图报错 =========================================================== 1、数据库会哪些? 增、删、改、查 2、什么是视图 视图是一个虚拟表,在基础表的基础上动态生成的 3、视图的作用
Mysql之索引 1、什么是索引(索引是一种数据结构) 一个索引在存储的表中的数据结构 索引是在表的字段上创建 索引包含了一个列在值,这个值保存在一个数据结构中 2、索引的作用 保证数据记录的唯一性 实现表与表之间的参照完整性 减少排序和分组的的时间(例如在使用 order by,group by 查询语句进行数据检索时间) 可以利用索引快速访问数据库中特定的信息(重点) 3、索引的缺点 索引要占物理内存 对表进行增删改查,索引也要动态维护,降低数据维护速度 4、索引的分类 普通索引 index mul 最基本的索引,没有如何的限制 主键索引 primary key pri 是一种唯一索引,不能为空 唯一索引 unique uni uni 是一种唯一索引,可以为空 全文索引 组合索引 单列索引 聚焦索引 非聚焦索引 5、索引的使用 索引查询方法 show index from 表名 show keys from 表名 查看表结构 desc 表结构 创建索引 建表后建立索引 建立普通索引 index mul(简写) 索引名和字段名不同 alter table 表名 add index 索引名(字段名) 索引名和字段名相同 alter table 表名 add index (字段名) 创建唯一索引 unique 简写() 字段名和索引名不同 alter table 表名 add unique 索引名 字段名和索引名相同 alter table 表名 add unique 字段名 创建主键索引 primary key 简写(pri)唯一不能为空(主键索引一个表中只能有一个) alter table 表名 add primary key (字段名) create方法创建索引 create index 索引名 on 表名(字段名) 新建表建立索引 删除索引 只能删除普通索引和唯一索引 alter table 表名 drop index 索引名 只删除主键索引 alter table 表名 drop primary key ======================================================== 1、你熟悉数据库语句吗? 2、你说一下索引有哪些? 3、索引主要用来做什么? 4、什么是索引? 5、创建索引的时间? 6、主键索引和唯一索引的区别? Mysql之外键 一、外键的介绍 1、外键的定义: 让一张表记录的数据不要太过于冗余,在数据库中对表的关系进行解耦,尽量让表的数据单一化。 2、外键作用 外键的作用:保持数据的一致性和完整性 3、mysql 数据库中存储引擎 innodb (外键要使用innodb存储引擎) myisam(默认) 4、查看存储引擎 格式:show table status from 库名 where name="表名"; 案例:show table status from hz10 where name="emp" ;
=========================================================== 建表语句: (1)通过建表语句来创建主键 mm 表 nn 表 mm 表如下创建: Create table mm (id int(10) primary key , name varchar(10)) ENGINE=innodb ; (父表) nn表 如下创建: create table nn (sid int(10) PRIMARY key ,sname varchar(20) , constraint fk_wj foreign key(sid) REFERENCES mm(id) )engine=innodb ; (子表) constraint 外键名 指定外键 foreign key (子表)指定字段 REFERENCES 父表(父表字段) 引用外部表的主键 (2)直接创建键(表先建好) 创建 ss 表: (父表) create table ss (id int(10) primary key , name varchar(10))ENGINE=innodb; 创建 cc 表:(子表) create table cc (sid int(10) primary key , sname varchar(10))ENGINE=innodb 格式:alter table 子表 add CONSTRAINT 外键名 foreign key (子表字段名) REFERENCES 父表(父表的字段名) 案例:alter table cc add CONSTRAINT ss_key foreign key (sid) REFERENCES ss(id) =========================================================== 查看外键: 格式:show create table 表名 ; show create table cc ;
=========================================================== 删除外键: 格式:alter table 表名 drop foreign key 外键名 案例:alter table cc drop foreign key ss_key ; =========================================================== 一、子表和父表之间关系: 1、在子表插入数据,父表不存在的数据无法插入(报错) 案例:INSERT into cc VALUES (1,"aa") 报错(父表不存在的数据,子表无法插入) Cannot add or update a child row: a foreign key constraint fails (`hz10`.`cc`, CONSTRAINT `ss_key` FOREIGN KEY (`sid`) REFERENCES `ss` (`id`)) 2、在子表插入数据,父表存在的数据才能插入 案例:INSERT into ss VALUES (1,"wq") ; 先插入父表 INSERT into cc VALUES (1,"aa") 3、父表和子表都为空数据,子表无法插入数据,父表可以插入数据 4、存在外键时:父表删除数据,需要先删除子表数据 (1)子表和父表数据都存在,直接删除父表,报错,无法删除 案例:DELETE from ss where id=1 ; 直接删除父表 Cannot delete or update a parent row: a foreign key constraint fails (`hz10`.`cc`, CONSTRAINT `ss_key` FOREIGN KEY (`sid`) REFERENCES `ss` (`id`)) (1)子表和父表数据都存在,直接先删除子表 ,在删除父表 DELETE from cc where sid=1 ; 先删除子表数据 DELETE from ss where id=1 ; 在删除父表数据 4、主键名可以修改 alter table cc add CONSTRAINT ss foreign key (sid) REFERENCES ss(id)
=========================================================== 总结: 1、如何创建外键? 两种方法: 1、建表时创建 父表 在子表设置外键 格式:create table 表名(sid int(10) PRIMARY key ,sname varchar(20) , constraint fk_wj foreign key(sid) REFERENCES mm(id) )engine=innodb ; (子表) 2、建表后创建 格式:alter table 子表表名 add CONSTRAINT 外键名 foreign key (子表字段) REFERENCES 父表(父表字段) engine=innodb ; 2、父表和子表的关系? (1)当父表不存在的数据,子表无法插入 (2)当两表为空时,子表无法插入数据,父表可插入 (3)当父表删除数据,需要先删除子表数据 3、公司为什么用外键? (1)保存数据的一致性和完整性 (2)公司数据量大,造成数据重复,新旧表维护成本大,使用外键让公司数据进行分类 和管理,让基础数据放在主表上,子表单一化,这样避免数据的冗余。 Mysql存储过程 一、存储的介绍 (1)什么是存储过程? h存储过程是实现某个特定功能的sql 语句的集合,编译 后的存储过程会保存 在数据库中,通过存储过程的名称可以反复的调用执行。 (2)存储过程的优点? 1、存储创建后,就可以反复非调用和使用,不需要重新写复杂的sql语句 2、创建、修改存储过程不会对数据有任何的影响 3、存储过程可以通过参数和返回值 4、存储过程可以通过加入控制语句,加强sql语句的功能性和灵活性 5、对于的那个的增删改查语句,可以直接封装在一个函数体当中,或者封装在一个集合当中,存储过程一旦创建就可以直接调用,而且可以重复调用 6、单个sql语句每次执行都要数据库进行编译,而存储过程创建只需要编译一次,后续就可调用 7、创建存储过程,可以重复进行调用,可以减少开发人员的工作量 8、防止sql注入 9、造数据 ============================================ 二、存储的基本格式: delimiter // #分隔符/定格符 create procedure 存储名称( in或out 或 inout) BEGIN #开始 执行语句块1 执行语句块2 end #结束 // #分隔符 先执行创建存储,在调用使用call call 存储名() 调用存储 ============================================ 基本使用的语句: (1)查看单个存储过程的项详情 格式:show create procedure 存储名; show create procedure hz1 ; (2)查看所有已经创建的存储过程详情 格式:show PROCEDURE STATUS ; show PROCEDURE STATUS ; (3)查询数据库创建的存储过程 格式:show PROCEDURE STATUS where db="数据库名" ; show PROCEDURE STATUS where db="hz10" ; (4)删除存储 格式:drop procedure 存储名称 ; drop procedure hz2 ; ============================================ 存储过程的编写 (1)无参数的存储过程 格式: delimiter // create procedure 存储名称() BEGIN 语句; END //call 存储名称() #调用存储过程例: 案例:delimiter // create procedure aa() BEGIN select * from emp; END // call aa() (2)in 输入参数的存储 格式: delimiter // create procedure 存储名称( in x int) BEGIN select * from 表名 where 字段名=x; END // call 存储过程名(103) 案例: delimiter // create procedure bb( in x int) BEGIN select * from emp where dept2=x; END // call bb(103) (3)out 输出参数 格式: delimiter // create procedure ee( out y int ) BEGIN select sid into y from emp where name="sunbao"; END // call ee(@y) select @y (4)in ,out 案例 delimiter // create procedure ff( out y int ,in x int) BEGIN select age into y from emp where sid=x; END // call ff(@y,1789) select @y (5)inout 输入和输出 delimiter // create procedure hh( inout n int) BEGIN set n:=n+1; END // set @n=2 call hh(@n) select @n ============================================ 1、用户变量 定义语法: set @变量名 赋值的语法: (1)set @ 变量名 :=值 (2)set @ 变量名 =值 (3)select @变量名:=值 ; 方法二:通过查询结果为变量赋值 select 字段| 表达式 into 变量名 from 表名 where 条件 2、声明变量 declare i int default 0 #declare 声明变量 ,i i 变量 数据类型 int 默认值 =========================================================== 造数据 第一种造数 在存储外先建表,在造数据,写死的数据) delimiter // DROP PROCEDURE if exists hh ; #增强存储的健壮性,判断存在删除 create procedure hh() BEGIN declare i int default 0 ; #声名一个变量, i变量 ,int数据类型 条件 while (i<10) DO INSERT into abc VALUES (i); set i=i+1; end WHILE ; select * from abc ; END call hh() 第二种造数 在存储外先建表,在造数据,根据输入的数据造数) delimiter // DROP PROCEDURE if exists hh ; #增强存储的健壮性,判断存在删除 create procedure hh(in x int) BEGIN declare i int default 0 ; #声名一个变量, i变量 ,int数据类型 条件 while (i<x) DO INSERT into abc VALUES (i); set i=i+1; end WHILE ; select * from abc ; END call hh(1000) 第三种造数:( 在储存中造表,在造数据,根据输入的数据造数) drop table abc ; create table abc (id int(10)) ; delimiter // DROP table if EXISTS abc; DROP PROCEDURE if exists hh ; #增强存储的健壮性,判断存在删除 create procedure hh(in x int) BEGIN declare i int default 0 ; #声名一个变量, i变量 ,int数据类型 条件 DROP table if EXISTS abc; create table abc (id int(10)) ; while (i<x) DO INSERT into abc VALUES (i); set i=i+1; end WHILE ; select * from abc ; END // call hh(100) =========================================================== 循环语句: 数据库中有三种: while ......条件...do ....执行语句块....end while loop........end loop repeat ........until end repeat ___________________________________________________________ if判断语句 if语句的单分支: if 条件 then 执行sql1 else 执行sql2 end if ; ___________________________________________________________if判断语句 if语句的多分支: if 条件 1 then 执行sql1 else if 条件2 执行sql2 else if 条件3 执行sql语句3 else 执行语句4 end if ; end if ; end if ;
|