三 触发器

  对某个表进行某种操作(如:增删改查),希望触发某个动作,可以使用触发器。

  1.创建触发器

  1. create trigger trigger1_before_insert_tb1 before insert on tb1 for each row
  2. begin
  3. ...
  4. end
  5.  
  6. before可以换成after, insert可以换成delete,update.

  

    在想tb1插入数据后,tb2结果:

  

  触发器获得用户提交的数据:

  1. create trigger tri_after_insert_tb1 after insert on tb1 for each row
  2. begin
  3. NEW.nid (为用户新提交过来的 tb1.nid的值)
  4. NEW.name(为用户新提交过来的tb1.name的值)
  5.  
  6. insert into tb2(num) values(NEW.nid);
  7. end
  8.  
  9. create trigger tri_after_delete_tb1 after delete on tb1 for each row
  10. begin
  11. OLD.nid (为删除的tb1.nid的值)
  12. OLD.name(为删除的tb1.name的值)
  13.  
  14. insert into tb2(num) values(OLD.nid);
  15. end
  16.  
  17. create trigger tri_after_update_tb1 after update on tb1 for each row
  18. begin
  19. NEW.nid (为用户新提交过来的 tb1.nid的值)
  20. NEW.name(为用户新提交过来的tb1.name的值)
  21. OLD.nid (为删除的tb1.nid的值)
  22. OLD.name(为删除的tb1.name的值)
  23.  
  24. insert into tb2(num) values(OLD.nid),(New.nid);
  25. end

  2. 删除触发器

  1. drop trigger tri_after_insert_tb1;

  3. 使用触发器:调用触发条件即可。

四 事务

  事务多用于原子性操作,一旦某个操作引起了错误或者警告,可以回滚到原来的状态,保持数据库的完整性。

  

  1. delimiter //
  2. create procudureprocudure1(
  3. OUT return varchar(20)
  4. )
  5. begin
  6. declare exit handler for sqlexception --发生错误会执行的程序代码块
  7. begin
  8. -- ERROR
  9. set return = "Error";
  10. rollback;
  11. end;
  12.  
  13. declare exit handler for sqlwarning   --发生警告会执行的程序代码块
  14. begin
  15. -- WARNING
  16. set return = "Warn";
  17. rollback;
  18. end;
  19.  
  20. start transaction;
  21. delete from table1;
  22. insert into table2(name) values('damon'); --如果这条命令和上条命令出现错误或警告,会执行上面错误代码块或警告代码块
  23. commit;
  24.  
  25. -- SUCCESS
  26. set return = "Success ";   --如果ransaction代码块中没有错误发生,就会执行到这条命令
  27.  
  28. END//
  29. delimiter ;

四 函数

  1. CHAR_LENGTH(str)
  2. 返回值为字符串str 的长度,长度的单位为字符。一个多字节字符算作一个单字符。
  3. 对于一个包含五个二字节字符集, LENGTH()返回值为 10, CHAR_LENGTH()的返回值为5
  4.  
  5. CONCAT(str1,str2,...)
  6. 字符串拼接
  7. 如有任何一个参数为NULL ,则返回值为 NULL
  8. CONCAT_WS(separator,str1,str2,...)
  9. 字符串拼接(自定义连接符)
  10. CONCAT_WS()不会忽略任何空字符串。 (然而会忽略所有的 NULL)。
  11.  
  12. CONV(N,from_base,to_base)
  13. 进制转换
  14. 例如:
  15. SELECT CONV('a',16,2); 表示将 a 16进制转换为2进制字符串表示
  16.  
  17. FORMAT(X,D)
  18. 将数字X 的格式写为'#,###,###.##',以四舍五入的方式保留小数点后 D 位, 并将结果以字符串的形式返回。若 D 0, 则返回结果不带有小数点,或不含小数部分。
  19. 例如:
  20. SELECT FORMAT(12332.1,4); 结果为: '12,332.1000'
  21. INSERT(str,pos,len,newstr)
  22. str的指定位置插入字符串
  23. pos:要替换位置其实位置
  24. len:替换的长度
  25. newstr:新字符串
  26. 特别的:
  27. 如果pos超过原字符串长度,则返回原字符串
  28. 如果len超过原字符串长度,则由新字符串完全替换
  29. INSTR(str,substr)
  30. 返回字符串 str 中子字符串的第一个出现位置。
  31.  
  32. LEFT(str,len)
  33. 返回字符串str 从开始的len位置的子序列字符。
  34.  
  35. LOWER(str)
  36. 变小写
  37.  
  38. UPPER(str)
  39. 变大写
  40.  
  41. LTRIM(str)
  42. 返回字符串 str ,其引导空格字符被删除。
  43. RTRIM(str)
  44. 返回字符串 str ,结尾空格字符被删去。
  45. SUBSTRING(str,pos,len)
  46. 获取字符串子序列
  47.  
  48. LOCATE(substr,str,pos)
  49. 获取子序列索引位置
  50.  
  51. REPEAT(str,count)
  52. 返回一个由重复的字符串str 组成的字符串,字符串str的数目等于count
  53. count <= 0,则返回一个空字符串。
  54. str count NULL,则返回 NULL
  55. REPLACE(str,from_str,to_str)
  56. 返回字符串str 以及所有被字符串to_str替代的字符串from_str
  57. REVERSE(str)
  58. 返回字符串 str ,顺序和字符顺序相反。
  59. RIGHT(str,len)
  60. 从字符串str 开始,返回从后边开始len个字符组成的子序列
  61.  
  62. SPACE(N)
  63. 返回一个由N空格组成的字符串。
  64.  
  65. SUBSTRING(str,pos) , SUBSTRING(str FROM pos) SUBSTRING(str,pos,len) , SUBSTRING(str FROM pos FOR len)
  66. 不带有len 参数的格式从字符串str返回一个子字符串,起始于位置 pos。带有len参数的格式从字符串str返回一个长度同len字符相同的子字符串,起始于位置 pos 使用 FROM的格式为标准 SQL 语法。也可能对pos使用一个负值。假若这样,则子字符串的位置起始于字符串结尾的pos 字符,而不是字符串的开头位置。在以下格式的函数中可以对pos 使用一个负值。
  67.  
  68. mysql> SELECT SUBSTRING('Quadratically',5);
  69. -> 'ratically'
  70.  
  71. mysql> SELECT SUBSTRING('foobarbar' FROM 4);
  72. -> 'barbar'
  73.  
  74. mysql> SELECT SUBSTRING('Quadratically',5,6);
  75. -> 'ratica'
  76.  
  77. mysql> SELECT SUBSTRING('Sakila', -3);
  78. -> 'ila'
  79.  
  80. mysql> SELECT SUBSTRING('Sakila', -5, 3);
  81. -> 'aki'
  82.  
  83. mysql> SELECT SUBSTRING('Sakila' FROM -4 FOR 2);
  84. -> 'ki'
  85.  
  86. TRIM([{BOTH | LEADING | TRAILING} [remstr] FROM] str) TRIM(remstr FROM] str)
  87. 返回字符串 str 其中所有remstr 前缀和/或后缀都已被删除。若分类符BOTHLEADINTRAILING中没有一个是给定的,则假设为BOTH remstr 为可选项,在未指定情况下,可删除空格。
  88.  
  89. mysql> SELECT TRIM(' bar ');
  90. -> 'bar'
  91.  
  92. mysql> SELECT TRIM(LEADING 'x' FROM 'xxxbarxxx');
  93. -> 'barxxx'
  94.  
  95. mysql> SELECT TRIM(BOTH 'x' FROM 'xxxbarxxx');
  96. -> 'bar'
  97.  
  98. mysql> SELECT TRIM(TRAILING 'xyz' FROM 'barxxyz');
  99. -> 'barx'
  100.  
  101. 部分内置函数

内置函数

参考博客:https://www.cnblogs.com/wupeiqi/articles/5713323.html 十分感谢!

  1. 自建函数
  2.  
  3. delimiter //
  4. create function f1(arg1 int, arg2 int)
  5. returns int
  6. begin
  7. declare num int;
  8. set nuim = arg1 + arg2;
  9. return (num);
  10. end//
  11. delimiter ;
  12.  
  13. 在创建函数的时候报错:
  14.  
  15. This function has none of DETERMINISTIC, NO SQL, or READS SQL DATA in its declaration and binary logging is enabled (you *might* want to use the less safe log_bin_trust_function_creators variable)
    需要 调用命令: set global log_bin_trust_function_creators=TRUE;就可以了。

  

函数与存储过程的不同点:  

  1.函数里不能返写SQL语句,存储过程可以。

    但函数中可以这样使用:

    set id = 0;

    select nid into id form student where name = 'damon';

  2.函数通过return返回返回值,存储过程通过参数返回返回值。

删除函数:

  1. drop fucntion f1;

调用函数;

  1. select f1(1, 2);

  

五 索引(重要程度 *******)

  索引是数据库中专门用于快速查找数据的一种数据结构,其内部使用红黑查找树,所以可以快速查找到数据。功能:建立索引加快寻找;约束;

  种类:

  普通索引:加速查找;

  唯一索引:加速查找,约束列数据不能重复,可以为null;

  主键索引:加速查找,约束列数据不能重复,不可以为Null;

  组合索引:多列组合创建一个索引文件;

  1. 普通索引 

  1. create table tb1(
  2. nid int not null auto_increment primary key,
  3. name varchar(20) not null,
  4. index ix_name(name)
  5. }
  6.  
  7. --创建表时,将name列作为索引

