declare 游標名 cursor for select_statement
復制代碼
打開游標
open 游標名
復制代碼
從游標中取值,使用 fetch 進行取值,語法如下:
fetch 游標名 into var1,var2,……
復制代碼
利用fetch將取到的一條記錄中的字段賦值給多個變量。
關閉游標
close 游標名
復制代碼
觸發(fā)器()
是一種特殊的存儲過程,它在插入、修改或刪除表中的數(shù)據(jù)時觸發(fā)執(zhí)行,擁有更精細、更復雜的數(shù)據(jù)控制能力。MySQL 從 5.0 版本開始支持觸發(fā)器。
舉個例子,現(xiàn)有用戶表和日志表。當一個用戶被創(chuàng)建時,我們用日志來記錄用戶的創(chuàng)建過程。如果不使用觸發(fā)器,則需要手動編寫程序來實現(xiàn);而一旦使用觸發(fā)器,我們可以在信息插入用戶表后,立刻觸發(fā)對日志表的操作,使其記錄創(chuàng)建用戶的信息。
創(chuàng)建和刪除觸發(fā)器
創(chuàng)建觸發(fā)器的語法如下:
CREATE TRIGGER trigger_name trigger_time trigger_event
ON table_name
FOR EACH ROW
trigger_statement;
復制代碼
參數(shù)解釋:
查看觸發(fā)器
使用SHOW ;命令查看所有觸發(fā)器,因為觸發(fā)器有自己的保存機制,顯示出來的信息量比較大
刪除觸發(fā)器使用的語法如下:
DROP TRIGGER 觸發(fā)器名;
復制代碼
視圖
視圖是從一個或多個表中糅合出來的虛擬表。一個視圖并不包含真實的數(shù)據(jù),它提供了另一個視角去查看或改變表中的數(shù)據(jù)。
打個比喻:把視圖想象成一扇窗戶,通過窗戶往里看,我們只能看到一部分,而這部分就是數(shù)據(jù)庫系統(tǒng)允許你看到的數(shù)據(jù)。而不允許你看到的內容會被遮擋住,讓你不可見。
使用視圖可以提高我們對數(shù)據(jù)的操作效率,同時增加安全性:
總之,使用視圖的主要作用就是保障數(shù)據(jù)的安全性,同時提高查詢效率。
創(chuàng)建視圖
創(chuàng)建視圖使用的語句是 VIEW,完整語法看上去比較復雜,大家可以到官網上去查看。
CREATE VIEW viewname[column1, ……, columnn]
AS
SELECT 語句;
復制代碼
查詢視圖
視圖是一種虛擬的表,也符合 DQL 操作,視圖的查詢和表的查詢相同,查看 視圖中的所有數(shù)據(jù),其 SQL 語句如下:
SELECT * FROM city_view;
復制代碼
刪除視圖
使用 FROM子句可以刪除視圖,其語法如下:
DELETE FROM 視圖名 [WHERE子句];
復制代碼
更新視圖數(shù)據(jù)
把 id 為 2 的城市人口更新為 。其 SQL 語句如下:
UPDATE city_view SET population = 100000 WHERE id = 2;
復制代碼
查看視圖和基表,結果如下:
SELECT * FROM city_view WHERE id = 2;
復制代碼
查看基表數(shù)據(jù)如下:
SELECT * FROM city WHERE id = 2;
復制代碼
插入視圖數(shù)據(jù)
給視圖插入數(shù)據(jù)和表插入數(shù)據(jù)一樣,使用 INTO語句,我們在視圖中插入一條 id 為 4080,名字為test,人口數(shù)量為 500 的記錄,其 SQL 語句如下:
INSERT INTO city_view VALUES(4080, 'test', 500);
復制代碼
序列
前面我們在介紹主鍵的時候知道,主鍵必須是唯一的。為了方便管理主鍵同時滿足主鍵唯一性要求,我們把主鍵設置為自增長。實現(xiàn)自增長需要用到序列。
序列就是一組有特定變化規(guī)律的整數(shù),其最主要的用途就是創(chuàng)建主鍵,確保主鍵的唯一性。序列是一個數(shù)據(jù)庫對象,獨立于表進行存儲,可以為多個表使用。
目前 MySQL 是不支持類似建表或視圖的方式來直接創(chuàng)建序列對象( 支持)。雖然有來實現(xiàn)自增長,但不能設置步長、起始值、是否循環(huán)等。最重要的是,在 MySQL 中一張表只能有一個字段設置為自增長,如果我們需要兩個或以上的字段實現(xiàn)自增長該怎么辦呢? 需要做一些間接處理。
新建表時設置起始值
下面我們在 demo 數(shù)據(jù)庫下新創(chuàng)建一個表 demo2:
CREATE TABLE demo2 (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(30) NOT NULL
)AUTO_INCREMENT=1000;
復制代碼
插入新的值:
INSERT INTO demo2(name) VALUES('小明');
SELECT * FROM demo2;
復制代碼
可以看到起始值為 1000。
創(chuàng)建表后設置起始值
修改 demo2 表的起始值為 1500:
ALTER TABLE demo2 AUTO_INCREMENT = 1500;
復制代碼
這時如果再插入新值:
INSERT INTO demo2(name) VALUES('小紅');
SELECT * FROM demo2;
復制代碼
可以看到新的 id 起始值已經變?yōu)?1500 了使用屬性時我們需要注意:
列具有以下屬性:
所有數(shù)據(jù)操作可簡單分為讀操作(獲取數(shù)據(jù))和寫操作(插入數(shù)據(jù)、修改數(shù)據(jù)、刪除數(shù)據(jù))。一般情況下,讀寫比例在 10:1 左右,大量的讀操作給數(shù)據(jù)庫性能帶來不小的考驗。因此,對查詢語句的優(yōu)化是重中之重,優(yōu)化的關鍵就是利用好索引。
索引在 MySQL 中又叫作鍵存儲過程中創(chuàng)建視圖,英文名key,是存儲引擎用于快速找到記錄的一種數(shù)據(jù)結構。索引對于性能的提升非常關鍵,尤其是當表中的數(shù)據(jù)量越來越龐大的時候。我們前面介紹約束使用到的 key,其實就是一種索引,叫做主鍵索引。
舉個簡單的例子:我們把數(shù)據(jù)庫比作漢語字典,那么索引就是這本字典的音序表,通過音序表可以快速查找到需要的漢字。索引的目的就是為了提高查詢效率。在 MySQL 中常用的索引可以分為三類,分別是:普通索引、唯一索引、聯(lián)合索引。
普通索引
普通索引使用關鍵字 INDEX 定義,根據(jù)建立索引的時機不同存儲過程中創(chuàng)建視圖,書寫方式有細微差別。分為以下 3 種情況:
唯一索引
唯一索引不僅加速查找,還具有約束性。
聯(lián)合索引
聯(lián)合索引即為索引同時設置多個字段。
INDEX 索引名(字段名)
復制代碼
給已經存在的表中某字段添加索引,其語法如下:
CREATE INDEX 索引名 ON 表名(字段名);
復制代碼
修改表時創(chuàng)建索引,其語法如下:
ALTER TABLE 表名 ADD INDEX 索引名(字段名)
復制代碼
查看索引,借助表信息查看表中是否存在索引,其語法如下:
SHOW CREATE TABLE 表名;
復制代碼
查看 表中的索引,其 SQL 語句如下:
SHOW CREATE TABLE teacher;
復制代碼
刪除索引,使用的關鍵字是DROP INDEX … on …,其語法如下:
DROP INDEX 索引名 ON 表名;
復制代碼