MySQL資料庫基礎知識五(檢視和儲存程式)
使用檢視
檢視是一個虛表,它是在表或其他檢視的基礎上,使用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