当前位置:首页 >> IT/计算机 >>

用在SELECT和WHERE子句中的函数


用在 SELECT 和 WHERE 子句中的函数
在一个 SQL 语句中的 select_expression 或 where_definition 可由使用下面 描述的函数的任何表达式组成。 包含 NULL 的一个表达式总是产生一个 NULL 值,否则除非表达式所包含 的操作符和函数在文档中说明。 注意:在一个函数名和跟随它的括号之间不许没有空格。这帮助 MySQL

分 析器区分函数调用和具有相同名字的对表或列的引用, 尽管允许在参数周围有空 格。 为了简洁,例子以缩写形式显示从 mysql 程序输出。因此: mysql> select MOD(29,9); 1 rows in set (0.00 sec)

+-----------+ | mod(29,9) | +-----------+ | 2|

+-----------+ 被显示为这样: mysql> select MOD(29,9); -> 2 7.4.1 分组函数 ( ... ) 括号。使用它们来强制在一个表达式的计算顺序。 mysql> select 1+2*3; -> 7 mysql> select (1+2)*3; -> 9 7.4.2 常用的算术操作

一般的算术操作符是可用的。注意在-、+和*情况下,如果两个参数是整数,结 果用 BIGINT(64 位)精度计算! + 加法 mysql> select 3+5; -> 8 减法 mysql> select 3-5; -> -2 * 乘法 mysql> select 3*5; -> 15 mysql> select 18014398509481984*18014398509481984.0; -> 324518553658426726783156020576256.0 mysql> select 18014398509481984*18014398509481984; -> 0

最后一个表达式的结果是不正确的,因为整数乘积的结果超过用 BIGINT 计算的 64 位范围。 / 除法 mysql> select 3/5; -> 0.60 被零除产生一个 NULL 结果: mysql> select 102/(1-1); -> NULL

一个除法用 BIGINT 算术计算, 只要在它的结果被转换到一个整数的上下 文中执行! 7.4.3 位函数 MySQL 为位操作使用 BIGINT(64 位)算法,因此这些操作符有最大 64 位的一 个范围。 | 位或 mysql> select 29 | 15; -> 31 & 位与 mysql> select 29 & 15; -> 13

<< 左移位一个长(BIGINT)数字。 mysql> select 1 << 2 -> 4

>> 右移位一个长(BIGINT)数字。 mysql> select 4 >> 2 -> 1 ~ 颠倒所有的位。 mysql> select 5 & ~1 -> 4

BIT_COUNT(N)

返回在参数 N 设定的位的数量。 mysql> select BIT_COUNT(29); -> 4

7.4.4 逻辑运算 所有的逻辑函数返回 1(TRUE)或 0(FALSE)。 NOT ! 逻辑非。如果参数是 0,返回 1,否则返回 0。例外: NOT NULL 返回 NULL。 mysql> select NOT 1; -> 0 mysql> select NOT NULL; -> NULL mysql> select ! (1+1); -> 0 mysql> select ! 1+1; -> 1 最后的例子返回 1,因为表达式作为(!1)+1 计算。 OR

|| 逻辑或。如果任何一个参数不是 0 并且不 NULL,返回 1。 mysql> select 1 || 0; -> 1 mysql> select 0 || 0; -> 0 mysql> select 1 || NULL; -> 1

AND

&& 逻辑与。如果任何一个参数是 0 或 NULL,返回 0,否则返回 1。 mysql> select 1 && NULL; -> 0 mysql> select 1 && 0; -> 0

7.4.5 比较运算符 比较操作得出值 1(TRUE)、0(FALSE)或 NULL 等结果。这些函数工作运 用在数字和字符串上。 当需要时, 字符串自动地被变换到数字且数字到字符串(如 在 Perl)。 MySQL 使用下列规则执行比较:
? 如果一个或两个参数是

NULL,比较的结果是 NULL,除了<=>操作符。

? 如果在比较中操作的两个参数是字符串,他们作为字符串被比较。 ? 如果两个参数是整数,他们作为整数被比较。 ? 十六进制的值如果不与一个数字比较,则被当作二进制字符串。 ? 如果参数之一是一个

TIMESTAMP 或 DATETIME 列而其他参数是一个

常数, 在比较执行前, 常数被转换为一个时间标记。 这样做是为了对 ODBC 更友好。
? 在所有其他的情况下,参数作为浮点(实数)数字被比较。

