MySQL 视图 存储过程
博文目录
视图是虚拟的表,与包含数据的表不一样,视图只包含使用时动态检索数据的查询,而自身不包含任何数据。
使用视图的好处
- 重用SQL语句
- 简化复杂的SQL操作
- 使用表的组成部分而不是整个表
- 保护数据。可以给用户赋予表的某个部分的访问权限,而不是整个表的访问权限
使用视图的规则
- 与表一样,视图必须唯一命名
- 在一个数据库中,可以创建的视图数目没有限制
- 视图可以嵌套,即利用从其他视图中查询出来的数据构建新的视图
- Order by可以用在视图中,但是如果从该视图检索数据的select中也包含order by,那么该视图中的order by将会被覆盖
- 视图不能索引,也不能有关联的触发器或默认值
- 视图和表可以一起使用,例如编写一条连接表和视图的查询
创建视图
create view v_customers as select customers.cust_name,customers.cust_id,count(orders.order_num) from customers left outer join orders on customers.cust_id=orders.cust_id group by customers.cust_id;
使用视图
select * from v_customers;
删除视图
select * from v_customers;
视图的更新
对视图进行insert update delete将影响其基表,因为视图不包含任何数据
不是所有视图都可以更新:
- 含有分组(group by和having)
- 联接查询
- 子查询
- 聚合函数
- DISTINCT
不是迫不得已,不要对视图进行更新操作,因为效率低。视图主要用于查询数据。
存储过程
存储过程是一组为了完成某个特定功能而编写的并运行在数据库端的SQL程序集。
存储过程的优点
- 通过把处理封装在简单易用的单元中,简化复杂的操作
- 提高性能。使用存储过程比使用单独的SQL语句要快
- 安全,调用者只需要调用指定的存储过程即可,而不用关心存储过程的内容
存储过程的缺点
- 编写复杂
- 如果没有响应的权限,你将无法编写存储过程
创建存储过程
delimiter // create procedure productavg() begin select avg(prod_price) as avgprice from products; end // delimiter ;
调用存储过程
call productavg();
带返回值的存储过程
delimiter // create procedure productinfo( out pl decimal(8,2), out ph decimal(8,2), out pa decimal(8,2) ) begin select min(prod_price) into pl from products; select max(prod_price) into ph from products; select avg(prod_price) into pa from products; end // delimiter ;
调用带返回值的存储过程
call productinfo(@pricelow,@pricehigh,@priceavg); select @pricelow,@pricehigh,@priceavg;
带传入参数的存储过程
delimiter // create procedure ordertotal( in ordernum int, out total decimal(8,2) ) begin select sum(item_price*quantity) info total from orderitems where order_num=ordernum; end // delimiter ;
调用带传入参数的存储过程
call ordertotal(20005,@total); select @total;
有选择流程的存储过程
delimiter // create procedure ordertotaltax( in ordernum int, in tax boolean, out total decimal(8,2) ) begin declare ordertotal decimal(8,2); declare taxvalue float default 0.6; select sum(item_price*quantity) into ordertotal from orderitems where order_num=ordernum; if tax then select ordertotal+(ordertotal*taxvalue) into ordertotal; end if; select ordertotal into total; end // delimiter ;
使用有选择流程的存储过程
call ordertotaltax(20005,1,@total); select @total; call ordertotaltax(20005,0,@total); select @total;
IF语句的存储过程
delimiter // create procedure iftest(out var int) begin declare id int default 14; if id='12' then set var=0; elseif id<12 then set var=1; else set var=2; end if; end // delimiter ;
WHILE语句的存储过程
delimiter // create procedure whiletest() begin declare num int; declare total int default 0; set num=0; while num<10 do set total=total+num; set num=num+1; end while; select total; end // delimiter ;
删除存储过程
drop procedure productavg;
Java调用存储过程
DELIMITER // CREATE PROCEDURE insert_test(IN uname VARCHAR(50),IN uaddress VARCHAR(50)) BEGIN INSERT INTO t_test(username,address) VALUES(uname,uaddress); END// DELIMITER ;
Class.forName("com.mysql.jdbc.Driver"); Connection conn = DriverManager.getConnection("jdbc:mysql:///proc_db","root","root"); CallableStatement cs = conn.prepareCall("{CALL insert_test(?,?)}"); cs.setString(1, "hunthon"); cs.setString(2, "hennan"); int rows = cs.executeUpdate(); System.out.println(rows); cs.close(); conn.close();
DELIMITER // CREATE PROCEDURE find_test() BEGIN SELECT id,username,address FROM t_test; END// DELIMITER ;
Class.forName("com.mysql.jdbc.Driver"); Connection conn = DriverManager.getConnection("jdbc:mysql:///proc_db","root","root"); CallableStatement cs = conn.prepareCall("{CALL find_test()}"); ResultSet rs = cs.executeQuery(); while(rs.next()) { String name = rs.getString("username"); String address = rs.getString("address"); System.out.println("name:" + name + "\taddress:" + address); } rs.close(); cs.close(); conn.close();
DELIMITER // CREATE PROCEDURE insert_getId(OUT id INT,IN uname VARCHAR(50),IN uaddress VARCHAR(50)) BEGIN INSERT INTO t_test(username,address) VALUES(uname,uaddress); SELECT LAST_INSERT_ID() INTO id; SELECT id; END// DELIMITER ;
Class.forName("com.mysql.jdbc.Driver"); Connection conn = DriverManager.getConnection("jdbc:mysql:///proc_db","root","root"); CallableStatement cs = conn.prepareCall("{CALL insert_getId(?,?,?)}"); cs.registerOutParameter(1, Types.INTEGER); cs.setString(2, "fankai"); cs.setString(3, "hennan"); cs.executeUpdate(); int id = cs.getInt(1); System.out.println("刚刚插入的Id:" + id); cs.close(); conn.close();
相关推荐
MySQL视图及存储过程学习笔记
MYSQL数据库的索引、视图、触发器、游标和存储过程
MySQL触发器、存储过程、自定义函数、视图简单示例
主要介绍了MySql视图触发器存储过程详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
基于MySQL存储过程的ssm学生成绩管理系统,其中运用了MySQL的存储过程,函数,使用mybatis调用,项目使用maven管理
在Navicat中创建MySQL动态视图的方法,附图解。
视图 什么是视图?视图的作用是什么? 视图(view)是一种虚拟存在的表,是一个逻辑表,它本身是不包含数据的。作为一个select语句保存在数据字典中的。 通过视图,可以展现基表(用来创建视图的表叫做基表base ...
什么是视图?...是从一个基表里引用来的,基表就是存储在数据库目录下的那些物理表,当我们对基表里的数据进行更新时,那视图表里的数据也会跟着更新。更新视图表的数据时,那基表里的数据也会跟着更新。
过程、触发器、视图、信息架构视图”,这是介绍 MySQL 5.0 新特性丛书的第一集。希望这 本书能像内行专家那样与您进行对话,用简单的问题、例子让你学到需要的知识。 为了达到这样的目的,我会从每一个细节开始慢的...
MySQL 5.0 之后的版本添加了对视图的支持。 认识视图 视图是一个虚拟表,其内容由查询定义。同真实表一样,视图包含一系列带有名称的列和行数据,但视图并不是数据库真实存储的数据表。 视图是从一个、多个表或者...
16.MySQL高级存储过程创建调用查询删除语法.avi 17.MySQL高级存储过程语法变量.avi 18.MySQL高级存储过程语法if判断.avi 19.MySQL高级存储过程语法输入参数.avi 20.MySQL高级存储过程语法输出参数.avi 21.MySQL高级...
视图没有实际的物理记录,不是以数据集的形式存储在数据库中的,它所对应的数据实际上是存储在视图所引用的真实表中的。 视图是数据的窗口,而表是内容。表是实际数据的存放单位,而视图只是以不同的显示方式展示...
MYSQL数据库的索引、视图、触发器、游标和存储过程.pdf
完整版 MySQL8.0从入门到精通 MySQL数据库教程 第10章 存储过程和函数(共20页).ppt 完整版 MySQL8.0从入门到精通 MySQL数据库教程 第11章 视图(共20页).ppt 完整版 MySQL8.0从入门到精通 MySQL数据库教程 第12章...
本文实例讲述了mysql视图之创建可更新视图的方法。分享给大家供大家参考,具体如下: 我们知道,在mysql中,视图不仅是可查询的,而且是可更新的。这意味着我们可以使用insert或update语句通过可更新视图插入或更新...
根据自定义模板通过数据库表、视图和存储过程批量生成代码, 模板编辑和代码查看支持语法高亮 (Java, VB, T-SQL) 可以新增语法文件,文件格式类似于 EditPlus 软件附带模板包括: VB 三层结构中实体和...
sys - 一组视图、函数和存储过程的集合用于帮助MySQL管理员了解MySQL数据库使用情况