首页 > 代码库 > MySQL视图和自定义函数

MySQL视图和自定义函数

>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
视图是指从一个或者多个表中导出来的数据,是一种虚拟存在的表。视图就像一个窗口,通过这个窗口可以看到系统专门提供的数据,这样用户就可以不用看到整个数据而只关心对自己有用的数据。
数据库中只存放了视图的定义,而没有存放视图中的数据,这些数据存放在原来的表中。
使用视图查询数据时,数据库会从原来的表中取出对应的数据。
视图中的数据依赖于原来表中的数据,一旦表中的数据发生改变,显示在视图中的数据也会随之发生改变。

视图的作用:保障数据的安全,提高查询效率

创建视图

CREATE VIEW message AS
SELECT e.name,e.age,d.dept_name,e.married,e.gender FROM dept d JOIN employee e WHERE e.dept_id = d.dept_id;

修改视图
ALTER VIEW message AS
SELECT e.name,e.age,d.dept_name FROM dept d JOIN employee e WHERE e.dept_id = d.dept_id;

CREATE OR REPLACE VIEW message AS
SELECT e.name,e.age,d.dept_name,e.married,e.gender FROM dept d JOIN employee e WNERE e.dept_id = d.dept_id;

修改视图数据
INSERT INTO message values();
注:修改视图中的数据时,基本都是转换到基本表来更新(视图是一个虚拟表,其中没有数据)
虽然可以修改,但是有很多限制
一般情况下,最好将视图作为查询数据的虚拟表,而不要通过视图来更新数据。

删除视图
删除视图是指只会删除数据库中已经存在的视图,只删除视图的定义,不会删除表中的数据
DROP VIEW message;
或者判断视图是否存在并删除
DROP VIEW if exists message;

使用视图
SELECT * FROM message;

查看视图结构信息
DESCRIBE|DESC message;
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
自定义函数(user-defined function UDF)是对MySQL功能的一个扩展

创建函数

函数体中可以使用复合结构、流程控制、SQL语句、变量定义等语法
使用SQL语句:
【例】
DELIMITER //
CREATE FUNCTION getStudent(sid INT)
RETURNS varchar(100)
BEGIN
RETURN (SELECT CONCAT(‘name:‘, name, ‘,score:‘,score) FROM student WHERE id = sid);
END //
DELIMITER ;
流程控制语句语法:
1.IF语句

search_condition参数表示条件判断语句
statement_list参数表示不同条件的执行语句

【例】
DELIMITER //
CREATE FUNCTION getLevel(userid INT)
RETURNS varchar(100)
BEGIN
DECLARE sscore INT;
DECLARE level TEXT DEFAULT ‘‘;
SELECT score FROM student WHERE id = userid INTO sscore;
IF sscore<60 THEN SET level = ‘不及格‘;
ELSEIF sscore>=60 THEN SET level = ‘及格‘;
END IF;
RETURN CONCAT(sscore,‘:‘,level);
END //
DELIMITER ;

2.CASE语句

case_value : 条件判断的变量
when_value : 变量的取值
statement_list : 不同when_value值得执行语句

search_condition : 条件判断语句
statement_list : 不同条件的执行语句

【例】
DELIMITER //
CREATE FUNCTION getLevel2(userid INT)
RETURNS varchar(100)
BEGIN
DECLARE sscore INT;
DECLARE level TEXT DEFAULT ‘‘;
SELECT score FROM student WHERE id = userid INTO sscore;
CASE
WHEN sscore>80 THEN SET level=‘优秀‘;
WHEN sscore>60 THEN SET level=‘良好‘;
ELSE SET level=‘不及格‘;
END CASE;
RETURN CONCAT(sscore,‘:‘,level);
END //
DELIMITER ;

3.LOOP语句
本身没有停止循环的语句
【例】
DELIMITER //
CREATE FUNCTION testLoop()
RETURNS INT
BEGIN
DECLARE count INT DEFAULT 0;
DECLARE sid INT DEFAULT 1;
addcount:LOOP
SET count = count + (SELECT score FROM student WHERE id = sid);
SET sid = sid + 1;
IF sid > 3 THEN LEAVE addcount;
END IF;
END LOOP addcount;
RETURN count;
END //
DELIMITER ;

4.LEAVE语句
用于跳出循环
LEAVE label
5.ITERATE语句
跳出当前循环,进入下一次循环
ITERATE label
6.REPEAT语句
有条件控制的循环语句,当满足条件时,跳出循环

【例】
DELIMITER //
CREATE FUNCTION testRepeat()
RETURNS INT
BEGIN
DECLARE count INT DEFAULT 0;
DECLARE sid INT DEFAULT 1;
REPEAT
SET count = count + (SELECT score FROM student WHERE id = sid);
SET sid = sid + 1;
UNTIL sid = 4
END REPEAT;
RETURN count;
END //
DELIMITER ;

7.WHILE语句
有条件控制的循环语句,当满足条件时,执行循环内的语句

【例】
DELIMITER //
CREATE FUNCTION testWhile()
RETURNS INT
BEGIN
DECLARE count INT DEFAULT 0;
DECLARE sid INT DEFAULT 1;
WHILE sid <= 3 DO
SET count = count + (SELECT score FROM student WHERE id = sid);
SET sid = sid + 1;
END WHILE;
RETURN count;
END //
DELIMITER ;
使用函数
SELECT getLevel(2);

删除函数
DROP FUNCTION getLevel;

【注意】
由于在BEGIN...END语句块中包含需要使用;结尾的语句,因此需要修改结束标识
DELIMITER // 修改默认的结束符";"为"//"
UDF可以没有参数,但是必须有且只有一个返回值
如果在函数体中包含多条语句,需要使用BEGIN...END语句块包含起来

 

MySQL视图和自定义函数