1. 窗口函数
mysql好像没有发现窗口函数,然后……
需求1:为数据表增加行号,row_number()的功能。
SELECT
t2.score,
t2.op_time,
-- 行号
@no := @no + 1 AS row_no
FROM
`student` t2,
(SELECT
@no := 0) tx ;
需求2:把第一个学习记录日期,窗口函数first_value()功能;
SELECT t2.id,t2.op_time,
CASE WHEN @preId = t2.id THEN @firstDate
WHEN @preId := t2.id THEN @firstDate := t2.op_time
END AS first_date
FROM
(
SELECT t.`id`,t.`op_time`
FROM `student` t
WHERE t.`id` IS NOT NULL
ORDER BY t.`id`, t.`op_time`
) t2,
(SELECT @preId := NULL, @firstDate := NULL) tx ;
运行结果为:
这些东西,引起了对如下对象的回忆:
2.函数
什么是存储函数: 封装一段sql代码,完成一种特定的功能,返回结果。
一个函数应该属于某个数据库,可以使用db_name.funciton_name的形式执行当前函数所属数据库,否则为当前数据库。
在函数那栏中,选择创建函数,代码如下就可以了:
DELIMITER $$
CREATE FUNCTION my_add (a INTEGER, b INTEGER) RETURNS INTEGER
BEGIN
RETURN a + b ;
END $$
DELIMITER ;
使用方法:select my_add(1,2)
会显示像查询结果的东西。
3. 储存过程
存储过程(Stored Procedure)是在大型数据库系统中,一组为了完成特定功能的SQL 语句集,存储在数据库中,经过第一次编译后再次调用不需要再次编译,用户通过指定存储过程的名字并给出参数(如果该存储过程带有参数)来执行它。
创建储存过程,代码如下:
DELIMITER $$
CREATE PROCEDURE test_proce ()
BEGIN
DECLARE i INT DEFAULT 0 ;
WHILE
i < 1000 DO
INSERT INTO student (score)
VALUES
(i) ;
SET i = i + 1 ;
END WHILE ;
END $$
DELIMITER ;
运行结果会保存在student数据表中。
调用方法:call test_proce()
4. 视图
CREATE VIEW tst_view AS
(SELECT
*
FROM
kadinfo.`student` t
WHERE t.score > 50) ;
这个就像查询表一样用。
5. 事件
SHOW VARIABLES LIKE 'event_scheduler';
"Variable_name" "Value"
"event_scheduler" "OFF"
设置开启:
set global event_scheduler = on;
再查看调度的情况:
"Variable_name" "Value"
"event_scheduler" "ON"
编写事件代码:
-- ----------------------------
-- Event structure for `tst_action`
-- ----------------------------
DROP EVENT IF EXISTS `tst_action` ;
DELIMITER $$
CREATE EVENT `tst_action`
ON SCHEDULE EVERY 1 MINUTE STARTS '2018-02-27 10:00:00'
ON COMPLETION NOT PRESERVE ENABLE DO
BEGIN
INSERT INTO student (score, op_time) VALUES (99999, NOW()) ;
END $$
DELIMITER ;
可以看到的效果:
"score" "op_time"
"99999" "2018-02-27 10:13:00"
"99999" "2018-02-27 10:14:00"
"99999" "2018-02-27 10:15:00"
也就是说,每分钟会向数据库表增加一条记录。
6. 触发器
一张表发生了某件事(插入、删除、更新操作),然后自动触发了预先编写好的若干条SQL语句的执行;
创建触发器代码:
DROP TRIGGER IF EXISTS `tst_trigger`;
DELIMITER $$
CREATE TRIGGER `tst_trigger` AFTER INSERT
ON `student` FOR EACH ROW
BEGIN
INSERT INTO student_log (des, op_time)
VALUES
('update student data', NOW()) ;
END $$
DELIMITER ;
执行就可以完成了。
对student插入一条记录:
INSERT INTO student (score, op_time) VALUES (99999, NOW()) ;
插入的记录如下:
同时,再看一眼log表:
可见,在这个同时,对student所监控的表格进行日志更新。
最后看下所在的在SQLyog显示: