工作了半年从没有用过视图,但可能只是工作关系吧!怎么都要学习一下
- 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';
上面是根据名字获取的,下面的是全部的