- 浏览: 199495 次
- 性别:
- 来自: 北京
文章分类
最新评论
1.存储过程只在创造时进行编译,以后每次执行存储过程都不需再重新编译,而一般 SQL 语句每执行一次就编译一次,所以使用存储过程可提高数据库执行速度。
2.当对数据库进行复杂操作时(如对多个表进行 Update,Insert,Query,Delete 时),可将此复杂操作用存储过程封装起来与数据库提供的事务处理结合一起使用。这些操作,如果用程序来完成,就变成了一条条的 SQL 语句,可能要多次连接数据库。而换成存储,只需要连接一次数据库就可以了。
3.存储过程可以重复使用,可减少数据库开发人员的工作量。
4.安全性高,可设定只有某此用户才具有对指定存储过程的使用权。
1,变量
DECLARE声明,SET赋值
INT, INTEGER
BIGINT
FLOAT
DOUBLE
DECIMAL(precision, scale), NUMERIC(precision, scale)
DATE
DATETIME
CHAR(length)
VARCHAR(length)
BLOB, TEXT
LONGBLOB, LONGTEXT
可以在DECLARE变量时用DEFAULT设置默认值,不设则为NULL
2,参数
参数分IN、OUT和INOUT类型
3,用户变量
以@开头的为用户变量,作用域为session,所以可以当作全局变量使用
4,注释
//为单行注释
/*
|
| 多行注释
|
*/
5,操作符
算术操作符
+
-
*
/ # 结果可能为小数
DIV # 结果为整数
%
比较操作符
>
<
<=
>=
BETWEEN
NOT BETWEEN
IN
NOT IN
=
<>, != # 不等号
<=> # Null safe equal (returns TRUE if both arguments are Null)
LIKE
REGEXP
IS NULL
IS NOT NULL
逻辑操作符
AND
OR
XOR
位操作符
|
&
<<
>>
~
6,内建函数
分为字符串函数、算术函数、日期和时间函数和其他函数
常用MySQL函数
ABS
CEILING
CONCAT
CURDATE
DATE_ADD
DATE_SUB
FORMAT
GREATEST
IF
IFNULL
INSERT
INSTR
ISNULL
LEAST
LEFT
LENGTH
LOCATE
LOWER
LPAD
LTRIM
MOD
NOW
POWER
RAND
REPEAT
REPLACE
ROUND
RPAD
RTRIM
SIGN
SQRT
STRCMP
SUBSTRING
UPPER
VERSION
7,数据类型
MySQL中所有的变量都为单元素,没有数组的概念。
String类型
CHAR:定长,不足的部分用空格,超出的部分截断,最大255字节
VARCHAR:变长,不足的部分变短,超出的部分截断,最大65532字节
ENUM类型
SET类型
SET与ENUm类似,但是可以有多个值
CREATE PROCEDURE sp_set(in_option SET('Yes', 'No', 'Maybe'))
BEGIN
SELECT in_option;
END
--------------
CALL sp_set('Yes')
--------------
+-----------+
| in_option |
+-----------+
| Yes |
+-----------+
1 row in set (0.01 sec)
Query OK, 0 rows affected (0.01 sec)
--------------
CALL sp_set('Yes,No,Maybe')
--------------
+--------------+
| in_option |
+--------------+
| Yes,No,Maybe |
+--------------+
1 row in set (0.00 sec)
Query OK, 0 rows affected (0.00 sec)
--------------
CALL sp_set('Yes,No,Go away')
--------------
ERROR 1265 (01000): Data truncated for column 'in_option' at row 1
Numeric类型
DATE和DATETIME类型
DATE用于存储日期,DATETIME用于存储日期和时间
TEXT和BLOB类型
TEXT可以存储64K,LONGTEXT可以存储4G
BLOB和LONGBLOB与之类似,但是它们还可以存储二进制数据
8,sql_mode
'STRICT_TRANS_TABLES'(默认值): 对transactional的table做严格数据类型限制
'STRICT_ALL_TABLES': 对所有table都做严格数据类型限制
在strict mode下,如果出现Data truncate错误(如将String赋值给Integer)会raise error,而在no strict mode下则会出现不可预料的行为(如将String赋值给Integer时值变为0)并且只能在“show warnings;”时看到。
mysql> SHOW WARNINGS;
+---------+------+----------------------------------------+
| Level | Code | Message |
+---------+------+----------------------------------------+
| Warning | 1265 | Data truncated for column 'b' at row 1 |
| Warning | 1265 | Data truncated for column 'c' at row 1 |
+---------+------+----------------------------------------+
存储过程应该一直在strict mode下工作,这样可以避免不可预期的错误。
一个存储过程包括名字,参数列表,以及可以包括很多 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 ;
发表评论
-
Linux下mysql定时备份操作
2012-08-17 16:22 8981.操作系统[root@localhost ~]# ca ... -
mysql 密码修改
2012-08-17 16:24 809>mysql -u root -p Enter pa ... -
CentOS mysqldb 安装
2012-08-13 14:00 1122安装: http://pypi.python.org/pyp ... -
mongodb安装windows服务
2012-07-19 14:46 1010Mongodb的windows服务安装和卸载 ... -
mysql cursor游标的使用,实例
2012-03-28 16:36 31549mysql被oracle收购后,从mysql-5.5开始 ... -
mysql 存储过程中不能使用 return 的解决办法
2012-03-28 15:22 13352大家都知道,mysql 的存储过程是不能使用 ... -
MySQL 存储过程参数用法 in, out, inout
2012-03-28 15:20 812MySQL 存储过程参数有 ... -
在Centos下启用mysql的远程访问账号
2012-02-13 11:32 2166在Centos下启用mysql的远程访问账号 在默 ... -
ubuntu 下安装mysql , mysql允许用户远程连接
2012-02-10 16:35 2823一,安装MySQL sudo apt-get inst ... -
mysql 创建数据库时指定字符
2011-04-08 10:12 974先mysql进入: GBK: create databa ... -
linux 下导出 mysql 命令
2011-03-28 14:27 1121在linux 下导出 Mysql 数据库的方法 my ... -
mysql 杂谈
2011-03-07 15:06 7511、mysql 连接字符串: select CONCA ... -
mysql 杂谈
2011-03-07 14:57 7071、mysql 连接字符串: select CONCA ... -
centos 下mysql的最常用的操作指令
2010-10-15 15:45 9991、service mysqld status 查看my ... -
在mysql 中导入 .sql 文件
2010-10-15 15:22 899当需要导入到一个mysql 中数据表结构的时候,可以如下操作: ... -
mysql 创建数据库时指定编码
2010-10-15 15:15 1188mysql 创建 数据库时指定编码很重要,很多开发者都使用了默 ...
相关推荐
Mysql存储过程常用语句模板(含变量,if,三种循环等等) Mysql存储过程常用语句模板(含变量,if,三种循环等等) Mysql存储过程常用语句模板(含变量,if,三种循环等等) Mysql存储过程常用语句模板(含变量,if,三...
本文实例讲述了mysql存储过程之返回多个值的方法。分享给大家供大家参考,具体如下: mysql存储函数只返回一个值。要开发返回多个值的存储过程,需要使用带有INOUT或OUT参数的存储过程。咱们先来看一个orders表它的...
mysql经典教程+mysql存储过程讲解 重点讲解Mysql的存储过程,触发器,游标的使用 对mysql不太熟的朋友可以好好学习。。。
c++实现调mysql存储过程,实现存储过程的出参入参,可以支持查询多数据返回,还有存储过程的复杂数据的增删改等
mysql中文手册.chm+mysql命令大全.chm+mysql存储过程.pdf
mysql存储过程实现分页 mysql存储过程实现分页 mysql存储过程实现分页 mysql存储过程实现分页
MySQL存储过程学习 MySQL存储过程 MySQL存储过程
本文实例讲述了MySQL存储过程的异常处理方法。分享给大家供大家参考。具体如下: mysql> mysql> delimiter $$ mysql> mysql> CREATE PROCEDURE myProc -> (p_first_name VARCHAR(30), -> p_last_name VARCHAR(30)...
MySQL存储过程编程 可以看看 数据库 存储过程
mysql存储过程ppt
mysql 存储过程 实战
MySQL存储过程
mysql获取两个时间相差年月日:使用mysql存储过程,实现计算两个时间的差值,并用年月日时分秒的格式输出,且从大到小为0时则不展示对应单位(如:相差1小时20秒 则展示'1时0分20秒')
mysql存储过程,存储函数练习,里面有详细代码,供大家参考
php中调用MySQL存储过程示例
mysql存储过程实例详细介绍了mysql存储过程的开发步骤
mysql存储过程调试工具,可以设置断点,方便查看变量信息等。好用,简单
MySQL存储过程,入门简单,循序渐进,很适合自学,很详尽,很好学。
MySQL存储过程 MySQL存储过程 MySQL存储过程 MySQL存储过程 MySQL存储过程