# MySQL Day05

索引

什么是索引?

索引 类似“目录”,给一张表添加一个目录
索引是一个单独得,物理的数据结构,是某个表中一列或若干列值得集合和相应得指向物理标识这些值得数据页得逻辑指针清单。索引依赖于表建立得,提供了编排表中数据得内部方法。
目的是为了提高效率

索引得作用有哪些?

  • 索引得作用
    1. 为了提高查询效率
    1. 通过快速定位数据得方法,减少磁盘I/O操作

索引的分类有哪些?

    1. 普通索引 不需要添加任何限制条件,可以创建在任何数据类型中,有字段本身得完整性约束决定
    1. 唯一索引 使用unique 参数进行设置,该值必须是唯一的 主键是一种特殊得唯一索引
    1. 全文索引 使用fulltext 参数进行设置, 只能创建在char,varchar或者 text类型得字段上(适用于查询数据量较大得字符串类型得字符)
    1. 单列索引 在表中但字段上创建,只能根据该字段进行索引查询,只要保证该索引值对应一个字段即可。多列索引在表中多个字段上创建,根据多个字段进行索引 只有查询使用了这些第一个字段时名索引才有效
    1. 空间索引 使用spatial 参数进行设置,只能建立在空间数据类型上(geometry、point、linerstring和polygon)

创建索引得原则有哪些?

  1. 选择唯一索引 因为唯一索引得值是唯一得
  2. 为经常需要排序、分组和联合操作得字段建立索引频繁使用 order by、group by 、 distinct、union等操作字段
  3. 经常作为查询条件得字段建立索引
    WHERE 条件经常使用得字段可以创建索引。 可以给外键创建索引
  4. 限制索引数目 并不是越多越好 占用磁盘空间 修改表时,对索引得重构和更新比较麻烦
  5. 尽量使用数据量少得索引
  6. 尽量使用前缀来索引 检索值很长时,比如TEXT、BLOG 只检索对面的若干个字符
  7. 不适用或使用频率低得,应尽快删除 不适合健索引得情况:表很小 字段不经常出现 where子句中 字段经常更新

索引得语法

-- 创建索引
CREATE INDEX INDEX_EMP ON emp(deptno);
-- 删除索引
DROP INDEX INDEX_EMP ON emp;

触发器

什么是触发器?

触发器时对表进行插入、更新、删除得时候会自动执行得特殊存储过程
当触发某个条件时 会发动

触发器得分类

MySQL 中触发器可以分为两类:DML触发器和DDL触发器,其中DDL触发器他们会影响多种数据定于语言语句,而激发,比如 alter、creat、drop语句
DML触发器分为:1、after触发器 之后触发 a、inster触发器 b、update触发器 c、delete触发器
2、 before 触发器 之前触发
其中 after 触发器要求只有执行某一操作 insert、update、delete之后触发器才能被触发,而且只能定义在表上

触发器得语法

-- 创建一个触发器
delimiter $$
  CREATE TRIGGER -- 触发器得名称 触发得实际 before | after 触发事件 insert|delete|UPDATE
  ON -- 在张表上建立得触发器 FOR EACH ROW
  BEGIN
    --   触发器执行得代码
    END  $$
DELIMITER
-- 案例2:创建一个带参数得存储过程,根据员工编号查询员工得年薪
DELIMITER $$
    CREATE PROCEDURE pro_getYsalByEmpno(IN v_empno INT,OUT ysal DOUBLE(7,2))

     BEGIN
       SELECT sal*12+IFNULL(comm,0) INTO ysal from  emp WHERE empno=v_empno;
     END
$$
delimiter
SET @ysal=0;
call pro_getYsalByEmpno(7499,@ysal);
SELECT @ysal FROM DUAL;

注意::慎用触发器,尽量少使用触发器,不建议使用。触发器是针对每一行的;对增删改非常频繁的表上切记 不要使用触发器,因为它会非常消耗资源。

什么是存储函数?

--  JAVA 函数
DELIMITER $$
    CREATE FUNCTION 函数名称 (参数列表)
    RETURNS 返回的类型
begin
    sql 语句得代码:必须有返回值
    return 值:
END
$$
delimiter
--
创建一个带参数得存储过程,根据员工编号查询员工得年薪
DELIMITER $$
    CREATE PROCEDURE pro_getYsalByEmpno(IN v_empno INT,OUT ysal DOUBLE(7,2))

     BEGIN
       SELECT sal*12+IFNULL(comm,0) INTO ysal from  emp WHERE empno=v_empno;
     END
$$
delimiter
SET @ysal=0;
call pro_getYsalByEmpno(7499,@ysal);
SELECT @ysal FROM DUAL;
-- 存储函数得格式
-- 创建一个带参数的存储函数,根据员工编号查询员工得年薪 
DELIMITER $$
    CREATE FUNCTION fun_getYsalByEmpno(v_empno INT)
    RETURNS DOUBLE
begin
    DECLARE ysal double(7,2);
    SELECT sal*12+IFNULL(comm,0) INTO ysal FROM emp WHERE empno=v_empno;
    return ysal;
END
$$
delimiter
-- CALL fun_getYsalByEmpno( v_empno INT) 不能调用
SELECT fun_getYsalByEmpno(7499);

存储函数和存储过程一样,也是sql语句组成的代码块。

存储函数可以有输入参数,并且可以直接调用,不需要call语句,且必须有一条包含RETURN语句

存储过程与存储函数得区别?

1.存储函数和存储过程统称为存储例程(store routine),存储函数的限制比较多,例如不能用临时表,只能用表变量,而 存储过程的限制较少,存储过程的实现功能要复杂些,而函数的实现功能针对性比较强。
2.返回值不同: 存储函数必须有返回值,且仅返回一个结果值; 存储过程可以没有返回值,但是能返回结果集(out,inout).
3.调用时的不同: 存储函数嵌入在SQL中使用,可以使用select 存储函数名(变量值) 来调用; 存储过程通过call语句调用 call 存储过程名;
4.参数的不同: 存储函数的参数类型类似于IN参数 存储过程的参数类型有三种:
(1) in 数据只是从外部传入内部使用(值传递),可以是数值也可以是变量
(2) out 只允许过程内部使用(不用外部数据),给外部使用的(引用传递:外部的数据会被先清空才会进入到内部),只 能是变量
(3) inout 外部可以在内部使用,内部修改的也可以给外部使用,典型的引用传递,只能传递变量

如何删除存储过程以及 存储函数?

语法:DROP PROCEDURE [IF EXISTS] 存储过程名称; 注意:它是不带括号的。
语法:DROP FUNCTION [IF EXISTS] 存储函数名称;

PD PdShell16 使用

1. 制作逻辑数据库图

工具栏 Toolbox
第二个小工具栏 第二个图标 建表 第三个建立关系
Database --> Generate Database 到出 数据库语言

2. 制作物理模型

3. 制作一个简单的模型

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值