使用视图
视图是一个虚表,它是在表或其他视图的基础上,使用SELECT语句来定义的。
创建视图:
create view view_name as select last_name,first_name from president;//创建虚表view_name,表为2列,表中数据来自于president
select * from view_name;
select last_name from view_name where last_name = 'ad';
order by,limit等子句。
创建视图并更改列名
create view view_name(ln,fn) as select last_name,first_name from president;//虚表中的列名改为ln和fn。
视图用于定义语句较为复杂的查询。
create view grade_stats as
select
grade_event.date,grade_event.category,
MIN(score.score) as minimum,
MAX(score.score) as maximum,
MAX(score.score)-MIN(score.score)+1 as span,
SUM(score.score) as total,
AVG(score.score) as average,
COUNT(score.score) as count
from score inner join grade_event
on score.event_id = grade_event.event_id
group by grade_event.date;
通过这个试图进行查询,会执行连续操作,并检索计算的结果。
select * from grade_status;
复合语句和语句分隔符
对于复合语句,在块内的语句之间必须使用分号“;”进行分割,由于客户端程序mysql也会使用“;”,会起冲突,所以使用delimiter关键字,对mysql客户端分隔符进行重设’
创建存储过程
delimiter $
create procedure show_times()
BEGIN
select current_timestamp as 'Local Time'
select UTC_TIMESTAMP AS 'UTC TIME';
END$
delimiter;
call show_times();
存储函数和存储过程
创建存储函数
delimiter $
create function count_born_in_year(p_year INT)
returns int
reads sql data
begin
return(select count(*) from president where year(birth) = p_year;
END$
delimiter;
调用:select count_born_in_year(1400);
存储过程的参数类型3中
IN参数,调用者会把一个传导过程里面,进行参数修改,但是结束后,调用者不能访问
out参数,调用者能访问
input 参数允许调用者向过程传递一个值再取回一个值。
触发器
1.利用触发器来实现数据完整性约束
2.可以给予某个表达式来为列提供默认值
3.可以在行删除或更新之前先检查行的当前内容。
创建一个触发器,超过0~100范围的按最近的添加,还添加当前的日期
create table t(percent INT,dt DATETIME);
delimiter $
create trigger bi_t before insert on t
for each row begin
if NEW.percent < 0 THEN
SET NEW.percent = 0;
elseif NEW.percent > 100 THEN
SET NEW.percent = 100;
END IF
END$ NEW.dt = CURRENT_TIMESTAMP;
END$
delimiter;
使用
INSERT INTO t(percent) VALUES(-2); DO SLEEP(2);
事件
事件调度器是否开着。
SET GLOBAL event_scheduler = ON;
创建事件的基本语法:
create event event_name
on schedule {at datetime| every expr interval[starts datetime][ends datetime]}
do event_stmt
如每四小时定时清理
create event expire_web_session
on schedule every 4 hour
do
delete from web_session
where last_visit < CURRENT_TIMESTAMP - INTERVAL 1 DAY;
如果创建一个只执行一次的则:
on schedule at CURRENT_TIMESTAMP + INTERVAL 1 HOUR