数据库技术三:索引,视图,存储过程,触发器,数据控制,数据备份与恢复

MySQL 索引

  • 什么是索引?

--    索引就是排好序的,帮助我们进行快速查找的数据结构.
--    简单来讲,索引就是一种将数据库中的记录按照特殊形式存储的数据结构。通过索引,能够显著地提高数据查询的效率,从而提升服务器的性能.
--    专业一点来说呢,索引是一个排好序的列表,在这个列表中存储着索引的值和包含这个值的数据所在行的物理地址。在数据库十分庞大的时候,索引可以大大加快查询的速度,这是因为使用索引后可以不用扫描全表来定位某行的数据,而是先通过索引表找到该行数据对应的物理地址然后访问相应的数据。
--    MySQL 将一个表的索引都保存在同一个索引文件中,如果对其中的数据进行增删改操作,MySQL 都会自动的更新索引。

  • 常见索引分类

Primary Key -- 主键索引
   主键是一种唯一性索引,每个表只能有一个主键,用于标识数据表中的每一条记录。

   一个表可以没有主键,但最多只能有一个主键,并且主键值不能包含 NULL。

-- 为 demo1 表添加主键索引
-- 创建 demo01 表
CREATE TABLE demo01(
    did INT,
    dname VARCHAR(20),
    hobby VARCHAR(30)
);
ALTER TABLE demo01 ADD PRIMARY KEY (did);

-- 删除表
DROP TABLE demo01;

-- 创建表的时候直接添加主键索引 (最常用)
CREATE TABLE demo01(
    did INT PRIMARY KEY,
    dname VARCHAR(20),
    hobby VARCHAR(30)
); 

Unique -- 唯一索引
   唯一索引指的是索引列的所有值都只能出现一次,必须唯一。

   唯一索引可以保证数据记录的唯一性,而且索引的效率也提升了。事实上,创建唯一索引的目的往往不是为了提高访问速度,而只是为了避免数据出现重复。

-- 使用 create 语句添加唯一索引
CREATE UNIQUE INDEX index_hobby ON demo01(hobby)

-- 创建表的时候直接添加主键索引
CREATE TABLE demo02(  
    did INT PRIMARY KEY,
    dname VARCHAR(20),
    hobby VARCHAR(30),
   UNIQUE index_hobby (hobby)
);

-- 通过表结构删除索引
ALTER TABLE demo02 
DROP INDEX index_hobby;

-- 通过表结构添加索引
-- 索引名字可省略,会自动生成名字
ALTER TABLE demo02 
ADD UNIQUE (hobby);

-- 向表中插入数据
INSERT INTO demo01 VALUES(1,'张三','运动');
-- 报错:Duplicate entry 'DBJ' for key 'hobby'
INSERT INTO demo01 VALUES(2,'李四','运动');

index -- 普通索引
   最常见的索引,作用就是加快对数据的访问速度。

   只为那些最经常出现在查询条件或排序条件中的数据列创建普通索引。

-- 使用 create 语句添加唯一索引
CREATE INDEX dname_index ON demo01(dname);

-- 通过表结构删除索引
ALTER TABLE demo01 
DROP INDEX dname_index;

-- 通过表结构添加索引
ALTER TABLE demo01 
ADD INDEX dname_index(dname);

删除索引
   由于索引会占用一定的磁盘空间,因此,为了避免影响数据库的性能,应该及时删除不再使用的索引

-- 删除  demo01 表中名为  dname_indx 的普通索引。
ALTER TABLE demo01 DROP INDEX dname_indx;

索引的优缺点总结

  • 添加索引首先应考虑在 where 及 order by 涉及的列上建立索引。
  • 优点:1. 大大的提高查询速度;2. 可以显著的减少查询中分组和排序的时间。
  • 缺点:1. 创建索引和维护索引需要时间,而且数据量越大时间越长。2. 当对表中的数据进行增加、修改、删除的时候,索引也要同时进行维护,降低了数据的维护速度。

MySQL 视图

  • 什么是视图

1 . 视图是一种虚拟表。
2 . 视图建立在已有表的基础上,视图赖以建立的这些表称为基表。
3 . 向视图提供数据内容的语句为 SELECT 语句,可以将视图理解为存储起来的 SELECT 语句。
4 . 视图向用户提供基表数据的另一种表现形式。

  • 视图的作用

   视图可以在权限控制时使用。比如,某几个列可以运行用户查询,其他列不允许,可以开通视图查询特定的列,起到权限控制的作用。

   视图可以简化复杂的多表查询。视图本身就是一条查询 SQL,可以将一次复杂的查询构建成一张视图,用户只要查询视图就可以获取想要得到的信息(不需要再编写复杂的 SQL)。

  • 视图的使用

   创建视图

  • 语法格式:--> create view 视图名 [column_list] as select语句;
    -- view: 表示视图;
    -- column_list: 可选参数,表示属性清单,指定视图中各个属性的名称,默认情况下,与SELECT语句中查询 的属性相同 ;
    -- as : 表示视图要执行的操作 ;
    -- select语句: 向视图提供数据内容;
