变量
- 系统变量
- 查找
其中% 表示通配符
SHOW VARIABLES LIKE ‘变量’;
SHOW VARIABLES LIKE ‘log%’;
SELECT @@变量
SELECT @@log_bin- 修改
GLOBAL是指在mysql进程生存期间 都是有效的 重启失效
SESSION 是指本次连接生存期间 都是有效的
SET GLOBAL 可改变量 = 值;
SET SESSION 可改变量 = 值;
系统变量也可以修改my.ini配置 重启还是生效的 - 用户变量
在DELIMITER之间使用尽量不要加@ 在外部使用加上@
- 内部自定义变量 作用域BEGIN与END之间
- 变量申明
DECLARE 变量名 变量类型 [DEFAULT 默认值] - 变量赋值
set 变量=值;
- 变量申明
DECLARE i INT(10);
DECLARE c VARCHAR(50) DEFAULT 'default';
set i=123;
set c='char';
- IN OUT INOUT变量
- IN 相当于 函数参数 只进不出
- OUT 相当于 函数返回值 只出不进
- INOUT 相当于 函数引用参数
DELIMITER ;;
CREATE DEFINER=`root`@`localhost` PROCEDURE `test`(IN `invar` int,OUT `outvar` int,INOUT `inoutvar` int)
BEGIN
###IN变量只能在内部使用 属于内部变量
set outvar=invar;
set inoutvar=3;
END
;;
DELIMITER;
##############################################################################
###外部对OUT变量赋值不能传进去 只出不进
##set @tout=124;
###INOUT变量 不能直接赋值 和函数引用参数一样
set @tinout=124;
call test(12,@tout,@tinout);
select @tout,@tinout;
语句
- if
IF 条件1 then
语句1
ELSEIF 条件2 then
语句2
ELSE
语句3
ELSE IF;
IF ff%3=2 then
RETURN 2;
ELSEIF ff%3=1 then
RETURN 1;
ELSE
RETURN 0;
END IF;
- case
CASE 变量
WHEN 条件1 THEN
语句1
WHEN 条件2 THEN
语句2
ELSE
语句3
END CASE ;
CASE ff
WHEN 2 THEN
RETURN 2;
WHEN 1 THEN
RETURN 1;
ELSE
RETURN 0;
END CASE;
- while
WHILE 条件 DO
语句
END WHILE;
WHILE ff<100 DO
update `test`.`test` set `f1`=`f1`+1 where id=1;
set ff=ff+1;
END WHILE;
- repeat
-
类似do…while语句 先运行后判断
- REPEAT
语句
UNTIL 退出条件
END REPEAT;
REPEAT
update `test`.`test` set `f1`=`f1`+1 where id=1;
set ff=ff+1;
UNTIL ff>200
END REPEAT;
- loop
标签:LOOP
语句
END LOOP;
中止本次循环
ITERATE 标签; 相对于continue
中止循环
LEAVE 标签;相对于break
set i=0;
test:LOOP
set i=i+1;
IF i%2=1 then
###奇数跳出循环
ITERATE test;
ELSE
update `test`.`test2` set `f1`=`f1`+1 where id=1;
END IF;
IF i>100 then
###大于100 中止循环
LEAVE test;
END IF;
END LOOP;
select insert update
- select
单列 直接赋值
set type=(select `type` from `test` where `id`=1 limit 1);
多列 select …into
变量名不能和列名一样的
select `cid`,`type` into commentid,ptype from `community_comment_op` where `id`=new.`id` limit 1;
- insert/update
LAST_INSERT_ID() 返回插入的ID
ROW_COUNT() 返回影响的行数
定时器/事件
注意事项
mysql系统时间 时区是否和php一致
SHOW VARIABLES LIKE ‘time%’;
是否开启定时器
show variables like ‘event_scheduler’;
是否有授权 event权限
show grants;
CREATE EVENT 事件名
ON SCHEDULE
时间格式
ON COMPLETION 结束后是否保存
状态
DO 定时事件;
结束后是否保存 PRESERVE保存 NOT PRESERVE 不保存
状态 ENABLE(默认) 可用 DISABLE 禁止 DISABLE ON SLAVE从服务器上禁止
时间格式
1.定时任务 执行一次
AT timestamp [+ INTERVAL interval]
其中timestamp 格式 xxxx-xx-xx xx:xx:xx 或者CURRENT_TIMESTAMP
interval单位 YEAR | QUARTER季度 | MONTH | DAY | HOUR | MINUTE |WEEK | SECOND
从当前时间间隔10分钟后执行
AT CURRENT_TIMESTAMP + INTERVAL 10 MINUTE;
AT 2018-10-26 19:30:03
2.周期性任务
EVERY interval
[STARTS timestamp [+ INTERVAL interval] ]
[ENDS timestamp [+ INTERVAL interval] ]
每5秒执行一次 过30分钟后停止
EVERY 5 SECOND
STARTS CURRENT_TIMESTAMP
ENDS CURRENT_TIMESTAMP + INTERVAL 30 MINUTE
过10分钟后清空test表
DELIMITER ;;
CREATE EVENT test
ON SCHEDULE
AT CURRENT_TIMESTAMP + INTERVAL 10 MINUTE
ON COMPLETION NOT PRESERVE
ENABLE
DO TRUNCATE TABLE `test`;
;;DELIMITER
从现在起每三小时清理过期的验证码
DELIMITER ;;
CREATE EVENT IF NOT EXISTS yzcode_del
ON SCHEDULE EVERY 3 HOUR
STARTS CURRENT_TIMESTAMP
ON COMPLETION PRESERVE
ENABLE
DO
BEGIN
###set session time_zone = '+8:00';
DELETE FROM `yzcode` WHERE `expiretime`<CURRENT_TIMESTAMP;
END
;;DELIMITER;
触发
CREATE TRIGGER 表名 BEFORE|AFTER INSERT|UPDATE|DELETE ON 表名 FOR EACH ROW
触发语句
每次点赞或者倒彩 评论操作表每插入一条 评论表点赞数,倒彩数加一
DELIMITER $$
CREATE TRIGGER `community_comment_op_insert` AFTER INSERT ON `community_comment_op` FOR EACH ROW
BEGIN
declare commentid int;
declare ptype int;
###new.列名 操作之后的新值
###old.列名 操作之后的旧值
###select into !!!变量名和列名要不一样
select `cid`,`type` into commentid,ptype from `community_comment_op` where `id`=new.`id` limit 1;
if ptype=1 then
update `community_comment` set `praise_num` = `praise_num` + 1 where `id` = commentid;
else
update `community_comment` set `criticism_num` = `criticism_num` + 1 where `id` = commentid;
end if;
END
$$DELIMITER
游标
游标相对于结果集的一个指针 操作需要特别小心
申明
DECLARE 游标名 CURSOR FOR 查找语句;
打开
OPEN 游标名;
遍历
!!!变量列表 名字不能列名一样的
FETCH 游标名 INTO 变量列表;
关闭
CLOSE 游标名;
DECLARE done INT DEFAULT FALSE;
DECLARE tid INT;
DECLARE cur CURSOR FOR select `id` from test2;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;
OPEN cur;
REPEAT
FETCH cur INTO tid;
update test2 set `f1`=tid where `id`=tid limit 1;
UNTIL done
END REPEAT;
CLOSE cur;
自定义函数
自定义函数 有返回值 直接执行
存储过程 参数类型IN OUT INOUT 支持事务 使用call执行
DELIMITER $$
CREATE FUNCTION `test`(`i` int)
RETURNS int(10)
NO SQL
BEGIN
set i=i+10;
RETURN i;
END;
$$ DELIMITER
select test(20);
存储过程
DELIMITER $$
CREATE DEFINER = `root`@`localhost` PROCEDURE `replace`(IN `c` char(255),OUT `rid` int,OUT `isinsert` int)
BEGIN
set rid=0;
select `id` into rid from `test`.`test` where `f1`=c limit 1;
IF rid=0 THEN
insert into `test`.`test` (`f1`)values(c);
set rid=LAST_INSERT_ID();
set isinsert=1;
ELSE
set isinsert=0;
END IF;
END;
事务
CREATE DEFINER = CURRENT_USER PROCEDURE `test`()
BEGIN
DECLARE rid INT(10);
START TRANSACTION;
insert into `test`.`test` (`f1`)values('kk');
set rid=LAST_INSERT_ID();
IF rid>100 THEN
ROLLBACK;
ELSE
COMMIT;
END IF;
END;;
修饰符
- 创建者
用户名@主机 或者 CURRENT_USER
DEFINER = root@localhost - IF NOT EXISTS 是否存在
- COMMENT ‘备注’
- 数据访问:
CONTAINS SQL包含SQL语句但不包含读或写数据的语句
NO SQL不包含SQL语句
READS SQL DATA包含读数据的语句
MODIFIES SQL DATA包含写数据的语句 - 安全性:
SQL SECURITY { DEFINER | INVOKER }
DEFINER 判定创建者是否有权限
INVOKER 判定调用者是否有权限
内置函数
AVG()//平均值
COUNT()//计数
MAX()//最大值
MIN()//最小值
SUM()//求和
NOW ( ) //当前时间
CURRENT_TIMESTAMP ( ) //当前时间戳
FORMAT (number,decimal_places ) //保留小数位数
FLOOR (number2 ) //向下取整
CEILING (number2 ) //向上取整
TRIM(string2) //去除指定位置的指定字符
UCASE (string2 ) //转换成大写
LCASE (string2 ) //转换成小写
LENGTH (string ) //string长度
REPLACE (str ,search_str ,replace_str ) //在str中用replace_str替换search_str
STRCMP (string1 ,string2 ) //逐字符比较两字串大小,
SUBSTRING (str , position [,length ]) //从str的position开始,取length个字符,
注:mysql中处理字符串时,默认第一个字符下标为1,即参数position必须大于等于1