创建表+索引

  1. create index ix_name on tb1(name)

创建索引

  1. drop ix_name on tb1

删除索引

  1. show index from tb1

查看索引

注意:如果创建索引是BLOB或者TEXT类型时,需要指定长度。

  2. 唯一索引

  1. create table tb2(
  2. nid int null auto_increment primary key,
  3. name varchar(20) not null,
  4. unique ix_name(name)
  5. )

创建表+唯一索引

  1. create unique index ix_name on tb2(name)

创建唯一索引

  1. drop unique index ix_name on tb2

删除唯一索引

  3. 主键索引

创建主键索引就是创建主键;

  4. 组合索引

在创建索引的时候,选择两个列名。规则:最左匹配,根据创建索引时,最左侧的列名为根据,判断是否走索引。

    a. 普通组合索引: 无约束。

    b. 联合位移组合索引:有约束,两列数据同时不相同,才能插入。

  5. 执行计划

  相对比较准确表达当前SQL运行状况。

  explain SQL语句;

    type = ALL 全数据表扫描;效率低。

    type = index 全索引表扫描;效率低。

  在SQL语句后加 limit 会提高效率。

  type 是 ALL 或者Index时,都是有优化的余地。

  6. 如何命中索引

  (1) like '%xx': select * from tb where name like '%om' 不走索引 like 'da%'走索引

  (2) 使用函数:select * from tb where reverse(name) = 'damon'

  (3) 使用or :select* from tb where nid = 1 or name = 'damon'; nid和name都是索引就不走索引

  (4) 类型不一致:select * from tb where name = 1;

  (5) 使用!=: select * from tb where name != 'damon';当name不是主键时,不会走索引,反之,走索引;

  (6) 使用 >:select * from tb where name > 'alex'; 如果主键是索引还是整数类型,则还是会走索引。

  (7) 使用order by:select email from tb order by email,name;当根据索引排序时,如果映射不是索引,则不会走索引。如果对主键排序,则还是走索引;

  (8) 注意事项

    a. 避免使用select * ;

    b. 尽量使用char代替varchar;

    c. 表的字段顺序固定长度的字段优先;

    d. 当时用多个条件查询时,多使用组合索引代替单个索引;

    e. 尽量使用短索引;

    f. 使用连接(JOIN)代替子查询(Sub-Queries);

    g. 连表时注意条件类型须一致;

    h. 索引散列(重复少), 不适合建索引。例:性别;

六 分页

  如果数据量比较大时,越到后面使用limit分页的效率越低,解决方案:

  where nid > 1000000 limit x, m 直接跳过前1000000数据,往下扫描。

七 慢日志查询

  1. 内存中配置MySQL自动记录慢日志。

  2. 写一个配置文件*.ini, 在配置文件中修改,然后重启。

     指定配置文件: mysqld --default files = D:/mysql/default.ini;

  3. 在修改时,建议两种方式都修改。

  1. slow_query_log = ON 开启慢日志记录
  2. long_query_time = 0.5 超过此时间,则记录
  3. slow_query_log_file = D:/usr/slow.log 日志文件路径
  4. log_queries_not_using_indexes = ON 为使用索引的搜索是否记录

  4.查看慢日志

  mysqldumpslow -s at -a  /usr/slow.log

