三 触发器

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

  1.创建触发器

create trigger trigger1_before_insert_tb1 before insert on tb1 for each row
begin
...
end before可以换成after, insert可以换成delete,update.

  

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

  

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

create trigger tri_after_insert_tb1 after insert on tb1 for each row
begin
NEW.nid (为用户新提交过来的 tb1.nid的值)
NEW.name(为用户新提交过来的tb1.name的值) insert into tb2(num) values(NEW.nid);
end create trigger tri_after_delete_tb1 after delete on tb1 for each row
begin
OLD.nid (为删除的tb1.nid的值)
OLD.name(为删除的tb1.name的值) insert into tb2(num) values(OLD.nid);
end create trigger tri_after_update_tb1 after update on tb1 for each row
begin
NEW.nid (为用户新提交过来的 tb1.nid的值)
NEW.name(为用户新提交过来的tb1.name的值)
OLD.nid (为删除的tb1.nid的值)
OLD.name(为删除的tb1.name的值) insert into tb2(num) values(OLD.nid),(New.nid);
end

  2. 删除触发器

drop trigger tri_after_insert_tb1;

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

四 事务

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

  

delimiter //
create procudureprocudure1(
OUT return varchar(20)
)
begin
declare exit handler for sqlexception --发生错误会执行的程序代码块
begin
-- ERROR
set return = "Error";
rollback;
end; declare exit handler for sqlwarning   --发生警告会执行的程序代码块
begin
-- WARNING
set return = "Warn";
rollback;
end; start transaction;
delete from table1;
insert into table2(name) values('damon'); --如果这条命令和上条命令出现错误或警告,会执行上面错误代码块或警告代码块
commit; -- SUCCESS
set return = "Success ";   --如果ransaction代码块中没有错误发生,就会执行到这条命令 END//
delimiter ;

四 函数

CHAR_LENGTH(str)
返回值为字符串str 的长度,长度的单位为字符。一个多字节字符算作一个单字符。
对于一个包含五个二字节字符集, LENGTH()返回值为 10, 而CHAR_LENGTH()的返回值为5。 CONCAT(str1,str2,...)
字符串拼接
如有任何一个参数为NULL ,则返回值为 NULL。
CONCAT_WS(separator,str1,str2,...)
字符串拼接(自定义连接符)
CONCAT_WS()不会忽略任何空字符串。 (然而会忽略所有的 NULL)。 CONV(N,from_base,to_base)
进制转换
例如:
SELECT CONV('a',16,2); 表示将 a 由16进制转换为2进制字符串表示 FORMAT(X,D)
将数字X 的格式写为'#,###,###.##',以四舍五入的方式保留小数点后 D 位, 并将结果以字符串的形式返回。若 D 为 0, 则返回结果不带有小数点,或不含小数部分。
例如:
SELECT FORMAT(12332.1,4); 结果为: '12,332.1000'
INSERT(str,pos,len,newstr)
在str的指定位置插入字符串
pos:要替换位置其实位置
len:替换的长度
newstr:新字符串
特别的:
如果pos超过原字符串长度,则返回原字符串
如果len超过原字符串长度,则由新字符串完全替换
INSTR(str,substr)
返回字符串 str 中子字符串的第一个出现位置。 LEFT(str,len)
返回字符串str 从开始的len位置的子序列字符。 LOWER(str)
变小写 UPPER(str)
变大写 LTRIM(str)
返回字符串 str ,其引导空格字符被删除。
RTRIM(str)
返回字符串 str ,结尾空格字符被删去。
SUBSTRING(str,pos,len)
获取字符串子序列 LOCATE(substr,str,pos)
获取子序列索引位置 REPEAT(str,count)
返回一个由重复的字符串str 组成的字符串,字符串str的数目等于count 。
若 count <= 0,则返回一个空字符串。
若str 或 count 为 NULL,则返回 NULL 。
REPLACE(str,from_str,to_str)
返回字符串str 以及所有被字符串to_str替代的字符串from_str 。
REVERSE(str)
返回字符串 str ,顺序和字符顺序相反。
RIGHT(str,len)
从字符串str 开始,返回从后边开始len个字符组成的子序列 SPACE(N)
返回一个由N空格组成的字符串。 SUBSTRING(str,pos) , SUBSTRING(str FROM pos) SUBSTRING(str,pos,len) , SUBSTRING(str FROM pos FOR len)
不带有len 参数的格式从字符串str返回一个子字符串,起始于位置 pos。带有len参数的格式从字符串str返回一个长度同len字符相同的子字符串,起始于位置 pos。 使用 FROM的格式为标准 SQL 语法。也可能对pos使用一个负值。假若这样,则子字符串的位置起始于字符串结尾的pos 字符,而不是字符串的开头位置。在以下格式的函数中可以对pos 使用一个负值。 mysql> SELECT SUBSTRING('Quadratically',5);
-> 'ratically' mysql> SELECT SUBSTRING('foobarbar' FROM 4);
-> 'barbar' mysql> SELECT SUBSTRING('Quadratically',5,6);
-> 'ratica' mysql> SELECT SUBSTRING('Sakila', -3);
-> 'ila' mysql> SELECT SUBSTRING('Sakila', -5, 3);
-> 'aki' mysql> SELECT SUBSTRING('Sakila' FROM -4 FOR 2);
-> 'ki' TRIM([{BOTH | LEADING | TRAILING} [remstr] FROM] str) TRIM(remstr FROM] str)
返回字符串 str , 其中所有remstr 前缀和/或后缀都已被删除。若分类符BOTH、LEADIN或TRAILING中没有一个是给定的,则假设为BOTH 。 remstr 为可选项,在未指定情况下,可删除空格。 mysql> SELECT TRIM(' bar ');
-> 'bar' mysql> SELECT TRIM(LEADING 'x' FROM 'xxxbarxxx');
-> 'barxxx' mysql> SELECT TRIM(BOTH 'x' FROM 'xxxbarxxx');
-> 'bar' mysql> SELECT TRIM(TRAILING 'xyz' FROM 'barxxyz');
-> 'barx' 部分内置函数

内置函数

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

自建函数

delimiter //
create function f1(arg1 int, arg2 int)
returns int
begin
declare num int;
set nuim = arg1 + arg2;
return (num);
end//
delimiter ; 在创建函数的时候报错: 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返回返回值,存储过程通过参数返回返回值。

删除函数:

drop fucntion f1;

调用函数;

select f1(1, 2);

  

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

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

  种类:

  普通索引:加速查找;

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

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

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

  1. 普通索引 

create table tb1(
nid int not null auto_increment primary key,
name varchar(20) not null,
index ix_name(name)
} --创建表时,将name列作为索引

创建表+索引

create index ix_name on tb1(name)

创建索引

drop ix_name on tb1

删除索引

show index from tb1

查看索引

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

  2. 唯一索引

create table tb2(
nid int null auto_increment primary key,
name varchar(20) not null,
unique ix_name(name)
)

创建表+唯一索引

create unique index ix_name on tb2(name)

创建唯一索引

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. 在修改时,建议两种方式都修改。

slow_query_log = ON                             开启慢日志记录
long_query_time = 0.5 超过此时间,则记录
slow_query_log_file = D:/usr/slow.log 日志文件路径
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. ConxtMenu高级用法

    ##背景我们经常在列表的页面中,点击列表中的行,一般进入详情页面,长按列表中一行,会弹出一个菜单,包含了对某一行的操作(编辑.删除等等),也知道通常的用法: 0x01. 在Activity中注册需要上 ...

  2. virtualenv 个人指南

    virtualenv是解决一个机器上多个应用需要的Python版本不一致的问题,virtualenv就是用来为一个应用创建一套"隔离"的Python运行环境,解决了解决了不同应用间 ...

  3. 8.2.2 使用Java8增强的Iterator遍历集合元素

    8.2.2 使用Java 8增强的Iterator遍历集合元素 Iterator接口方法 程序示例 Iterator仅用于遍历集合 Iterator必须依附于Collection对象 修改迭代变量的值 ...

  4. Java线程知识

    概念 线程生命周期 Java线程模型 线程方法 线程优先级 线程同步 线程在多任务处理应用程序中有着至关重要的作用 概念 基本概念 进程:在操作系统中每个独立运行的程序就是一个进程 线程:程序执行的一 ...

  5. 利用FinalData恢复shift+delete误删的文件

    当前位置 : 首页 » 文章分类 :  生活  »  利用FinalData恢复shift+delete误删的文件 上一篇 有关可变形部件模型(Deformable Part Model)的一些说明 ...

  6. Zookeeper的核心概念以及java客户端使用

    一.Zookeeper的核心概念 分布式配置中心(存储):disconf(zk).diamond(mysql+http) 1)znode ZooKeeper操作和维护的是一个个数据节点,称为 znod ...

  7. shell 之 case。。。esac多分支选择

    case分支属于匹配执行的方式,它针对指定的变量预先设置一个可能的取值,判断该变量的实际取值是否与预设的某一个值相匹配,如果匹配上了,就执行相应的一组操作,如果没有任何值能够匹配,就执行预先设置的默认 ...

  8. 搭建websocket消息推送服务,必须要考虑的几个问题

    近年,不论是正在快速增长的直播,远程教育以及IM聊天场景,还是在常规企业级系统中用到的系统提醒,对websocket的需求越来越大,对websocket的要求也越来越高.从早期对websocket的应 ...

  9. 操作系统-CPU管理的直观想法

    1. 管理CPU,先要使用CPU 管理CPU的最直观方法 2. 提出问题 有IO指令执行的特别慢,当cpu执行计算指令很快,遇到IO指令cpu进行等待,利用率不高. 使用多道程序.交替执行,这样cpu ...

  10. sql数据库在登录异常时 ora-03114:未连接到ORACLE怎么办

    关闭SQL数据,重新启动,登录就好,不要用删除,或者其他方法,如果这麽做还是不可以,那么在想其他办法! 我自己就是这麽做的