26 MySQL索引、存储过程和触发器

367 阅读6分钟

1 MySQL索引

在数据库表中,对字段建立索引可以极大地提高查询速度,在MySQL中常见的索引可以分为以下几种:

索引名称说明
主键索引主键是一种唯一性索引,每个表只能有一个主键,用于标识数据表中的每一条记录
唯一索引唯一索引指的是索引类的所有值都只能出现一次,也就是每个值具有唯一性
普通索引最常见的索引,作用就是加快对数据的访问速度

MySql将一个表中的索引都保存在同一个索引文件中,若果对数据库进行增删改操作,MySql都会自动的更新索引。

主键索引

一个表可以没有主键,但最多只能有一个主键,且逐渐的值不能为null,为表添加主键索引的语法格式是:

创建表时直接添加主键索引

create table 表名(
	字段名  字段类型  primary key,
);

修改表结构时,添加主键索引

alter table add primary key (列名)

唯一索引

唯一索引可以保证数据记录的唯一性。在实际开发中,创建唯一索引不光光是为了提高查询速度,更多的是为了避免数据出现重复。

唯一索引的语法格式

--第一种方式,在创建表时添加唯一索引
create table(
  列名 类型(长度),
  unique [索引名称] (列名)
);
--第二种方式,在已创建的表上添加唯一索引
create unique index 索引名 on 表名(列名(长度));
--第三种修改表结构,添加唯一索引
alter table 表名 add unique (列名)

普通索引

普通索引(有关键字key和index定义的索引)的唯一作用就是加快数据的访问速度。因此,应该将那些经常出现在查询条件或排序条件中的数据列添加普通索引。普通索引的语法格式是:

--第一种,在已有表上创建索引
create index 索引名 on 表名 (列名(长度));
--第二种,修改表结构添加索引
alter table 表名 add index 索引名(列名)

删除索引

由于索引是会占用额外的存储空间的,为了避免影响数据库性能,应该删除不再使用的索引,删除索引的语法格式是:

alter table 表名 drop index 索引名;

索引的优缺点:

  • 优点:提高了查询速度;显著减少了查询分组和排序的时间。
  • 缺点:创建索引和维护索引需要时间,与数据量的大小成正比;对表中的数据进行增删改操作的时候,就需要维护索引,这也就降低了数据的维护速度。

2 MySQL视图

视图是一种虚拟的表,是建立在已有的表的基础上,视图赖以建立的这些表称为基表,向视图提供数据内容的语句是select语句,可以将视图理解为存储起来的select语句。

视图的作用:用在权限控制方面,只能用户查看特定的几列数据,其他列的数据用户是查看不到的;简化复杂的多表查询,由于视图本身就是一条SQL查询语句,我们可以将一次复杂的查询构建成视图,这样用户就可以之间查询视图就可以得到相应的数据,而不用再书写复杂的查询语句。

创建视图

语法格式:

create view  视图名 [可选参数] as select语句;

创建视图查询所有商品和商品的对应分类信息,具体代码:

create view products_category_view as select * from products p left join category c on c.cid = p.category_id;
--查询视图,只需要将视图当作一张表就行
select * from products_category_view;

查询鞋服类下最贵的商品的全部信息

select * from products_category_view pcv where pcv.cname='鞋服'and pcv.price=(select max(price) from products_category_view where cname='鞋服');

视图与表的区别:

  • 视图是建立在表的基础之上的,表存储数据库中的数据,而视图只是做数据的展示

  • 通过视图是无法改变表中的数据

  • 删除视图,表是不受影响,而删除表,视图就不起作用

3 MySQL存储过程

存储过程是一种在数据库中存储复杂程序,以便外部程序调用的一种数据库对象。存储的过程是完成特定功能的SQL语句集,经编译创建并保存在数据库中,用户可以通过指定存储过程的名字并给定参数来调用执行。简而言之,存储过程就是一堆SQL语句的合并,中间加入了一些逻辑控制。