-- 创建视图
-- 先编写查询语句
-- 查询所有商品和商品的对应分类信息
SELECT * 
FROM 
products p 
    LEFT JOIN 
category c 
    ON 
    p.`category_id` = c.`cid`;

-- 基于上面的查询语句,创建视图
CREATE VIEW products_category_view 
AS 
    SELECT * 
    FROM 
        products p 
        LEFT JOIN 
        category c 
        ON 
        p.`category_id` = c.`cid`;

-- 查询视图,当做一张只读的表来操作
SELECT * FROM products_category_view;

通过视图进行查询

-- 需求1:查询各个分类下的商品平均价格
-- 方式一:通过多表查询
SELECT 
    cname AS '分类名称',
    AVG(p.`price`) AS '平均价格'
FROM 
products p 
    LEFT JOIN 
category c 
    ON 
    p.`category_id` = c.`cid`
GROUP BY c.`cname`;
-- 方式二:通过视图查询省略了连接表的操作
SELECT 
    cname AS '分类名称',
    AVG(price) AS '平均价格'
FROM products_category_view 
GROUP BY cname;


-- 需求2:查询鞋服分类下最贵的商品的全部信息
-- 方式一:通过连表查询
SELECT * 
FROM 
products p 
    LEFT JOIN 
category c 
    ON 
    p.`category_id` = c.`cid`
WHERE 
    c.`cname` = '鞋服' 
    AND 
    p.`price` = (
        SELECT 
            MAX(price) AS maxPrice
        FROM 
        products p 
            LEFT JOIN 
        category c 
            ON 
            p.`category_id` = c.`cid`
        WHERE c.`cname` = '鞋服');
-- 方式二:通过视图查询
SELECT * 
FROM products_category_view pcv 
WHERE 
    pcv.`cname` = '鞋服'
    AND 
    pcv.`price` = (
        SELECT MAX(price) 
        FROM products_category_view 
        WHERE cname = '鞋服'
    );

视图与表的区别
-- 视图是建立在表的基础上,表存储数据库中的数据,而视图只是做一个数据的展示。

-- 通过视图不能改变表中数据(一般情况下视图中的数据都是表中的列经过计算得到的结果,不允许更新)。

-- 删除视图,表不受影响,而删除表,视图不再起作用。


MySQL 存储过程

  • 什么是存储过程

MySQL 5.0 版本开始支持存储过程。

存储过程是一种在数据库中存储复杂程序,以便外部程序调用的一种数据库对象。存储过程是为了完成特定功能的 SQL 语句集,经编译创建并保存在数据库中,用户在需要时可通过指定存储过程的名字并给定参数来调用执行。

简单来说,存储过程其实就是一堆 SQL 语句的合并,中间加入了一些逻辑控制。

  • 存储过程的优缺点

优点:
   存储过程一旦调试完成后,就可以稳定运行。前提是业务需求要相对稳定没有变化。
   存储过程减少业务系统与数据库的交互,降低耦合,使数据库交互更加快捷,适合应用服务器与数据库服务器不在同一个地区的情况。

缺点:
   互联网行业需求变化较快,MySQL 的存储过程与 Oracle 相比较弱,所以较少使用。
   存储过程可以在简单的逻辑中使用,但是移植十分困难。特别是在数据库集群环境,要保证各个库之间存储过程变更一致也十分困难。阿里巴巴的代码规范里也提出了禁止使用存储过程,因为存储过程维护起来的确麻烦。

  • 存储过程的创建方式

-- 创建商品表与订单表
-- 商品表,num 为库存
CREATE TABLE goods(
    gid INT,
    NAME VARCHAR(20),
    num INT
);
-- 订单表,price 为订单价格
CREATE TABLE orders(
    oid INT,
    gid INT,
    price INT
);
-- 向商品表中添加3条数据
INSERT INTO goods VALUES(1,'奶茶',20);
INSERT INTO goods VALUES(2,'绿茶',100);
INSERT INTO goods VALUES(3,'花茶',25);


-- 方式一:编写简单存储过程
-- 查询所有商品数据
-- 一般使用 $$ 为语句结束符
DELIMITER $$   
CREATE 
    PROCEDURE 
goods_proc()  
BEGIN   
    select * from goods; 
END $$

-- 调用存储过程查询 goods 表数据
call goods_proc;

-- 方式二:创建接收参数的存储过程
-- 接收一个商品 id,根据 id 删除数据
DELIMITER $$  
CREATE 
    PROCEDURE 
goods_proc02(
        IN goods_id INT
    )  
