## 一、兩個引擎的對比
### MyISAM
- 不支持事務,但是整個操作是原子性的(事務具備四種特性:原子性、一致性、隔離性、持久性)
- 不支持外鍵,支持表鎖,每次鎖住的是整張表
MyISAM的表鎖有讀鎖和寫鎖(<font color='red'>兩個鎖都是表級別</font>)
一個MyISAM表有三個文件:索引文件,表結構文件,數(shù)據(jù)文件
存儲表的總行數(shù),執(zhí)行<font color='orange'>select count(*) from table</font>時只要簡單的讀出保存好的行數(shù)即可
采用非聚集索引,索引文件的數(shù)據(jù)域存儲指向數(shù)據(jù)文件的指針。輔索引與主索引基本一致,但是輔索引不用保證唯一性。
<font color='red'>對于AUTO_INCREMENT類型的字段,在MyISAM表中,可以和其他字段一起建立聯(lián)合索引。</font>
### InnoDB
- 支持事務,支持事務的四種隔離級別;是一種具有事務(commit)、回滾(rollback)和崩潰修復能力(crash recovery capabilities)的事務安全(transaction-safe (ACID compliant))型表。
- 支持行鎖和外鍵約束,因此可以支持寫并發(fā)
- 不存儲總行數(shù);也就是說,執(zhí)行select count(*) from table時,InnoDB要掃描一遍整個表來計算有多少行。注意的是,當count(*)語句包含 where條件時,兩種表的操作是一樣的。
- 對于AUTO_INCREMENT類型的字段,InnoDB中必須包含只有該字段的索引
- DELETE FROM table時,InnoDB不會重新建立表,而是一行一行的刪除
- 一個Innodb表存儲在一個文件內(nèi)(共享表空間,表大小不受操作系統(tǒng)的限制),也可能為多個(設置為獨立表空間,表大小受操作系統(tǒng)限制,大小為2G),受操作系統(tǒng)文件大小的限制
- 主鍵索引采用聚集索引(索引的數(shù)據(jù)域存儲數(shù)據(jù)文件本身),輔索引的數(shù)據(jù)域存儲主鍵的值;因此從輔索引查找數(shù)據(jù),需要先通過輔索引找到主鍵值,再訪問主鍵索引;最好使用自增主鍵,防止插入數(shù)據(jù)時,為維持B+樹結構,文件的大調(diào)整。
? ### 兩者的區(qū)別

## 二、MySQL磁盤碎片
### 碎片產(chǎn)生的原因
- <font color='orange'>表的存儲會出現(xiàn)碎片化</font>,每當刪除了一行內(nèi)容,該段空間就會變?yōu)榭瞻住⒈涣艨?,而在一段時間內(nèi)的大量刪除操作,會使這種留空的空間變得比存儲列表內(nèi)容所使用的空間更大;
- 當執(zhí)行插入操作時,MySQL會嘗試使用空白空間,但如果某個空白空間一直沒有被大小合適的數(shù)據(jù)占用,仍然無法將其徹底占用,就形成了碎片;
- 當MySQL對數(shù)據(jù)進行掃描時,它掃描的對象實際是列表的容量需求上限,也就是數(shù)據(jù)被寫入的區(qū)域中處于峰值位置的部分
如:<font color='orange'>一個表有1萬行,每行10字節(jié),會占用10萬字節(jié)存儲空間,執(zhí)行刪除操作,只留一行,實際內(nèi)容只剩下10字節(jié),但MySQL在讀取時,仍看做是10萬字節(jié)的表進行處理,所以,碎片越多,就會越來越影響查詢性能。</font>
#### 查看表碎片的大?。?/p>
```MySQL
show table status like '表名';
```
結果中'Data_free'列的值就是碎片大小

#### 列出所有已經(jīng)產(chǎn)生碎片的表:
```MySQL
select table_schema db, table_name, data_free, engine from information_schema.tables where table_schema not in ('information_schema', 'mysql') and data_free > 0;
```
#### 清理表碎片
1. MyISAM表:
? ```MySQL
? optimize table 表名;
? ```
2. InnoDB表:
? ```MySQL
? alter table 表名 engine = InnoDB;
? ```
? ## 三、數(shù)據(jù)庫優(yōu)化
<font color='orange'>是否需要清理碎片、上的鎖是否為表鎖</font>
<font color='orange'>select后不要用*,不然會回表</font>
#### 選取最適用的字段屬性
<font color='red'>數(shù)據(jù)庫中的表越小,在它上面執(zhí)行的查詢也就會越快。</font>因此,在創(chuàng)建表的時候,為了獲得更好的性能,我們可以將表中字段的寬度設得盡可能小
**另外一個提高效率的方法是在可能的情況下,應該盡量把字段設置為NOT NULL**,這樣在將來執(zhí)行查詢的時候,數(shù)據(jù)庫<font color='red'>不用去比較NULL值</font>
因為在MySQL中,ENUM類型被當作數(shù)值型數(shù)據(jù)來處理,而數(shù)值型數(shù)據(jù)被處理起來的速度要比文本類型快得多
#### 使用連接(JOIN)來代替子查詢(Sub-Queries)
使用子查詢可以一次性的完成很多邏輯上需要多個步驟才能完成的SQL操作,同時也可以<font color='red'>避免事務或者表鎖死</font>,并且寫起來也很容易。但是,有些情況下,<font color='red'>子查詢可以被更有效率的連接(JOIN)替代</font>。
#### 使用聯(lián)合(UNION)來代替手動創(chuàng)建的臨時表(不懂)
可以把需要使用臨時表的兩條或更多的<font color='orange'>select</font>查詢合并的一個查詢中。在客戶端的查詢會話<font color='red'>結束的時候</font>,臨時表會被<font color='red'>自動刪除</font>,從而保證數(shù)據(jù)庫整齊、高效
用union來創(chuàng)建查詢的時候,我們只需要用UNION作為關鍵字把多個select語句連接起來就可以了,要注意的是所有select語句中的字段數(shù)目要想同。
#### 事務
事務原理是:<font color='red'>要么語句塊中每條語句都操作成功,要么都失敗</font>。換句話說,<font color='orange'>就是可以保持數(shù)據(jù)庫中數(shù)據(jù)的一致性和完整性</font>。事物以<font color='orange'>BEGIN</font>關鍵字開始,<font color='orange'>COMMIT</font>關鍵字結束。在這之間的一條SQL操作失敗,那么,<font color='orange'>rollback</font>命令就可以把數(shù)據(jù)庫恢復到<font color='orange'>BEGIN</font>開始之前的狀態(tài)。
<font color='cornflowerblue'>事務的另一個重要作用是當多個用戶同時使用相同的數(shù)據(jù)源時,它可以利用鎖定數(shù)據(jù)庫的方法來為用戶提供一種安全的訪問方式,這樣可以保證用戶的操作不被其它的用戶所干擾。</font>
#### 鎖定表
盡管事務是維護數(shù)據(jù)庫完整性的一個非常好的方法,但卻因為它的<font color='red'>獨占性</font>,有時會影響數(shù)據(jù)庫的性能,尤其是在很大的應用系統(tǒng)中。<font color='red'>由于在事務執(zhí)行的過程中,數(shù)據(jù)庫將會被鎖定</font>,因此其它的用戶請求<font color='red'>只能暫時等待直到該事務結束</font>。如果一個數(shù)據(jù)庫系統(tǒng)只有少數(shù)幾個用戶來使用,事務造成的影響不會成為一個太大的問題;但假設有成千上萬的用戶同時訪問一個數(shù)據(jù)庫系統(tǒng),就會產(chǎn)生比較嚴重的響應延遲。此時通過<font color='red'>鎖定表</font>的方法來獲得更好的性能
#### 使用外鍵
鎖定表的方法可以<font color='red'>維護數(shù)據(jù)的完整性</font>,但是它<font color='red'>卻不能保證數(shù)據(jù)的關聯(lián)性</font>。這個時候我們就可以使用<font color='orange'>外鍵</font>。
#### 使用索引
索引是提高數(shù)據(jù)庫性能的常用方法,它可以令數(shù)據(jù)庫服務器以比沒有索引快得多的速度檢索特定的行,尤其是在查詢語句當中包含有<font color='red'>MAX()</font>,<font color='red'>MIN()</font>和<font color='red'>ORDERBY</font>這些命令的時候,性能提高更為明顯。
一般說來,索引應建立在那些將用于<font color='red'>JOIN,WHERE</font>判斷和<font color='red'>ORDER BY</font>排序的字段上。盡量不要對數(shù)據(jù)庫中某個含有大量重復的值的字段建立索引。
#### 優(yōu)化的查詢語句
絕大多數(shù)情況下,使用索引可以提高查詢的速度,但如果<font color='red'>SQL語句使用不恰當?shù)脑?lt;/font>,索引將無法發(fā)揮它應有的作用。
- 不能將一個建有索引的<font color='orange'>int</font>字段和<font color='orange'>bigint</font>字段進行比較;但是作為特殊的情況,在<font color='orange'>CHAR</font>類型的字段和<font color='orange'>VARCHAR</font>類型字段的字段大小相同的時候,可以將它們進行比較。
- 在建有索引的字段上盡量<font color='orange'>不要使用函數(shù)</font>進行操作
- 在搜索字符型字段時,我們有時會使用<font color='red'>LIKE關鍵字和通配符</font>,這種做法雖然簡單,但卻也是<font color='red'>以犧牲系統(tǒng)性能為代價</font>的。
## 四、慢查詢?nèi)罩?/p>
MySQL的慢查詢?nèi)罩臼荕ySQL提供的一種日志記錄,它用來記錄在MySQL中響應時間超過閥值的語句,具體指運行時間超過<font color='orange'>long_query_time</font>(<font color='red'>long_query_time的默認值為10,意思是運行10S以上的語句</font>)值的SQL,則會被記錄到慢查詢?nèi)罩局小?/p>
#### 慢查詢?nèi)罩鞠嚓P參數(shù)
```MySQL
slow_query_log:是否開啟慢查詢?nèi)罩荆?表示開啟,0表示關閉。
show variables like '%slow_query_log';
slow-query-log-file:MySQL數(shù)據(jù)庫慢查詢?nèi)罩敬鎯β窂???梢圆辉O置該參數(shù),系統(tǒng)則會默認給一個缺省的文件host_name-slow.log
show variables like '%slow_query_log-file';
long_query_time :慢查詢閾值,當查詢時間多于設定的閾值時,記錄日志。
show VARIABLES like 'long_query_time%';
log_queries_not_using_indexes:未使用索引的查詢也被記錄到慢查詢?nèi)罩局校蛇x項)。
show variables like '%log_queries_not_using_indexes';
```
<font color='red'>log_output</font>:日志存儲方式。<font color='red'>log_output='FILE'</font>表示將<font color='orange'>日志存入文件,默認值是'FILE'。</font><font color='red'>log_output='TABLE'</font>表示將<font color='orange'>日志存入數(shù)據(jù)庫</font>,這樣日志信息就會被寫入到<font color='orange'>mysql.slow_log表</font>中。MySQL數(shù)據(jù)庫支持同時兩種日志存儲方式,配置的時候以逗號隔開即可,如:<font color='orange'>log_output='FILE,TABLE'。</font>日志記錄到系統(tǒng)的專用日志表中,要比記錄到文件耗費更多的系統(tǒng)資源,因此對于需要啟用慢查詢?nèi)罩?,又需要能夠獲得更高的系統(tǒng)性能,那么建議優(yōu)先記錄到文件。
```mysql
查詢慢查詢?nèi)罩敬鎯Ψ椒?/p>
show variables like '%log_output'
修改慢查詢?nèi)罩敬鎯ξ恢?/p>
set global log_output = 'FILE,TABLE'
打印在MySQL中慢查詢?nèi)罩镜奈恢?/p>
SELECT * FROM mysql.slow_log
```
默認情況下<font color='orange'>slow_query_log</font>的值為<font color='red'>OFF</font>,表示慢查詢?nèi)罩臼墙玫?/p>
<font color='cornflowerblue'>那么開啟了慢查詢?nèi)罩竞?,什么樣的SQL才會記錄到慢查詢?nèi)罩纠锩婺兀?lt;/font> 這個是由參數(shù)<font color='orange'>long_query_time</font>控制,默認情況下<font color='orange'>long_query_time</font>的值為10秒,可以使用命令修改,也可以在my.cnf參數(shù)里面修改。關于運行時間正好等于<font color='orange'>long_query_time</font>的情況,并不會被記錄下來。也就是說,在<font color='red'>mysql源碼里是判斷大于long_query_time,而非大于等于</font>。
## 五、本日重點講解(不重要的東西)
可移植性不好,不易調(diào)試
### 1、觸發(fā)器
與表有關的數(shù)據(jù)對象,在滿足某種條件的時候,被動執(zhí)行SQL語句
指事先為某張表<font color='red'>綁定一段代碼</font>,當表中的<font color='red'>某些內(nèi)容發(fā)生改變</font>(增、刪、改)的時候,系統(tǒng)會<font color='red'>自動觸發(fā)代碼并執(zhí)行</font>。
#### 作用:
- 可在寫入數(shù)據(jù)前,強制檢驗或者轉換數(shù)據(jù)(保證護數(shù)據(jù)安全)
- 觸發(fā)器發(fā)生錯誤時,前面用戶已經(jīng)執(zhí)行成功的操作會被撤銷,類似事務的回滾
#### 創(chuàng)建觸發(fā)器
基本語句
```MySQL
delimiter 自定義結束符號
create trigger 觸發(fā)器名字 觸發(fā)時間 觸發(fā)事件 on 表 for each row
begin
? ? -- 觸發(fā)器內(nèi)容主體,每行用分號結尾
end 自定義的結束符合
```
<font color='orange'>on 表 for each</font>:觸發(fā)對象,觸發(fā)器綁定的實質(zhì)是表中的所有行,因此當每一行發(fā)生指定改變時,觸發(fā)器就會發(fā)生
##### 觸發(fā)時間
當 SQL 指令發(fā)生時,會令行中數(shù)據(jù)發(fā)生變化,而每張表中對應的行有兩種狀態(tài):**數(shù)據(jù)操作前和操作后**
- before:表中數(shù)據(jù)發(fā)生改變前的狀態(tài)
- after:表中數(shù)據(jù)發(fā)生改變后的狀態(tài)
**PS**:如果 before 觸發(fā)器失敗或者語句本身失敗,將不執(zhí)行 after 觸發(fā)器(如果有的話)
##### 觸發(fā)事件
觸發(fā)器是針對數(shù)據(jù)發(fā)送改變才會被觸發(fā),對應的操作只有
- INSERT:沒有 old,只有 new,new 表示將要(插入前)或者已經(jīng)增加(插入后)的數(shù)據(jù)
- DELETE:既有 old 也有 new,old 表示更新之前的數(shù)據(jù),new 表示更新之后的數(shù)據(jù)
- UPDATE:沒有 new,只有 old,old 表示將要(刪除前)或者已經(jīng)被刪除(刪除后)的數(shù)據(jù)
#### 查看觸發(fā)器
1.查看全部觸發(fā)器
```MySQL
show triggers;
```
2.查看觸發(fā)器的創(chuàng)建語句
```MySQL
show create trigger 觸發(fā)器名字;
```
3.觸發(fā)觸發(fā)器
```MySQL
drop trigger 觸發(fā)器名字;
```
#### 刪除觸發(fā)器
觸發(fā)器不能修改,只能刪除
```MySQL
drop trigger + 觸發(fā)器名字
```
### 2、存儲過程
#### 變量
##### 局部變量
局部變量只在<font color='orange'>BEGIN</font>和<font color='orange'>END</font>的代碼塊中有效,執(zhí)行完該代碼塊,變量就消失,在存儲過程中最為常見。<font color='orange'>DECLARE</font>語句專門用于定義局部變量,可以使用<font color='orange'>DEFAULT</font>語句來指明默認值。定義多個變量:<font color='orange'>DECLARE x, y INT DEFAULT 0</font>。賦值用的是`SET`或`SELECT`語句:
```MySQL
DECLARE total_count INT DEFAULT 0
SET total_count = 10;
SELECT COUNT(*) INTO total_count FROM products
```
其中<font color='orange'>total_count</font>為局部變量
##### 用戶變量
<font color='red'>用戶變量與數(shù)據(jù)庫連接有關</font>,一個客戶端定義的變量不能被其它客戶端看到或使用。當客戶端退出時,該客戶端連接的所有變量將失效。用戶變量不需要聲明,可以直接使用,用戶變量以<font color='orange'>@var_name</font>的形式命名變量,<font color='red'>變量名必須以@開頭</font>。
賦值語法,一般用<font color='orange'>SET</font>:
```MySQL
set @varName=value;
SELECT @var_name := value;
```
賦值后輸出用<font color='orange'>select @varName</font>。
##### 系統(tǒng)變量
MySQL可以訪問許多系統(tǒng)變量。當服務器運行時許多變量允許動態(tài)更改。這樣就可以修改服務器操作而不需要停止并重啟服務器。系統(tǒng)變量又包含兩種:<font color='red'>會話變量影響具體客戶端連接的操作,全局變量影響服務器整體操作。</font>
##### 全局變量
全局變量在 MySQL 啟動的時候由服務器自動初始化他們的值, 這些默認的值可以在<font color='orange'>/etc/my.cnf</font>中修改。要想更改全局變量,必須具有<font color='red'>SUPER</font>權限。全局變量作用于<font color='red'>SERVER的整個生命周期</font>,<font color='red'>但重啟后所有設置的全局變量均失效</font>。要想讓全局變量重啟后繼續(xù)生效,需要更改相應的配置文件。
```MySQL
show global variables like 'wait_timeout%';
```
```mysql
更改等待時間
set global wait_timeout=4;
```
#### 存儲過程創(chuàng)建
存儲過程是一組已經(jīng)預先編譯好的<font color='orange'>sql</font>語句的集合,理解為批處理語句(增加流程控制語句),一般在復雜邏輯中才會使用存儲過程
<font color='red'>存儲過程的優(yōu)點:</font>
- 提供了代碼的可用性
- 簡化了數(shù)據(jù)庫操作,將業(yè)務邏輯的細節(jié)隱藏在存儲過程中
- 減少了編譯次數(shù),減少了網(wǎng)絡IO的次數(shù),從而提高操作效率
<font color='red'>存儲過程的創(chuàng)建</font>
```cpp
/*
delimiter $
create procedure 存儲過程的名稱(參數(shù)列表)
begin
局部變量的定義
多條sql語句
流程控制語句
eng;$
*/
```
如果存儲過程中只有一條<font color='orange'>sql</font>語句可以省略<font color='orange'>begin end</font>
<font color='red'>參數(shù)列表</font>
| 參數(shù)模式 | 形參名稱 | 參數(shù)類型? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? |
| :------- | -------- | ------------------------------------------------- |
| in? ? ? | username | MySQL數(shù)據(jù)庫中的數(shù)據(jù)類型(數(shù)值型,字符型,日期型) |
| out? ? ? | pwd? ? ? | MySQL數(shù)據(jù)庫中的數(shù)據(jù)類型(數(shù)值型,字符型,日期型) |
| inout? ? | xxx? ? ? | MySQL數(shù)據(jù)庫中的數(shù)據(jù)類型(數(shù)值型,字符型,日期型) |
<font color='red'>in</font>:聲名該參數(shù)是一個輸入型參數(shù)(<font color='orange'>類似Java中的形參</font>)
<font color='red'>out</font>:聲名該參數(shù)為一個輸出型參數(shù)(<font color='orange'>類型Java中的返回值</font>),在一個存儲過程中<font color='orange'>可以定義多個out類型的參數(shù)</font>
<font color='red'>inout</font>:聲名該參數(shù)可以為輸入型參數(shù),也可以為輸出型參數(shù)
<font color='red'>存儲過程調(diào)用</font>
```mysql
call 存儲過程的名稱(實參列表)
-- 實參列表中包含由輸出類型的參數(shù)
```
<font color='red'>存儲過程的演示</font>
- 無參的存儲過程
? ```MySQL
? -- 用于b_user表中插入2條數(shù)據(jù)
? delimiter $ -- 自定義結束標志
? create procedure pro_insert()
? begin
? insert into b_user(name,sex) values('1','1');
? insert into b_user(name,sex) values('2','2');
? end;$
? -- 用這個存儲過程
? call pro_insert();
? ```
- 帶有<font color='red'>in</font>模式參數(shù)的存儲過程
? ```MySQL
? -- 用于向b_user插入2條數(shù)據(jù),性別由客戶輸入
? delimiter $
? create procedure pro_insert2(in sex char(1))
? begin
? insert into b_user(name,sex) values('1',sex);
? insert into b_user(name,sex) values('2',sex);
? end;$
? call pro_insert2('男');
? ```
- 帶有多個<font color='red'>in</font>模式參數(shù)的存儲過程
? ```MySQL
? -- 用于向b_user插入2條數(shù)據(jù),性別由客戶輸入
? delimiter $
? create procedure pro_insert2(in name varchar(10),in sex char(1))
? begin
? insert into b_user(name,sex) values(name,sex);
? insert into b_user(name,sex) values(name,sex);
? end;$
? call pro_insert2('name','男');
? ```
- 帶<font color='red'>in,out</font>參數(shù)的存儲過程
? ```MySQL
? -- 判斷用戶登錄,如果用戶名和密碼輸入正確登錄成功,否則登錄失敗
? -- 根據(jù)輸入的用戶名和密碼作為條件b_user表中查詢,如果查詢總行數(shù)==1,則認為登錄成功,讓resukt返回登錄成功;否則登錄失敗
? delimiter $
? create procedure pro_login(in name varchar(20),in pwd varchar(10,out result varchar(20)))
? begin
? declare total int default 0; -- 用于存放查詢總行數(shù)
? select count(*) from b_user u where u.name= name and u.pwd= pwd; -- 將查詢結果賦值給total局部變量
? set result:= if(total=1,'登錄成功','登錄失敗');
? end;$
? -- 存儲過程如何執(zhí)行
? -- 解決判斷,使用自定義變量
? set @result:='';
? call pro_login('李四','123',@result);
? select @result;
? ```
- 刪除存儲過程
? ```MySQL
? drop procedure 存儲過程名稱
? ```
- 查看存儲過程
? ```MySQL
? show create procedure 存儲過程名稱;
? ```
- 修改存儲過程
? ```MySQL
? drop
? create
? ```
#### 流程控制語句
- <font color='red'>if</font>函數(shù)結構
? ```cpp
? /*
? if 邏輯表達式 then 語句1;
? elseif 邏輯表達式2 then 語句2;
? …………
? else 語句n;
? end if;
? */
? ```
- <font color='red'>case</font>結構
? 等值選擇
? ```MySQL
? case 字段|變量|表達式
? when 值 then 值|語句
? when 值 then 值
? …………
? else 值
? end
? ```
? 不等值選擇
? ```MySQL
? case
? when 邏輯表達式 then 語句1
? ……
? else 語句n
? end
? ```
- <font color='red'>循環(huán)結構</font>
? while
? ```mysql
? /*
? while 邏輯表達式 do
? 循環(huán)體
? end while;
? */
? -- 需求:創(chuàng)建存儲過程,輸入一個值,返回1到該值的和
? delimiter $
? create procedure pro_sum(in input int,out total int)
? begin
? declare i int default 1;
? declare sum_ int default 0;
? while i<=input do
? set sum_=sum_+i;
? set i=i+1;
? end while;
? set total:=sum_;
? end;$
? set @result:=0;
? call pro_sum(10,@result);
? select @result;
? ```
- repeat
? ```mysql
? repeat
? 循環(huán)體
? until 邏輯表達式 -- 當滿足邏輯表達式,跳出循環(huán)
? end repeat;
? delimiter $
? create procedure pro_sum_loop(in input int,out total int)
? begin
? declare i int default 1;
? declare sum_ int default 0;
? repeat
? set sum_:=sum_+i;
? set i:=i+1;
? until i>input
? end REPEAT;
? set total:=sum_;
? end;$
? set @result:=0;
? call pro_sum(10,@result);
? select @result;
? ```
### 3、存儲函數(shù)
##### 1. 存儲函數(shù):
- 函數(shù)(Function)為一命名的存儲程序,可帶參數(shù),并返回一計算值.
- 函數(shù)和過程的結構類似,但必須有一個return子句,用于返回函數(shù)值.
##### 2. 創(chuàng)建存儲函數(shù)的語法:
```kotlin
create [or replace] function 函數(shù)名(參數(shù)列表)
return 函數(shù)值類型
as
PLSQL子程序體;
```
<font color='red'>注意事項:</font>
- (1) 與存儲過程注意事項類似,不同的是,**必須有個返回值**;
- (2) 參數(shù)列表可以有,也可以沒有.當沒有時,函數(shù)名后面不要帶括號.
```rust
create or replace function queryempannal(pempno in number)
return number
as
? psal emp.sal%type;
? pcomm emp.comm%type;
begin
? select sal,comm into psal,pcomm from emp where empno=pempno;
? return psal*12+nvl(pcomm,0);
end;
```
刪除函數(shù):
```MySQL
drop function 函數(shù)名;
```
### 4、定時任務
#### 查看任務是否開啟
```MySQL
show variables like '%event_sche%';
```
開啟定時策略
```MySQL
set global event_scheduler=1;
```
#### 創(chuàng)建定時任務
```MySQL
create event run_event
on schedule every 1 minute
on completion preserve disable
do call test_procedure ();
```
- create event day_event:是創(chuàng)建名為run_event的事件
- 創(chuàng)建周期定時的規(guī)則,意思是每分鐘執(zhí)行一次
- on completion preserve disable是表示創(chuàng)建后并不開始生效。
- do call test_procedure ()是該event(事件)的操作內(nèi)容
#### 定時任務操作
查看
```MySQL
SELECT event_name,event_definition,interval_value,interval_field,status
FROM information_schema.EVENTS;
```
開啟或關閉
```MySQL
alter event run_event on completion preserve enable;//開啟定時任務
alter event run_event on completion preserve disable;//關閉定時任務
```
#### 定時規(guī)則
周期執(zhí)行–關鍵字 EVERY
單位有:<font color='red'>second、minute、hour、day、week(周)、quarter(季度)、month、year</font>
```MySQL
on schedule every 1 week //每周執(zhí)行1次
```