📄 mysql 语言参考.txt
字号:
mysql> SELECT 1 && NULL;
-> NULL
mysql> SELECT 0 && NULL;
-> 0
mysql> SELECT NULL && 0;
-> 0
请注意,在 MySQL 4.0.5 以前版本中,当遇到一个 NULL 时就停止计算,而不是继续进程检查可能存在的0。这就意味着,在这些版本中,SELECT (NULL AND 0) 返回 NULL,而不是 0。在 4.0.5 中,代码已被重新设计了,已便于在任何仍然使用优化情况下,返回值总是能如 ANSI 所规定的那样。
OR
||
逻辑或。如果任何一个操作数是非零的,返回值为 1,如果任一操作数为 NULL,返回值为 NULL,否则返回 0。
mysql> SELECT 1 || 1;
-> 1
mysql> SELECT 1 || 0;
-> 1
mysql> SELECT 0 || 0;
-> 0
mysql> SELECT 0 || NULL;
-> NULL
mysql> SELECT 1 || NULL;
-> 1
XOR
逻辑异或。如果任一操作数为 NULL,返回值为 NULL。对于非 NULL 的操作数,如果有奇数个非零的操作数,结果返回为 1,否则返回 0。
mysql> SELECT 1 XOR 1;
-> 0
mysql> SELECT 1 XOR 0;
-> 1
mysql> SELECT 1 XOR NULL;
-> NULL
mysql> SELECT 1 XOR 1 XOR 1;
-> 1
a XOR b 算术相等于 (a AND (NOT b)) OR ((NOT a) and b)。 XOR 在 MySQL 4.0.2 中被添加。
6.3.1.4 控制流函数
IFNULL(expr1,expr2)
如果 expr1 为非 NULL 的,IFNULL() 返回 expr1,否则返回 expr2。IFNULL() 返回一个数字或字符串值,这取决于它被使用的语境:
mysql> SELECT IFNULL(1,0);
-> 1
mysql> SELECT IFNULL(NULL,10);
-> 10
mysql> SELECT IFNULL(1/0,10);
-> 10
mysql> SELECT IFNULL(1/0,'yes');
-> 'yes'
在 MySQL 4.0.6 和更新版本中,IFNULL(expr1,expr2) 的默认返回值以 STRING、REAL 或 INTEGER 顺序更加'general'了两个表达式。当你基于一个表达式创建一个表或在一个临时表中 MySQL 不得不存储一个从 IFNULL() 返回的值时,这个与较早 MySQL 版本的不同将更加值得注意。
CREATE TABLE foo SELECT IFNULL(1,"test") as test;
在 MySQL 4.0.6 中,列 'test' 的类型为 CHAR(4),然而在较早的版本中,你得到的却是 BIGINT。
NULLIF(expr1,expr2)
如果 expr1 = expr2 为真,返回 NULL,否则返回 expr1。它等同于 CASE WHEN x = y THEN NULL ELSE x END:
mysql> SELECT NULLIF(1,1);
-> NULL
mysql> SELECT NULLIF(1,2);
-> 1
注意,如果参数不相等,在 MySQL 中,expr1 被求值两次。
IF(expr1,expr2,expr3)
如果 expr1 为真(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'),'no','yes');
-> 'no'
如果 expr2 或 expr3 明确地为 NULL,那么函数 IF() 的返回值类型为非 NULL 列的类型。(这在选择在 MySQL 4.0.3 中新加入)。 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) 的测试结果。这可能不是你所期望的。在第二种情况下,比较测试原浮点数是否为一个非零值。比较的结果被作为整数使用。 缺省的 IF() 返回值类型 (当结果存储在临时表中时,这是非常重要的) 在 MySQL 3.23 中按下列方式确定: 表达式 返回值
表达式(expr2)或表达式(expr3)返回值为字符串 字符串
表达式(expr2)或表达式(expr3)返回值为浮点型值 浮点型
表达式(expr2)或表达式(expr3)返回值为整型 整型
如果表达式(expr2)和表达式(expr3)均是字符串,同时两个字符串均是忽略字母大小写的,那么返回值也是忽略字母大小写的(从 MySQL 3.23.51 开始)。
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
第一个形式当 value=compare-value 时返回 result。第二个形式当第一个为真值的 condition 出现时,返回该条件的结果。如果没有匹配的结果值,那么 ELSE 后的结果将被返回。如果没有 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
返回值的类型 (INTEGER、DOUBLE 或 STRING) 与第一个返回值(第一个 THEN 后的表达式)的类型相同。
6.3.2 字符串函数
如果返回结果的长度超过服务器参数 max_allowed_packet 的大小,字符串值函数将返回 NULL。查看章节 5.5.2 调节服务器参数。
对于操作字符串位置的函数,第一个位置被标记为 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 的最左边的字符是一个多字节的字符,根据多字节字符的成分字符的 ASCII 码值通过下面的公式计算返回那个的编码:((first byte ASCII code)*256+(second byte ASCII code))[*256+third byte ASCII code...]。如果最左边的字符不是一个多字节字符,返回值与 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_or_S)
如果 N_OR_S 是一个数字,返回 N 的字符串表示的十六进制值形式,这里 N 是一个长长的(BIGINT)数字。这个函数等价于 CONV(N,10,16)。 如果 N_OR_S 是一个字符串,N_OR_S 中的每个字符均被转换为 2 位十六进制数字,并以十六进制的字符串形式返回。这是 0xff 形式的字符串反转操作。
mysql> SELECT HEX(255);
-> 'FF'
mysql> SELECT HEX("abc");
-> 616263
mysql> SELECT 0x616263;
-> "abc"
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'
CONCAT_WS(separator, str1, str2,...)
CONCAT_WS() 支持 CONCAT 加上一个分隔符,它是一个特殊形式的 CONCAT()。第一个参数剩余参数间的分隔符。分隔符可以是与剩余参数一样的字符串。如果分隔符是 NULL,返回值也将为 NULL。这个函数会跳过分隔符参数后的任何 NULL 和空字符串。分隔符将被加到被连接的字符串之间:
mysql> SELECT CONCAT_WS(",","First name","Second name","Last Name");
-> 'First name,Second name,Last Name'
mysql> SELECT CONCAT_WS(",","First name",NULL,"Last Name");
-> 'First name,Last Name'
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() 和 CHARACTER_LENGTH() 对于多字节字符只计数一次。
BIT_LENGTH(str)
返回字符串 str 的比特长度:
mysql> SELECT BIT_LENGTH('text');
-> 32
LOCATE(substr,str)
POSITION(substr IN str)
返回子串 substr 在字符串 str 中第一次出现的位置。如果子串 substr 在 str 中不存在,返回值为 0:
mysql> SELECT LOCATE('bar', 'foobarbar');
-> 4
mysql> SELECT LOCATE('xbar', 'foobar');
-> 0
这个函数是多字节安全的。在 MySQL 3.23 中,这个函数是字母大小写敏感的,当在 MySQL 4.0 中时,如有任一参数是一个二进制字符串,它才是字母大小写敏感的。
LOCATE(substr,str,pos)
返回子串 substr 在字符串 str 中的第 pos 位置后第一次出现的位置。如果 substr 不在 str 中返回 0 :
mysql> SELECT LOCATE('bar', 'foobarbar',5);
-> 7
这个函数是多字节安全的。在 MySQL 3.23 中,这个函数是字母大小写敏感的,当在 MySQL 4.0 中时,如有任一参数是一个二进制字符串,它才是字母大小写敏感的。
INSTR(str,substr)
返回子串 substr 在字符串 str 中第一次出现的位置。这与有两个参数形式的 LOCATE() 相似,只是参数的位置被颠倒了:
mysql> SELECT INSTR('foobarbar', 'bar');
-> 4
mysql> SELECT INSTR('xbar', 'foobar');
-> 0
这个函数是多字节安全的。在 MySQL 3.23 中,这个函数是字母大小写敏感的,当在 MySQL 4.0 中时,如有任一参数是一个二进制字符串,它才是字母大小写敏感的。
LPAD(str,len,padstr)
用字符串 padstr 对 str 进行左边填补直至它的长度达到 len 个字符长度,然后返回 str。如果 str 的长度长于 len',那么它将被截除到 len 个字符。
mysql> SELECT LPAD('hi',4,'??');
-> '??hi'
RPAD(str,len,padstr)
用字符串 padstr 对 str 进行右边填补直至它的长度达到 len 个字符长度,然后返回 str。如果 str 的长度长于 len',那么它将被截除到 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 的 pos 位置起返回 len 个字符的子串。使用 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 ');
-> '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 的近音字。两个发音差不多的字符串应该有同样的近音字。一个标准的近音字为 4 个字符长,但是函数 SOUNDEX() 却返回一个任意长的字符串。你可以在结果上使用 SUBSTRING() 标准的近音字。提供的字符中所有的非数字字母的字符均被忽略。所有在 A-Z 范围之外的国际 alpha 字符被视为元音:
mysql> SELECT SOUNDEX('Hello');
-> 'H400'
mysql> SELECT SOUNDEX('Quadratically');
-> 'Q36324'
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)
返回一个由重复了 count 次的字符串 str 组成的字符串。如果 count <= 0,返回一个空字符串。如果 str 或 count 是 NULL,返回值也为 NULL:
mysql> SELECT REPEAT('MySQL', 3);
-> 'MySQLMySQLMySQL'
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -