|  | 
8#
 
 
 楼主|
发表于 2008-1-16 09:24:13
|
只看该作者 
| 3.3. 表达式 表达式是字面量,变量和操作符的集合,用以计算出某些需要的值。条件执行和流程控制表达式经常会依赖于这些值来决定循环条件和代码分支。
 
 Example 3-12 演示了几种表达式
 
 Example 3-12.表达式用例
 3.4 内建函数复制代码Myvariable_name
Myvariable_name+1
ABS(Myvariable_name)
3.14159
IF(Myvariable='M','Male','Female')
(2+4)/12
你可以在MySQL语句中使用大多数MySQL产品允许的函数,你能在MySQL手册中找到他们的详尽文档,并且我们在第9章提供了大多数函数的明细和样例,我们也将在第十章介绍如何在你的MySQL存储程序中使用自己创建的“存储”函数。
 
 在SQL中可以被使用的函数未必都能在存储程序中被编组操作符(多行)调用。那些函数包括SUM, COUNT, MIN, MAX和AVG。MySQL允许表达式中包括函数,但是就像Example 3-13所演示的那样,他们会返回NULL值
 
 Example 3-13在存储过程中的函数调用返回NULL
 MySQL函数被归类为以下几个类型复制代码 
mysql> create procedure functions(  )
begin
        DECLARE a int default 2;
        declare b int default 3;
        declare c FLOAT;
 
        SET c=SUM(a); select c;
 
end;
 
Query OK, 0 rows affected (0.00 sec)
 
mysql> call functions(  );
 
