1.数据库存储过程:简单滴说,存储过程就是存储在数据库中的一个程序。
2..数据库存储过程作用:
第一:存储过程因为SQL语句已经预编绎过了,因此运行的速度比较快
第二:存储过程可以接受参数、输出参数、返回单个或多个结果集以及返回值。可以向程序返回错误原因。
第三:存储过程运行比较稳定,不会有太多的错误。只要一次成功,以后都会按这个程序运行。
第四:存储过程主要是在服务器上运行,减少对客户机的压力。
第五:存储过程可以包含程序流、逻辑以及对数据库的查询。同时可以实体封装和隐藏了数据逻辑。
第六:存储过程可以在单个存储过程中执行一系列 SQL 语句。
第七:存储过程可以从自己的存储过程内引用其它存储过程,这可以简化一系列复杂语句。
此外,如果多条SQL语句执行过程中,过程环节返回了数据作为后面环节的输入数据,如果直接通过
SQL语句执行,势必导致大量的数据通过网络返回到客户机,并在客户机运算;如果封装在存储过程中,
则将运算放在服务器进行,不但减少了客户机的压力,同时也减少了网络流量,提高了执行的效率。
3.mysql存储过程:
MySQL5存储过程,用得人好像不多。按照数据库设计原理来讲,存储过程是在db server上预编译的,所以查询速度会比较起纯SQL语句快很多。可能是现在流行OO,导至存储过程使用的余地大打折扣。但如果从效果上来讲,用存储过程来实现业务规则所带得DB SERVER压力,比用JAVA类实现业务规则所带来的WEB SERVER压力要小。当然存储过程也不应滥用,象普通的insert、update之类的语句就不需要使用存储过程了。
MySQL创建procudure的语法与sql server/Oracle差别较大。
例1:传入参数的procedure
create procedure usp_test(param varchar(20)
select * from talbeName where column=param
例2:更新表的procedure
create procedure usp_test2 (t varchar(20))
begin
set xname = 'test'
update table set column = xname where column1=t
end
MySQL创建存储过程时不带as,而且()不能省略,即便是没有传入参数。这一点象sql server或是oracle那样直观,而且声明变量时直接用declare,不用加的@或@@(in out变量除外)。还有一点是很怪的语法,如果是以“select”为开头的存储过程,是不能加"begin end"的。"begin end"表示多条SQL语句的复合体。
当然,事实上几乎没有哪款数据库是完全符合SQL3标准的,多少都含有自己的一些成份里面,这也造成使用存储过程会使程序的可移性降低。
调用procedure
MySQL使用call关键字。例:call usp_test('test');而不是execute,同样()是不能省略的。
创建完procedure后,再看看java是如何调用procedure的。
Connection conn = null
CallableStatement cstmt = nullResultSet rs = null
try{
conn = DbConn.getDbConn()//get pool conn
CallableStatement cstmt = conn.prepareCall("{call usp_test(?)}")
call.setString(1, "test")
rs = call.executeQuery()
while(rs.next()){
String te = rs.getString(1)
System.out.println("te:"+te)
}
}catch(Exception e){
System.out.println("e: "+e)
}finally{
try{
rs.close()
cstmt.close()
conn.close()
}catch(Exception ex){
System.out.println("ex:"+ex)
}
}
这里使用的是"{call usp_test()}"来调用存储过程。同时也可以编程传入参数,进行查询。
一个存储过程包括名字,参数列表,以及可以包括很多SQL语句的SQL语句集。创建存储过程:
语法:
CREATE PROCEDURE p()
BEGIN
/*此存储过程的正文*/
END
CREATE PROCEDURE productpricing()
BEGIN
SELECT Avg(pro_price) AS priceaverage
FROM products
END
# begin…end之间是存储过程的主体定义
# mysql的分界符是分号(;)
调用存储过程的方法是:
# CALL加上过程名以及一个括号
# 例如调用上面定义的存储过程
CALL productpricing()
# 哪怕是不用传递参数,存储过程名字后面的括号“()”也是必须的
删除存储过程的方法是:
DROP PROCUDURE productpricing
创建带参数的存储过程:
CREATE PROCUDURE productpricing(
OUT p1 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
# DECIMAL用于指定参数的数据类型
# OUT用于表明此值是用于从存储过程里输出的
# MySQL支持 OUT, IN, INOUT
调用带参数的存储过程:
CALL productpricing(@pricelow,
@pricehigh,
@priceaverage)
# 所有的参数必须以@开头
# 要想获取@priceaverage的值,用以下语句
SELECT @priceaverage
# 获取三个的值,用以下语句
SELECT @pricehigh, @pricelow, @priceaverage
另一个带IN和OUT参数的存储过程:
CREATE PROCEDURE ordertotal(
IN onumber INT,
OUT ototal DECIMAL(8,2)
)
BEGIN
SELECT Sum(item_price*quantity)
FROM orderitems
WHERE order_num = onumber
INTO ototal
END
CALL ordertotal(20005, @total)
SELECT @total
添加一个完整的例子:(这是一个自定义分页的存储过程)
DELIMITER $$
DROP PROCEDURE IF EXISTS `dbcall`.`get_page`$$
CREATE DEFINER=`root`@`localhost` PROCEDURE `get_page`(
/**//*Table name*/
tableName varchar(100),
/**//*Fileds to display*/
fieldsNames varchar(100),
/**//*Page index*/
pageIndex int,
/**//*Page Size*/
pageSize int,
/**//*Field to sort*/
sortName varchar(500),
/**//*Condition*/
strWhere varchar(500)
)
BEGIN
DECLARE fieldlist varchar(200)
if fieldsNames=''||fieldsNames=null THEN
set fieldlist='*'
else
set fieldlist=fieldsNames
end if
if strWhere=''||strWhere=null then
if sortName=''||sortName=null then
set @strSQL=concat('SELECT ',fieldlist,' FROM ',tableName,' LIMIT ',(pageIndex-1)*pageSize,',',pageSize)
else
set @strSQL=concat('SELECT ',fieldlist,' FROM ',tableName,' ORDER BY ',sortName,' LIMIT ',(pageIndex-1)*pageSize,',',pageSize)
end if
else
if sortName=''||sortName=null then
set @strSQL=concat('SELECT ',fieldlist,' FROM ',tableName,' WHERE ',strWhere,' LIMIT ',(pageIndex-1)*pageSize,',',pageSize)
else
set @strSQL=concat('SELECT ',fieldlist,' FROM ',tableName,' WHERE ',strWhere,' ORDER BY ',sortName,' LIMIT ',(pageIndex-1)*pageSize,',',pageSize)
end if
end if
PREPARE stmt1 FROM @strSQL
EXECUTE stmt1
DEALLOCATE PREPARE stmt1
END$$
DELIMITER
1.查看数据库,选中使用数据库,并查看数据库表,具体 *** 作命令如下:
show databases
use student
show tables
2.选择student数据库中的一张表stu_score,查看数据库表数据,并利用explain分析数据库表,如下图所示:
select * from stu_score
explain select * from stu_score
3.查看数据库使用索引的情况,使用命令:
show status like 'Handler_read%'
4.用于分析和存储表的关键字,分析的结果可以得到精准的信息,利用命令analyze,
analyze table stu_score
5.检查数据库表stu_score,检查表是否有错误,利用命令:
check table stu_score
6.优化数据库表,利用命令:
optimize table stu_score
扩展资料:
可以使用命令行工具管理 MySQL 数据库(命令 mysql 和 mysqladmin),也可以从 MySQL 的网站下载图形管理工具 MySQL Administrator, MySQL Query Browser 和 MySQL Workbench。
phpMyAdmin是由 php 写成的 MySQ L资料库系统管理程程序,让管理者可用 Web 界面管理 MySQL 资料库。
phpMyBackupPro也是由 PHP 写成的,可以透过 Web 界面创建和管理数据库。它可以创建伪 cronjobs,可以用来自动在某个时间或周期备份 MySQL 数据库。
另外,还有其他的 GUI 管理工具,例如 mysql-front 以及 ems mysql manager, navicat等等。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)