1. 窗口函数

mysql好像没有发现窗口函数,然后……
需求1:为数据表增加行号,row_number()的功能。

SELECT 
  t2.score,
  t2.op_time,
  -- 行号
  @no := @no + 1 AS row_no 
FROM
  `student` t2,
  (SELECT 
    @no := 0) tx ;

MySQL窗口函数 pecent mysql窗口函数 是用来干嘛_MySQL窗口函数 pecent


需求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 ;

运行结果为:

MySQL窗口函数 pecent mysql窗口函数 是用来干嘛_触发器_02


这些东西,引起了对如下对象的回忆:

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()) ;

插入的记录如下:

MySQL窗口函数 pecent mysql窗口函数 是用来干嘛_mysql_03


同时,再看一眼log表:

MySQL窗口函数 pecent mysql窗口函数 是用来干嘛_MySQL窗口函数 pecent_04


可见,在这个同时,对student所监控的表格进行日志更新。

最后看下所在的在SQLyog显示:

MySQL窗口函数 pecent mysql窗口函数 是用来干嘛_触发器_05