仓酷云

标题: MYSQL编程:MySQL 4.1.0 中文参考手册 --- 6.3 用... [打印本页]

作者: 愤怒的大鸟    时间: 2015-1-16 22:45
标题: MYSQL编程:MySQL 4.1.0 中文参考手册 --- 6.3 用...
如果互联网服务提供商,支撑数据的云服务,或它们之间任一点网络被堵塞或中断,他们就会遇到与数据延迟或应用程序故障有关的问题。如果问题发生在企业内部,解决方案提供商可以排除故障找出原因。mysql|select|参考|参考手册|函数|中文MySQL4.1.0中文参考手册---犬犬(心帆)翻译MySQLReferenceManualforversion4.1.0-alpha.

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>SELECTMOD(29,9);1rowsinset(0.00sec)+-----------+|mod(29,9)|+-----------+|2|+-----------+

将被显现为如许:

mysql>SELECTMOD(29,9);->2
6.3.1无范例的特别运算符和函数6.3.1.1圆括号
(...)

括号,利用它来强迫一个表达式的盘算按次。

mysql>SELECT1+2*3;->7mysql>SELECT(1+2)*3;->9
6.3.1.2对照运算符
对照运算符的了局是1(TRUE)、0(FALSE)或NULL。这些函数可事情于数字和字符串上。依据必要,字符串将会主动地被转换到数字,和数字被转换成字符串(好比在Perl中)。

MySQL利用以下划定规矩举行对照:
假如一个或两个参数是NULL,对照的了局是NULL,除<=>运算符。假如在一个对照操纵中两个参数均是字符串,他们将作为字符串被对照。假如两个参数均是整数,他们作为整数被对照。十六进制值假如不与一个数字举行对照,那末它将看成一个二进制字符串。假如参数之一是一个TIMESTAMP或DATETIME列,而另外一参数是一个常数,在对照实行之前,这个常数被转换为一个工夫戳。如许做是为了对ODBC更友爱。在一切别的情形下,参数作为浮点(real)数字被对照。
缺省地,字符串利用以后字符集以疏忽字母巨细写的体例举行对照(缺省的字符集为ISO-8859-1Latin1,它对英语处置得很杰出)。

上面的例子演示了关于对照操纵字符串到数字的转换:

mysql>SELECT1>6x;->0mysql>SELECT7>6x;->1mysql>SELECT0>x6;->0mysql>SELECT0=x6;->1
=即是:
mysql>SELECT1=0;->0mysql>SELECT0=0;->1mysql>SELECT0.0=0;->1mysql>SELECT0.01=0;->0mysql>SELECT.01=0.01;->1
<>!=不即是:
mysql>SELECT.01<>0.01;->1mysql>SELECT.01<>0.01;->0mysql>SELECTzapp<>zappp;->1
<=小于或即是:
mysql>SELECT0.1<=2;->1
<小于:
mysql>SELECT2<2;->0
>=年夜于或即是:
mysql>SELECT2>=2;->1
>年夜于:
mysql>SELECT2>2;->0
<=>NULL值平安即是:
mysql>SELECT1<=>1,NULL<=>NULL,1<=>NULL;->110
ISNULLISNOTNULL测试一个值是或不是NULL:
mysql>SELECT1ISNULL,0ISNULL,NULLISNULL;->001mysql>SELECT1ISNOTNULL,0ISNOTNULL,NULLISNOTNULL;->110
为了可以与别的程序更好的事情,在利用ISNULL是MySQL撑持以下分外选择性:经由过程它,你能够找到最初拔出的纪录行:
SELECT*FROMtbl_nameWHEREauto_colISNULL
这个操纵能够经由过程设置SQL_AUTO_IS_NULL=0来克制。检察章节5.5.6SET句法.关于NOTNULL的DATE和DATETIME列,能够经由过程利用以下语句找到特别的值0000-00-00:
SELECT*FROMtbl_nameWHEREdate_columnISNULL
这必要经由过程某些ODBC使用程序才干事情(由于ODBC不撑持一个0000-00-00日期)

exprBETWEENminANDmax假如expr年夜于或即是min,而且expr小于或即是max,BETWEEN前往1,不然前往0。它等价于表达式(min<=exprANDexpr<=max),只需一切的参数均是不异的范例。不然范例会按照下面的划定规矩产生转换,可是使用于一切三个参数。注重,在MySQL4.0.5之前,参数被转换到expr的范例。
mysql>SELECT1BETWEEN2AND3;->0mysql>SELECTbBETWEENaANDc;->1mysql>SELECT2BETWEEN2AND3;->1mysql>SELECT2BETWEEN2ANDx-3;->0
exprNOTBETWEENminANDmax同等于NOT(exprBETWEENminANDmax)。

exprIN(value,...)假如expr是IN列表中的作一值,它将前往1,不然前往0。假如一切的值均是常数,那末一切的值被按照expr的范例举行盘算和排序。然后以一个二进制搜刮体例完成项目标搜刮。这就意味着,假如IN列表完整由常数构成,IN将长短常快的。假如expr是一个字母巨细写敏感的字符串表达式,字符串对照将以巨细写敏感体例实行:
mysql>SELECT2IN(0,3,5,wefwf);->0mysql>SELECTwefwfIN(0,3,5,wefwf);->1
从MySQL4.1入手下手(切合SQL-99尺度),假如左手边的表达式是NULL,大概在列表中没有发明相婚配的值而且列表中的一个表达式是NULL,IN均前往NULL。

exprNOTIN(value,...)同等于NOT(exprIN(value,...))。

ISNULL(expr)假如expr是NULL,ISNULL()前往1,不然前往0:
mysql>SELECTISNULL(1+1);->0mysql>SELECTISNULL(1/0);->1
注重,对NULL值利用=举行对照老是为false!COALESCE(list)前往列表中第一个非NULL的元素:
mysql>SELECTCOALESCE(NULL,1);->1mysql>SELECTCOALESCE(NULL,NULL,NULL);->NULL
INTERVAL(N,N1,N2,N3,...)Returns假如N<N1前往0,假如N<N2前往1,等等。一切的参数均被看成整数。为了函数能准确地事情,它请求N1<N2<N3<...<Nn。这是由于它利用的是一个二进制的搜刮(十分地快):
mysql>SELECTINTERVAL(23,1,15,17,30,44,200);->3mysql>SELECTINTERVAL(10,1,10,100,1000);->2mysql>SELECTINTERVAL(22,23,30,44,200);->0

假如以任何一个尺度运算符(=,<>...,但除LIKE)对一个疏忽巨细写的字符串举行对照,尾部的空缺空间(空格、TAB和换行)均被疏忽。

mysql>SELECT"a"="A
";->1
6.3.1.3逻辑运算符


在SQL中,一切的逻辑运算符前往的值均为TRUE、FALSE或NULL(未知)。在MySQL中,它们由1(TRUE)、0(FALSE)和NULL完成。这些年夜部分在分歧的SQL数据库间是不异的,但是某些大概会以一个非零值前往TRUE。
NOT!逻辑非。假如操纵数为0,前往1;假如操纵数为非零,前往0;假如操纵数为NOTNULL,前往NULL。
mysql>SELECTNOT10;->0mysql>SELECTNOT0;->1mysql>SELECTNOTNULL;->NULLmysql>SELECT!(1+1);->0mysql>SELECT!1+1;->1
最初一个例子前往1,由于表达式是与(!1)+1一样被盘算的。

AND&&逻辑与。假如一切的操纵数都长短零或非NULL的,前往1;假如有一个或多个操纵数为0,则前往0,只需操纵数中有NULL前往值就为NULL。
mysql>SELECT1&&1;->1mysql>SELECT1&&0;->0mysql>SELECT1&&NULL;->NULLmysql>SELECT0&&NULL;->0mysql>SELECTNULL&&0;->0
请注重,在MySQL4.0.5之前版本中,当碰到一个NULL时就中断盘算,而不是持续历程反省大概存在的0。这就意味着,在这些版本中,SELECT(NULLAND0)前往NULL,而不是0。在4.0.5中,代码已被从头计划了,已便于在任何仍旧利用优化情形下,前往值老是能如ANSI所划定的那样。OR||逻辑或。假如任何一个操纵数长短零的,前往值为1,假如任一操纵数为NULL,前往值为NULL,不然前往0。
mysql>SELECT1||1;->1mysql>SELECT1||0;->1mysql>SELECT0||0;->0mysql>SELECT0||NULL;->NULLmysql>SELECT1||NULL;->1
XOR逻辑异或。假如任一操纵数为NULL,前往值为NULL。关于非NULL的操纵数,假如有奇数个非零的操纵数,了局前往为1,不然前往0。
mysql>SELECT1XOR1;->0mysql>SELECT1XOR0;->1mysql>SELECT1XORNULL;->NULLmysql>SELECT1XOR1XOR1;->1
aXORb算术相称于(aAND(NOTb))OR((NOTa)andb)。XOR在MySQL4.0.2中被增加。6.3.1.4把持流函数

IFNULL(expr1,expr2)假如expr1为非NULL的,IFNULL()前往expr1,不然前往expr2。IFNULL()前往一个数字或字符串值,这取决于它被利用的语境:
mysql>SELECTIFNULL(1,0);->1mysql>SELECTIFNULL(NULL,10);->10mysql>SELECTIFNULL(1/0,10);->10mysql>SELECTIFNULL(1/0,yes);->yes
在MySQL4.0.6和更新版本中,IFNULL(expr1,expr2)的默许前往值以STRING、REAL或INTEGER按次加倍general了两个表达式。当你基于一个表达式创立一个表或在一个一时表中MySQL不能不存储一个从IFNULL()前往的值时,这个与较早MySQL版本的分歧将加倍值得注重。
CREATETABLEfooSELECTIFNULL(1,"test")astest;
在MySQL4.0.6中,列test的范例为CHAR(4),但是在较早的版本中,你失掉的倒是BIGINT。

NULLIF(expr1,expr2)假如expr1=expr2为真,前往NULL,不然前往expr1。它同等于CASEWHENx=yTHENNULLELSExEND:
mysql>SELECTNULLIF(1,1);->NULLmysql>SELECTNULLIF(1,2);->1
注重,假如参数不相称,在MySQL中,expr1被求值两次。

IF(expr1,expr2,expr3)假如expr1为真(expr1<>0和expr1<>NULL),那末IF()前往expr2,不然前往expr3。IF()前往一个数字或字符串,这取决于它被利用的语境:
mysql>SELECTIF(1>2,2,3);->3mysql>SELECTIF(1<2,yes,no);->yesmysql>SELECTIF(STRCMP(test,test1),no,yes);->no
假如expr2或expr3明白地为NULL,那末函数IF()的前往值范例为非NULL列的范例。(这在选择在MySQL4.0.3中新到场)。expr1是作为一个整数值被盘算的,这就意味着,假如测试的是一个浮点型或字符串值,就必需举行对照操纵:
mysql>SELECTIF(0.1,1,0);->0mysql>SELECTIF(0.1<>0,1,0);->1
在下面第一种情形下,IF(0.1)前往0,是由于0.1被转换为一个整数值,前往IF(0)的测试了局。这大概不是你所希冀的。在第二种情形下,对照测试原浮点数是不是为一个非零值。对照的了局被作为整数利用。缺省的IF()前往值范例(当了局存储在一时表中时,这长短常主要的)在MySQL3.23中按以下体例断定:表达式前往值表达式(expr2)或表达式(expr3)前往值为字符串字符串表达式(expr2)或表达式(expr3)前往值为浮点型值浮点型表达式(expr2)或表达式(expr3)前往值为整型整型假如表达式(expr2)和表达式(expr3)均是字符串,同时两个字符串均是疏忽字母巨细写的,那末前往值也是疏忽字母巨细写的(从MySQL3.23.51入手下手)。

CASEvalueWHEN[compare-value]THENresult[WHEN[compare-value]THENresult...][ELSEresult]ENDCASEWHEN[condition]THENresult[WHEN[condition]THENresult...][ELSEresult]END第一个情势当value=compare-value时前往result。第二个情势当第一个为真值的condition呈现时,前往该前提的了局。假如没有婚配的了局值,那末ELSE后的了局将被前往。假如没有ELSE部分,那末NULL被前往:
mysql>SELECTCASE1WHEN1THEN"one"WHEN2THEN"two"ELSE"more"END;->"one"mysql>SELECTCASEWHEN1>0THEN"true"ELSE"false"END;->"true"mysql>SELECTCASEBINARY"B"WHEN"a"THEN1WHEN"b"THEN2END;->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>SELECTASCII(2);->50mysql>SELECTASCII(2);->50mysql>SELECTASCII(dx);->100
也可参看ORD()函数。

