触发器:触发器是一个特殊的存储过程,它是MySQL在insert、update、delete的时候自动执行的代码块。

    1. create trigger trigger_name
    2. after/before insert/update/delete on 表名
    3. for each row
    4. begin
    5. sql语句:(触发的语句一句或多句)
    6. end
    1. DELIMITER $$
    2. create trigger trigger_name
    3. after insert on teacher
    4. for each row
    5. begin
    6. insert into course(cname,teacher_id) values('数学',new.tid);
    7. end$$
    8. DELIMITER ;

    *MySQL 的触发器中不能对本表进行 insert、update 和 delete 操作,否则会报错

    函数:MySQL中提供了许多内置函数,还可以自定义函数(实现程序员需要sql逻辑处理)

    1. 自定义函数:
    2. 创建:CREATE FUNCTION 函数名称(参数列表)  
    3.    RETURNS 返回值类型  
    4. 函数体
    5. 调用:SELECT 函数名称(参数列表)
    1. 修改: ALTER FUNCTION 函数名称 [characteristic ...]
    2. 删除:DROP FUNCTION [IF EXISTS] 函数名称
    1. -- 1. 创建函数
    2. create function fun_add(a int,b int)
    3. returns int return a + b;
    4. -- 2. 执行函数
    5. select fun_add(1,1);
    1. DELIMITER $$
    2. CREATE FUNCTION rsum(n int) RETURNS int
    3. begin
    4. declare a int default 0;
    5. declare s int default 0;
    6. while a<n do
    7. set a = a+1;
    8. set s = s+a;
    9. end while;
    10. return s;
    11. end$$
    12. DELIMITER ;
    1. 出错信息:
    2. ERROR 1418 (HY000): 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)
    3. 原因:
    4. 这是我们开启了bin-log, 我们就必须指定我们的函数是否是
    5. 1 DETERMINISTIC 不确定的
    6. 2 NO SQL 没有SQl语句,当然也不会修改数据
    7. 3 READS SQL DATA 只是读取数据,当然也不会修改数据
    8. 4 MODIFIES SQL DATA 要修改数据
    9. 5 CONTAINS SQL 包含了SQL语句
    10. 其中在function里面,只有 DETERMINISTIC, NO SQL READS SQL DATA 被支持。如果我们开启了 bin-log, 我们就必须为我们的function指定一个参数。
    11. 解决方法:
    12. SQL code
    13. mysql> show variables like 'log_bin_trust_function_creators';
    14. +---------------------------------+-------+
    15. | Variable_name | Value |
    16. +---------------------------------+-------+
    17. | log_bin_trust_function_creators | OFF |
    18. +---------------------------------+-------+
    19. mysql> set global log_bin_trust_function_creators=1;
    20. mysql> show variables like 'log_bin_trust_function_creators';
    21. +---------------------------------+-------+
    22. | Variable_name | Value |
    23. +---------------------------------+-------+
    24. | log_bin_trust_function_creators | ON |
    25. 这样添加了参数以后,如果mysqld重启,那个参数又会消失,因此记得在my.cnf配置文件中添加:
    26. log_bin_trust_function_creators=1

    视图:视图是由查询结果形成的一张虚拟表,是表通过某种运算得到的一个投影

    1. create view view_name as select 语句

    *视图只是一条预编译的SQL语句,并不保存实际数据

    1. mysql> select * from teacher,course where course.teacher_id = teacher.tid;
    2. +-----+-----------------+-----+--------+------------+
    3. | tid | tname | cid | cname | teacher_id |
    4. +-----+-----------------+-----+--------+------------+
    5. | 1 | 张磊老师 | 1 | 生物 | 1 |
    6. | 2 | 李平老师 | 2 | 物理 | 2 |
    7. | 3 | 刘海燕老师 | 3 | 体育 | 3 |
    8. | 2 | 李平老师 | 4 | 美术 | 2 |
    9. +-----+-----------------+-----+--------+------------+
    10. 4 rows in set (0.00 sec)
    11. mysql> create view view_name as select * from teacher,course where course.teacher_id = teacher.tid;
    12. Query OK, 0 rows affected (0.00 sec)
    13. mysql> show tables;
    14. +--------------------+
    15. | Tables_in_homework |
    16. +--------------------+
    17. | class |
    18. | course |
    19. | score |
    20. | student |
    21. | teacher |
    22. | view_name |
    23. +--------------------+
    24. 6 rows in set (0.00 sec)
    25. mysql> select * from view_name;
    26. +-----+-----------------+-----+--------+------------+
    27. | tid | tname | cid | cname | teacher_id |
    28. +-----+-----------------+-----+--------+------------+
    29. | 1 | 张磊老师 | 1 | 生物 | 1 |
    30. | 2 | 李平老师 | 2 | 物理 | 2 |
    31. | 3 | 刘海燕老师 | 3 | 体育 | 3 |
    32. | 2 | 李平老师 | 4 | 美术 | 2 |
    33. +-----+-----------------+-----+--------+------------+

    存储过程:把一段代码封装起来,当要执行这一段代码的时候,可以通过调用该存储过程来实现(经过第一次编译后再次调用不需要再次编译,比一个个执行sql语句效率高)

    1. create procedure 存储过程名(参数,参数,…)
    2.    begin
    3.    //代码
    4.    end
    5. call 存储过程名(参数...)
    1. #1. 准备表
    2. create table s1(
    3. id int,
    4. name varchar(20),
    5. gender char(6),
    6. email varchar(50)
    7. );
    8. #2. 创建存储过程,实现批量插入记录
    9. delimiter $$ #声明存储过程的结束符号为$$
    10. create procedure auto_insert1()
    11. BEGIN
    12. declare i int default 1;
    13. while(i<30)do
    14. insert into s1 values(i,'eva','female',concat('eva',i,'@oldboy'));
    15. set i=i+1;
    16. end while;
    17. END$$ #$$结束
    18. delimiter ; #重新声明分号为结束符号
    19. #3. 查看存储过程
    20. show create procedure auto_insert1\G
    21. #4. 调用存储过程
    22. call auto_insert1();
    1. 存储过程可以有多个in,out,inout参数,而函数只有输入参数类型,而且不能带in.
    2. 存储过程实现的功能要复杂一些;而函数的单一功能性(针对性)更强。
    3. 存储过程可以返回多个值;存储函数只能有一个返回值。
    4. 存储过程一般独立的来执行;而存储函数可以作为其它sql语句的组成部分来出现。
    5. 存储过程可以调用存储函数。函数不能调用存储过程。