当前位置:操作系统 > Unix/Linux >>

用于SELECT和WHERE子句的函数

6.3 用于 SELECT 和 WHERE 子句的函数

  一个 SQL 语句中的 select_expression 或 where_definition 可由任何使用了下面所描述函数的表达式组成。

  包含 NULL 的表达式总是得出一个 NULL 值结果,除非表达式中的操作和函数在文档中有另外的说明。

  注意:在一个函数名和跟随它的括号之间必须不存在空格。这有助于 MySQL 语法分析程序区分函数调用和对恰巧与函数同名表或列的引用。然而,参数左右两边的空格却是允许的。

  你可以强制 MySQL 接受函数名后存在空格的形式,这需要通过以 --ansi 选项启动 mysqld,或在 mysql_connect() 中使用 CLIENT_IGNORE_SPACE,但是,在这种情况下,所有的函数名均将成为保留字。查看章节 1.8.2 以 ANSI 模式运行 MySQL.

  为了简洁,从 mysql 程序输出的例子以缩写的形式显示。因此:

  mysql> SELECT MOD(29,9);

  1 rows in set (0.00 sec)

  +-----------+

  | mod(29,9) |

  +-----------+

  | 2 |

  +-----------+

  将被显示为这样:

  mysql> SELECT MOD(29,9);

  -> 2

  6.3.1 无类型的特殊运算符和函数

  6.3.1.1 圆括号

  ( ... )

  括号,使用它来强制一个表达式的计算顺序。

  mysql> SELECT 1+2*3;

  -> 7

  mysql> SELECT (1+2)*3;

  -> 9

  6.3.1.2 比较运算符

  比较运算符的结果是 1 (TRUE)、0 (FALSE) 或 NULL。这些函数可工作于数字和字符串上。根据需要,字符串将会自动地被转换到数字,以及数字被转换成字符串(比如在 Perl 中)。

  MySQL 使用下列规则进行比较:

  * 如果一个或两个参数是 NULL,比较的结果是 NULL,除了 <=> 运算符。

  * 如果在一个比较操作中两个参数均是字符串,他们将作为字符串被比较。

  * 如果两个参数均是整数,他们作为整数被比较。

  * 十六进制值如果不与一个数字进行比较,那么它将当作一个二进制字符串。

  * 如果参数之一是一个 TIMESTAMP 或 DATETIME 列,而另一参数是一个常数,在比较执行之前,这个常数被转换为一个时间戳。这样做是为了对 ODBC 更友好。

  * 在所有其它情况下,参数作为浮点(real)数字被比较。

  缺省地,字符串使用当前字符集以忽略字母大小写的方式进行比较(缺省的字符集为 ISO-8859-1 Latin1,它对英语处理得很出色)。

  下面的例子演示了对于比较操作字符串到数字的转换:

  mysql> SELECT 1 > '6x';

  -> 0

  mysql> SELECT 7 > '6x';

  -> 1

  mysql> SELECT 0 > 'x6';

  -> 0

  mysql> SELECT 0 = 'x6';

  -> 1

  =

  等于:

  mysql> SELECT 1 = 0;

  -> 0

  mysql> SELECT '0' = 0;

  -> 1

  mysql> SELECT '0.0' = 0;

  -> 1

  mysql> SELECT '0.01' = 0;

  -> 0

  mysql> SELECT '.01' = 0.01;

  -> 1

  <>

  !=

  不等于:

  mysql> SELECT '.01' <> '0.01';

  -> 1

  mysql> SELECT .01 <> '0.01';

  -> 0

  mysql> SELECT 'zapp' <> 'zappp';

  -> 1

  <=

  小于或等于:

  mysql> SELECT 0.1 <= 2;

  -> 1

  <

  小于:

  mysql> SELECT 2 < 2;

  -> 0

  >=

  大于或等于:

  mysql> SELECT 2 >= 2;

  -> 1

  >

  大于:

  mysql> SELECT 2 > 2;

  -> 0

  <=>

  NULL 值安全等于:

  mysql> SELECT 1 <=> 1, NULL <=> NULL, 1 <=> NULL;

  -> 1 1 0

  IS NULL

  IS NOT NULL

  测试一个值是或不是 NULL:

  mysql> SELECT 1 IS NULL, 0 IS NULL, NULL IS NULL;

  -> 0 0 1

  mysql> SELECT 1 IS NOT NULL, 0 IS NOT NULL, NULL IS NOT NULL;

  -> 1 1 0

  为了能够与其它程序更好的工作,在使用 IS NULL 是 MySQL 支持下列额外选择性:

  * 通过它,你可以找到最后插入的记录行:

  SELECT * FROM tbl_name WHERE auto_col IS NULL

  这个操作可以通过设置 SQL_AUTO_IS_NULL=0 来禁止。查看章节 5.5.6 SET 句法.

  * 对于 NOT NULL 的 DATE 和 DATETIME 列,可以通过使用下列语句找到特殊的值 0000-00-00:

  SELECT * FROM tbl_name WHERE date_column IS NULL

  这需要通过某些 ODBC 应用程序才能工作(因为 ODBC 不支持一个 0000-00-00 日期)

  expr BETWEEN min AND max

  如果 expr 大于或等于 min ,并且 expr 小于或等于 max,BETWEEN 返回 1,否则返回 0。它等价于表达式 (min <= expr AND expr <= max) ,只要所有的参数均是相同的类型。 否则类型会依照上面的规则发生转换,但是应用于所有三个参数。注意,在 MySQL 4.0.5 之前,参数被转换到 expr 的类型。

  mysql> SELECT 1 BETWEEN 2 AND 3;

  -> 0

  mysql> SELECT 'b' BETWEEN 'a' AND 'c';

  -> 1

  mysql> SELECT 2 BETWEEN 2 AND '3';

  -> 1

  mysql> SELECT 2 BETWEEN 2 AND 'x-3';

  -> 0

  expr NOT BETWEEN min AND max

  等同于 NOT (expr BETWEEN min AND max)。

  expr IN (value,...)

  如果 expr 是 IN 列表中的作一值,它将返回 1,否则返回 0。如果所有的值均是常数,那么所有的值被依照 expr 的类型进行计算和排序。然后以一个二进制搜索方式完成项目的搜索。这就意味着,如果 IN 列表完全由常数组成,IN 将是非常快的。如果 expr 是一个字母大小写敏感的字符串表达式,字符串比较将以大小写敏感方式执行:

  mysql> SELECT 2 IN (0,3,5,'wefwf');

  -> 0

  mysql> SELECT 'wefwf' IN (0,3,5,'wefwf');

  -> 1

  从 MySQL 4.1 开始(符合 SQL-99 标准),如果左手边的表达式是 NULL,或者在列表中没有发现相匹配的值并且列表中的一个表达式是 NULL,IN 均返回 NULL。

  expr NOT IN (value,...)

  等同于 NOT (expr IN (value,...))。

  ISNULL(expr)

  如果 expr 是 NULL,ISNULL() 返回 1,否则返回 0:

  mysql> SELECT ISNULL(1+1);

  -> 0

  mysql> SELECT ISNULL(1/0);

  -> 1

  注意,对 NULL 值使用 = 进行比较总是为 false !

  COALESCE(list)

  返回列表中第一个非 NULL 的元素:

  mysql> SELECT COALESCE(NULL,1);

  -> 1

  mysql> SELECT COALESCE(NULL,NULL,NULL);

  -> NULL

  INTERVAL(N,N1,N2,N3,...)

  Returns 如果 N < N1 返回 0,如果 N < N2 返回 1,等等。所有的参数均被当作整数。为了函数能正确地工作,它要求 N1 < N2 < N3 < ... < Nn。这是因为它使用的是一个二进制的搜索(非常地快):

  mysql> SELECT INTERVAL(23, 1, 15, 17, 30, 44, 200);

  -> 3

  mysql> SELECT INTERVAL(10, 1, 10, 100, 1000);

  -> 2

  mysql> SELECT INTERVAL(22, 23, 30, 44, 200);

  -> 0

  如果以任何一个标准运算符(=, <>..., 但除了 LIKE)对一个忽略大小写的字符串进行比较,尾部的空白空间(空格、TAB 和换行)均被忽略。

  mysql> SELECT "a" ="A \n";

  -> 1

  6.3.1.3 逻辑运算符

  在 SQL 中,所有的逻辑运算符返回的值均为 TRUE、FALSE 或 NULL (未知)。在 MySQL 中,它们由 1 (TRUE)、0 (FALSE) 和 NULL 实现。这些大部分在不同的 SQL 数据库间是相同的,然而某些可能会以一个非零值返回 TRUE。

  NOT

  !

  逻辑非。如果操作数为 0,返回 1;如果操作数为非零,返回 0;如果操作数为 NOT NULL,返回 NULL。

  mysql> SELECT NOT 10;

  -> 0

  mysql> SELECT NOT 0;

  -> 1
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,