⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 06-3.html

📁 MySQL4.1.0 中文参考手册
💻 HTML
📖 第 1 页 / 共 5 页
字号:
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>&#38;&</CODE>
<DD>
逻辑与。
如果所有的操作数都是非零或非 <CODE>NULL</CODE> 的,返回 <CODE>1</CODE>;如果有一个或多个操作数为 <CODE>0</CODE> ,则返回 <CODE>0</CODE>,只要操作数中有 <CODE>NULL</CODE> 返回值就为 <CODE>NULL</CODE>。

<PRE>
mysql&#62; SELECT 1 &#38;& 1;
        -&#62; 1
mysql&#62; SELECT 1 &#38;& 0;
        -&#62; 0
mysql&#62; SELECT 1 &#38;& NULL;
        -&#62; NULL
mysql&#62; SELECT 0 &#38;& NULL;
        -&#62; 0
mysql&#62; SELECT NULL &#38;& 0;
        -&#62; 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&#62; SELECT 1 || 1;
        -&#62; 1
mysql&#62; SELECT 1 || 0;
        -&#62; 1
mysql&#62; SELECT 0 || 0;
        -&#62; 0
mysql&#62; SELECT 0 || NULL;
        -&#62; NULL
mysql&#62; SELECT 1 || NULL;
        -&#62; 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&#62; SELECT 1 XOR 1;
        -&#62; 0
mysql&#62; SELECT 1 XOR 0;
        -&#62; 1
mysql&#62; SELECT 1 XOR NULL;
        -&#62; NULL
mysql&#62; SELECT 1 XOR 1 XOR 1;
        -&#62; 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&#62; SELECT IFNULL(1,0);
        -&#62; 1
mysql&#62; SELECT IFNULL(NULL,10);
        -&#62; 10
mysql&#62; SELECT IFNULL(1/0,10);
        -&#62; 10
mysql&#62; SELECT IFNULL(1/0,'yes');
        -&#62; '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&#62; SELECT NULLIF(1,1);
        -&#62; NULL
mysql&#62; SELECT NULLIF(1,2);
        -&#62; 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 &#60;&#62; 0</CODE> 以及 <CODE>expr1 &#60;&#62; NULL</CODE>),那么 <CODE>IF()</CODE> 返回 <CODE>expr2</CODE>,否则返回 <CODE>expr3</CODE>。<CODE>IF()</CODE> 返回一个数字或字符串,这取决于它被使用的语境:

<PRE>
mysql&#62; SELECT IF(1&#62;2,2,3);
        -&#62; 3
mysql&#62; SELECT IF(1&#60;2,'yes','no');
        -&#62; 'yes'
mysql&#62; SELECT IF(STRCMP('test','test1'),'no','yes');
        -&#62; '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&#62; SELECT IF(0.1,1,0);
        -&#62; 0
mysql&#62; SELECT IF(0.1&#60;&#62;0,1,0);
        -&#62; 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&#62; SELECT CASE 1 WHEN 1 THEN "one"
           WHEN 2 THEN "two" ELSE "more" END;
       -&#62; "one"
mysql&#62; SELECT CASE WHEN 1&#62;0 THEN "true" ELSE "false" END;
       -&#62; "true"
mysql&#62; SELECT CASE BINARY "B" WHEN "a" THEN 1 WHEN "b" THEN 2 END;
       -&#62; 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&#62; SELECT ASCII('2');
        -&#62; 50
mysql&#62; SELECT ASCII(2);
        -&#62; 50
mysql&#62; SELECT ASCII('dx');
        -&#62; 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&#62; SELECT ORD('2');
        -&#62; 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&#62; SELECT CONV("a",16,2);
        -&#62; '1010'
mysql&#62; SELECT CONV("6E",18,8);
        -&#62; '172'
mysql&#62; SELECT CONV(-17,10,-18);
        -&#62; '-H'
mysql&#62; SELECT CONV(10+"10"+'10'+0xa,10,10);
        -&#62; '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&#62; SELECT BIN(12);
        -&#62; '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&#62; SELECT OCT(12);
        -&#62; '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&#62; SELECT HEX(255);
        -&#62; 'FF'
mysql&#62; SELECT HEX("abc");
        -&#62; 616263
mysql&#62; SELECT 0x616263;
        -&#62; "abc"
</PRE>

<A NAME="IDX1168"></A>
<DT><CODE>CHAR(N,...)</CODE>
<DD>
<CODE>CHAR()</CODE> 以整数类型解释参数,返回这个整数所代表的 ASCII 码值给出的字符组成的字符串。<CODE>NULL</CODE> 值将被忽略:

<PRE>
mysql&#62; SELECT CHAR(77,121,83,81,'76');
        -&#62; 'MySQL'
mysql&#62; SELECT CHAR(77,77.3,'77.3');
        -&#62; 'MMM'
</PRE>

<A NAME="IDX1169"></A>
<DT><CODE>CONCAT(str1,str2,...)</CODE>
<DD>
将参数连接成字符串返回。如果有任何一个参数为 <CODE>NULL</CODE>,返回值也为 <CODE>NULL</CODE>。可以有超过 2 个的参数。数字参数将被转换为相等价的字符串形式:

<PRE>
mysql&#62; SELECT CONCAT('My', 'S', 'QL');
        -&#62; 'MySQL'
mysql&#62; SELECT CONCAT('My', NULL, 'QL');
        -&#62; NULL
mysql&#62; SELECT CONCAT(14.3);
        -&#62; '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&#62; SELECT CONCAT_WS(",","First name","Second name","Last Name");
       -&#62; 'First name,Second name,Last Name'
mysql&#62; SELECT CONCAT_WS(",","First name",NULL,"Last Name");
       -&#62; '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&#62; SELECT LENGTH('text');
        -&#62; 4
mysql&#62; SELECT OCTET_LENGTH('text');
        -&#62; 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&#62; SELECT BIT_LENGTH('text');
        -&#62; 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&#62; SELECT LOCATE('bar', 'foobarbar');
        -&#62; 4
mysql&#62; SELECT LOCATE('xbar', 'foobar');
        -&#62; 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&#62; SELECT LOCATE('bar', 'foobarbar',5);
        -&#62; 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&#62; SELECT INSTR('foobarbar', 'bar');
        -&#62; 4
mysql&#62; SELECT INSTR('xbar', 'foobar');
        -&#62; 0
</PRE>

这个函数是多字节安全的。在 MySQL 3.23 中,这个函数是字母大小写敏感的,当在 MySQL 4.0 中时,如有任一参数是一个二进制字符串,它才是字母大小写敏感的。

<P></P>

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -