1. 程式人生 > >MySQL資料庫基礎知識五(檢視和儲存程式)

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