MySQL技术内幕——视图和存储程序
视图和存储程序
- 存储程序
是存储函数,存储过程,触发器和事件的总称。 - 存储例程
特指存储函数,存储过程。
使用视图
视图是一个虚表,它是在表或其他视图的基础上,使用 SELECT 语句来定义的。
查询视图就等效于查询定义它的那条语句,只是视图将细节隐藏了起来。
视图定义里可以包含表达式计算和连接等操作,因此查询视图更易于编写出简单的用于获得所要信息的查询。
一个基本的视图可以只选择表的部分列。
定义一个视图,让它只检索想要的那些列:
CREATE VIEW vpres AS
SELECT last_name, first_name, city, state FROM president;
在视图里也可以使用 SELECT * ,并且只会获得在视图定义里通过名字指定的那些列:
SELECT * FROM vpres;
视图是逻辑语句,逻辑语句的执行结果是一个表。
定义视图后,直接通过引用视图对象即可获得视图关联逻辑语句执行结果。
创建视图时,需拥有对于视图的CREATE VIEW权限,拥有对SELECT语句所选列的操作权限。
及拥有对该语句里其他地方所引用的所有列的SELECT权限。
使用视图时,只能引用视图结果表中存在的列。
定义视图时,显式指定结果表列名。
CREATE VIEW vpres2(ln, fn) AS
SELECT last_name, first_name FROM president;
使用存储程序
存储程序是存储函数,存储过程,触发器和事件的统称。
复合语句和语句分隔符
复合语句由一个BEGIN和END块构成,其间可以包含任意数量的语句。
对于匿名用户,则以“delimiter ”代替。
CREATE PROCEDURE greetings()
BEGIN
DECLARE user CHAR(77) CHARACTER SET utf8;
SET user = (SELECT CURRENT_USER());
IF INSTR(user, '@') > 0 THEN
SET user = SUBSTRING_INDEX(user, '@', 1);
END IF;
IF user = ' ' THEN # 匿名用户
SET user = 'earthling';
END IF;
SELECT CONCAT('Greetings, ', user, '!') AS greeting;
END