找回密码
 立即注册

推荐阅读

  • 便民服务
  • 关注我们
  • 社区新手

MySQL视图索引外键存储过程

[复制链接]
视图
一。视图定义
一个虚拟表(逻辑表),它不在数据库中以存储数据的形式保存(本身不包含数据),还是在使用视图的时候动态生成
二。视图的作用
1、数据库中的数据查询非常复杂,例如多表,子查询,编写语句较多,并且这种查询常被重复使用,那么我们就可以创建视图,避免每次写sql语句产生错误,也提高了查询的效率
2、为了安全,在公司中,有些字段为保密字段,那么可以创建视图,限制对某些字段的操作。
三。优缺点
优点:
1.提高查询效率
在数据库中非常复杂的结构,可以通过创建视图避免多次编写sql语句出现问题
2.安全
公司有些保密字段,可以通过创建视图来显示用户对某些字段进行操作
3.简单
不需要关心后面
缺点:
1、性能差
把视图查询结果转换成对表的查询
2、修改限制
修改视图数据,必须把它转化为对基础表的修改

脱敏测试(加密测试) 通常情况下,数据库是敏感,(脱敏测试)不是每一个用户都能进行访问,但是某些用户需要读取表中的部分数据,这时候就可以指定条件创建视图来限制用户只能访问指定的数据,并提供一个视图接口进行访问
四。视图的使用
  • 先查数据库中的基本表:show tables
  • 创建视图

格式:create view 视图名 as (sql语句)
3.查看创建的视图 : show create view xx
4.删除视图 :drop view xx
5.查看视图所有的内容:select * from xx
6.创建视图以后,就不需要重复合表,语句也简单
视图就是合表,可以简化查询语句

注:1。视图的特点,是由基本表产生的虚拟表
2。创建和删除不影响基础表
3。更新和删除数据直接影响基本表()
4。视图内容来源多个虚拟表不能删除
5。视图不能修改表字段
6。基础表修改数据,视图也修改数据
7。基础表修改字段,视图报错


索引
一。定义
一个索引在存储的表中的数据结构。索引是在表的字段上创建,索引包含一个列的值,这个值保存在一个数据结构中
二。作用
  • 保证数据记录的唯一性
  • 实现表与表之间的参照完整性
  • 减少排序和分组的时间(例如在使用order by, group by 查询语句进行数据检索时候)
  • 可以利用索引快速访问数据库中特定信息

三。缺点
  • 占物理内存
  • 对表进行crud,索引也要动态维护,降低数据的维护速度

四。分类
1.普通索引
index mul  最基本的索引,没有任何限制
2.主键索引
primary key  一种唯一索引,不能为空
3.唯一索引
unique uni  一种唯一索引,可以为空
4。全文索引
5。组合索引
6。单列索引
7。聚焦索引 && 非聚焦索引
五。使用
1)查询方法
a。show index from xx
b。show keys from xx
2)查看表结构
desc xx
3)创建索引
3.1创建普通索引
    a。(创建索引)CREATE INDEX indexName ON table_name (column_name)
格式:   b。修改表结构(添加索引)alter table xx add index(字段名)
          ||  alter table xx add index indexName(columnName)
3.2创建唯一索引给
alter table xx add unique (columnName)
3.3创建主键索引
alter table xx add primary key(columnName)
4)删除索引
4.1只能删除普通索引和唯一索引
alter table xx drop index indexName
4.2 只删除主键索引
alter table xx drop PRIMARY key

面试题:
1.熟悉数据库语句?
2.说一下索引有哪些
3.索引主要用来做什么,规范字段,快速查询数据,
4.创建索引的时间
5、主键索引和唯一索引
唯一         多个

外键
一。定义
二。

父表与子表之间的关系:
1.在子表插入输入数据,父表不存在的数据无法插入

2.在子表插入数据,父表存在的数据才能插入

3.父表和子表都为空数据,子表无法插入数据,父表可以插入数据

4.父表和子表存在外键,父表删除数据,需要先删除子表的数据
4.1子表和父表数据都存在,直接删除父表,会报错,无法删除


