1、视图:开发中不常用
给某个常用的查询语句设置别名,方便使用
创建:create view 视图名称 as SQL
修改:alter view 视图名称 as SQL
删除:drop view 视图名称
视图是虚拟的而非物理表。
2、触发器:开发中不常用
执行增删改语句,自动执行设置的关联语句
触发器中类:insert,delete,update
触发时机:before,after
关键字:new:insert,update中;old:delete,update中
例:before insert触发
delimiter // 更改语句结束符为// create trigger t1 before insert on class for each row begin insert into student values(0,'sdf',12,3); end// t1是触发器名称,在插入语句执行之前执行begin和end间语句,注意:each row 表示每插入一条记录,就执行一次触发器 delimiter ; 语句结束符改回 ;
new关键字:在将插入到class中的name,也插入到student中
create trigger wwww before insert on class for each row begin insert into student values(0,new.name,12,3); end//
删除触发器:
drop trigger t1;
3、函数
(1)内置函数:
select curdate(); yyyy-mm-dd select char_length('sdf'); 字符串长度 mysql> select concat('asdf','123'); +----------------------+ | concat('asdf','123') | +----------------------+ | asdf123 | +----------------------+ 时间格式化: mysql> select date_format(curdate(),'%Y-%m');select curdate(); +--------------------------------+ | date_format(curdate(),'%Y-%m') | +--------------------------------+ | 2018-03 | +--------------------------------+ 1 row in set +------------+ | curdate() | +------------+ | 2018-03-14 | +------------+ 1 row in set
时间格式化:https://dev.mysql.com/doc/refman/5.7/en/date-and-time-functions.html
(2)自定义函数:
delimiter // create function f1(i1 int,i2 int) returns int begin declare num int default 0;set num = i1 + i2;return num;end // mysql> select f1(1,45); +----------+ | f1(1,45) | +----------+ | 46 | +----------+
注意:1、函数有返回值;2、函数内不能写如select等语句
4、存储过程
存储过程是指保存在mysql上的一个别名,它代指的是事先写好的,实现一定功能的一堆sql语句。以后通过该别名执行。
视图也是别名,但是是把视图当作一张表(临时结果集)来调用的,视图只能查询;存储过程直接通过别名来调用,别名代表一系列操作(查,改等)
存储过程是为了减少直接写sql语句
可通过远程传入存储过程名执行数据库操作
a、简单存储过程
delimiter // create procedure f1() begin select * from student; #查 insert into class(name) values('yiban'); #插入 end // delimiter ; mysql中使用:call f1(); pymysql使用:cursor.callproc('f1')
传参数:in,out,inout关键字
b、in
delimiter // create procedure f2( in n1 int, in n2 int ) begin select * from student where id > n1; end // delimiter ; mysql中使用:call f2(4,6); #n2没有利用,也要传入 pymysql使用:cursor.callproc('f1',(4,6))
c、in,out #存储过程没有return,可以用out返回值
delimiter // create procedure f3( in n1 int, out n2 int #变量 ) begin set n2 = 123456 select * from student where id > n1; end // delimiter ; set @v1 = 0; #session级别的全局变量
mysql中使用:call f3(4,@v1); #n2必须是变量 查看:select @v1; #输出 123456 pymysql使用:cursor.callproc('f3',(4,2)) cursor.excute('select @_f3_0,@_f3_1')
d、inout
e、事务(原子性操作),要不全部执行,要不全部不执行
f、游标
g、动态执行sql(防sql注入)
特性:1、可传参数 in,out,inout
2、pymysql结合
3、没有return;out 可用于标识存储过程的执行结果
5、索引
6、ORM操作