📄 06-3.html
字号:
mysql> SELECT ! 1+1;
-> 1
</PRE>
最后一个例子返回 <CODE>1</CODE>,因为表达式是与 <CODE>(!1)+1</CODE> 一样被计算的。
<P></P>
<A NAME="IDX1148"></A>
<A NAME="IDX1149"></A>
<DT><CODE>AND</CODE>
<DD>
<DT><CODE>&&</CODE>
<DD>
逻辑与。
如果所有的操作数都是非零或非 <CODE>NULL</CODE> 的,返回 <CODE>1</CODE>;如果有一个或多个操作数为 <CODE>0</CODE> ,则返回 <CODE>0</CODE>,只要操作数中有 <CODE>NULL</CODE> 返回值就为 <CODE>NULL</CODE>。
<PRE>
mysql> SELECT 1 && 1;
-> 1
mysql> SELECT 1 && 0;
-> 0
mysql> SELECT 1 && NULL;
-> NULL
mysql> SELECT 0 && NULL;
-> 0
mysql> SELECT NULL && 0;
-> 0
</PRE>
请注意,在 MySQL 4.0.5 以前版本中,当遇到一个 <CODE>NULL</CODE> 时就停止计算,而不是继续进程检查可能存在的<CODE>0</CODE>。这就意味着,在这些版本中,<CODE>SELECT (NULL AND 0)</CODE> 返回 <CODE>NULL</CODE>,而不是 <CODE>0</CODE>。在 4.0.5 中,代码已被重新设计了,已便于在任何仍然使用优化情况下,返回值总是能如 ANSI 所规定的那样。
<A NAME="IDX1150"></A>
<A NAME="IDX1151"></A>
<DT><CODE>OR</CODE>
<DD>
<DT><CODE>||</CODE>
<DD>
逻辑或。
如果任何一个操作数是非零的,返回值为 <CODE>1</CODE>,如果任一操作数为 <CODE>NULL</CODE>,返回值为 <CODE>NULL</CODE>,否则返回 <CODE>0</CODE>。
<PRE>
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
</PRE>
<A NAME="IDX1152"></A>
<DT><CODE>XOR</CODE>
<DD>
逻辑异或。
如果任一操作数为 <CODE>NULL</CODE>,返回值为 <CODE>NULL</CODE>。对于非 <CODE>NULL</CODE> 的操作数,如果有奇数个非零的操作数,结果返回为 <CODE>1</CODE>,否则返回 <CODE>0</CODE>。
<PRE>
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
</PRE>
<CODE>a XOR b</CODE> 算术相等于 <CODE>(a AND (NOT b)) OR ((NOT a) and b)</CODE>。
<CODE>XOR</CODE> 在 MySQL 4.0.2 中被添加。
</DL>
<H4><A NAME="Control_flow_functions"></A>6.3.1.4 控制流函数</H4>
<P>
<A NAME="IDX1153"></A>
<A NAME="IDX1154"></A>
</P>
<DL COMPACT>
<DT><CODE>IFNULL(expr1,expr2)</CODE>
<DD>
<A NAME="IDX1155"></A>
<A NAME="IDX1156"></A>
如果 <CODE>expr1</CODE> 为非 <CODE>NULL</CODE> 的,<CODE>IFNULL()</CODE> 返回 <CODE>expr1</CODE>,否则返回 <CODE>expr2</CODE>。<CODE>IFNULL()</CODE> 返回一个数字或字符串值,这取决于它被使用的语境:
<PRE>
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'
</PRE>
在 MySQL 4.0.6 和更新版本中,<CODE>IFNULL(expr1,expr2)</CODE> 的默认返回值以 <CODE>STRING</CODE>、<CODE>REAL</CODE> 或 <CODE>INTEGER</CODE> 顺序更加'general'了两个表达式。当你基于一个表达式创建一个表或在一个临时表中 MySQL 不得不存储一个从 <CODE>IFNULL()</CODE> 返回的值时,这个与较早 MySQL 版本的不同将更加值得注意。
<PRE>
CREATE TABLE foo SELECT IFNULL(1,"test") as test;
</PRE>
在 MySQL 4.0.6 中,列 'test' 的类型为 <CODE>CHAR(4)</CODE>,然而在较早的版本中,你得到的却是 <CODE>BIGINT</CODE>。
<P></P>
<A NAME="IDX1157"></A>
<DT><CODE>NULLIF(expr1,expr2)</CODE>
<DD>
如果 <CODE>expr1 = expr2</CODE> 为真,返回 <CODE>NULL</CODE>,否则返回 <CODE>expr1</CODE>。
它等同于 <CODE>CASE WHEN x = y THEN NULL ELSE x END</CODE>:
<PRE>
mysql> SELECT NULLIF(1,1);
-> NULL
mysql> SELECT NULLIF(1,2);
-> 1
</PRE>
注意,如果参数不相等,在 MySQL 中,<CODE>expr1</CODE> 被求值两次。
<P></P>
<A NAME="IDX1158"></A>
<DT><CODE>IF(expr1,expr2,expr3)</CODE>
<DD>
如果 <CODE>expr1</CODE> 为真(<CODE>expr1 <> 0</CODE> 以及 <CODE>expr1 <> NULL</CODE>),那么 <CODE>IF()</CODE> 返回 <CODE>expr2</CODE>,否则返回 <CODE>expr3</CODE>。<CODE>IF()</CODE> 返回一个数字或字符串,这取决于它被使用的语境:
<PRE>
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'
</PRE>
如果 <CODE>expr2</CODE> 或 <CODE>expr3</CODE> 明确地为 <CODE>NULL</CODE>,那么函数 <CODE>IF()</CODE> 的返回值类型为非 <CODE>NULL</CODE> 列的类型。(这在选择在 MySQL 4.0.3 中新加入)。
<CODE>expr1</CODE> 是作为一个整数值被计算的,这就意味着,如果测试的是一个浮点型或字符串值,就必须进行比较操作:
<PRE>
mysql> SELECT IF(0.1,1,0);
-> 0
mysql> SELECT IF(0.1<>0,1,0);
-> 1
</PRE>
在上面第一种情况下,<CODE>IF(0.1)</CODE> 返回 <CODE>0</CODE>,是因为 <CODE>0.1</CODE> 被转换为一个整数值,返回 <CODE>IF(0)</CODE> 的测试结果。这可能不是你所期望的。在第二种情况下,比较测试原浮点数是否为一个非零值。比较的结果被作为整数使用。
缺省的 <CODE>IF()</CODE> 返回值类型 (当结果存储在临时表中时,这是非常重要的) 在 MySQL 3.23 中按下列方式确定:
<TABLE BORDER WIDTH="95%">
<TR><TD><STRONG>表达式 </STRONG> </TD><TD> <STRONG>返回值 </STRONG>
</TD></TR>
<TR><TD>表达式(expr2)或表达式(expr3)返回值为字符串 </TD><TD> 字符串
</TD></TR>
<TR><TD>表达式(expr2)或表达式(expr3)返回值为浮点型值 </TD><TD> 浮点型
</TD></TR>
<TR><TD>表达式(expr2)或表达式(expr3)返回值为整型 </TD><TD> 整型
</TD></TR>
</TABLE>
如果表达式(expr2)和表达式(expr3)均是字符串,同时两个字符串均是忽略字母大小写的,那么返回值也是忽略字母大小写的(从 MySQL 3.23.51 开始)。
<P></P>
<A NAME="IDX1159"></A>
<DT><CODE>CASE value WHEN [compare-value] THEN result [WHEN [compare-value] THEN result ...] [ELSE result] END</CODE>
<DD>
<DT><CODE>CASE WHEN [condition] THEN result [WHEN [condition] THEN result ...] [ELSE result] END</CODE>
<DD>
第一个形式当 <CODE>value=compare-value</CODE> 时返回 <CODE>result</CODE>。第二个形式当第一个为真值的 <CODE>condition</CODE> 出现时,返回该条件的结果。如果没有匹配的结果值,那么 <CODE>ELSE</CODE> 后的结果将被返回。如果没有 <CODE>ELSE</CODE> 部分,那么 <CODE>NULL</CODE> 被返回:
<PRE>
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
</PRE>
</DL>
<P>
返回值的类型 (<CODE>INTEGER</CODE>、<CODE>DOUBLE</CODE> 或 <CODE>STRING</CODE>) 与第一个返回值(第一个 <CODE>THEN</CODE> 后的表达式)的类型相同。
</P>
<H3><A NAME="String_functions"></A>6.3.2 字符串函数</H3>
<P>
<A NAME="IDX1160"></A>
<A NAME="IDX1161"></A>
</P>
<P>
如果返回结果的长度超过服务器参数 <CODE>max_allowed_packet</CODE> 的大小,字符串值函数将返回 <CODE>NULL</CODE>。查看章节 <A HREF="manual1.html#Server_parameters">5.5.2 调节服务器参数</A>。
</P>
<P>
对于操作字符串位置的函数,第一个位置被标记为 1。
</P>
<DL COMPACT>
<DT><CODE>ASCII(str)</CODE>
<DD>
<A NAME="IDX1162"></A>
返回字符串 <CODE>str</CODE> 最左边的那个字符的 ASCII 码值。如果 <CODE>str</CODE> 是一个空字符串,那么返回值为 <CODE>0</CODE>。如果 <CODE>str</CODE> 是一个 <CODE>NULL</CODE>,返回值也是 <CODE>NULL</CODE>:
<PRE>
mysql> SELECT ASCII('2');
-> 50
mysql> SELECT ASCII(2);
-> 50
mysql> SELECT ASCII('dx');
-> 100
</PRE>
也可参看 <CODE>ORD()</CODE> 函数。
<P></P>
<A NAME="IDX1163"></A>
<DT><CODE>ORD(str)</CODE>
<DD>
如果字符串 <CODE>str</CODE> 的最左边的字符是一个多字节的字符,根据多字节字符的成分字符的 ASCII 码值通过下面的公式计算返回那个的编码:<CODE>((first byte ASCII code)*256+(second byte ASCII code))[*256+third byte ASCII code...]</CODE>。如果最左边的字符不是一个多字节字符,返回值与 <CODE>ASCII()</CODE> 函数相同:
<PRE>
mysql> SELECT ORD('2');
-> 50
</PRE>
<A NAME="IDX1164"></A>
<DT><CODE>CONV(N,from_base,to_base)</CODE>
<DD>
在不同的数字基数之间转换数字。将数字 <CODE>N</CODE> 从 <CODE>from_base</CODE> 转换到 <CODE>to_base</CODE>,并以字符串表示形式返回。如果任何一个参数为 <CODE>NULL</CODE>,那么返回值也为 <CODE>NULL</CODE>。参数 <CODE>N</CODE> 被解释为是一个整数,但是也可以被指定为一个整数或一个字符串。最小基为 <CODE>2</CODE>,最大基为 <CODE>36</CODE>。如果 <CODE>to_base</CODE> 是一个负值,<CODE>N</CODE> 将被看作为是一个有符号数字。否则,<CODE>N</CODE> 被视为是无符号的。<CODE>CONV</CODE> 以 64 位精度工作:
<PRE>
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'
</PRE>
<A NAME="IDX1165"></A>
<DT><CODE>BIN(N)</CODE>
<DD>
返回 <CODE>N</CODE> 的字符串表示的二进制值形式,在这里,<CODE>N</CODE> 长长的(<CODE>BIGINT</CODE>)数字。这个函数等价于 <CODE>CONV(N,10,2)</CODE>。如果 <CODE>N</CODE> 是一个 <CODE>NULL</CODE>,返回值也是 <CODE>NULL</CODE>:
<PRE>
mysql> SELECT BIN(12);
-> '1100'
</PRE>
<A NAME="IDX1166"></A>
<DT><CODE>OCT(N)</CODE>
<DD>
返回 <CODE>N</CODE> 的字符串表示的八进制值形式,在这里,<CODE>N</CODE> 是一个长长的数字。这个函数等价于 <CODE>CONV(N,10,8)</CODE>。如果 <CODE>N</CODE> 是一个 <CODE>NULL</CODE>,返回值也是 <CODE>NULL</CODE> :
<PRE>
mysql> SELECT OCT(12);
-> '14'
</PRE>
<A NAME="IDX1167"></A>
<DT><CODE>HEX(N_or_S)</CODE>
<DD>
如果 N_OR_S 是一个数字,返回 <CODE>N</CODE> 的字符串表示的十六进制值形式,这里 <CODE>N</CODE> 是一个长长的(<CODE>BIGINT</CODE>)数字。这个函数等价于 <CODE>CONV(N,10,16)</CODE>。
如果 N_OR_S 是一个字符串,N_OR_S 中的每个字符均被转换为 2 位十六进制数字,并以十六进制的字符串形式返回。这是 <CODE>0xff</CODE> 形式的字符串反转操作。
<PRE>
mysql> SELECT HEX(255);
-> 'FF'
mysql> SELECT HEX("abc");
-> 616263
mysql> SELECT 0x616263;
-> "abc"
</PRE>
<A NAME="IDX1168"></A>
<DT><CODE>CHAR(N,...)</CODE>
<DD>
<CODE>CHAR()</CODE> 以整数类型解释参数,返回这个整数所代表的 ASCII 码值给出的字符组成的字符串。<CODE>NULL</CODE> 值将被忽略:
<PRE>
mysql> SELECT CHAR(77,121,83,81,'76');
-> 'MySQL'
mysql> SELECT CHAR(77,77.3,'77.3');
-> 'MMM'
</PRE>
<A NAME="IDX1169"></A>
<DT><CODE>CONCAT(str1,str2,...)</CODE>
<DD>
将参数连接成字符串返回。如果有任何一个参数为 <CODE>NULL</CODE>,返回值也为 <CODE>NULL</CODE>。可以有超过 2 个的参数。数字参数将被转换为相等价的字符串形式:
<PRE>
mysql> SELECT CONCAT('My', 'S', 'QL');
-> 'MySQL'
mysql> SELECT CONCAT('My', NULL, 'QL');
-> NULL
mysql> SELECT CONCAT(14.3);
-> '14.3'
</PRE>
<A NAME="IDX1170"></A>
<DT><CODE>CONCAT_WS(separator, str1, str2,...)</CODE>
<DD>
<CODE>CONCAT_WS()</CODE> 支持 CONCAT 加上一个分隔符,它是一个特殊形式的 <CODE>CONCAT()</CODE>。第一个参数剩余参数间的分隔符。分隔符可以是与剩余参数一样的字符串。如果分隔符是 <CODE>NULL</CODE>,返回值也将为 <CODE>NULL</CODE>。这个函数会跳过分隔符参数后的任何 <CODE>NULL</CODE> 和空字符串。分隔符将被加到被连接的字符串之间:
<PRE>
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'
</PRE>
<A NAME="IDX1171"></A>
<A NAME="IDX1172"></A>
<A NAME="IDX1173"></A>
<A NAME="IDX1174"></A>
<DT><CODE>LENGTH(str)</CODE>
<DD>
<DT><CODE>OCTET_LENGTH(str)</CODE>
<DD>
<DT><CODE>CHAR_LENGTH(str)</CODE>
<DD>
<DT><CODE>CHARACTER_LENGTH(str)</CODE>
<DD>
返回字符串 <CODE>str</CODE> 的长度:
<PRE>
mysql> SELECT LENGTH('text');
-> 4
mysql> SELECT OCTET_LENGTH('text');
-> 4
</PRE>
注意,<CODE>CHAR_LENGTH()</CODE> 和 <CODE>CHARACTER_LENGTH()</CODE> 对于多字节字符只计数一次。
<P></P>
<A NAME="IDX1175"></A>
<DT><CODE>BIT_LENGTH(str)</CODE>
<DD>
返回字符串 <CODE>str</CODE> 的比特长度:
<PRE>
mysql> SELECT BIT_LENGTH('text');
-> 32
</PRE>
<A NAME="IDX1176"></A>
<A NAME="IDX1177"></A>
<DT><CODE>LOCATE(substr,str)</CODE>
<DD>
<DT><CODE>POSITION(substr IN str)</CODE>
<DD>
返回子串 <CODE>substr</CODE> 在字符串 <CODE>str</CODE> 中第一次出现的位置。如果子串 <CODE>substr</CODE> 在 <CODE>str</CODE> 中不存在,返回值为 <CODE>0</CODE>:
<PRE>
mysql> SELECT LOCATE('bar', 'foobarbar');
-> 4
mysql> SELECT LOCATE('xbar', 'foobar');
-> 0
</PRE>
这个函数是多字节安全的。在 MySQL 3.23 中,这个函数是字母大小写敏感的,当在 MySQL 4.0 中时,如有任一参数是一个二进制字符串,它才是字母大小写敏感的。
<P></P>
<A NAME="IDX1178"></A>
<DT><CODE>LOCATE(substr,str,pos)</CODE>
<DD>
返回子串 <CODE>substr</CODE> 在字符串 <CODE>str</CODE> 中的第 <CODE>pos</CODE> 位置后第一次出现的位置。如果 <CODE>substr</CODE> 不在 <CODE>str</CODE> 中返回 <CODE>0</CODE> :
<PRE>
mysql> SELECT LOCATE('bar', 'foobarbar',5);
-> 7
</PRE>
这个函数是多字节安全的。在 MySQL 3.23 中,这个函数是字母大小写敏感的,当在 MySQL 4.0 中时,如有任一参数是一个二进制字符串,它才是字母大小写敏感的。
<P></P>
<A NAME="IDX1179"></A>
<DT><CODE>INSTR(str,substr)</CODE>
<DD>
返回子串 <CODE>substr</CODE> 在字符串 <CODE>str</CODE> 中第一次出现的位置。这与有两个参数形式的 <CODE>LOCATE()</CODE> 相似,只是参数的位置被颠倒了:
<PRE>
mysql> SELECT INSTR('foobarbar', 'bar');
-> 4
mysql> SELECT INSTR('xbar', 'foobar');
-> 0
</PRE>
这个函数是多字节安全的。在 MySQL 3.23 中,这个函数是字母大小写敏感的,当在 MySQL 4.0 中时,如有任一参数是一个二进制字符串,它才是字母大小写敏感的。
<P></P>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -