视图概念

视图存储查询语句,当调用的时候,产生结果集,视图充当的是虚拟表的角色。其实视图可以理解为从一个表或多个表中导出来的表,作用和真实表一样,包含一系列带有行和列的数据 . 视图中,用户可以使用SELECT语句查询数据,也可以使用INSERT,UPDATE,DELETE修改记录,视图可以使用户操作方便,并保障数据库系统安全,如果原表改名或者删除则视图也失效。

视图操作

  • 创建视图
语法结构:

CREATE [OR REPLACE] VIEW [view_name] AS [SELECT_STATEMENT];

释义:

CREATE VIEW: 创建视图
OR REPLACE : 可选,如果添加原来有同名视图的情况下会覆盖掉原有视图
view_name : 视图名称
SELECT_STATEMENT :SELECT语句

e.g.
create view  c1 as select name,age from class_1;
  • 视图表的增删改查操作
    视图的增删改查操作与一般表的操作相同,使用insert update delete select即可,但是原数据表的约束条件仍然对视图产生作用。
  • 删除视图
    drop view [IF EXISTS] 视图名;
    IF EXISTS 表示如果存在,这样即使没有指定视图也不会报错。
drop view c1;
  • 修改视图
    参考创建视图,将create关键字改为alter
alter view  c1 as select name,age,score from class_1;

视图作用

  • 作用
  1. 是对数据的一种重构,不影响原数据表的使用。
  2. 简化高频复杂操作的过程,就像一种对复杂操作的封装
  3. 提高安全性,可以给不同用户提供不同的视图
  4. 让数据更加清晰
  • 缺点
  1. 视图的性能相对较差,从数据库视图查询数据可能会很慢
  2. 表依赖关系处理麻烦,根据数据库的基础表创建一个视图。每当更改视图或者原表时,另一个也会修改。

函数和存储过程

存储过程和函数是事先经过编译并存储在数据库中的一段sql语句集合,调用存储过程和函数可以简化应用开发工作,提高数据处理的效率。

函数创建

delimiter 自定义符号  -- 如果函数体只有一条语句, begin和end可以省略, 同时delimiter也可以省略

  create function 函数名(形参列表) returns 返回类型  -- 注意是retruns

  begin

    函数体    -- 函数语句集,set @a 定义变量

    return val

  end  自定义符号

delimiter ;

释义:
delimiter 自定义符号 是为了在函数内些语句方便,制定除了;之外的符号作为函数书写**结束标志**,一般用$$或者//
形参列表 : 形参名 类型   类型为mysql支持类型
返回类型:  函数返回的数据类型,mysql支持类型即可
函数体: 若干sql语句组成,如果只有一条语句也可以不写delimiter和begin,end
return: 返回指定类型返回值
e.g. 无参数的函数调用
delimiter $$
create function st() returns int 
begin 
return (select score from class_1 order by score desc limit 1); 
end $$
delimiter ;

select st();
e.g. 含有参数的函数调用
delimiter $$
create function queryNameById(uid int(10)) 
returns varchar(20)
begin
return  (select name from class_1 where id=uid);
end $$
delimiter ;

select queryNameById(1);

存储过程创建

创建存储过程语法与创建函数基本相同,但是没有返回值。

delimiter 自定义符号 

  create procedure 存储过程名(形参列表)

  begin

    存储过程    -- 存储过程语句集,set @a 定义变量

  end  自定义符号

delimiter ;

释义:
delimiter 自定义符号 是为了在函数内些语句方便,制定除了;之外的符号作为函数书写结束标志
形参列表 :[ IN | OUT | INOUT ] 形参名 类型
          in 输入,out  输出,inout 可以输入也可以输出
存储过程: 若干sql语句组成,如果只有一条语句也可以不写delimiter和begin,end
e.g. 存储过程创建和调用
delimiter $$
create procedure st() 
begin 
    select name,age from class_1; 
    select name,score from class_1 order by score desc; 
end $$
delimiter ;

call st();
  • 存储过程三个参数的区别
  • IN 类型参数可以接收变量也可以接收常量,传入的参数在存储过程内部使用即可,但是在存储过程内部的修改无法传递到外部
  • OUT 类型参数只能接收一个变量,接收的变量不能够在存储过程内部使用(内部为NULL),但是可以在存储过程内对这个变量进行修改。因为定义的变量是全局的,所以外部可以获取这个修改后的值。
  • INOUT类型参数同样只能接收一个变量,但是这个变量可以在存储过程内部使用。在存储过程内部的修改也会传递到外部。
  • 设置变量方法: set @[变量名] = 值; 表示这是一个用户变量,使用时用@[变量名]。 在函数内部设置declare [变量名] [变量类型]为局部变量,局部变量可以使用set赋值或者着使用into关键字。
e.g. : 分别将参数类型改为IN OUT INOUT 看一下结果区别
delimiter $$
create procedure p_out ( OUT num int )
begin
    select num;
    set num=100;
    select num;
end $$

delimiter ;

set @num=10;
call p_out(@num)

存储过程和存储函数操作

  1. 调用存储过程

语法:

call 存储过程名字([存储过程的参数[,……]])
  1. 调用存储函数

语法:

select 存储函数名字([存储过程的参数[,……]])
  1. 使用show status语句查看存储过程和函数的信息

语法:

show {procedure|function} status [like’存储过程或存储函数的名称’]

显示内容:数据库、名字、类型、创建者、创建和修改日期

  1. 使用show create语句查看存储过程和函数的定义

语法:

show create  {procedure|function}  存储过程或存储函数的名称
  1. 删除存储过程或存储函数

语法:

DROP {PROCEDURE | FUNCTION} [IF EXISTS] sp_name

函数和存储过程区别

  1. 函数有且只有一个返回值,而存储过程不能有返回值。
  2. 函数只能有输入参数,而存储过程可以有in,out,inout多个类型参数。
  3. 存储过程中的语句功能更丰富,实现更复杂的业务逻辑,可以理解为一个按照预定步骤调用的执行过程,而函数中不能展示查询结果集语句,只是完成查询的工作后返回一个结果,功能针对性比较强。
  4. 存储过程一般是作为一个独立的部分来执行(call调用)。而函数可以作为查询语句的一个部分来调用。