一、视图
概念:MySQL从5.0.1版本开始提供视图功能。一种虚拟存在的表,行和列的数据来自定义视图的查询中使用的表 ,并且是在使用视图时动态生成的,只保存了sql逻辑,不保存查询结果。
就类似于封装了一个sql语句,里面有具体的操作你只需要调用即可使用。
应用场景: 多个地方用到同样的查询结果、该查询结果使用的sql语句较复杂
创建视图:
create view 视图名称 as 查询语句;
使用视图:
select * from 视图名;
修改视图:
alter view 视图名称 as 查询语句
删除视图(可以一次删除多个视图):
drop view if exists 视图名称,视图名....;
查看视图:
DESC 视图名;
SHOW CREATE VIEW 视图名;
案例1:创建视图要求查询部门最高工资高于12000的部门信息
先创建视图后使用
CREATE VIEW testv1
AS
SELECT MAX(salary) mx,department_id
FROM employees
GROUP BY department_id
HAVING MAX(salary)>12000;
SELECT d.*,v1.mx
FROM departments d
JOIN testv1 v1
ON d.department_id = v1.department_id;
二、存储过程
概念:一组事先经过编译并存储在数据库中的一段SQL语句的集合,类似于Java里的方法,直接区调用。
使用好处: 1、简化应用开发人员的很多工作
2、减少数据在数据库和应用服务器之间的传输
3、提高了数据处理的效率
创建存储过程语法:
CREATE PROCEDURE 存储过程名(参数列表)
BEGIN
存储过程体(一组合法的SQL语句);
END
注意:参数列表包含三部分:参数模式、参数名、参数类型
举例:IN stuname varchar(20)
参数模式: IN:该参数可以作为输入,也就是该参数需要调用方法传入值
OUT:该参数可以作为输出,也就是该参数可以作为返回值
INOUT:该参数既可以作为输入也可以作为输出,也就是该参数既需要传入值,又可以返回值
如果存储过程体只有一句话,BEGIN END就可以省略
存储过程提中每条SQL语句都必须加分号
为了避免存储体中分号结束语句,我们使用分隔符DELIMITER告诉mysql解释器,该段命令是否已经结束了
例如:在存储过程上写上DELIMITER $ 知道遇到下一个$才会去执行。
调用语法:
CALL 存储过程名(实参列表);
案例1:求1-n的和
为了避免存储体中分号结束语句,我们使用分隔符DELIMITER告诉mysql解释器,该段命令是否已经结束了。
DELIMITER $
CREATE PROCEDURE SUM(IN n INT)
BEGIN
#定义total、num两个变量
DECLARE total INT DEFAULT 0;
DECLARE num INT DEFAULT 0;
WHILE num < n DO
SET num:=num+1;
SET total:=total+num;
END WHILE;
#输出total
SELECT total;
END$
调用
#求1~10的和
call p1(10)$
案例2:创建存储过程实现传入用户名和密码,插入到admin表中
DELIMITER $
CREATE PROCEDURE test_1(IN username VARCHAR(20),IN loginPwd VARCHAR(20))
BEGIN
INSERT INTO admin(admin.username,admin.password)
VALUES(username,loginPwd);
END$
调用
#向表中插入的用户名xyz,密码为zh
CALL test_1('xyz','zh')$
删除存储过程语法:
DROP PROCEDURE 存储过程名;
查看存储过程信息:
SHOW CREATE PROCEDURE 存储过程名;
三、函数
概念:一组事先经过编译并存储在数据库中的一段SQL语句的集合,类似于Java里的方法,直接区调用。
使用好处: 1、简化应用开发人员的很多工作
2、减少数据在数据库和应用服务器之间的传输
3、提高了数据处理的效率
特点:有且仅有1个返回,适合做处理数据后返回一个结果
创建语法:
CREATE FUNCTION 函数名(参数列表) RETURNS 返回类型
BEGIN
函数体
END
参数列表包含两部分:参数名、参数类型
函数体:肯定会有return 语句,如果没有会报错
也需要使用DELIMITER设置结束标记
案例1:返回公司员工个数
DELIMITER $
CREATE FUNCTION test1() RETURNS INT
BEGIN
#创建一个局部变量用于return返回
DECLARE total INT DEFAULT 0;
SELECT COUNT(*) INTO total
FROM employees;
RETURN total;
END $
案例1:根据员工名返回他的工资
DELIMITER $
CREATE FUNCTION test2(empName VARCHAR(20)) RETURNS DOUBLE
BEGIN
#定义用户变量用于返回
SET @sal = 0;
SELECT salary INTO @sal
FROM employees
WHERE last_name = empName;
RETURN sal;
END $
调用函数:
SELECT 函数名(参数列表)$
查看函数:
SHOW CREATE FUNCTION 函数名;
删除函数:
DROP FUNCTION 函数名;