数据库 视图 函数 存储过程

说明:都类似于java中的方法,将一组完成特定功能的逻辑语句包装起来,对外暴露名字。
好处:
1、提高重用性
2、sql语句简单
3、减少了和数据库服务器连接的次数,提高了效率

一、视图

定义:

视图其实就是一条查询sql语句,用于显示一个或多个表或其他视图中的相关数据。视图将一个查询的结果作为一个表来使用,因此视图可以被看作是存储的查询或一个虚拟表。视图并不在数据库中存储数据值,数据库中只在数据字典中存储对视图的定义。视图来源于表,所有对视图数据的修改最终都会被反映到视图的基表中,这些修改必须服从基表的完整性约束,并同样会触发定义在基表上的触发器。(Oracle支持在视图上显式的定义触发器和定义一些逻辑约束) mysql5.1版本出现的新特性,本身是一个虚拟表,它的数据来自于表,通过执行时动态生成。

作用:

用户可以通过视图以不同形式来显示基表中的数据,视图的强大之处在于它能够根据不同用户的需要来对基表中的数据进行整理。视图常见的用途如下: 
①通过视图可以设定允许用户访问的列和数据行,从而为表提供了额外的安全控制。
②隐藏数据复杂性 。
③视图中可以使用连接(join),用多个表中相关的列构成一个新的数据集。此视图就对用户隐藏了数据来源于多个表的事实。 

好处:
1、简化sql语句
2、提高了sql的重用性
3、保护基表的数据,提高了安全性

1、创建视图:

create view vi_视图名
AS
查询语句;        

2、修改视图:

方式一:

create or replace view vi_视图名
AS
查询语句;        

方式二:

alter view vi_视图名
AS
查询语句;        

3、删除视图:

drop view vi_视图名1,vi_视图名2,...;        

4、查看

desc vi_视图名;
show create view vi_视图名;        

5、使用
1).插入
insert
2).修改
update
3).删除
delete
4).查看
select
注意:视图一般用于查询的,而不是更新的,所以具备以下特点的视图都不允许更新
①包含分组函数、group by、distinct、having、union、
②join
③常量视图
④where后的子查询用到了from中的表
⑤用到了不可更新的视图

6、视图和表的对比

数据库 视图 函数 存储过程_第1张图片

二、存储过程

1、创建 

create procedure 存储过程名(参数模式in|out|inout 参数名 参数类型)
begin
        存储过程体
end        

注意:

1. 参数模式:in、out、inout,其中in可以省略。 

1). 无返回无参。   

2). in:该参数只能作为输入(该参数不能做返回值),无返回有参。

3). out:该参数只能作为输出(该参数只能做返回值),有返回无参。

4). 既带in又带out,有返回有参。

5). inout:既能做输入又能做输出,有返回有参。

2. 需要设置新的结束标记:delimiter 结束定界符

例:

DELIMITER $
USE 库名 $
-- 如果存在存储过程名删除此存储过程
DROP PROCEDURE IF EXISTS 存储过程名 $
CREATE PROCEDURE 存储过程名(IN|OUT|INOUT 参数名  参数类型,...)
BEGIN
	sql语句1;
	sql语句2;
END $
-- 即为换回分号';'
DELIMITER ;        

3. 存储过程体中可以有多条sql语句,如果仅仅一条sql语句,则可以省略begin。

4. 存储过程体的每一条sql语句都需要用分号结尾。

2、调用

call 存储过程名(实参列表);        

举例:
调用in模式的参数:call sp1(‘值’);
调用out模式的参数:set @name; call sp1(@name);select @name;
调用inout模式的参数:set @name=值; call sp1(@name); select @name;
3、查看

show create procedure 存储过程名;        

4、删除

drop procedure 存储过程名;        

 

三、函数

1、创建

create function 函数名(参数名 参数类型) returns  返回类型
begin
    函数体;
    return ;
end        

注意:下面示例中 return 与 returns ,区别是returns子句指定该函数返回值的数据类型,return用于返回具体的值/值变量。

例1:不带参数的自定义函数

DELIMITER $
USE 库名 $
-- 如果存在函数名dayTime则删除此函数
DROP FUNCTION IF EXISTS dayTime $
CREATE FUNCTION dayTime () RETURNS VARCHAR (30) 
RETURN DATE_FORMAT(NOW(),'%Y年%m月%d日 %H点:%i分:%s秒') $
-- 即为换回分号';'
DELIMITER ;

 调用:SELECT dayTime ();

 例2:带参数的自定义函数

DELIMITER $
USE 库名 $
-- 如果存在函数名getEvaluation则删除此函数
DROP FUNCTION IF EXISTS getEvaluation $
CREATE FUNCTION getEvaluation (num1 SMALLINT UNSIGNED,num2 SMALLINT UNSIGNED) 
RETURNS FLOAT(10, 2) UNSIGNED 
RETURN (num1 + num2) / 2 $
-- 即为换回分号';'
DELIMITER ;        

 调用:SELECT getEvaluation(6,8);

 例3:具有复合结构函数体的自定义函数

(无参有返回)案例:返回公司的员工个数。

DELIMITER $
USE 库名 $
-- 如果存在函数名getUserNum则删除此函数
DROP FUNCTION IF EXISTS getUserNum $
CREATE FUNCTION getUserNum() RETURNS INT
BEGIN
	DECLARE num INT DEFAULT 0; -- 定义局部变量
	SELECT COUNT(*) INTO num FROM user_info; -- INTO num赋值
	RETURN num;
END $
-- 即为换回分号';'
DELIMITER ;         

  调用:SELECT getUserNum();

(有参有返回)#案例:根据员工名,返回它的工资。

DELIMITER $
USE 库名 $
-- 如果存在函数名getEmpNameSal则删除此函数
DROP FUNCTION IF EXISTS getEmpNameSal $
CREATE FUNCTION getEmpNameSal(empName VARCHAR(20)) RETURNS DOUBLE
BEGIN
	SET @sal=0;-- 定义用户变量 
	SELECT salary INTO @sal FROM employees WHERE last_name = empName;-- INTO @sal赋值
	RETURN @sal;
END $
-- 即为换回分号';'
DELIMITER ;         

  调用:SELECT getEmpNameSal('bob');

2、调用

select 函数名(实参列表);        

3、查看

show create function 函数名;        

4、删除

drop function 函数名;        

转载请注明出处:BestEternity亲笔。

你可能感兴趣的:(数据库)