`

MySQL 视图 存储过程

阅读更多

MySQL 视图 存储过程

博文目录

  1. 视图的创建及使用
  2. 存储过程的创建及使用
  3. Java调用存储过程

视图是虚拟的表,与包含数据的表不一样,视图只包含使用时动态检索数据的查询,而自身不包含任何数据。


使用视图的好处

  • 重用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视图用法、注意事项)..docx

    #### 二、MySQL视图 ##### 1、基本概念 视图是一种虚拟表,它不实际存储数据,而是根据定义的查询从一个或多个实际表中动态获取数据。视图的主要用途之一是提高数据的安全性,通过限制用户对敏感数据的访问,仅展示...

    MySQL--视图的定义

    ### MySQL视图定义详解 #### 视图的概念 在MySQL中,**视图**是一种特殊的虚拟表,其结果集由从本机表中选择的数据组成。视图并不存储实际的数据,而是存储一条SELECT语句,当用户访问视图时,数据库引擎会执行该...

    在Navicat中创建MySQL动态视图的方法

    - **视图**:视图是基于一个或多个表的虚拟表,它并不存储实际数据,而是存储一个SQL查询。通过视图可以实现对数据的安全访问控制。 - **动态视图**:相比于静态视图,动态视图更加灵活,它可以实时反映基础表的变化...

    mysql经典教程+mysql存储过程讲解

    本教程结合"mysql经典教程+mysql存储过程讲解"的主题,将深入探讨MySQL的基础知识以及核心特性——存储过程。 首先,我们需要理解什么是数据库。数据库是一个组织和存储数据的系统,允许用户以结构化方式访问和管理...

    MySql视图顺序整理工具

    MySQL视图是数据库管理系统中的一个重要概念,它允许用户创建虚拟的表,这些表的数据来源于一个或多个实际的表,但不存储数据本身。视图在数据库设计中扮演着简化查询、提供安全隔离、抽象复杂数据结构等角色。在这...

    Mysql视图工具(Navicat for MySQL)

    MySQL视图工具,如Navicat for MySQL,是数据库管理员和开发人员常用的一款图形化界面工具,它提供了方便的方式来管理MySQL数据库,包括创建、编辑和操作视图。Navicat for MySQL不仅支持基本的数据库管理和数据操作...

    mysql中文手册+mysql命令大全+mysql存储过程

    CHM文件是一种Windows帮助文件,包含了大量的MySQL知识,如数据库概念、安装配置、SQL语法、索引、视图、触发器、存储过程和函数等。这个手册可以帮助用户快速查找并理解MySQL的各种功能和操作,尤其对于初学者来说...

    mysql视图简介.pdf

    ### MySQL视图详解 #### 一、视图概述 视图是MySQL中一种重要的功能,它为用户提供了灵活的数据访问方式。简而言之,视图是一个虚拟表,其内容由一条SELECT语句定义。尽管视图看起来像是一个独立的表,但实际上它...

    MySQL触发器、存储过程、自定义函数、视图示例

    #### 四、MySQL视图 视图是基于一个或多个表的结果集。视图可以简化复杂的查询,并提供了一种安全的方式访问数据。 **示例:** 在此例中,我们创建了一个视图`view_userinfo`,它包含了`userinfo`表中的所有列以及...

    创建mysql数据库视图

    以下将详细介绍创建MySQL数据库视图的过程以及相关的知识点。 1. **视图的基本概念** 视图是基于一个或多个表的预定义SQL查询。用户可以像操作真实的表一样对视图进行查询,但修改时需要注意视图的可更新性,不是...

    基于MySQL存储过程的ssm学生成绩管理系统

    在这个"基于MySQL存储过程的SSM学生成绩管理系统"中,开发人员利用了MySQL数据库的高级特性——存储过程和函数,来优化数据处理,提高系统性能。 首先,让我们深入了解MySQL的存储过程。存储过程是一组预先编译的...

    MySql视图触发器存储过程详解

    MySQL中的视图、触发器和存储过程是数据库管理中常用的功能,它们可以帮助开发者更高效、安全地进行数据操作。下面将分别对这三个概念进行详细解释。 **视图(View)** 视图是一种虚拟表,它是由SQL查询结果形成的...

    MySQL存储过程.pdf

    13. **视图与存储过程的结合**:存储过程可以与视图一起使用,创建复杂的业务逻辑视图,提供给用户更加友好的接口。 综上所述,“MySQL存储过程.pdf”这份文档可能会详细解释以上各个知识点,并通过实例展示如何在...

    MySQL数据库:视图与存储过程

    #### 二、MySQL视图 **1. 视图的概念** 视图是一种虚拟表,其内容由存储在数据库中的查询定义。视图不实际存储数据,而是指向表中的数据。通过视图,可以简化复杂的查询,并提供数据安全性。 **2. 创建视图** ...

    MySQL 5.0 存储过程

    MySQL 5.0新增特性中,存储过程是一个重要的部分,本书主要面向对MySQL有一定了解,但希望了解...通过本书的学习,读者能够有效地利用MySQL 5.0提供的存储过程、触发器、视图等新特性,提高数据库操作的效率和安全性。

    利用视图提高MySQL查找效率.doc

    视图可以被理解为数据库中的虚拟表,虽然它不实际存储任何数据,但可以根据预定义的SQL SELECT语句来动态获取所需的数据。视图的使用主要体现在以下几个方面: 1. **简化操作**:视图简化了用户对数据库的操作。...

    mysql-视图详解.doc

    MySQL中的视图是数据库对象的一种,它并不存储实际的数据,而是根据用户定义的SQL查询来虚拟展示数据。视图提供了一种数据抽象机制,允许用户以不同的角度或简化的方式查看同一张表或多个表中的数据。视图的使用对于...

    浅谈MySql 视图、触发器以及存储过程

    MySQL中的视图、触发器和存储过程是数据库管理系统中非常重要的功能,它们分别在数据抽象、数据操作自动化和批量处理方面发挥着关键作用。 **视图(View)** 视图是一种虚拟表,它并不实际存储数据,而是由一个...

Global site tag (gtag.js) - Google Analytics