BEGIN 
    DELETE FROM goods 
    WHERE gid = goods_id;
END $$

-- 调用存储过程传递参数,删除对应的商品
CALL goods_proc02(2);

-- 方式三:使用输出参数创建存储过程
-- 接收参数插入数据, 并返回受影响的行数
DELIMITER $$
CREATE 
    PROCEDURE 
orders_proc(
        IN o_oid INT,
        IN o_gid INT,
        IN o_price INT,
        OUT out_num INT
    )
BEGIN
   -- 执行插入操作
    INSERT INTO orders 
    VALUES(o_oid,o_gid,o_price);
   -- 设置 num 的值为 1
    SET @out_num = 1;
   -- 返回 out_num的值
    SELECT @out_num;
END $$

-- 调用存储过程插入数据,获取返回值
CALL orders_proc(1,2,30,@out_num);  


MySQL触发器

  • 什么是触发器

触发器是 MySQL 提供给程序员和数据分析员来保证数据完整性的一种方法,它是与表事件相关的特殊的存储过程,它的执行不是由程序调用,也不是手工启动,而是由事件来触发,比如当对一个表进行增删改操作时就会激活它执行。

可以把触发器理解为:当执行一条 SQL 语句的时候,这条 SQL 语句的执行会自动去触发执行其他的 SQL 语句。

  • 触发器创建的四个要素

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

  • 创建触发器

在一个数据库中触发器名是唯一的。

-- 向商品中添加一条数据
INSERT INTO goods VALUES(1,'书本',40);

-- 编写触发器
-- 卖出商品之后减少库存量
-- 修改结束标识,避免执行出现错误
DELIMITER $
-- 创建触发器 t1
CREATE TRIGGER t1
-- 指定触发的时机,和要监听的表 
AFTER INSERT ON orders 
-- 行触发器 固定写法
FOR EACH ROW
# 触发后具体要执行的事件
BEGIN
    # 订单+1,库存-1
    UPDATE goods 
    SET num = num - 1 
    WHERE gid = 1;
END$

-- 向订单表中添加一条数据
# 添加后,触发器执行,库存自动减一
INSERT INTO orders VALUES(1,1,25);

DCL(数据控制语言)

MySQL 默认使用的都是 root 用户,超级管理员,拥有全部的权限。除了 root 用户以外,我们还可以通过 DCL 来定义一些权限较小的用户,分配不同的权限来管理和维护数据库。

创建用户

格式:create user '用户名'@'主机名' identified by '密码';

-- 创建 admin1 用户
   --只能在 localhost 这个服务器登录 mySQL 服务器,密码为 123456
CREATE USER 'admin1'@'localhost' IDENTIFIED BY '123456';

-- 创建 admin2 用户
   --可以在任何电脑上登录 mySQL 服务器,密码为 123456
CREATE USER 'admin2'@'%' IDENTIFIED BY '123456';

用户授权

格式:grant 权限1,权限2..... on 数据库名.表名 to '用户名'@'主机名';

-- 给 admin1 用户分配对 db4 数据库中 products 表的查询权限
GRANT SELECT ON db4.products TO 'admin1'@'localhost';

-- 给 admin2 用户分配所有权限和操作所有数据库的所有表
GRANT ALL ON *.* TO 'admin2'@'%'; 

查看用户权限

格式:show grant for '用户名'@'主机名';

-- 查看 root 用户的权限
   -- GRANT ALL PRIVILEGES 是表示所有权限
SHOW GRANTS FOR 'root'@'localhost';

删除用户&查询用户

-- 删除 admin1 用户
DROP USER 'admin1'@'localhost';

-- 查询所有用户
SELECT * FROM USER;

数据库备份&还原

备份的应用场景:在服务器进行数据传输、数据存储、数据交换时,就有可能产生数据故障。比如,发生意外停机或存储介质损坏。 此时,如果没有采取数据备份和数据恢复手段与措施,就会导致数据的丢失,造成的损失是无法弥补与估量的。

  • SQLYog 数据备份

首先,选中要备份的数据库,右键选择“备份/导出”,选择“备份数据库”;然后指定文件位置,选择导出即可。

  • SQLYog 数据恢复

首先,导入备份的 SQL 文件,选中用户名,右键选择“执行 SQL 脚本”;然后选择文件位置,点击执行即可。

  • 命令行备份

执行备份,备份 db1 中的数据到 D 盘的 db1.sql 文件中:

mysqldump -uroot -proot db1 > D:/db1.sql
  • 命令行恢复

还原 db1 数据库中的数据(注意:还原的时候需要先创建一个 db1 数据库 ):

use db1;
source 文件地址
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,802评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,109评论 2 379
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,683评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,458评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,452评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,505评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,901评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,550评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,763评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,556评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,629评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,330评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,898评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,897评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,140评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,807评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,339评论 2 342

推荐阅读更多精彩内容