使用存储过程的优缺点:

  • 优点:存储过程一旦调试完成,就可以稳定运行,这也就要求业务需求是稳定不变的;存储过程减少了业务系统与数据库的交互,降低耦合,数据库交互更加快捷。
  • 缺点:实际开发中业务需求是经常发生改变的,因此不建议使用存储过程;存储过程可移植性很差;存储过程的维护麻烦

无参存储过程的创建方式:

delimiter $$ --声明语句结束符,可以自定义,一般使用$$
create procedure 过程名() --声明存储过程
begin      --开始编写存储过程
           --要执行的操作
end $$     --存储过程结束
--调用存储过程
call 存储过程名

编写存储过程,查询所有商品数据,再调用存储过程

delimiter $$
create procedure good_pro()
begin
    select * from products;

end $$;
call good_pro;

编写带参数的存储过程

create procedure 存储过程名(in 参数名 参数类型);

编写一个接受参数的存储过程,接收商品id,根据id删除数据

delimiter $$
create procedure good_delete(in id varchar(32))
begin
    delete from products where pid=id;
end $$;
call good_delete('p009');

编写带参数且有返回值的存储过程

变量赋值和OUT输出参数,表示存储过程向调用者传出值

set @变量名=--变量赋值
out 变量名 数据类型 --存储过程向调用者传出值

编写一个带参数和返回值的存储过程,返回1表示插入成功

delimiter $$
create procedure pro_in(in id varchar(32),in name varchar(50),in price int,in flag varchar(2),in cate varchar(32),out res int)
begin
    insert into products values (id,name,price,flag,cate);
    set @res=1;
    select @res;

end $$;
call pro_in('p009','苹果电脑',10000,'1','c001',@res);

4 MySQL触发器

触发器是MySQL一种保护数据完整性的方法,与表事件相关的特殊存储过程,它的执行不是有程序调用,也不是手工调用,而是由事件来触发的。简单理解就是当我们执行一条sql语句的时候,这条sql语句的执行会自动去触发执行其他的sql语句。

触发器创建的四个要素:

  • 监视地点(table)
  • 监视事件(insert/update/delete)
  • 触发时间(before/after)
  • 触发事件(insert/update/delete)

创建触发器的语法格式

delimiter $$
create trigger 触发器名
before/after(insert/update/delete)
on 表名
for each row --固定写法,叫做行触发器,每一行受影响,触发事件都执行
begin
--这里写触发事件
end $$;

编写触发器:当下订单的时候,对应的商品的库存量要相应的减少,卖出商品之后减少库存量

delimiter $$
create trigger  t1 after insert on orders for each row
    begin
        update goods set num=num-1 where gid=1;

    end $$;
insert into orders values (1,1,20);

5 DCL数据控制语言

通过使用DCL语言可以来定义一些权限较小的用户,分配不同的权限来管理和维护数据库。

创建用户,语法格式:

create user '用户名'@'主机名' identified by '密码'

其中要说明的是主机名是指定用户在那个主机上可以登录数据库,本地用户就写localhost,当想从任意主机登陆时,写通配符%

实例

create user 'admin'@'localhost' identified by '123456';

用户授权

创建好用户后,可以对用户进行授权,语法格式

grant  权限1,权限2... on 数据库名.表名 to '用户名'@'主机名' --权限有:create alter select insert update等
-- on用来指定权限针对的数据库和表  to  将权限分配给那个用户

给admin分配数据库db2中products表的查询操作权限

grant select on db2.products to admin@'localhost';

查看权限

查看用户的权限,语法格式:

show grants for '用户名'@'主机名';

查看root用户的权限

show grants for 'root'@'localhost';

删除用户

删除掉用户,语法格式:

drop user '用户名'@'主机名'

删除admin用户

drop user 'admin'@'localhost';

查询数据库

选择名为mysql的数据库,直接查询user表即可

select * from user;