MySQL学习(5)的更多相关文章

  1. 我的MYSQL学习心得(一) 简单语法

    我的MYSQL学习心得(一) 简单语法 我的MYSQL学习心得(二) 数据类型宽度 我的MYSQL学习心得(三) 查看字段长度 我的MYSQL学习心得(四) 数据类型 我的MYSQL学习心得(五) 运 ...

  2. 我的MYSQL学习心得(二) 数据类型宽度

    我的MYSQL学习心得(二) 数据类型宽度 我的MYSQL学习心得(一) 简单语法 我的MYSQL学习心得(三) 查看字段长度 我的MYSQL学习心得(四) 数据类型 我的MYSQL学习心得(五) 运 ...

  3. 我的MYSQL学习心得(三) 查看字段长度

    我的MYSQL学习心得(三) 查看字段长度 我的MYSQL学习心得(一) 简单语法 我的MYSQL学习心得(二) 数据类型宽度 我的MYSQL学习心得(四) 数据类型 我的MYSQL学习心得(五) 运 ...

  4. 我的MYSQL学习心得(四) 数据类型

    我的MYSQL学习心得(四) 数据类型 我的MYSQL学习心得(一) 简单语法 我的MYSQL学习心得(二) 数据类型宽度 我的MYSQL学习心得(三) 查看字段长度 我的MYSQL学习心得(五) 运 ...

  5. 我的MYSQL学习心得(五) 运算符

    我的MYSQL学习心得(五) 运算符 我的MYSQL学习心得(一) 简单语法 我的MYSQL学习心得(二) 数据类型宽度 我的MYSQL学习心得(三) 查看字段长度 我的MYSQL学习心得(四) 数据 ...

  6. 我的MYSQL学习心得(六) 函数

    我的MYSQL学习心得(六) 函数 我的MYSQL学习心得(一) 简单语法 我的MYSQL学习心得(二) 数据类型宽度 我的MYSQL学习心得(三) 查看字段长度 我的MYSQL学习心得(四) 数据类 ...

  7. 我的MYSQL学习心得(七) 查询

    我的MYSQL学习心得(七) 查询 我的MYSQL学习心得(一) 简单语法 我的MYSQL学习心得(二) 数据类型宽度 我的MYSQL学习心得(三) 查看字段长度 我的MYSQL学习心得(四) 数据类 ...

  8. 我的MYSQL学习心得(八) 插入 更新 删除

    我的MYSQL学习心得(八) 插入 更新 删除 我的MYSQL学习心得(一) 简单语法 我的MYSQL学习心得(二) 数据类型宽度 我的MYSQL学习心得(三) 查看字段长度 我的MYSQL学习心得( ...

  9. 我的MYSQL学习心得(九) 索引

    我的MYSQL学习心得(九) 索引 我的MYSQL学习心得(一) 简单语法 我的MYSQL学习心得(二) 数据类型宽度 我的MYSQL学习心得(三) 查看字段长度 我的MYSQL学习心得(四) 数据类 ...

  10. 我的MYSQL学习心得(十) 自定义存储过程和函数

    我的MYSQL学习心得(十) 自定义存储过程和函数 我的MYSQL学习心得(一) 简单语法 我的MYSQL学习心得(二) 数据类型宽度 我的MYSQL学习心得(三) 查看字段长度 我的MYSQL学习心 ...

随机推荐

  1. python 堡垒机讲解及实例

    paramiko模块,该模块基于SSH用于连接远程服务器并执行相关操作. SSHClient:用于连接远程服务器并执行基本命令 #coding:utf-8 import paramiko ssh=pa ...

  2. 安装python3.5

    安装python3.5可能使用的依赖 [root@heweiwei heweiwei]# yum install openssl-devel bzip2-devel expat-devel gdbm- ...

  3. 抛开贾跃亭!法拉第FF91能成功吗?

    在本届CES 2018上,FF 91又一次刷屏了,而且实实在在地允许试乘了. 抛开贾跃亭的因素不谈,你觉得FF 91能成功吗? 最开始知道法拉第FF91这款电动汽车的名字时,总感觉怪怪的--像是把法拉 ...

  4. JavaScript if为true的情况

    变量如果不为0,null,undefined,false,都会被处理为true.只要变量有非0的值或是某个对象,数组,字符串,都会认为true

  5. loadrunner通过web的post请求方法测接口 2

    模拟APP发送请求给Cloud, 一般都是用户登录后.cloud会返回登录成功的消息并且返回一个cookie给app, app下次要做一些例如设置名称之类的工作,在请求消息里面会携带返回的cookie ...

  6. List.remove()的使用注意

    不使用forEach的循环 使用forEach循环 参考 今天修改一个bug,需要取一个List和一个Set的交集,使用了双重循环.想着提高循环效率,每加入一个交集中的元素,就将List中的元素删除, ...

  7. 京东Y事业部打造一体化质量管理平台

    互联网企业质量管理的困惑 作为互联网时代的互联网企业,我们的研发模式和传统模式相比,最显著的不同在于发布节奏加快了,这个加快不是快了10%,20%,50%,而是加快了几倍,甚至几十倍,上百倍.面对加快 ...

  8. java反序列化-ysoserial-调试分析总结篇(2)

    前言: 这篇主要分析commonCollections2,调用链如下图所示: 调用链分析: 分析环境:jdk1.8.0 反序列化的入口点为src.zip!/java/util/PriorityQueu ...

  9. LeetCode--链表2-双指针问题

    LeetCode--链表2-双指针问题 思考问题: 判断一个链表是否有环 列举几种情况: graph LR A-->B B-->C C-->D D-->E E-->C g ...

  10. 逆向破解之160个CrackMe —— 001(上)

    CrackMe--001 前置知识介绍: 160 CrackMe 是比较适合新手学习逆向破解的CrackMe的一个集合,一共160个待逆向破解的程序 CrackMe:一些公开给别人尝试破解的小程序,制 ...