+------+
| c    |
+------+
| NULL |
+------+
1 row in set (0.00 sec)
 字符串函数
 
 这些函数主要对字符串变量执行操作,比方说:你可以连接字符串,在字符串中查找字符,得到子串和其他常规操作
 
 数学函数
 
 这些函数主要对数字进行操作,比方说:你可以进行乘方(平方),三角函数(sin,cos),随机数函数和对数函数等。
 
 日期和时间函数
 
 折现函数主要的操作对象是日期和时间,比方说:你可以得到当前时间,从一个日期上加上或减去一个时间间隔,找出两个日期间的差异,获取某个确定的时间点(比如:得到一天中某时间的小时数)
 
 其它函数
 
 这些函数包括了所有不容易被分入上面类别中函数。他们包括类型转换函数,流程控制函数(比如:CASE),信息反馈函数(比如服务器版本)和加密函数
 
 Table 3-8总结了大多数常用的函数;相见第九章来获取函数语法和样例的完整覆盖
 
 Table 3-8. 经常被使用的MySQL函数
 
 
 
 
 
 
 | 函数 
 | 描述 
 |  | ABS(number) 
 | 返回提供数字的绝对值。比方说, ABS(-2.3)=2.3. 
 |  | CEILING(number) 
 | 返回下一个最大整数,比方说, CEILING(2.3)=3. 
 |  | CONCAT(string1[,string2,string3,...]) 
 | 返回所有提供字符串的连接形式的值 
 |  | CURDATE 
 | 返回当前时间(不带时间) 
 |  | DATE_ADD(date,INTERVAL amount_type) 
 | 给提供的时间值加上一个时间间隔并返回一个新时间。正确的形式有SECOND, MINUTE, HOUR, DAY, MONTH和YEAR 
 |  | DATE_SUB(date,INTERVAL interval_type) 
 | 从提供的时间值上减去一个时间间隔并返回一个新的时间。正确的形式有SECOND, MINUTE, HOUR, DAY, MONTH和YEAR 
 |  | FORMAT(number,decimals) 
 | 返回一个指定精确度的数值,并给与以1000为单位的分割(通常使用“,”) 
 |  | GREATEST(num1,num2[,num3, ... ]) 
 | 返回所有提供参数中的最大数 
 |  | IF(test, value1,value2) 
 | 测试一个逻辑条件,如果为真则返回value1,如果为假返回value2 
 |  | IFNULL(value,value2) 
 | 返回第一个值,除非第一个值为空;这样的话返回第二个值 
 |  | INSERT(string,position,length,new) 
 | 把一个字符串插入到另一个字符串中 
 |  | INSTR(string,substring) 
 | 返回一个字符串中子串的位置 
 |  | ISNULL(expression) 
 | 如果参数为空则返回1,否则返回0 
 |  | LEAST(num1,num2[,num3, ... ]) 
 | 返回参数列表中的最小值 
 |  | LEFT(string,length) 
 | 返回字符串最左边的部分 
 |  | LENGTH(string) 
 | 返回字符串中的字节数。CHAR_LENGTH可以被用来返回字符数(这会在你使用多字节字符集是产生差异) 
 |  | LOCATE(substring,string[,number]) 
 | 返回字符串中子串的位置,可选的第三个参数为在父字符串中开始搜索的位置 
 |  | LOWER(string) 
 | 返回给定字符串的小写形式 
 |  | LPAD(string,length,padding) 
 | 返回字符串 str, 其左边由字符串padding 填补到length 字符长度,第三个参数为填充字符 
 |  | LTRIM(string) 
 | 删除所有字符串中的前缀空格 
 |  | MOD(num1,num2) 
 | 返回第一个数除于第二个数后的模(余数部分) 
 |  | NOW 
 | 返回当前日期和时间 
 |  | POWER(num1,num2) 
 | 返回num1的num2次方 
 |  | RAND([seed]) 
 | 返回一个随机数。seed可被用于随机数生成器的种子数 
 |  | REPEAT(string,number) 
 | 返回一个重复number次string的字符串 
 |  | REPLACE(string,old,new) 
 | 用new替换所有出现old的地方 
 |  | ROUND(number[,decimal]) 
 | 舍去给定数值的指定精度的位数 
 |  | RPAD(string,length,padding) 
 | 返回字符串 str, 其右边由字符串padding 填补到length 字符长度,第三个参数为填充字符 
 |  | RTRIM(string) 
 | 删除字符串尾部的空格 
 |  | SIGN(number) 
 | 如果number小于0则返回-1,如果大于0则返回1,如果为0则返回0 
 |  | SQRT(number) 
 | 返回number的平方根 
 |  | STRCMP(string1,string2) 
 | 如果两个值相同则返回0,若根据当前分类次序,第一个参数小于第二个,则返回 -1,其它情况返回 1 。
 
 |  | SUBSTRING(string,position,length) 
 | 从字符串指定位置开始返回length个字符 
 |  | UPPER(string) 
 | 将指定字符串转换为大写 
 |  | VERSION 
 | 返回MySQL服务器当前版本号的字符串 
 | 
 
 函数可以被用在任何接受表达式的场合,在SET语句,条件语句中(IF,CASE),和循环控制子句。Example 3-14展示了在SET和IF子句中使用函数的例子
 
 
 Example 3-14.在SET和IF子句中使用函数的例子
 复制代码
CREATE PROCEDURE function_example(  )
BEGIN
 
  DECLARE TwentyYearsAgoToday DATE;
  DECLARE mystring VARCHAR(250);
 
  SET TwentyYearsAgoToday=date_sub(curdate(  ), interval 20 year);
 
  SET mystring=concat('It was ',TwentyYearsAgoToday,
      ' Sgt Pepper taught the band to play...');
 
  SELECT mystring;
 
  IF (CAST(SUBSTR(version(  ),1,3) AS DECIMAL(2,1)) <5.0) THEN
    SELECT 'MySQL versions earlier than 5.0 cannot run stored programs - you
            must be hallucinating';
  ELSE
        SELECT 'Thank goodness you are running 5.0 or higher!';
  END IF;
 
END$$
 
CALL function_example(  )$$
 
+---------------------------------------------------------+
| mystring                                                |
+---------------------------------------------------------+
| It was 1985-11-22 Sgt Pepper taught the band to play... |
+---------------------------------------------------------+
1 row in set (0.03 sec)
 
+-----------------------------------------------+
| Thank goodness you are running 5.0 or higher! |
+-----------------------------------------------+
| Thank goodness you are running 5.0 or higher! |
+-----------------------------------------------+
1 row in set (0.03 sec)
 | 
 |