MySQL day5学习 视图与存储过程

工作了半年从没有用过视图,但可能只是工作关系吧!怎么都要学习一下

  • 1 -为什么要用视图?视图是什么?

视图本身其实不存储数据,视图只是用来查看存储在别处的数据的一种设施,它返回的数据是从其他的表中检索出来的,再添加或者更改相关表的数据时,视图将返回改变后的数据。


  • 2-视图规则

视图名字必须为一,视图可以用ORDER BY但是如果查询数据时也有order by 视图中的数据将被覆盖,视图不能被索引,也不能有触发器或者默认值,但是视图可以和表一起使用。


  • 3 视图操作

create view 创建视图
show create view 视图名字
drop view 视图名字
更新视图时可以先用drop 再用create 也可以直接用create or update


  • 4- 使用试图
//单独创建
CREATE   VIEW  myview2 AS
SELECT a.advertiser_name ,g.agency_name  
from admin_advertiser a ,admin_agency g
      where a.agency_id = g.id

//创建或者更新
CREATE OR REPLACE VIEW  myview2 AS
SELECT a.advertiser_name ,g.agency_name  
from admin_advertiser a ,admin_agency g
      where a.agency_id = g.id
利用视图检索数据
SELECT * from myview2 where advertiser_name IS NOT NULL
  • 更新视图规则

通常有分组包括GROUP BY 和Having
联结
子查询

聚焦函数(Min()、Count()、Sum() 等)
DISTINCT去重
到处(计算)列

存储过程

  • 1-什么时存储过程

简单来说就是为了以后的使用而保存的一条或者多条SQL的集合,可以将其视为批文件,但是不仅限于批文件。

  • 2-为什么要用存储过程

简化操作、保证数据的完整性、简化变动的管理、提高性能。简单来说,简单、安全、高性能

  • 3-创建存储过程
CREATE PROCEDURE  myhh()
BEGIN
    SELECT  AVG(account) AS acc 
    FROM admin_advertiser ;
END ;
  • 4-存储过程分隔符
    默认的是 ;但是如果命令行实用程序要解释存储过程自身内的 ;字符,则他们会最终不会成为存储过程的成分,这回事存储过程的sql出现错误。
    解决办法是临时更改命令实用程序的语句分隔符,除了\之外都可以作为语句分隔符,如下

DELIMITER //
CREATE PROCEDURE  myhh2()
BEGIN
    SELECT  AVG(account) AS acc 
    FROM admin_advertiser ;
END //

DELIMITER ;
  • 5- 操作存储过程
    1.调用存储过程,花括号有
call myhh2();

2.删除存储过程,没有括号

drop PROCEDURE myhh2 ;

3.删除存储过程如果不存在的话会出现错误,可以判断有一下是否存在

drop PROCEDURE IF EXISTS  myhh2 ;
  • 6- 只带输出参数OUT 的存储过程

6.1.1 都是输出的参数

CREATE PROCEDURE can1(
out p1 DECIMAL( 8,2) ,
out p2 DECIMAL( 8,2) ,
out p3 DECIMAL( 8,2) 
)
BEGIN
     SELECT   max(account) into p1 FROM admin_advertiser ;
     SELECT   min(account)         FROM admin_advertiser  into p2 ;
     SELECT   avg(account) into p3 FROM admin_advertiser ;
END;

6.1.2 调用带参数的存储过程。参数必须以@开始

CALL can1(@priceMax ,@priceMin ,@priceAvg);

6.1.3 检索数据

SELECT @priceMax ;
SELECT @priceMax ,@priceMin ,@priceAvg ;

6.2.1 参数中有OUT 和IN 的存储过程

CREATE PROCEDURE can2(
in yourId int ,
out zhi DECIMAL( 8,2) 

)
BEGIN
     SELECT (account) into zhi FROM admin_advertiser  where id =yourId ;
END;

6.2.2调用带IN 和OUT 参数的存储过程

CALL can2 (1 ,@total) ;

6.2.3检索数据

select @total ;
  • 7- 智能存储过程

7.1.1 创建只能存储过程

CREATE    PROCEDURE zhi2(
in  ae INTEGER ,
in  xu  boolean ,
out totalAccount decimal(8 ,2 )
)COMMENT '这里是hcg'
BEGIN 
    DECLARE total decimal(8,2) ;
    declare varNum int default 4 ;

    SELECT a.account  into total  from admin_advertiser a
           where a.id = ae  ;
    IF xu THEN
           SELECT  total+(total*varNum) into total ;
    end if ;
    SELECT total into totalAccount ;
END ;



上面的语句里面,里面有几点新东西
IN 和OUT里面的最好不要用大写字母,楼主就一直出问题不因为有了大写字母
-1.DECLARE 定义了两个局部变量 ,同样要求有数据类型和变量名
如果是常量应该指定默认值
-2. IF 语句检查是否为真,Boolean指定1为真,0为假
另外还支持 ELSEIF THEN 和 ELSE 子句
3. COMMENT 不是必须的,但是如果给出,将在show PROCEDURE STATUS ;中展示出来


7.1.2调用只能存储过程

call zhi2(1,1,@ads);

7.1.3检索数据

SELECT @ads;

  • 8- 检查存储过程

用来显示一个存储过程的CREATE语句

show create procedure zhi2 ;

为了获取更详细的信息可以用

//获取全部存储过程
show PROCEDURE STATUS  ;
//根据名字获取
show PROCEDURE STATUS like 'zhi2';

第一个
上面是根据名字获取的,下面的是全部的
第二个

猜你喜欢

转载自blog.csdn.net/qq_39455116/article/details/81087612