ORD(str)假如字符串str的最右边的字符是一个多字节的字符,依据多字节字符的成份字符的ASCII码值经由过程上面的公式盘算前往谁人的编码:((firstbyteASCIIcode)*256+(secondbyteASCIIcode))[*256+thirdbyteASCIIcode...]。假如最右边的字符不是一个多字节字符,前往值与ASCII()函数不异:
mysql>SELECTORD(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>SELECTCONV("a",16,2);->1010mysql>SELECTCONV("6E",18,8);->172mysql>SELECTCONV(-17,10,-18);->-Hmysql>SELECTCONV(10+"10"+10+0xa,10,10);->40
BIN(N)前往N的字符串暗示的二进制值情势,在这里,N长长的(BIGINT)数字。这个函数等价于CONV(N,10,2)。假如N是一个NULL,前往值也是NULL:
mysql>SELECTBIN(12);->1100
OCT(N)前往N的字符串暗示的八进制值情势,在这里,N是一个长长的数字。这个函数等价于CONV(N,10,8)。假如N是一个NULL,前往值也是NULL:
mysql>SELECTOCT(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>SELECTHEX(255);->FFmysql>SELECTHEX("abc");->616263mysql>SELECT0x616263;->"abc"
CHAR(N,...)CHAR()以整数范例注释参数,前往这个整数所代表的ASCII码值给出的字符构成的字符串。NULL值将被疏忽:
mysql>SELECTCHAR(77,121,83,81,76);->MySQLmysql>SELECTCHAR(77,77.3,77.3);->MMM
CONCAT(str1,str2,...)将参数毗连成字符串前往。假如有任何一个参数为NULL,前往值也为NULL。能够有凌驾2个的参数。数字参数将被转换为相称价的字符串情势:
mysql>SELECTCONCAT(My,S,QL);->MySQLmysql>SELECTCONCAT(My,NULL,QL);->NULLmysql>SELECTCONCAT(14.3);->14.3
CONCAT_WS(separator,str1,str2,...)CONCAT_WS()撑持CONCAT加上一个分开符,它是一个特别情势的CONCAT()。第一个参数残剩参数间的分开符。分开符能够是与残剩参数一样的字符串。假如分开符是NULL,前往值也将为NULL。这个函数会跳太过隔符参数后的任何NULL和空字符串。分开符将被加到被毗连的字符串之间:
mysql>SELECTCONCAT_WS(",","Firstname","Secondname","LastName");->Firstname,Secondname,LastNamemysql>SELECTCONCAT_WS(",","Firstname",NULL,"LastName");->Firstname,LastName
LENGTH(str)OCTET_LENGTH(str)CHAR_LENGTH(str)CHARACTER_LENGTH(str)前往字符串str的长度:
mysql>SELECTLENGTH(text);->4mysql>SELECTOCTET_LENGTH(text);->4
注重,CHAR_LENGTH()和CHARACTER_LENGTH()关于多字节字符只计数一次。

BIT_LENGTH(str)前往字符串str的比专长度:
mysql>SELECTBIT_LENGTH(text);->32
LOCATE(substr,str)POSITION(substrINstr)前往子串substr在字符串str中第一次呈现的地位。假如子串substr在str中不存在,前往值为0:
mysql>SELECTLOCATE(bar,foobarbar);->4mysql>SELECTLOCATE(xbar,foobar);->0
这个函数是多字节平安的。在MySQL3.23中,这个函数是字母巨细写敏感的,当在MySQL4.0中时,若有任一参数是一个二进制字符串,它才是字母巨细写敏感的。

LOCATE(substr,str,pos)前往子串substr在字符串str中的第pos地位后第一次呈现的地位。假如substr不在str中前往0:
mysql>SELECTLOCATE(bar,foobarbar,5);->7
这个函数是多字节平安的。在MySQL3.23中,这个函数是字母巨细写敏感的,当在MySQL4.0中时,若有任一参数是一个二进制字符串,它才是字母巨细写敏感的。

INSTR(str,substr)前往子串substr在字符串str中第一次呈现的地位。这与有两个参数情势的LOCATE()类似,只是参数的地位被倒置了:
mysql>SELECTINSTR(foobarbar,bar);->4mysql>SELECTINSTR(xbar,foobar);->0
这个函数是多字节平安的。在MySQL3.23中,这个函数是字母巨细写敏感的,当在MySQL4.0中时,若有任一参数是一个二进制字符串,它才是字母巨细写敏感的。

LPAD(str,len,padstr)用字符串padstr对str举行右边弥补直至它的长度到达len个字符长度,然后前往str。假如str的长度善于len,那末它将被截除到len个字符。
mysql>SELECTLPAD(hi,4,??);->??hi
RPAD(str,len,padstr)用字符串padstr对str举行右侧弥补直至它的长度到达len个字符长度,然后前往str。假如str的长度善于len,那末它将被截除到len个字符。
mysql>SELECTRPAD(hi,5,?);->hi???
LEFT(str,len)前往字符串str中最右边的len个字符:
mysql>SELECTLEFT(foobarbar,5);->fooba
这个函数是多字节平安的。

RIGHT(str,len)前往字符串str中最右侧的len个字符:
mysql>SELECTRIGHT(foobarbar,4);->rbar
这个函数是多字节平安的。

SUBSTRING(str,pos,len)SUBSTRING(strFROMposFORlen)MID(str,pos,len)从字符串str的pos地位起前往len个字符的子串。利用FROM的变体情势是ANSISQL92的句法:
mysql>SELECTSUBSTRING(Quadratically,5,6);->ratica
这个函数是多字节平安的。

SUBSTRING(str,pos)SUBSTRING(strFROMpos)从字符串str的pos地位起前往子串:
mysql>SELECTSUBSTRING(Quadratically,5);->raticallymysql>SELECTSUBSTRING(foobarbarFROM4);->barbar
这个函数是多字节平安的。

SUBSTRING_INDEX(str,delim,count)前往字符串str中在第count个呈现的分开符delim之前的子串。假如count是一个负数,前往从最初的(从右边入手下手计数)分开符到右边一切字符。假如count是正数,前往从最初的(从右侧入手下手计数)分开符到右侧一切字符:
mysql>SELECTSUBSTRING_INDEX(www.mysql.com,.,2);->www.mysqlmysql>SELECTSUBSTRING_INDEX(www.mysql.com,.,-2);->mysql.com
这个函数是多字节平安的。

LTRIM(str)前往移除领头的空格字符后的str:
mysql>SELECTLTRIM(barbar);->barbar


RTRIM(str)前往移除尾部的空格字符后的str:
mysql>SELECTRTRIM(barbar);->barbar
这个函数是多字节平安的。

TRIM([[BOTH|LEADING|TRAILING][remstr]FROM]str)移除字符串str中一切的remstr前缀或后缀,然后将其前往。假如没有任何BOTH、LEADING或TRAILING润色符被给出,BOTH被假定。假如remstr没有被指定,空格将被移除:
mysql>SELECTTRIM(bar);->barmysql>SELECTTRIM(LEADINGxFROMxxxbarxxx);->barxxxmysql>SELECTTRIM(BOTHxFROMxxxbarxxx);->barmysql>SELECTTRIM(TRAILINGxyzFROMbarxxyz);->barx
这个函数是多字节平安的。

SOUNDEX(str)前往str的近音字。两个发音差未几的字符串应当有一样的近音字。一个尺度的近音字为4个字符长,可是函数SOUNDEX()却前往一个恣意长的字符串。你能够在了局上利用SUBSTRING()尺度的近音字。供应的字符中一切的非数字字母的字符均被疏忽。一切在A-Z局限以外的国际alpha字符被视为元音:
mysql>SELECTSOUNDEX(Hello);->H400mysql>SELECTSOUNDEX(Quadratically);->Q36324


SPACE(N)前往有N空格字符构成的字符串:
mysql>SELECTSPACE(6);->


REPLACE(str,from_str,to_str)在字符串str中一切呈现的字符串from_str均被to_str交换,然后前往这个字符串:
mysql>SELECTREPLACE(www.mysql.com,w,Ww);->WwWwWw.mysql.com
这个函数是多字节平安的。

REPEAT(str,count)前往一个由反复了count次的字符串str构成的字符串。假如count<=0,前往一个空字符串。假如str或count是NULL,前往值也为NULL:
mysql>SELECTREPEAT(MySQL,3);->MySQLMySQLMySQL


REVERSE(str)以倒置的字符按次前往字符串str:
mysql>SELECTREVERSE(abc);->cba
这个函数是多字节平安的。

INSERT(str,pos,len,newstr)在字符串str中,将从pos地位入手下手,len个字符长的子串交换为字符串newstr,然后将了局前往:
mysql>SELECTINSERT(Quadratic,3,4,What);->QuWhattic
这个函数是多字节平安的。

ELT(N,str1,str2,str3,...)假如N=1,前往str1,假如N=2,前往str2,等等。假如N小于1或年夜于参数的数目,前往NULL。ELT()FIELD()反运算:
mysql>SELECTELT(1,ej,Heja,hej,foo);->ejmysql>SELECTELT(4,ej,Heja,hej,foo);->foo


FIELD(str,str1,str2,str3,...)前往str在列表str1,str2,str3,...中的索引。假如str没有发明,前往0。FIELD()是ELT()的反运算:
mysql>SELECTFIELD(ej,Hej,ej,Heja,hej,foo);->2mysql>SELECTFIELD(fo,Hej,ej,Heja,hej,foo);->0


FIND_IN_SET(str,strlist)Returnsavalue假如字符串str在由N个子串构成的列表strlist中,前往一个1到N的值。一个字符串列表是由经由过程字符“,”分开的多个子串构成。假如第一个参数是一个常数字符串,而且第二个参数是一个SET列范例,FIND_IN_SET()函数将被优化为利用位运算!假如str在不strlist中大概假如strlist是一个空串,前往值为0。假如任何一个参数为NULL,前往值也是NULL。假如第一个参数包括一个“,”,这个函数将完整不克不及事情:
mysql>SELECTFIND_IN_SET(b,a,b,c,d);->2


MAKE_SET(bits,str1,str2,...)前往一个汇合(包括由字符“,”分开的多个子串构成的一个字符串),它由在bits汇合中有响应的比特位的字符串构成。str1对应于比特位0,str2对应比特位1,等等。在str1,str2,...中的NULL串不同意被增加到了局中:
mysql>SELECTMAKE_SET(1,a,b,c);->amysql>SELECTMAKE_SET(1|4,hello,nice,world);->hello,worldmysql>SELECTMAKE_SET(0,a,b,c);->


EXPORT_SET(bits,on,off,[separator,[number_of_bits]])前往一个字符串,关于在bits中的每一个比特字位,你将失掉一个on字符,而假如比特字位是一个清零比特位(resetbit)你将失掉一个off字符串。每一个字符串均被“分开符”(缺省为“,”)分开,而且只要number_of_bits(缺省为64)个bits被利用:
mysql>SELECTEXPORT_SET(5,Y,N,,,4)->Y,N,Y,N
示例(译者注):
mysql>selectEXPORT_SET(1,1,0,,5);->10000#最右边第一名为2的0次幂mysql>selectEXPORT_SET(2,1,0,,5);->01000#最右边第一名为2的0次幂,第二位为2的1次幂mysql>selectEXPORT_SET(4,1,0,,5);->00100#最右边第一名为2的0次幂,第二位为2的1次幂,第三位为2的2次幂mysql>selectEXPORT_SET(15,1,0,,5);->11110#最右边第一名为2的1次幂,第四位为2的3次幂mysql>selectEXPORT_SET(16,1,0,,5);->00001#最右边第一名为2的1次幂,第五位为2的4次幂#以上了局在MySQL4.0.12中测试经由过程
示例停止(译者注)

LCASE(str)LOWER(str)按照以后字符集设置映照(缺省为ISO-8859-1Latin1),将字符串str中的一切字符改动为小写,然后前往该值:
mysql>SELECTLCASE(QUADRATICALLY);->quadratically
这个函数是多字节平安的。

UCASE(str)UPPER(str)按照以后字符集设置映照(缺省为ISO-8859-1Latin1),将字符串str中的一切字符改动为年夜写,然后前往该值:
mysql>SELECTUCASE(Hej);->HEJ
这个函数是多字节平安的。

LOAD_FILE(file_name)读进文件,并将文件内容作为一个字符串前往。这个文件必需在服务器上,必需指定文件完全的路径名,而且你必需有FILE权限。文件必需完整可读,而且小于max_allowed_packet。假如该文件不存在,或由于下面的任一缘故原由而不克不及被读出,函数前往NULL:
mysql>UPDATEtbl_nameSETblob_column=LOAD_FILE("/tmp/picture")WHEREid=1;
假如你没有利用MySQL3.23,你不能不在你的使用程序中读取文件,以文件的信息创立一个INSERT语句,来更新数据库。假如你利用MySQL++库,上面有一个示例,具体请检察http://www.mysql.com/documentation/mysql++/mysql++-examples.html。

QUOTE(str)援用一个字符串,并前往一个了局,该了局可作为一个得当本义过的数据值在一个SQL语句中利用。字符串被单引号包抄着前往,而且在该字符串中每一个单引号(“”)、反斜线标记(“”)、ASCIINUL和Control-Z呈现的中央,在该字符之前均被加上了一个反斜线。假如参数是NULL,那末了局值是一个没有单引号包抄的单词“NULL”。QUOTE函数在MySQL4.0.3中被到场。
mysql>SELECTQUOTE("Dont");->Don        !mysql>SELECTQUOTE(NULL);->NULL
6.3.2.1字符串对照函数


在需要的时分,MySQL会主动地将数字转换到字符串,反之亦然:

mysql>SELECT1+"1";->2mysql>SELECTCONCAT(2,test);->2test

假如你但愿明白地将一个数字转换为字符串,将它参数传送到CONCAT()中。

假如将一个二进制字符串作为参数传送给一个字符串函数,了局前往也是一个二进制字符串。一个数字被转换到字符串,该字符串被视为是一个二进制字符串。这仅仅会影响了局。



一般,只需字符串对照中的任何一个表达式是辨别巨细写的,对照就会以字母巨细写敏感体例实行。
exprLIKEpat[ESCAPEescape-char]利用SQL的复杂的正轨表达式举行对照的形式婚配。前往1(TRUE)或0(FALSE)。能够在形式中利用上面所示的两个通配符字符与LIKE共同:字符寄义%婚配恣意多个字符,乃至是零个字符_严厉地婚配一个字符
mysql>SELECTDavid!LIKEDavid_;->1mysql>SELECTDavid!LIKE%D%v%;->1
为了测试一个含有通配符的笔墨实例,能够用本义符加在能配符前。假如没有明白指定ESCAPE字符,假定为“”:字符串寄义\%婚配一个%字符\_婚配一个_字符
mysql>SELECTDavid!LIKEDavid\_;->0mysql>SELECTDavid_LIKEDavid\_;->1
为了指定一个分歧的本义字符,可使用ESCAPE子句:
mysql>SELECTDavid_LIKEDavid|_ESCAPE|;->1
上面两个语句标明,字符串对照是疏忽巨细写的,除非任一操纵数是一个二进制字符串:
mysql>SELECTabcLIKEABC;->1mysql>SELECTabcLIKEBINARYABC;->0
LIKE同意用在一个数字表达式上。(这是MySQL对ANSISQLLIKE的扩大。)
mysql>SELECT10LIKE1%;->1
注重:由于MySQL在字符串中利用的是C的本义句法(比方“
”),以是在LIKE字符串中利用的任何一个“”必需被双写。比方,为了查找“
”,必需以“
”情势指定它。为了查找“”,必需指定它为“\”(反斜线被语法剖析器剥离一次,另外一次在形式婚配时完成,留下一条独自的反斜线被婚配)。

exprNOTLIKEpat[ESCAPEescape-char]不异于NOT(exprLIKEpat[ESCAPEescape-char])。

exprSOUNDSLIKEexpr同等于SOUNDEX(expr)=SOUNDEX(expr)(合用于MySQL4.1或更新的版本)。

exprREGEXPpatexprRLIKEpat按照形式pat对字符串表达式expr实行一个形式对照。形式能够是一个扩大的正则表达式。检察章节GMySQL正则表达式。Returns假如表达式expr婚配pat,前往1,不然前往0。RLIKE是REGEXP的同义词,它供应了与mSQL的兼容。注重:MySQL在字符串中利用的是C的本义句法(比方“
”),以是在REGEXP字符串中利用的任何一个“”必需被双写。在MySQL3.23.4中,REGEXP关于一般的(不是二进制)字符串是疏忽巨细写的:
mysql>SELECTMonty!REGEXPm%y%%;->0mysql>SELECTMonty!REGEXP.*;->1mysql>SELECTnew*
*lineREGEXPnew*.*line;->1mysql>SELECT"a"REGEXP"A","a"REGEXPBINARY"A";->10mysql>SELECT"a"REGEXP"^[a-d]";->1
当决意一个字符的范例时,REGEXP和RLIKE利用以后利用的字符集(缺省为ISO-8859-1Latin1)。

exprNOTREGEXPpatexprNOTRLIKEpat同等于NOT(exprREGEXPpat)。

STRCMP(expr1,expr2)假如字符串是不异,STRCMP()前往0,假如第一个参数依据以后排次序序小于第二个参数,前往-1,不然前往1:
mysql>SELECTSTRCMP(text,text2);->-1mysql>SELECTSTRCMP(text2,text);->1mysql>SELECTSTRCMP(text,text);->0


MATCH(col1,col2,...)AGAINST(expr)MATCH(col1,col2,...)AGAINST(exprINBOOLEANMODE)MATCH...AGAINST()用于全文搜刮,前往在列(col1,col2,...)和查询expr之间文本的相干类似的标准。相干性是一个正的浮点型数字。零相干性意味着不类似。MATCH...AGAINST()可用于MySQL3.23.23或更新的版本中。INBOOLEANMODE扩大在MySQL4.0.1中被新到场。具体形貌和利用典范,请检察6.8MySQL全文搜刮。6.3.2.2字母巨细写敏理性



BINARYBINARY操纵符将跟在它前面的字符串强迫作为一个二进制字符串。这能够很简单地强迫一个列的对照以字母巨细写敏感体例举行,即便该列没有界说为BINARY或BLOB?
mysql>SELECT"a"="A";->1mysql>SELECTBINARY"a"="A";->0
BINARYstring是CAST(stringASBINARY)的缩写。检察章节6.3.5Cast函数。BINARY在MySQL3.23.0中被到场。注重,当将一个索引列强迫为BINARY时,在某些语境中,MySQL将不克不及无效地利用索引。
假如但愿对一个blob举行疏忽字母巨细的对照时,你一般能够在对照前将它转换到年夜写:

SELECTALIKEUPPER(blob_col)FROMtable_name;

我们企图不久推出在分歧字符集间的转化,以使字符串对照有更好的伸缩性。
6.3.3数字函数6.3.3.1算术运算
经常使用的算术操纵符均是可用的。注重,假如两个参数均是整型,`-,`+和`*以BIGINT(64位)精度运算并前往了局!假如一个参数是一个无标记的整数,另外一个参数也是一个整数,了局也将是一个无标记整数。检察章节6.3.5Cast函数。

+加法:
mysql>SELECT3+5;->8
-减法:
mysql>SELECT3-5;->-2
*乘法:
mysql>SELECT3*5;->15mysql>SELECT18014398509481984*18014398509481984.0;->324518553658426726783156020576256.0mysql>SELECT18014398509481984*18014398509481984;->0
最初一个表达式的了局是毛病的,这是由于乘法了局凌驾了64位BIGINT盘算局限。/除法:
mysql>SELECT3/5;->0.60
被0除将前往一个NULL了局:
mysql>SELECT102/(1-1);->NULL
只要当在一个了局被转换到一个整数的语境中实行时,除法将会以BIGINT举行算术盘算。6.3.3.2数学函数
一切的数学函数在产生毛病的情形下,均前往NULL。


-一元减。改动参数的标记:
mysql>SELECT-2;->-2
注重,假如这个操纵符被用于一个BIGINT,前往值也是一个BIGINT!这就意味着,应当制止在一个大概有值-2^63的整数上利用-操纵符!

ABS(X)前往X的相对值:
mysql>SELECTABS(2);->2mysql>SELECTABS(-32);->32
这个函数可平安地利用于BIGINT值。

SIGN(X)以-1、0或1体例前往参数的标记,它取决于参数X是正数、0或负数。
mysql>SELECTSIGN(-32);->-1mysql>SELECTSIGN(0);->0mysql>SELECTSIGN(234);->1
MOD(N,M)%取模(就如C中的%操纵符)。前往N被M除后的余数:
mysql>SELECTMOD(234,10);->4mysql>SELECT253%7;->1mysql>SELECTMOD(29,9);->2mysql>SELECT29MOD9;->2
这个函数可平安地利用于BIGINT值。最初一个示例可在MySQL4.1中事情。

FLOOR(X)前往不年夜于X的最年夜整数值:
mysql>SELECTFLOOR(1.23);->1mysql>SELECTFLOOR(-1.23);->-2
注重,前往值被转换为一个BIGINT!

CEILING(X)前往不小于X的最小整数:
mysql>SELECTCEILING(1.23);->2mysql>SELECTCEILING(-1.23);->-1
注重,前往值被转换为一个BIGINT!

ROUND(X)ROUND(X,D)将参数X四舍五进到比来的整数,然后前往。两个参数的情势是将一个数字四舍五进到D个小数后前往。
mysql>SELECTROUND(-1.23);->-1mysql>SELECTROUND(-1.58);->-2mysql>SELECTROUND(1.58);->2mysql>SELECTROUND(1.298,1);->1.3mysql>SELECTROUND(1.298,0);->1
注重,当参数在两个整数之间时,ROUND()的举动取决于C库的完成。某些取整到比来的偶数,老是向下取,老是向上取,也大概老是靠近于零。假如你必要某种取整范例,应当利用一个明白界说的函数好比TRUNCATE()或FLOOR()取代。

DIV整除。相似于FLOOR(),可是它可平安地用于BIGINT值。
mysql>SELECT5DIV2->2
DIV在MySQL4.1.0中新到场。

EXP(X)前往值e(天然对数的底)的X次方:
mysql>SELECTEXP(2);->7.389056mysql>SELECTEXP(-2);->0.135335
LN(X)前往X的天然对数:
mysql>SELECTLN(2);->0.693147mysql>SELECTLN(-2);->NULL
这个函数在MySQL4.0.3被新到场。在MySQL中,它是LOG(X)的同义词。

LOG(X)LOG(B,X)假如以一个参数挪用,它前往X的天然对数:
mysql>SELECTLOG(2);->0.693147mysql>SELECTLOG(-2);->NULL
假如以两个参数挪用,这个函数前往X恣意底B的对数:
mysql>SELECTLOG(2,65536);->16.000000mysql>SELECTLOG(1,100);->NULL
恣意底选项在MySQL4.0.3中被到场。LOG(B,X)等价于LOG(X)/LOG(B)。

LOG2(X)前往X的以2为底的对数:
mysql>SELECTLOG2(65536);->16.000000mysql>SELECTLOG2(-100);->NULL
LOG2()一般能够用于计数出一个数字必要几个比特位用于存储它。这个函数在MySQL4.0.3中被增加。在更早的版本中,可使用LOG(X)/LOG(2)来取代它。

LOG10(X)前往X以10为底的对数:
mysql>SELECTLOG10(2);->0.301030mysql>SELECTLOG10(100);->2.000000mysql>SELECTLOG10(-100);->NULL
POW(X,Y)POWER(X,Y)前往X的Y幂:
mysql>SELECTPOW(2,2);->4.000000mysql>SELECTPOW(2,-2);->0.250000
SQRT(X)前往X的非否平方根:
mysql>SELECTSQRT(4);->2.000000mysql>SELECTSQRT(20);->4.472136
PI()前往PI值(圆周率)。短少显现5位小数,可是在MySQL外部,为PI利用全体的双精度。
mysql>SELECTPI();->3.141593mysql>SELECTPI()+0.000000000000000000;->3.141592653589793116
COS(X)前往X的余弦,在这里,X以弧度给出:
mysql>SELECTCOS(PI());->-1.000000
SIN(X)前往X的正弦,在这里,X以弧度给出:
mysql>SELECTSIN(PI());->0.000000
TAN(X)前往X的正切,在这里,X以弧度给出:
mysql>SELECTTAN(PI()+1);->1.557408
ACOS(X)前往X的反余弦,更切实地说,前往余弦值为X的值。假如X不在-1到1之间的局限内,前往NULL:
mysql>SELECTACOS(1);->0.000000mysql>SELECTACOS(1.0001);->NULLmysql>SELECTACOS(0);->1.570796
ASIN(X)前往X的归正弦,更切实地说,前往正弦值为X的值。假如X不在-1到1之间的局限内,前往NULL:
mysql>SELECTASIN(0.2);->0.201358mysql>SELECTASIN(foo);->0.000000
ATAN(X)前往X的归正切,更切实地说,前往正切值为X的值:
mysql>SELECTATAN(2);->1.107149mysql>SELECTATAN(-2);->-1.107149
ATAN(Y,X)ATAN2(Y,X)前往两个变量X和Y的归正切。它相似于盘算Y/X的归正切,除两个参数的标记用于决意了局的象限:
mysql>SELECTATAN(-2,2);->-0.785398mysql>SELECTATAN2(PI(),0);->1.570796
COT(X)前往X的余切:
mysql>SELECTCOT(12);->-1.57267341mysql>SELECTCOT(0);->NULL
RAND()RAND(N)前往一个局限在0到1.0之间的随机浮点值。假如一个整数参数N被指定,它被当作种子值利用(用于发生一个可反复的数值):
mysql>SELECTRAND();->0.9233482386203mysql>SELECTRAND(20);->0.15888261251047mysql>SELECTRAND(20);->0.15888261251047mysql>SELECTRAND();->0.63553050033332mysql>SELECTRAND();->0.70100469486881
在一个ORDERBY子句中,不成以利用RAND()值利用一个列,由于ORDERBY将屡次反复盘算列。从MySQL3.23入手下手,你可使用:SELECT*FROMtable_nameORDERBYRAND(),这有益于失掉一个来自SELECT*FROMtable1,table2WHEREa=bANDc<dORDERBYRAND()LIMIT1000的汇合中的随机样本。注重,在一个WHERE子句中的RAND()将在每次WHERE实行时被从头盘算。RAND()并非预期完善的随机数产生器,可是能够取代做为发生出格的随机数一个疾速的办法,如许便于在两个分歧平台下的统一MySQL版本间挪动。

LEAST(X,Y,...)有两个或更多个参数,前往最小(最小值)的参数。参数利用以下划定规矩举行对照:假如前往值用于一个INTEGER语境,或一切的参数是整数值,它们作为整数对照。假如前往值用于一个REAL语境,或一切的参数均是实数值,它们作为实数被对照。假如任何一个参数是字母巨细写敏感的,参数作为巨细写敏感的字符串举行对照。在别的情形下,参数做为疏忽巨细写的字符中举行对照:
mysql>SELECTLEAST(2,0);->0mysql>SELECTLEAST(34.0,3.0,5.0,767.0);->3.0mysql>SELECTLEAST("B","A","C");->"A"
在早于MySQL3.22.5的版本中,你可使用MIN()取代LEAST。

GREATEST(X,Y,...)前往最年夜(最年夜值)参数。参数利用与LEAST分歧的划定规矩举行对照:
mysql>SELECTGREATEST(2,0);->2mysql>SELECTGREATEST(34.0,3.0,5.0,767.0);->767.0mysql>SELECTGREATEST("B","A","C");->"C"
在早于MySQL3.22.5的版本中,可使用MAX()取代GREATEST。

DEGREES(X)将参数X从弧度转换为角度,然后前往:
mysql>SELECTDEGREES(PI());->180.000000
RADIANS(X)将参数X从角度转换为弧度,然后前往:
mysql>SELECTRADIANS(90);->1.570796
TRUNCATE(X,D)将数值X截到D个小数,然后前往。假如D为0,了局将不包括小数点和小数部分:
mysql>SELECTTRUNCATE(1.223,1);->1.2mysql>SELECTTRUNCATE(1.999,1);->1.9mysql>SELECTTRUNCATE(1.999,0);->1mysql>SELECTTRUNCATE(-1.999,1);->-1.9
从MySQL3.23.51入手下手,一切数字被四舍五进到零。假如D是正数,那末数字的全部部分被瞄准零位输入:
mysql>SELECTTRUNCATE(122,-2);->100
注重,十进值小数在盘算机中一般不以准确数字存储,而是双精度型的值,你大概会被以下了局所捉弄:
mysql>SELECTTRUNCATE(10.28*100,0);->1027
下面了局的产生是由于10.28实践上是以某些像10.2799999999999999的情势被存储的。无疑希望员工得到系统、有深度的培训,显然MySQL在这一点上还做得很不够。
作者: 飘灵儿    时间: 2015-1-19 22:27
是否碎片会引发效率问题?这都是需要进一步探讨的东西。varbinary(max)代替image也让SQLServer的字段类型更加简洁统一。
作者: 透明    时间: 2015-1-28 13:59
始终遗憾SQLServer的登陆无法分配CPU/内存占用等指标数。如果你的SQLServer给别人分配了一个只可以读几个表的权限,而这个家伙疯狂的死循环进行连接查询,会给你的系统带来很大的负担。
作者: 再现理想    时间: 2015-2-5 21:44
代替了原来VB式的错误判断。比Oracle高级不少。
作者: 飘飘悠悠    时间: 2015-2-13 17:48
比如日志传送、比如集群。。。
作者: 兰色精灵    时间: 2015-3-4 01:04
然后最好有实践机会,能够把实践到的和实践结合起来,其实理论思考是个非常困扰和痛苦的事情
作者: 简单生活    时间: 2015-3-11 15:04
分区表效率问题肯定是大家关心的问题。在我的试验中,如果按照分区字段进行的查询(过滤)效率会高于未分区表的相同语句。但是如果按照非分区字段进行查询,效率会低于未分区表的相同语句。
作者: 山那边是海    时间: 2015-3-19 00:48
对于数据库来说,查询是数据库的灵魂,那么SQL查询效率究竟效率如何呢?下文将带对SQL查询的相关问题进行讨论,供您参考。
作者: 活着的死人    时间: 2015-3-27 00:07
外键的级联更能扩展可能大部分的同行在设计OLTP系统的时候都不愿意建立外键,都是通过程序来控制父子数据的完整性。




欢迎光临 仓酷云 (http://ckuyun.com/) Powered by Discuz! X3.2