Chinaunix首页 | 论坛 | 博客
  • 博客访问: 319832
  • 博文数量: 240
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 50
  • 用 户 组: 普通用户
  • 注册时间: 2016-08-04 18:14
文章分类

全部博文(240)

文章存档

2017年(8)

2014年(4)

2013年(15)

2012年(4)

2011年(14)

2010年(55)

2009年(140)

我的朋友

分类: LINUX

2010-07-17 21:04:00

    MySQL 存储过程是从 MySQL 5.0 开始增加的新功能。存储过程的优点很多,最主要的还是执行效率和SQL 代码封装。特别是 SQL 代码封装功能,如果没有存储过程,在外部程序访问数据库时(例如 PHP),要组织很多 SQL 语句。特别是业务逻辑复杂的时候,一大堆的 SQL 和条件夹杂在 PHP 代码中,让人不寒而栗。现在有了 MySQL 存储过程,业务逻辑可以封装存储过程中,这样不仅容易维护,而且执行效率也高。
 
 
1、MySQL存储过程的创建:
 

create procedure 存储过程名字()
(
   [in|out|inout] 参数 datatype
)
begin
   MySQL 语句1;
   MySQL 语句2;
   ......
end;

 

2、MySQL存储过程的调用:
 

call sp_name()


注意:存储过程名称后面必须加括号,哪怕该存储过程没有参数传递

 

3、MySQL存储过程的删除:

drop procedure sp_name;

注意:不能在一个存储过程中删除另一个存储过程,只能调用另一个存储过程

 

4、MySQL存储过程的查看:

select `name` from mysql.proc where db = 'your_db_name' and `type` = 'PROCEDURE'
或:
use your_db_name;
show procedure status;

 

5、MySQL存储过程内容的查看:

show create procedure proc_name;

 

6、MySQL存储过程的一个最简单的示范:

mysql> create procedure sp_sayhi() select 'hello';

mysql> call sp_sayhi();

 

7、MySQL存储过程的语法结构:

条件语句:
if 条件 then
  statement
else
  statement
end if;


循环语句:
[label:] WHILE expression DO
  statements
END WHILE [label];


loop循环:
[label:] LOOP
  statements
END LOOP [label];


until循环:
[label:] REPEAT
  statements
UNTIL expression
END REPEAT [label]


8、创建一个求和的MySQL存储过程:

DELIMITER $$
DROP PROCEDURE IF EXISTS sp_add $$
CREATE PROCEDURE sp_add(a int,b int)
BEGIN

declare c int;
if a is null then
    set a = 0;
end if;

if b is null then
    set b = 0;
end if;

set c = a + b;

select c as sum;

END $$
DELIMITER ;

 


9、MySQL存储过程的算术运算符:

+ 加 SET var1=2+2; 4
- 减 SET var2=3-2; 1
* 乘 SET var3=3*2; 6
/ 除 SET var4=10/3; 3.3333
DIV 整除 SET var5=10 DIV 3; 3
% 取模 SET var6=10%3 ; 1

 

10、MySQL存储过程的比较运算符: 

> 大于 1>2 False
< 小于 2<1 False
<= 小于等于 2<=2 True
>= 大于等于 3>=2 True
BETWEEN 在两值之间 5 BETWEEN 1 AND 10 True
NOT BETWEEN 不在两值之间 5 NOT BETWEEN 1 AND 10 False
IN 在集合中 5 IN (1,2,3,4) False
NOT IN 不在集合中 5 NOT IN (1,2,3,4) True
= 等于 2=3 False
<>, != 不等于 2<>3 False
<=> 严格比较两个NULL值是否相等 NULL<=>NULL True
LIKE 简单模式匹配 "Guy Harrison" LIKE "Guy%" True
REGEXP 正则式匹配 "Guy Harrison" REGEXP "[Gg]reg" False
IS NULL 为空 0 IS NULL False
IS NOT NULL 不为空 0 IS NOT NULL True

 

11、MySQL存储过程的逻辑运算符: 

(AND)
(OR)
异或(XOR)


12、MySQL存储过程的位运算符:

| 位或
& 位与
<< 左移位
>> 右移位
~ 位非(单目运算,按位取反)


13、MySQL存储过程的基本函数:

.字符串类