缺省地,字符串使用当前的字符集以大小写敏感的方式进行(缺省为 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; -> 1

>= 大于或等于 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;

expr BETWEEN min AND max

如果 expr 对大于或等于 min 且 expr 是小于或等于 max,BETWEEN 返 回 1, 否则它返回 0。 如果所有的参数类型是一样得, 这等价于表达式(min <= expr AND expr <= max)。第一个参数(expr)决定比较如何被执行。如 果 expr 是一个大小写不敏感的字符串表达式,进行一个大小写不敏感的 字符串比较。如果 expr 是一个大小写敏感的字符串表达式,进行一个大 小写敏感的字符串比较。如果 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 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 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 的值比较总为假! COALESCE(list) 回来 list 中第一个非 NULL 的单元。 mysql> select COALESCE(NULL,1); -> 1 mysql> select COALESCE(NULL,NULL,NULL); -> NULL INTERVAL(N,N1,N2,N3,...) 如果 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 7.4.6 字符串比较函数 通常, 如果在字符串比较中的任何表达式是区分大小写的,比较以大小写敏感的 方式执行。 expr LIKE pat [ESCAPE 'escape-char'] 使用 SQL 的简单的正规表达式比较的模式匹配。返回 1(TRUE)或 0 (FALSE)。用 LIKE,你可以在模式中使用下列 2 个通配符字符: % _ 匹配任何数目的字符,甚至零个字符 精确匹配一个字符

mysql> select 'David!' LIKE 'David_';

-> 1 mysql> select 'David!' LIKE '%D%v%'; -> 1 为了测试一个通配符的文字实例,用转义字符的加在字符前面。如果你不 指定 ESCAPE 字符,假定为“\”: \% \_ 匹配一%字符 匹配一_字符

mysql> select 'David!' LIKE 'David\_'; -> 0 mysql> select 'David_' LIKE 'David\_'; -> 1

为了指定一个不同的转义字符,使用 ESCAPE 子句: mysql> select 'David_' LIKE 'David|_' ESCAPE '|'; -> 1 LIKE 允许用在数字的表达式上! (这是 MySQL 对 ANSI SQL LIKE 的一 个扩充。) mysql> select 10 LIKE '1%'; -> 1 注意:因为 MySQL 在字符串中使用 C 转义语法(例如,“\n”),你必须在 你的 LIKE 字符串中重复任何“\”。例如,为了查找“\n”,指定它为“ \\n”, 为了查找“\”,指定它为“\\\\”(反斜线被分析器剥去一次,另一次是在模式 匹配完成时,留下一条单独的反斜线被匹配)。 expr NOT LIKE pat [ESCAPE 'escape-char'] 与 NOT (expr LIKE pat [ESCAPE 'escape-char'])相同。 expr REGEXP pat

expr RLIKE pat

执行一个字符串表达式 expr 对一个模式 pat 的模式匹配。模式可以是一 个扩充的正则表达式。见 MySQL 正则表达式句法的 H 描述.如果 expr 匹配 pat,返回 1,否则返回 0。RLIKE 是 REGEXP 的一个同义词,提供 了与 mSQL 的兼容性。 注意: 因为 MySQL 在字符串中使用 C 转义语法(例 如,“\n”), 你必须在你的 REGEXP 字符串重复任何“\”。在 MySQL3.23.4 中,REGEXP 对于正常的(不是二进制)字符串是忽略大小写。 mysql> select 'Monty!' REGEXP 'm%y%%'; -> 0 mysql> select 'Monty!' REGEXP '.*'; -> 1 mysql> select 'new*\n*line' REGEXP 'new\\*.\\*line'; -> 1 mysql> select "a" REGEXP "A", "a" REGEXP BINARY "A"; -> 1 0

当决定一个字符的类型时,REGEXP 和 RLIKE 使用当前的字符集(缺省 为 ISO-8859-1 Latin1)。 expr NOT REGEXP pat

expr NOT RLIKE pat 与 NOT (expr REGEXP pat)相同。 STRCMP(expr1,expr2) 如果字符串相同,STRCMP()回来 0,如果第一参数根据当前的排序次序 小于第二个,返回-1,否则返回 1。 mysql> select STRCMP('text', 'text2'); -> -1 mysql> select STRCMP('text2', 'text'); -> 1 mysql> select STRCMP('text', 'text'); -> 0

7.4.7 类型转换运算符 BINARY BINARY 操作符强制跟随它后面的字符串为一个二进制字符串。 即使列没 被定义为 BINARY 或 BLOB,这是一个强制列比较区分大小写的简易方 法。 mysql> select "a" = "A"; -> 1 mysql> select BINARY "a" = "A"; -> 0 BINARY 在 MySQL 3.23.0 中被引入。 7.4.8 控制流函数 IFNULL(expr1,expr2) 如果 expr1 不是 NULL, IFNULL()返回 expr1, 否则它返回 expr2。 IFNULL() 返回一个数字或字符串值,取决于它被使用的上下文环境。 mysql> select IFNULL(1,0); -> 1 mysql> select IFNULL(0,10); -> 0 mysql> select IFNULL(1/0,10); -> 10 mysql> select IFNULL(1/0,'yes'); -> 'yes'

IF(expr1,expr2,expr3) 如果 expr1 是 TRUE(expr1<>0 且 expr1<>NULL), 那么 IF()返回 expr2, 否则它返回 expr3。IF()返回一个数字或字符串值,取决于它被使用的上 下文。 mysql> select IF(1>2,2,3); -> 3 mysql> select IF(1<2,'yes','no');

-> 'yes' mysql> select IF(strcmp('test','test1'),'yes','no'); -> 'no' expr1 作为整数值被计算,它意味着如果你正在测试浮点或字符串值,你 应该使用一个比较操作来做。 mysql> select IF(0.1,1,0); -> 0 mysql> select IF(0.1<>0,1,0); -> 1 在上面的第一种情况中,IF(0.1)返回 0,因为 0.1 被变换到整数值, 导致 测试 IF(0)。这可能不是你期望的。在第二种情况中,比较测试原来的浮 点值看它是否是非零,比较的结果被用作一个整数。 CASE value WHEN [compare-value] THEN result [WHEN [compare-value] THEN result ...] [ELSE result] END

CASE WHEN [condition] THEN result [WHEN [condition] THEN result ...] [ELSE result] END 第一个版本返回 result,其中 value=compare-value。第二个版本中如果 第一个条件为真, 返回 result。 如果没有匹配的 result 值, 那么结果在 ELSE 后的 result 被返回。如果没有 ELSE 部分,那么 NULL 被返回。 mysql> SELECT CASE 1 WHEN 1 THEN "one" WHEN 2 THEN "two" ELSE "more" END; -> "one" mysql> SELECT CASE WHEN 1>0 THEN "true" ELSE "false" END; -> "true" mysql> SELECT CASE BINARY "B" when "a" then 1 when "b" then 2 END; -> NULL 7.4.9 数学函数

所有的数学函数在一个出错的情况下返回 NULL。 单目减。改变参数的符号。 mysql> select - 2; 注意,如果这个操作符与一个 BIGINT 使用,返回值是一个 BIGINT!这 意味着你应该避免在整数上使用-,那可能有值-2^63! ABS(X) 返回 X 的绝对值。 mysql> select ABS(2); -> 2 mysql> select ABS(-32); -> 32 该功能可安全用于 BIGINT 值。 SIGN(X) 返回参数的符号,为-1、0 或 1,取决于 X 是否是负数、零或正数。 mysql> select SIGN(-32); -> -1 mysql> select SIGN(0); -> 0 mysql> select SIGN(234); -> 1

MOD(N,M)

% 模 (类似 C 中的%操作符)。返回 N 被 M 除的余数。 mysql> select MOD(234, 10); -> 4 mysql> select 253 % 7; -> 1

mysql> select MOD(29,9); -> 2 这个函数可安全用于 BIGINT 值。 FLOOR(X) 返回不大于 X 的最大整数值。 mysql> select FLOOR(1.23); -> 1 mysql> select FLOOR(-1.23); -> -2 注意返回值被变换为一个 BIGINT! CEILING(X) 返回不小于 X 的最小整数值。 mysql> select CEILING(1.23); -> 2 mysql> select CEILING(-1.23); -> -1 注意返回值被变换为一个 BIGINT! ROUND(X) 返回参数 X 的四舍五入的一个整数。 mysql> select ROUND(-1.23); -> -1 mysql> select ROUND(-1.58); -> -2 mysql> select ROUND(1.58); -> 2

注意返回值被变换为一个 BIGINT! ROUND(X,D)

返回参数 X 的四舍五入的有 D 为小数的一个数字。如果 D 为 0,结果将 没有小数点或小数部分。 mysql> select ROUND(1.298, 1); -> 1.3 mysql> select ROUND(1.298, 0); -> 1 注意返回值被变换为一个 BIGINT! EXP(X) 返回值 e(自然对数的底)的 X 次方。 mysql> select EXP(2); -> 7.389056 mysql> select EXP(-2); -> 0.135335

LOG(X) 返回 X 的自然对数。 mysql> select LOG(2); -> 0.693147 mysql> select LOG(-2); -> NULL 如果你想要一个数字 X 的任意底 B 的对数,使用公式 LOG(X)/LOG(B)。 LOG10(X) 返回 X 的以 10 为底的对数。 mysql> select LOG10(2); -> 0.301030 mysql> select LOG10(100); -> 2.000000 mysql> select LOG10(-100); -> NULL POW(X,Y)

POWER(X,Y) 返回值 X 的 Y 次幂。 mysql> select POW(2,2); -> 4.000000 mysql> select POW(2,-2); -> 0.250000 SQRT(X) 返回非负数 X 的平方根。 mysql> select SQRT(4); -> 2.000000 mysql> select SQRT(20); -> 4.472136

PI() 返回 PI 的值(圆周率)。 mysql> select PI(); -> 3.141593 COS(X) 返回 X 的余弦, 在这里 X 以弧度给出。 mysql> select COS(PI()); -> -1.000000

SIN(X) 返回 X 的正弦值,在此 X 以弧度给出。 mysql> select SIN(PI()); -> 0.000000

TAN(X)

返回 X 的正切值,在此 X 以弧度给出。 mysql> select TAN(PI()+1); -> 1.557408

ACOS(X) 返回 X 反余弦, 即其余弦值是 X。 如果 X 不在-1 到 1 的范围, 返回 NULL。 mysql> select ACOS(1); -> 0.000000 mysql> select ACOS(1.0001); -> NULL mysql> select ACOS(0); -> 1.570796

ASIN(X) 返回 X 反正弦值,即其正弦值是 X。L 如果 X 不在-1 到 1 的范围,返回 NULL。 mysql> select ASIN(0.2); -> 0.201358 mysql> select ASIN('foo'); -> 0.000000

ATAN(X) 返回 X 的反正切值,即其正切值是 X。 mysql> select ATAN(2); -> 1.107149 mysql> select ATAN(-2); -> -1.107149 ATAN2(X,Y)

返回 2 个变量 X 和 Y 的反正切。它类似于计算 Y/X 的反正切,除了两个 参数的符号被用来决定结果的象限。 mysql> select ATAN(-2,2); -> -0.785398 mysql> select ATAN(PI(),0); -> 1.570796 COT(X) 返回 X 的余切。 mysql> select COT(12); -> -1.57267341 mysql> select COT(0); -> NULL RAND()

RAND(N) 返回在范围 0 到 1.0 内的随机浮点值。如果一个整数参数 N 被指定,它 被用作种子值。 mysql> select RAND(); -> 0.5925 mysql> select RAND(20); -> 0.1811 mysql> select RAND(20); -> 0.1811 mysql> select RAND(); -> 0.2079 mysql> select RAND(); -> 0.7888 你不能在一个 ORDER BY 子句用 RAND()值使用列,因为 ORDER BY 将重复计算列多次。 然而在 MySQL3.23 中, 你可以做:SELECT * FROM

table_name ORDER BY RAND(),这是有利于得到一个来自 SELECT * FROM table1,table2 WHERE a=b AND c<d ORDER BY RAND() LIMIT 1000 的集合的随机样本。注意在一个 WHERE 子句里的一个 RAND()将 在每次 WHERE 被执行时重新评估。 LEAST(X,Y,...) 有 2 和 2 个以上的参数,返回最小(最小值)的参数。参数使用下列规则进 行比较:
?

如果返回值被使用在一个 INTEGER 上下文, 或所有的参数都是

整数值,他们作为整数比较。
?

如果返回值被使用在一个 REAL 上下文,或所有的参数是实数

值,他们作为实数比较。
?

如果任何参数是一个大小敏感的字符串, 参数作为大小写敏感的

字符串被比较。
?

在其他的情况下,参数作为大小写无关的字符串被比较。

mysql> select LEAST(2,0); -> 0 mysql> select LEAST(34.0,3.0,5.0,767.0); -> 3.0 mysql> select LEAST("B","A","C"); -> "A" 在 MySQL 3.22.5 以前的版本,你可以使用 MIN()而不是 LEAST。 GREATEST(X,Y,...) 返回最大(最大值)的参数。参数使用与 LEAST 一样的规则进行比较。 mysql> select GREATEST(2,0); -> 2 mysql> select GREATEST(34.0,3.0,5.0,767.0); -> 767.0 mysql> select GREATEST("B","A","C"); -> "C"

在 MySQL 在 3.22.5 以前的版本, 你能使用 MAX()而不是 GREATEST. DEGREES(X) 返回参数 X,从弧度变换为角度。 mysql> select DEGREES(PI()); -> 180.000000 RADIANS(X) 返回参数 X,从角度变换为弧度。 mysql> select RADIANS(90); -> 1.570796 TRUNCATE(X,D) 返回数字 X,截断为 D 位小数。如果 D 为 0,结果将没有小数点或小数 部分。 mysql> select TRUNCATE(1.223,1); -> 1.2 mysql> select TRUNCATE(1.999,1); -> 1.9 mysql> select TRUNCATE(1.999,0); -> 1

7.4.10 字符串函数 如果结果的长度大于服务器参数 max_allowed_packet,字符串值函数返回 NULL。见 10.2.3 调节服务器参数。 对于针对字符串位置的操作,第一个位置被标记为 1。 ASCII(str) 返回字符串 str 的最左面字符的 ASCII 代码值。如果 str 是空字符串,返 回 0。如果 str 是 NULL,返回 NULL。 mysql> select ASCII('2'); -> 50 mysql> select ASCII(2); -> 50

mysql> select ASCII('dx'); -> 100 也可参见 ORD()函数。 ORD(str) 如果字符串 str 最左面字符是一个多字节字符,通过以格式((first byte ASCII code)*256+(second byte ASCII code))[*256+third byte ASCII code...]返回字符的 ASCII 代码值来返回多字节字符代码。如果最左面的 字符不是一个多字节字符。返回与 ASCII()函数返回的相同值。 mysql> select ORD('2'); -> 50

CONV(N,from_base,to_base) 在不同的数字基之间变换数字。 返回数字 N 的字符串数字, from_base 从 基变换为 to_base 基,如果任何参数是 NULL,返回 NULL。参数 N 解释 为一个整数, 但是可以指定为一个整数或一个字符串。 最小基是 2 且最大 的基是 36。 如果 to_base 是一个负数, 被认为是一个有符号数, N 否则, N 被当作无符号数。 CONV 以 64 位点精度工作。 mysql> select CONV("a",16,2); -> '1010' mysql> select CONV("6E",18,8); -> '172' mysql> select CONV(-17,10,-18); -> '-H' mysql> select CONV(10+"10"+'10'+0xa,10,10); -> '40'

BIN(N) 返回二进制值 N 的一个字符串表示, 在此 N 是一个长整数(BIGINT)数字, 这等价于 CONV(N,10,2)。如果 N 是 NULL,返回 NULL。 mysql> select BIN(12);

-> '1100' OCT(N) 返回八进制值 N 的一个字符串的表示,在此 N 是一个长整型数字,这等 价于 CONV(N,10,8)。如果 N 是 NULL,返回 NULL。 mysql> select OCT(12); -> '14'

HEX(N) 返回十六进制值 N 一个字符串的表示,在此 N 是一个长整型(BIGINT)数 字,这等价于 CONV(N,10,16)。如果 N 是 NULL,返回 NULL。 mysql> select HEX(255); -> 'FF'

CHAR(N,...) CHAR()将参数解释为整数并且返回由这些整数的 ASCII 代码字符组成的 一个字符串。NULL 值被跳过。 mysql> select CHAR(77,121,83,81,'76'); -> 'MySQL' mysql> select CHAR(77,77.3,'77.3'); -> 'MMM'

CONCAT(str1,str2,...) 返回来自于参数连结的字符串。如果任何参数是 NULL,返回 NULL。可 以有超过 2 个的参数。一个数字参数被变换为等价的字符串形式。 mysql> select CONCAT('My', 'S', 'QL'); -> 'MySQL' mysql> select CONCAT('My', NULL, 'QL'); -> NULL mysql> select CONCAT(14.3); -> '14.3'

LENGTH(str)

OCTET_LENGTH(str)

CHAR_LENGTH(str)

CHARACTER_LENGTH(str) 返回字符串 str 的长度。 mysql> select LENGTH('text'); -> 4 mysql> select OCTET_LENGTH('text'); -> 4 注意,对于多字节字符,其 CHAR_LENGTH()仅计算一次。 LOCATE(substr,str)

POSITION(substr IN str) 返回子串 substr 在字符串 str 第一个出现的位置,如果 substr 不是在 str 里面,返回 0. mysql> select LOCATE('bar', 'foobarbar'); -> 4 mysql> select LOCATE('xbar', 'foobar'); -> 0 该函数是多字节可靠的。 LOCATE(substr,str,pos) 返回子串 substr 在字符串 str 第一个出现的位置,从位置 pos 开始。如果 substr 不是在 str 里面,返回 0。 mysql> select LOCATE('bar', 'foobarbar',5); -> 7 这函数是多字节可靠的。 INSTR(str,substr)

返回子串 substr 在字符串 str 中的第一个出现的位置。 这与有 2 个参数形 式的 LOCATE()相同,除了参数被颠倒。 mysql> select INSTR('foobarbar', 'bar'); -> 4 mysql> select INSTR('xbar', 'foobar'); -> 0 这函数是多字节可靠的。 LPAD(str,len,padstr) 返回字符串 str,左面用字符串 padstr 填补直到 str 是 len 个字符长。 mysql> select LPAD('hi',4,'??'); -> '??hi'

RPAD(str,len,padstr) 返回字符串 str,右面用字符串 padstr 填补直到 str 是 len 个字符长。 mysql> select RPAD('hi',5,'?'); -> 'hi???' LEFT(str,len) 返回字符串 str 的最左面 len 个字符。 mysql> select LEFT('foobarbar', 5); -> 'fooba' 该函数是多字节可靠的。 RIGHT(str,len) 返回字符串 str 的最右面 len 个字符。 mysql> select RIGHT('foobarbar', 4); -> 'rbar' 该函数是多字节可靠的。 SUBSTRING(str,pos,len)

SUBSTRING(str FROM pos FOR len)

MID(str,pos,len) 从字符串 str 返回一个 len 个字符的子串,从位置 pos 开始。使用 FROM 的变种形式是 ANSI SQL92 语法。 mysql> select SUBSTRING('Quadratically',5,6); -> 'ratica' 该函数是多字节可靠的。 SUBSTRING(str,pos)

SUBSTRING(str FROM pos) 从字符串 str 的起始位置 pos 返回一个子串。 mysql> select SUBSTRING('Quadratically',5); -> 'ratically' mysql> select SUBSTRING('foobarbar' FROM 4); -> 'barbar' 该函数是多字节可靠的。 SUBSTRING_INDEX(str,delim,count) 返回从字符串 str 的第 count 个出现的分隔符 delim 之后的子串。如果 count 是正数,返回最后的分隔符到左边(从左边数) 的所有字符。如果 count 是负数,返回最后的分隔符到右边的所有字符(从右边数)。 mysql> select SUBSTRING_INDEX('www.mysql.com', '.', 2); -> 'www.mysql' mysql> select SUBSTRING_INDEX('www.mysql.com', '.', -2); -> 'mysql.com' 该函数对多字节是可靠的。 LTRIM(str) 返回删除了其前置空格字符的字符串 str。 mysql> select LTRIM(' barbar'); -> 'barbar' RTRIM(str)

返回删除了其拖后空格字符的字符串 str。 mysql> select RTRIM('barbar -> 'barbar' 该函数对多字节是可靠的。 TRIM([[BOTH | LEADING | TRAILING] [remstr] FROM] str) 返回字符串 str,其所有 remstr 前缀或后缀被删除了。如果没有修饰符 BOTH、LEADING 或 TRAILING 给出,BOTH 被假定。如果 remstr 没被 指定,空格被删除。 mysql> select TRIM(' -> 'bar' mysql> select TRIM(LEADING 'x' FROM 'xxxbarxxx'); -> 'barxxx' mysql> select TRIM(BOTH 'x' FROM 'xxxbarxxx'); -> 'bar' mysql> select TRIM(TRAILING 'xyz' FROM 'barxxyz'); -> 'barx' 该函数对多字节是可靠的。 SOUNDEX(str) 返回 str 的一个同音字符串。听起来“大致相同”的 2 个字符串应该有相同 的同音字符串。 一个“标准”的同音字符串长是 4 个字符, 但是 SOUNDEX() 函数返回一个任意长的字符串。你可以在结果上使用 SUBSTRING()得到 一个“标准”的 同音串。所有非数字字母字符在给定的字符串中被忽略。 所有在 A-Z 之外的字符国际字母被当作元音。 mysql> select SOUNDEX('Hello'); -> 'H400' mysql> select SOUNDEX('Quadratically'); -> 'Q36324' bar '); ');

SPACE(N)

返回由 N 个空格字符组成的一个字符串。 mysql> select SPACE(6); -> ' '

REPLACE(str,from_str,to_str) 返回字符串 str,其字符串 from_str 的所有出现由字符串 to_str 代替。 mysql> select REPLACE('www.mysql.com', 'w', 'Ww'); -> 'WwWwWw.mysql.com' 该函数对多字节是可靠的。 REPEAT(str,count) 返回由重复 countTimes 次的字符串 str 组成的一个字符串。 如果 count <= 0,返回一个空字符串。如果 str 或 count 是 NULL,返回 NULL。 mysql> select REPEAT('MySQL', 3); -> 'MySQLMySQLMySQL'

REVERSE(str) 返回颠倒字符顺序的字符串 str。 mysql> select REVERSE('abc'); -> 'cba' 该函数对多字节可靠的。 INSERT(str,pos,len,newstr) 返回字符串 str,在位置 pos 起始的子串且 len 个字符长得子串由字符串 newstr 代替。 mysql> select INSERT('Quadratic', 3, 4, 'What'); -> 'QuWhattic' 该函数对多字节是可靠的。 ELT(N,str1,str2,str3,...) 如果 N= 1,返回 str1,如果 N= 2,返回 str2,等等。如果 N 小于 1 或大 于参数个数,返回 NULL。ELT()是 FIELD()反运算。 mysql> select ELT(1, 'ej', 'Heja', 'hej', 'foo');

-> 'ej' mysql> select ELT(4, 'ej', 'Heja', 'hej', 'foo'); -> 'foo' FIELD(str,str1,str2,str3,...) 返回 str 在 str1, str2, str3, ...清单的索引。 如果 str 没找到, 返回 0。 FIELD() 是 ELT()反运算。 mysql> select FIELD('ej', 'Hej', 'ej', 'Heja', 'hej', 'foo'); -> 2 mysql> select FIELD('fo', 'Hej', 'ej', 'Heja', 'hej', 'foo'); -> 0 FIND_IN_SET(str,strlist) 如果字符串 str 在由 N 子串组成的表 strlist 之中,返回一个 1 到 N 的值。 一个字符串表是被“,”分隔的子串组成的一个字符串。 如果第一个参数是一 个常数字符串并且第二个参数是一种类型为 SET 的列,FIND_IN_SET() 函数被优化而使用位运算!如果 str 不是在 strlist 里面或如果 strlist 是空 字符串,返回 0。如果任何一个参数是 NULL,返回 NULL。如果第一个 参数包含一个“,”,该函数将工作不正常。 mysql> SELECT FIND_IN_SET('b','a,b,c,d'); -> 2

MAKE_SET(bits,str1,str2,...) 返回一个集合 (包含由“,”字符分隔的子串组成的一个字符串),由相应的 位在 bits 集合中的的字符串组成。 str1 对应于位 0, str2 对应位 1, 等等。 在 str1, str2, ...中的 NULL 串不添加到结果中。 mysql> SELECT MAKE_SET(1,'a','b','c'); -> 'a' mysql> SELECT MAKE_SET(1 | 4,'hello','nice','world'); -> 'hello,world' mysql> SELECT MAKE_SET(0,'a','b','c'); -> ''

EXPORT_SET(bits,on,off,[separator,[number_of_bits]]) 返回一个字符串, 在这里对于在“bits”中设定每一位,你得到一个“on”字符 串,并且对于每个复位(reset)的位,你得到一个“off”字符串。每个字符串 用“separator”分隔(缺省“,”),并且只有“bits”的“number_of_bits” (缺省 64) 位被使用。 mysql> select EXPORT_SET(5,'Y','N',',',4) -> Y,N,Y,N LCASE(str)

LOWER(str) 返回字符串 str,根据当前字符集映射(缺省是 ISO-8859-1 Latin1)把所有 的字符改变成小写。该函数对多字节是可靠的。 mysql> select LCASE('QUADRATICALLY'); -> 'quadratically'

UCASE(str)

UPPER(str) 返回字符串 str,根据当前字符集映射(缺省是 ISO-8859-1 Latin1)把所有 的字符改变成大写。该函数对多字节是可靠的。 mysql> select UCASE('Hej'); -> 'HEJ' 该函数对多字节是可靠的。 LOAD_FILE(file_name) 读入文件并且作为一个字符串返回文件内容。文件必须在服务器上,你必 须指定到文件的完整路径名,而且你必须有 file 权限。文件必须所有内容 都是可读的并且小于 max_allowed_packet。如果文件不存在或由于上面 原因之一不能被读出,函数返回 NULL。 mysql> UPDATE table_name SET blob_column=LOAD_FILE("/tmp/picture")

WHERE id=1;

MySQL 必要时自动变换数字为字符串,并且反过来也如此: mysql> SELECT 1+"1"; -> 2 mysql> SELECT CONCAT(2,' test'); -> '2 test' 如果你想要明确地变换一个数字到一个字符串, 把它作为参数传递到 CONCAT()。 如果字符串函数提供一个二进制字符串作为参数, 结果字符串也是一个二进制字 符串。被变换到一个字符串的数字被当作是一个二进制字符串。这仅影响比较。 7.4.11 日期和时间函数 对于每个类型拥有的值范围以及并且指定日期何时间值的有效格式的描述见 7.3.6 日期和时间类型。 这里是一个使用日期函数的例子。下面的查询选择了所有记录,其 date_col 的 值是在最后 30 天以内: mysql> SELECT something FROM table WHERE TO_DAYS(NOW()) - TO_DAYS(date_col) <= 30; DAYOFWEEK(date) 返回日期 date 的星期索引(1=星期天, 2=星期一, ……7=星期六)。 这些索 引值对应于 ODBC 标准。 mysql> select DAYOFWEEK('1998-02-03'); -> 3

WEEKDAY(date) 返回 date 的星期索引(0=星期一,1=星期二, ……6= 星期天)。 mysql> select WEEKDAY('1997-10-04 22:23:00'); -> 5 mysql> select WEEKDAY('1997-11-05'); -> 2

DAYOFMONTH(date) 返回 date 的月份中日期,在 1 到 31 范围内。 mysql> select DAYOFMONTH('1998-02-03'); -> 3 DAYOFYEAR(date) 返回 date 在一年中的日数, 在 1 到 366 范围内。 mysql> select DAYOFYEAR('1998-02-03'); -> 34 MONTH(date) 返回 date 的月份,范围 1 到 12。 mysql> select MONTH('1998-02-03'); -> 2

DAYNAME(date) 返回 date 的星期名字。 mysql> select DAYNAME("1998-02-05"); -> 'Thursday' MONTHNAME(date) 返回 date 的月份名字。 mysql> select MONTHNAME("1998-02-05"); -> 'February'

QUARTER(date) 返回 date 一年中的季度,范围 1 到 4。 mysql> select QUARTER('98-04-01'); -> 2

WEEK(date)

WEEK(date,first)

对于星期天是一周的第一天的地方, 有一个单个参数, 返回 date 的周数, 范围在 0 到 52。 个参数形式 WEEK()允许你指定星期是否开始于星期天 2 或星期一。如果第二个参数是 0,星期从星期天开始,如果第二个参数是 1,从星期一开始。 mysql> select WEEK('1998-02-20'); -> 7 mysql> select WEEK('1998-02-20',0); -> 7 mysql> select WEEK('1998-02-20',1); -> 8 YEAR(date) 返回 date 的年份,范围在 1000 到 9999。 mysql> select YEAR('98-02-03'); -> 1998 HOUR(time) 返回 time 的小时,范围是 0 到 23。 mysql> select HOUR('10:05:03'); -> 10 MINUTE(time) 返回 time 的分钟,范围是 0 到 59。 mysql> select MINUTE('98-02-03 10:05:03'); -> 5 SECOND(time) 回来 time 的秒数,范围是 0 到 59。 mysql> select SECOND('10:05:03'); -> 3 PERIOD_ADD(P,N) 增加 N 个月到阶段 P(以格式 YYMM 或 YYYYMM)。以格式 YYYYMM 返回值。注意阶段参数 P 不是日期值。 mysql> select PERIOD_ADD(9801,2);

-> 199803 PERIOD_DIFF(P1,P2) 返回在时期 P1 和 P2 之间月数, 和 P2 应该以格式 YYMM 或 YYYYMM。 P1 注意,时期参数 P1 和 P2 不是日期值。 mysql> select PERIOD_DIFF(9802,199703); -> 11

DATE_ADD(date,INTERVAL expr type)

DATE_SUB(date,INTERVAL expr type)

ADDDATE(date,INTERVAL expr type)

SUBDATE(date,INTERVAL expr type) 这些功能执行日期运算。对于 MySQL 3.22,他们是新的。ADDDATE() 和 SUBDATE()是 DATE_ADD()和 DATE_SUB()的同义词。在 MySQL 3.23 中,你可以使用+和-而不是 DATE_ADD()和 DATE_SUB()。(见例 子)date 是一个指定开始日期的 DATETIME 或 DATE 值,expr 是指定 加到开始日期或从开始日期减去的间隔值一个表达式,expr 是一个字符 串;它可以以一个“-”开始表示负间隔。type 是一个关键词,指明表达式 应该如何被解释。EXTRACT(type FROM date)函数从日期中返回“type” 间隔。下表显示了 type 和 expr 参数怎样被关联: type 值 SECOND MINUTE HOUR DAY MONTH 含义 秒 分钟 时间 天 月 期望的 expr 格式 SECONDS MINUTES HOURS DAYS MONTHS

YEAR



YEARS "MINUTES:SECONDS" "HOURS:MINUTES" "DAYS HOURS" "YEARS-MONTHS" "HOURS:MINUTES:SECONDS" "DAYS HOURS:MINUTES" "DAYS HOURS:MINUTES:SECONDS"

MINUTE_SECOND 分钟和秒 HOUR_MINUTE DAY_HOUR YEAR_MONTH HOUR_SECOND DAY_MINUTE DAY_SECOND 小时和分钟 天和小时 年和月 小时, 分钟, 天, 小时, 分钟 天, 小时, 分钟, 秒

MySQL 在 expr 格式中允许任何标点分隔符。表示显示的是建议的分隔 符。如果 date 参数是一个 DATE 值并且你的计算仅仅包含 YEAR、 MONTH 和 DAY 部分(即,没有时间部分),结果是一个 DATE 值。否则 结果是一个 DATETIME 值。 mysql> SELECT "1997-12-31 23:59:59" + INTERVAL 1 SECOND; -> 1998-01-01 00:00:00 mysql> SELECT INTERVAL 1 DAY + "1997-12-31"; -> 1998-01-01 mysql> SELECT "1998-01-01" - INTERVAL 1 SECOND; -> 1997-12-31 23:59:59 mysql> SELECT DATE_ADD("1997-12-31 23:59:59", INTERVAL 1 SECOND); -> 1998-01-01 00:00:00 mysql> SELECT DATE_ADD("1997-12-31 23:59:59", INTERVAL 1 DAY); -> 1998-01-01 23:59:59 mysql> SELECT DATE_ADD("1997-12-31 23:59:59", INTERVAL "1:1" MINUTE_SECOND); -> 1998-01-01 00:01:00

mysql> SELECT DATE_SUB("1998-01-01 00:00:00", INTERVAL "1 1:1:1" DAY_SECOND); -> 1997-12-30 22:58:59 mysql> SELECT DATE_ADD("1998-01-01 00:00:00", INTERVAL "-1 10" DAY_HOUR); -> 1997-12-30 14:00:00 mysql> SELECT DATE_SUB("1998-01-02", INTERVAL 31 DAY); -> 1997-12-02 mysql> SELECT EXTRACT(YEAR FROM "1999-07-02"); -> 1999 mysql> SELECT EXTRACT(YEAR_MONTH FROM "1999-07-02 01:02:03"); -> 199907 mysql> SELECT EXTRACT(DAY_MINUTE FROM "1999-07-02 01:02:03"); -> 20102 如果你指定太短的间隔值(不包括 type 关键词期望的间隔部分),MySQL 假设你省掉了间隔值的最左面部分。例如,如果你指定一个 type 是 DAY_SECOND,值 expr 被希望有天、小时、分钟和秒部分。如果你象 "1:10"这样指定值,MySQL 假设日子和小时部分是丢失的并且值代表分 钟和秒。换句话说,"1:10" DAY_SECOND 以它等价于"1:10" MINUTE_SECOND 的方式解释,这对那 MySQL 解释 TIME 值表示经过 的时间而非作为一天的时间的方式有二义性。 如果你使用确实不正确的日 期,结果是 NULL。如果你增加 MONTH、YEAR_MONTH 或 YEAR 并 且结果日期大于新月份的最大值天数,日子在新月用最大的天调整。 mysql> select DATE_ADD('1998-01-30', Interval 1 month); -> 1998-02-28 注意,从前面的例子中词 INTERVAL 和 type 关键词不是区分大小写的。 TO_DAYS(date)

给出一个日期 date,返回一个天数(从 0 年的天数)。 mysql> select TO_DAYS(950501); -> 728779 mysql> select TO_DAYS('1997-10-07'); -> 729669 TO_DAYS()不打算用于使用格列高里历(1582)出现前的值。 FROM_DAYS(N) 给出一个天数 N,返回一个 DATE 值。 mysql> select FROM_DAYS(729669); -> '1997-10-07' TO_DAYS()不打算用于使用格列高里历(1582)出现前的值。 DATE_FORMAT(date,format) 根据 format 字符串格式化 date 值。下列修饰符可以被用在 format 字符 串中: %M %W %D %Y %y %a %d %e %m %c %b %j %H 月名字(January……December) 星期名字(Sunday……Saturday) 有英语前缀的月份的日期(1st, 2nd, 3rd, 等等。) 年, 数字, 4 位 年, 数字, 2 位 缩写的星期名字(Sun……Sat) 月份中的天数, 数字(00……31) 月份中的天数, 数字(0……31) 月, 数字(01……12) 月, 数字(1……12) 缩写的月份名字(Jan……Dec) 一年中的天数(001……366) 小时(00……23)

%k %h %I %l %i %r %T %S %s %p %w %U %u %%

小时(0……23) 小时(01……12) 小时(01……12) 小时(1……12) 分钟, 数字(00……59) 时间,12 小时(hh:mm:ss [AP]M) 时间,24 小时(hh:mm:ss) 秒(00……59) 秒(00……59) AM 或 PM 一个星期中的天数(0=Sunday ……6=Saturday ) 星期(0……52), 这里星期天是星期的第一天 星期(0……52), 这里星期一是星期的第一天 一个文字“%”。

所有的其他字符不做解释被复制到结果中。 mysql> select DATE_FORMAT('1997-10-04 22:23:00', '%W %M %Y'); -> 'Saturday October 1997' mysql> select DATE_FORMAT('1997-10-04 22:23:00', '%H:%i:%s'); -> '22:23:00' mysql> select DATE_FORMAT('1997-10-04 22:23:00', '%D %y %a %d %m %b %j'); -> '4th 97 Sat 04 10 Oct 277' mysql> select DATE_FORMAT('1997-10-04 22:23:00', '%H %k %I %r %T %S %w'); -> '22 22 10 10:23:00 PM 22:23:00 00 6' MySQL3.23 中, 在格式修饰符字符前需要%。 MySQL 更早的版本中, 在 % 是可选的。

TIME_FORMAT(time,format) 这象上面的 DATE_FORMAT()函数一样使用,但是 format 字符串只能包 含处理小时、分钟和秒的那些格式修饰符。其他修饰符产生一个 NULL 值或 0。 CURDATE()

CURRENT_DATE 以'YYYY-MM-DD'或 YYYYMMDD 格式返回今天日期值, 取决于函数是在 一个字符串还是数字上下文被使用。 mysql> select CURDATE(); -> '1997-12-15' mysql> select CURDATE() + 0; -> 19971215 CURTIME()

CURRENT_TIME 以'HH:MM:SS'或 HHMMSS 格式返回当前时间值,取决于函数是在一个 字符串还是在数字的上下文被使用。 mysql> select CURTIME(); -> '23:50:26' mysql> select CURTIME() + 0; -> 235026 NOW()

SYSDATE()

CURRENT_TIMESTAMP 以'YYYY-MM-DD HH:MM:SS'或 YYYYMMDDHHMMSS 格式返回当前的 日期和时间,取决于函数是在一个字符串还是在数字的上下文被使用。 mysql> select NOW();

-> '1997-12-15 23:50:26' mysql> select NOW() + 0; -> 19971215235026 UNIX_TIMESTAMP()

UNIX_TIMESTAMP(date) 如果没有参数调用,返回一个 Unix 时间戳记(从'1970-01-01 00:00:00'GMT 开始的秒数)。 如果 UNIX_TIMESTAMP()用一个 date 参数 被调用,它返回从'1970-01-01 00:00:00' GMT 开始的秒数值。date 可以 是一个 DATE 字符串、 一个 DATETIME 字符串、 一个 TIMESTAMP 或以 YYMMDD 或 YYYYMMDD 格式的本地时间的一个数字。 mysql> select UNIX_TIMESTAMP(); -> 882226357 mysql> select UNIX_TIMESTAMP('1997-10-04 22:23:00'); -> 875996580 当 UNIX_TIMESTAMP 被用于一个 TIMESTAMP 列, 函数将直接接受值, 没有隐含的“string-to-unix-timestamp”变换。 FROM_UNIXTIME(unix_timestamp) 以'YYYY-MM-DD HH:MM:SS'或 YYYYMMDDHHMMSS 格式返回 unix_timestamp 参数所表示的值,取决于函数是在一个字符串还是或数 字上下文中被使用。 mysql> select FROM_UNIXTIME(875996580); -> '1997-10-04 22:23:00' mysql> select FROM_UNIXTIME(875996580) + 0; -> 19971004222300 FROM_UNIXTIME(unix_timestamp,format) 返回表示 Unix 时间标记的一个字符串,根据 format 字符串格式化。 format 可以包含与 DATE_FORMAT()函数列出的条目同样的修饰符。 mysql> select FROM_UNIXTIME(UNIX_TIMESTAMP(), '%Y %D %M %h:%i:%s %x');

-> '1997 23rd December 03:43:30 x' SEC_TO_TIME(seconds) 返回 seconds 参数, 变换成小时、 分钟和秒, 值以'HH:MM:SS'或 HHMMSS 格式化,取决于函数是在一个字符串还是在数字上下文中被使用。 mysql> select SEC_TO_TIME(2378); -> '00:39:38' mysql> select SEC_TO_TIME(2378) + 0; -> 3938 TIME_TO_SEC(time) 返回 time 参数,转换成秒。 mysql> select TIME_TO_SEC('22:23:00'); -> 80580 mysql> select TIME_TO_SEC('00:39:38'); -> 2378 7.4.12 其他函数 DATABASE() 返回当前的数据库名字。 mysql> select DATABASE(); -> 'test' 如果没有当前的数据库,DATABASE()返回空字符串。 USER()

SYSTEM_USER()

SESSION_USER() 返回当前 MySQL 用户名。 mysql> select USER(); -> 'davida@localhost'

在 MySQL 3.22.11 或以后版本中,这包括用户名和客户主机名。你可以 象这样只提取用户名部分(值是否包括主机名部分均可工作): mysql> select substring_index(USER(),"@",1); -> 'davida' PASSWORD(str) 从纯文本口令 str 计算一个口令字符串。 该函数被用于为了在 user 授权表 的 Password 列中存储口令而加密 MySQL 口令。 mysql> select PASSWORD('badpwd'); -> '7f84554057dd964b' PASSWORD()加密是非可逆的。PASSWORD()不以与 Unix 口令加密的 相同的方法执行口令加密。你不应该假定如果你的 Unix 口令和你的 MySQL 口令是一样的,PASSWORD()将导致与在 Unix 口令文件存储的 相同的加密值。见 ENCRYPT()。 ENCRYPT(str[,salt]) 使用 Unix crypt()系统调用加密 str。salt 参数应该是一个有 2 个字符的字 符串。(MySQL 3.22.16 中,salt 可以长于 2 个字符。) mysql> select ENCRYPT("hello"); -> 'VxuFAJXVARROc' 如果 crypt()在你的系统上不可用,ENCRYPT()总是返回 NULL。 ENCRYPT()只保留 str 起始 8 个字符而忽略所有其他,至少在某些系统 上是这样。这将由底层的 crypt()系统调用的行为决定。 ENCODE(str,pass_str) 使用 pass_str 作为口令加密 str。为了解密结果,使用 DECODE()。结果 是一个二进制字符串,如果你想要在列中保存它,使用一个 BLOB 列类 型。 DECODE(crypt_str,pass_str) 使用 pass_str 作为口令解密加密的字符串 crypt_str。crypt_str 应该是一 个由 ENCODE()返回的字符串。 MD5(string)

对字符串计算 MD5 校验和。值作为一个 32 长的十六进制数字被返回可 以,例如用作哈希(hash)键。 mysql> select MD5("testing") -> 'ae2b1fca515949e5d54fb22b8ed95575' 这是一个“RSA 数据安全公司的 MD5 消息摘要算法”。 LAST_INSERT_ID([expr]) 返回被插入一个 AUTO_INCREMENT 列的最后一个自动产生的值。见 20.4.29 mysql_insert_id()。 mysql> select LAST_INSERT_ID(); -> 195 产生的最后 ID 以每个连接为基础在服务器被维护,它不会被其他客户改 变。如果你更新另外一个有非魔术值(即,不是 NULL 和不是 0 的一个值) 的 AUTO_INCREMENT 列,它甚至不会被改变。如果 expr 作为一个参 数在一个 UPDATE 子句的 LAST_INSERT_ID()里面给出,那么参数值作 为一个 LAST_INSERT_ID()值被返回。这可以用来模仿顺序:首先创建 表: mysql> create table sequence (id int not null); mysql> insert into sequence values (0); 然后表能被用来产生顺序号,象这样: mysql> update sequence set id=LAST_INSERT_ID(id+1); 你可以不调用 LAST_INSERT_ID()而产生顺序,但是这样使用函数的实 用程序在服务器上自动维护 ID 值作为最后自动产生的值。你可以检索新 的 ID 值,就像你能读入正常 MySQL 中的任何正常的 AUTO_INCREMENT 值一样。例如,LAST_INSERT_ID()(没有一个参 数 )将返回新 ID。C API 函数 mysql_insert_id()也可被用来得到值。 FORMAT(X,D) 格式化数字 X 为类似于格式'#,###,###.##',四舍五入到 D 为小数。如果 D 为 0,结果将没有小数点和小数部分。 mysql> select FORMAT(12332.123456, 4); -> '12,332.1235'

mysql> select FORMAT(12332.1,4); -> '12,332.1000' mysql> select FORMAT(12332.2,0); -> '12,332' VERSION() 返回表明 MySQL 服务器版本的一个字符串。 mysql> select VERSION(); -> '3.22.19b-log' GET_LOCK(str,timeout) 试图获得由字符串 str 给定的一个名字的锁定,第二个 timeout 为超时。 如果锁定成功获得,返回 1,如果尝试超时了,返回 0,或如果发生一个 错误,返回 NULL(例如从存储器溢出或线程用 mysqladmin kill 被杀死)。 当你执行 RELEASE_LOCK()时、 执行一个新的 GET_LOCK()或线程终止 时,一个锁定被释放。该函数可以用来实现应用锁或模拟记录锁,它阻止 其他客户用同样名字的锁定请求; 赞成一个给定的锁定字符串名字的客户 可以使用字符串执行子协作建议的锁定。 mysql> select GET_LOCK("lock1",10); -> 1 mysql> select GET_LOCK("lock2",10); -> 1 mysql> select RELEASE_LOCK("lock2"); -> 1 mysql> select RELEASE_LOCK("lock1"); -> NULL 注意,第二个 RELEASE_LOCK()调用返回 NULL,因为锁"lock1"自动地 被第二个 GET_LOCK()调用释放。 RELEASE_LOCK(str) 释放字符串 str 命名的通过 GET_LOCK()获得的锁。如果锁被释放,返回 1, 如果锁没被这个线程锁定(在此情况下锁没被释放)返回 0, 并且如果命

名的锁不存在, 返回 NULL。 如果锁从来没有通过调用 GET_LOCK()获得 或如果它已经被释放了,锁将不存在。 BENCHMARK(count,expr) BENCHMARK()函数重复 countTimes 次执行表达式 expr, 它可以用于计 时 MySQL 处理表达式有多快。结果值总是 0。意欲用于 mysql 客户,它 报告查询的执行时间。 mysql> select BENCHMARK(1000000,encode("hello","goodbye")); +----------------------------------------------+ | BENCHMARK(1000000,encode("hello","goodbye")) | +----------------------------------------------+ | +----------------------------------------------+ 1 row in set (4.74 sec) 报告的时间是客户端的经过时间,不是在服务器端的 CPU 时间。执行 BENCHMARK()若干次可能是明智的, 并且注意服务器机器的负载有多重 来解释结果。 7.4.13 与 GROUP BY 子句一起使用的函数 如果你在不包含 GROUP BY 子句的一个语句中使用聚合函数,它等价于聚合所 有行。 COUNT(expr) 返回由一个 SELECT 语句检索出来的行的非 NULL 值的数目。 mysql> select student.student_name,COUNT(*) from student,course where student.student_id=course.student_id GROUP BY student_name; COUNT(*)在它返回的检索出来的行数目上有些不同,不管他们是否包含 NULL 值。如果 SELECT 从一个表检索,或没有检索出其他列并且没有 WHERE 子句,COUNT(*)被优化以便快速地返回。例如: mysql> select COUNT(*) from student; 0|

COUNT(DISTINCT expr,[expr...]) 返回一个不同值的数目。 mysql> select COUNT(DISTINCT results) from student; 在 MySQL 中, 你可以通过给出一个表达式列表以得到不同的表达式组合 的数目。在 ANSI SQL 中,你可能必须在 CODE(DISTINCT ..)内进行所 有表达式的连接。 AVG(expr) 返回 expr 的平均值。 mysql> select student_name, AVG(test_score) from student GROUP BY student_name;

MIN(expr)

MAX(expr) 返回 expr 的最小或最大值。 MIN()和 MAX()可以有一个字符串参数; 在这 种的情况下,他们返回最小或最大的字符串值。 mysql> select student_name, MIN(test_score), MAX(test_score) from student GROUP BY student_name;

SUM(expr) 返回 expr 的和。注意,如果返回的集合没有行,它返回 NULL! STD(expr)

STDDEV(expr) 返回 expr 标准差(deviation)。这是对 ANSI SQL 的扩展。该函数的形式 STDDEV()是提供与 Oracle 的兼容性。 BIT_OR(expr)

返回 expr 里所有位的位或。计算用 64 位(BIGINT)精度进行。 BIT_AND(expr) 返回 expr 里所有位的位与。计算用 64 位(BIGINT)精度进行。 MySQL 扩展了 GROUP BY 的用法。你可以不出现在的 GROUP BY 部分的 SELECT 表达式中使用列或计算,这表示这个组的任何可能值。你可以使用它 是性能更好,避免在不必要的项目上排序和分组。例如,你在下列查询中不需要 在 customer.name 上聚合: mysql> select order.custid,customer.name,max(payments) from order,customer where order.custid = customer.custid GROUP BY order.custid; 在 ANSI SQL 中, 你将必须将 customer.name 加到 GROUP BY 子句。 MySQL 在 中,名字是冗余的。 如果你从 GROUP BY 部分省略的列在组中不是唯一的,不要使用这个功能。 在某些情况下,你可以使用 MIN()和 MAX()获得一个特定的列值,即使它不是唯 一的。下例给出从包含 sort 列中最小值的行的 column 值: substr(MIN(concat(sort,space(6-length(sort)),column),7,length(column))) 注意, 如果你正在使用 MySQL 3.22(或更早)或如果你正在试图遵从 ANSI SQL, 你不能在 GROUP BY 或 ORDER BY 子句中使用表达式。你可以通过使用表达 式的一个别名解决此限制: mysql> SELECT id,FLOOR(value/100) AS val FROM tbl_name GROUP BY id,val ORDER BY val; 在 MySQL3.23 中,你可以这样做: mysql> SELECT id,FLOOR(value/100) FROM tbl_name ORDER BY RAND();


相关文章:
select from where_格式详解
select from where 格式详解 一、SELECT 语句的完整语法为: SELECT[ALL|DISTINCT...中,日期用?#?定界。日期也可以用 Datevalue()函数来代替。在比较字 符型的...
4数据查询课后习题
( A.SELECT INTO B.UNION C.子查询 D.联接 2. 下面是聚合函数的选项是( ...数据表的记录中重复值极少 B.精确匹配查询的搜索条件 WHERE 子句中经常使用的列...
上机实验五
(3)库函数能否直接使用在 SELECT 选取目标、HAVING 子句,WHERE 子句和 GROUP BY 列名中? 答:库函数可以使用 SELECT 选取目标、HAVING 子句,WHERE 子句,不能使用...
SQL复习题(附部分答案)
运算符是(_3__),如果在 SELECT 语句中使用聚合函数时,可以在后 面使用(_4...[ ] 22、在 SELECT 语句的 WHERE 子句的条件表达式中,可以匹配 0 个到多个...
select from where 格式详解
select from where 格式详解 一、SELECT 语句的完整语法为: SELECT[ALL|DISTINCT...中,日期用?#?定界。日期也可以用 Datevalue()函数来代替。在比较字 符型的...
...允许出现聚集函数的是 (23) 。 A.SELECT子句B.WHER_...
在SQL的查询语句中,允许出现聚集函数的是 (23) 。 A.SELECT子句B.WHERE子句C.HAVING短语D.SELECT子句和HAVING短语_答案解析_2016年_一模/二模/三模/联考_图文_...
在SELECT语句中,用来指定查询所用的表的子句是 A.WHERE...
在SELECT语句中,用来指定查询所用的表的子句是 A.WHEREB.GROUP BYC.ORDER BYD.FROM_答案解析_2016年_一模/二模/三模/联考_图文_百度高考
在SELECT语句中,用来指定查询所用的表的子句是 A.WHERE...
在SELECT语句中,用来指定查询所用的表的子句是 A.WHEREB.GROUP BYC.ORDER BYD.FROM_答案解析_2016年_一模/二模/三模/联考_图文_百度高考
SQL题库(有答案)
(3_B__) ,如果在 SELECT 语句中使用集合函数时,一定在后面 使用(4_A__)...8、在 Transact-SQL 语句的 WHERE 子句中,完全可以用 IN 子查询来代替 OR ...
SELECT语句中使用函数对异常产生的影响
分析原因,是因为 SELECT 语句中使用了 avg 函数。 4、 修改存储过程,加入: SELECT salary INTO v_sal FROM employees WHERE department_id=p_deptno; 结果正常...
更多相关标签: