视图

视图是一个虚拟表

创建视图

CREATE VIEW 视图名称 [列名,....] AS 子查询

create view emp2dep as select empl.*,depa.name as dep_name from empl inner JOIN depa on empl.dep_id=depa.id;

如果省略视图的列名,则该视图的列由子查询中的列组成

触发器

对表的增删改行为

创建触发器

create trigger 触发器名 before|after 触发事件INSERT/update/delete on 表名 FOR EACH ROW

CREATE TABLE cmd (

id INT PRIMARY KEY auto_increment,

USER CHAR (32),

priv CHAR (10),

cmd CHAR (64),

sub_time datetime, #提交时间

success enum ('yes', 'no') #0代表执行失败

);

CREATE TABLE errlog (

id INT PRIMARY KEY auto_increment,

err_id int

);

创建触发器

delimiter // #将sql语句的结束符号改为://

CREATE TRIGGER tri_after_insert_cmd AFTER INSERT ON cmd FOR EACH ROW

BEGIN

IF NEW.success = 'no' THEN #等值判断只有一个等号

        INSERT INTO errlog(err_id) VALUES(NEW.id) ; #必须加分号

  END IF ; #必须加分号

END //

delimiter ; #将sql语句的结束符号改回来分号

特别的:NEW表示即将插入的数据行,OLD表示即将删除的数据行。

DATE_FORMAT函数

CREATE TABLE blog (

id INT PRIMARY KEY auto_increment,

NAME CHAR (32),

sub_time datetime

);

INSERT INTO blog (NAME, sub_time)

VALUES

('第1篇','2015-03-01 11:31:21'),

('第2篇','2015-03-11 16:31:21'),

('第3篇','2016-07-01 10:21:31'),

('第4篇','2016-07-22 09:23:21'),

('第5篇','2016-07-23 10:11:11'),

('第6篇','2016-07-25 11:21:31'),

('第7篇','2017-03-01 15:33:21'),

('第8篇','2017-03-01 17:32:21'),

('第9篇','2017-03-01 18:31:21');

SELECT DATE_FORMAT(sub_time,'%Y-%m'),COUNT(id) FROM blog GROUP BY DATE_FORMAT(sub_time,'%Y-%m'); #提取时间的年和月份

存储过程

创建存储过程

delimiter //
create procedure p1()
BEGIN
select * from blog;
INSERT into blog(name,sub_time) values("xxx",now());
END //
delimiter ;

在mysql中调用

call p1()

在python中基于pymysql调用

cursor.callproc('p1')

print(cursor.fetchall())

对于存储过程,可以接收参数,其参数有三类:

in 仅用于传入参数用
out 仅用于返回值用
inout 既可以传入又可以当作返回值
delimiter //
create procedure p2(
in n1 int,
in n2 int #n2没起作用
)
BEGIN

select * from blog where id > n1;

END //
delimiter ;

在mysql中调用
call p2(3,2);

在python中基于pymysql调用
cursor.callproc('p2',(3,2))
print(cursor.fetchall())

delimiter //
create procedure p3(
in n1 int,
out res int
)
BEGIN
select * from blog where id > n1;
set res = 1;
END //
delimiter ;

在mysql中调用
set @res=0; #0代表假(执行失败),1代表真(执行成功)
call p3(3,@res);
select @res;

在python中基于pymysql调用
cursor.callproc('p3',(3,0)) #0相当于set @res=0
print(cursor.fetchall()) #查询select的查询结果

cursor.execute('select @_p3_0,@_p3_1;') #@p3_0代表第一个参数,@p3_1代表第二个参数,即返回值
print(cursor.fetchall())