CHARSET(str) //返回字串字符集
CONCAT (string2 [,... ]) //连接字串
INSTR (string ,substring ) //返回substring首次在string中出现的位置,不存在返回0
LCASE (string2 ) //转换成小写
LEFT (string2 ,length ) //从string2中的左边起取length个字符
LENGTH (string ) //string长度
LOAD_FILE (file_name ) //从文件读取内容
LOCATE (substring , string [,start_position ] ) 同INSTR,但可指定开始位置
LPAD (string2 ,length ,pad ) //重复用pad加在string开头,直到字串长度为length
LTRIM (string2 ) //去除前端空格
REPEAT (string2 ,count ) //重复count次
REPLACE (str ,search_str ,replace_str ) //在str中用replace_str替换search_str
RPAD (string2 ,length ,pad) //在str后用pad补充,直到长度为length
RTRIM (string2 ) //去除后端空格
STRCMP (string1 ,string2 ) //逐字符比较两字串大小,
SUBSTRING (str , position [,length ]) //从str的position开始,取length个字符
注:mysql中处理字符串时,默认第一个字符下标为1,position是可以为负值的,负值则会从str的倒数位开始截取。



mysql> select substring(’abcd’,0,2);
| |

mysql> select substring(’abcd’,1,2);
| ab |

TRIM([[BOTH|LEADING|TRAILING] [padding] FROM]string2) //去除指定位置的指定字符
UCASE (string2 ) //转换成大写
RIGHT(string2,length) //取string2最后length个字符
SPACE(count) //生成count个空格

 


.数学类
ABS (number2 ) //绝对值
BIN (decimal_number ) //十进制转二进制
CEILING (number2 ) //向上取整
CONV(number2,from_base,to_base) //进制转换
FLOOR (number2 ) //向下取整
FORMAT (number,decimal_places ) //保留小数位数
HEX (DecimalNumber ) //转十六进制
注:HEX()中可传入字符串,则返回其ASC-11码,如HEX(’DEF’)返回4142143
也可以传入十进制整数,返回其十六进制编码,如HEX(25)返回19
LEAST (number , number2 [,..]) //求最小值
MOD (numerator ,denominator ) //求余
POWER (number ,power ) //求指数
RAND([seed]) //随机数
ROUND (number [,decimals ]) //四舍五入,decimals为小数位数]

注:返回类型并非均为整数,如:
(1)默认变为整形值
mysql> select round(1.23);
| 1 |


mysql> select round(1.56);
| 2 |


(2)可以设定小数位数,返回浮点型数据
mysql> select round(1.567,2);
| 1.57 |


SIGN (number2 ) //返回符号,正负或0
SQRT(number2) //开平方

 


.日期时间类
ADDTIME (date2 ,time_interval ) //将time_interval加到date2
CONVERT_TZ (datetime2 ,fromTZ ,toTZ ) //转换时区
CURRENT_DATE ( ) //当前日期
CURRENT_TIME ( ) //当前时间
CURRENT_TIMESTAMP ( ) //当前时间戳
DATE (datetime ) //返回datetime的日期部分
DATE_ADD (date2 , INTERVAL d_value d_type ) //在date2中加上日期或时间
DATE_FORMAT (datetime ,FormatCodes ) //使用formatcodes格式显示datetime
DATE_SUB (date2 , INTERVAL d_value d_type ) //在date2上减去一个时间
DATEDIFF (date1 ,date2 ) //两个日期差
DAY (date ) //返回日期的天
DAYNAME (date ) //英文星期
DAYOFWEEK (date ) //星期(1-7) ,1为星期天
DAYOFYEAR (date ) //一年中的第几天
EXTRACT (interval_name FROM date ) //从date中提取日期的指定部分
MAKEDATE (year ,day ) //给出年及年中的第几天,生成日期串
MAKETIME (hour ,minute ,second ) //生成时间串
MONTHNAME (date ) //英文月份名
NOW ( ) //当前时间
SEC_TO_TIME (seconds ) //秒数转成时间
STR_TO_DATE (string ,format ) //字串转成时间,以format格式显示
TIMEDIFF (datetime1 ,datetime2 ) //两个时间差
TIME_TO_SEC (time ) //时间转秒数]
WEEK (date_time [,start_of_week ]) //第几周
YEAR (datetime ) //年份
DAYOFMONTH(datetime) //月的第几天
HOUR(datetime) //小时
LAST_DAY(date) //date的月的最后日期
MICROSECOND(datetime) //微秒
MONTH(datetime) //
MINUTE(datetime) //


阅读(685) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~