总结:
1.如何创建外键?
两种方法:
1)建表时创建 父表 在子表设置外键
格式:create table xx(sid int(10) primary key, sname varchar(20),constraint fk_sd foreign key(sid) references mm(id) engine = innodb);
2)建表后创建
格式:alter table 子表表名 add constraint 外建名 foreign key(子表字段)  references 父表(父表字段)
2.父表和子表的关系
1)当父表不存在的数据,子表无法插入
2)当两表为空时候,子表无法插入数据,父表可插入
3)当父表删除数据,需要先删除子表的数据
3.公司为什么用外键?
1)保存数据的一致性和完整性
2)公司数据量大,造成数据重复,新旧表维护成本大,使用外键让公司数据进行分类和管理,
让基础数据放在主表上,子表单一化,这样避免数据的冗余。



存储过程
一。定义
实现某个特定功能的sql语句的集合,编译后的存储过程会保存在数据库中,通过存储过程的名称可以反复的调用执行
二。优点
1.存储创建后,就可以反复调用和使用,不需要重新写复杂的sql语句
2.创建,修改存储过程不会对数据有任何影响
3.存储过程可以通过输入参数和返回值
4。可以通过加入控制语句,加强sql语句的功能性和灵活性
5.对于单个的crud语句可以直接封装在一个函数体当中,或者封装在一个集合当中,存储过程一旦创建就可以直接调用,而且可以重复调用
6.单个sql语句每次执行都要进行编译,而存储过程只需要编译一次,后续就可调用
7.创建存储过程,可以重复进行调用,可以减少开发人员的工作量
8.防止sql注入
9.造数据
三。如何使用
1.创建
delimiter // #分隔符/定格符
create procedure 存储名称( in 或者 out 或者 inout)
BEGIN #开始
执行语句块1
执行语句块2
end #结束
//分隔符
2。先执行创建存储,在调用使用call
call 存储名() 调用存储
             3。查询删除
3.1查看单个存储过程的项详情
show create procedure xx;
3.2查看所有已经创建的存储过程
show procedure status;
3.3查询数据库创建的存储过程
show procedure status where db = "xx";
3.4删除存储过程
drop procedure xx;
4。存储过程的编写
1)无参数的存储过程
eg:
delimiter //
create procedure xx()
BEGIN
select  ;
END
//

call xx()

2) in 输入参数的存储
  • 只用来向过程传递信息,为默认值。
  • MySQL存储过程"in"参数:跟C语言的函数参数的值传递类似,MySQL存储过程内部可能会修改此参数,
  • 但in类型参数的修改对调用者(caller)来说是不可见的(not visible)


eg:
delimiter //
create procedure  a(in x int)
BEGIN
select * from emp where dept = x;
END
//
call a(103)

3)out 输出参数
  • 只用来从过程传回信息。
  • MySQL存储过程"out"参数:从存储过程内部传值给调用者。
  • 在存储过程内部,该参数初始值为 null,无论调用者是否给存储过程参数设置值。

eg:
delimiter //
create procedure b(out y int)
BEGIN
select sid into y from emp where name = "xx"
END
//
call b(@y)
select @y

4)in,out
eg:
delimiter //
create procedure c(out y int,in x int)
BEGIN
select age into y from emp where sid = x;
END
//
call c(@y,1789)
select @y
5)inout 输入和输出
  • 可以向过程传递信息,如果值改变,则可再从过程外调用。
  • MySQL存储过程"inout"参数跟out类似,都可以从存储过程内部传值给调用者。
  • 不同的是:调用者还可以通过inout参数传递至给存储过程。

eg:
delimiter //
create procedure d(inout n int)
BEGIN
set n:=n+1;
END
//

set @n=2
call d(@n)
select @n

补充:
1、用户变量 定义语法
1.1set @变量名
赋值的语法:
set @变量名: = 值
set @变量名 =值
select @变量名: = 值
1.2通过查询结果为变量赋值
select 字段||表达式 into 变量名 from 表名 where 条件

2、声明变量
declare i int default 0
应用:
造数据
第一种:在存储外先建表,在造数据,写死的数据
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;

分享至 : QQ空间
收藏

0 个回复

您需要登录后才可以回帖 登录 | 立即注册