insert ignore insert ignore表示,如果中已经存在相同的记录,则忽略当前新数据 如果您使用一个例如“SET col_name = col_name + 1”的赋值,则对位于右侧的列名称的引用会被作为DEFAULT(col_name)处理。因此,该赋值相当于SET col_name = DEFAULT(col_name) + 1。 MySQL 的CAST()和CONVERT()函数可用来获取一个类型的值,并产生另一个类型的值 数据类型转换 CAST(value as type); CONVERT(value, type); 这个和like很像,也是可以支持正则表达式 PATINDEX ( '%pattern%' , expression ) 获取pattern字符出现的位置 声明mysql变量 declare @len int declare @str nvarchar(4000) declare @des nvarchar(4000) declare @count int REPLACE INTO `table` (`unique_column`,`num`) VALUES ('$unique_value',$num);跟INSERT INTO `table` (`unique_column`,`num`) VALUES('$unique_value',$num) ON DUPLICATE UPDATE num=$num;还是有些区别的. 区别就是replace into的时候会删除老记录。如果表中有一个自增的主键。 那么就要出问题了。 REVERSE(str) 返回字符串str并反转字符的顺序。 SUBSTRING_INDEX(str,delim,count) 返回从字符串str分隔符 delim 在计数发生前的子字符串。如果计数是正的,则返回一切到最终定界符(从左边算起)的左侧。如果count是负数,则返回一切最终定界符(从右边算起)的右侧。SUBSTRING_INDEX() 搜寻在delim时进行区分大小写的匹配 mysql> SELECT SUBSTRING_INDEX('www.mysql.com', '.', 2); +---------------------------------------------------------+ | SUBSTRING_INDEX('www.mysql.com', '.', 2) | +---------------------------------------------------------+ | www.mysql | +------------ concat是连接几个字符串,可以多个哦。 concat('wo','lin','xue','bin') 结果就是wolinxuebin。 SBUSTR(str,pos); 就是从pos开始的位置,一直截取到最后。 还有一种比较常用的是: 复制代码 代码如下: SUBSTR(str,pos,len); 这种表示的意思是,就是从pos开始的位置,截取len个字符(空白也算字符)。 1.substring 返回字符、binary、text 或 image 表达式的一部分。 基本语法:SUBSTRING ( expression , start , length ) expression:字符串、二进制字符串、text、image、列或包含列的表达式 start:整数,指定子串的开始位置 注:SQL中"1"表示字符串中的第一个字符,而.NET中"0"表示第一个字符 length:整数,指定子串的长度(要返回的字符数或字节数) 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) left(str, length) 说明:left(被截取字段,截取长度) right(str, length) 说明:right(被截取字段,截取长度) 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 INSTR(字段名, 字符串) 这个函数返回字符串在某一个字段的内容中的位置, 没有找到字符串返回0,否则返回位置(从1开始) REGEXP和NOT REGEXP 和like not like 差不多 TOP 子句用于规定要返回的记录的数目 SELECT TOP 2 * FROM Persons SELECT * FROM Persons LIMIT 2 功能差不多 IN 操作符 IN 操作符允许我们在 WHERE 子句中规定多个值。 SQL IN 语法 SELECT column_name(s) FROM table_name WHERE column_name IN (value1,value2,...) BETWEEN 操作符 操作符 BETWEEN ... AND 会选取介于两个值之间的数据范围。这些值可以是数值、文本或者日期。 SQL BETWEEN 语法 SELECT column_name(s) FROM table_name WHERE column_name BETWEEN value1 AND value2 方法1: MYSQL不支持: Select * Into new_table_name from old_table_name; 替代方法: Create table new_table_name (Select * from old_table_name); create table dust select * from student;//用于复制前未创建新表dust的情况下 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???' LTRIM(str) 返回删除了其前置空格字符的字符串str。 mysql> select LTRIM(' barbar'); -> 'barbar' RTRIM(str) 返回删除了其拖后空格字符的字符串str。 mysql> select RTRIM('barbar '); -> 'barbar' 该函数对多字节是可靠的。 TRIM([[BOTH | LEA DING | 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的一个同音字符串。听起来“大致相同”的2个字符串应该有相同的同音字符串。一个“标准”的同音字符串长是4个字符,但是SOUNDEX()函数返回一个任意长的字符串。 你可以在结果上使用SUBSTRING()得到一个“标准”的 同音串。所有非数字字母字符在给定的字符串中被忽略。所有在A-Z之外的字符国际字母被当作元音。 mysql> select SOUNDEX('Hello'); -> 'H400' mysql> select SOUNDEX('Quadratically'); -> 'Q36324' SPACE(N) 返回由N个空格字符组成的一个字符串。 mysql> select SPACE(6); -> ' ' 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()。 如果字符串函数提供一个二进制字符串作为参数,结果字符串也是一个二进制字符串。被变换到一个字符串的数字被当作是一个二进制字符串。这仅影响比较 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。2个参数形式WEEK()允许你指定星期是否开始于星期天或星期一。如果第二个参数是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之间月数,P1和P2应该以格式YYMM或YYYYMM。注意,时期参数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值 含义 期望的expr格式 SECOND 秒 SECONDS MINUTE 分钟 MINUTES HOUR 时间 HOURS DAY 天 DAYS MONTH 月 MONTHS YEAR 年 YEARS MINUTE_SECOND 分钟和秒 "MINUTES:SECONDS" HOUR_MINUTE 小时和分钟 "HOURS:MINUTES" DAY_HOUR 天和小时 "DAYS HOURS" YEAR_MONTH 年和月 "YEARS-MONTHS" HOUR_SECOND 小时, 分钟, "HOURS:MINUTES:SECONDS" DAY_MINUTE 天, 小时, 分钟 "DAYS HOURS:MINUTES" DAY_SECOND 天, 小时, 分钟, 秒 "DAYS HOURS:MINUTES:SECONDS" 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' DATE_FORMAT(date,format) 根据format字符串格式化date值。下列修饰符可以被用在format字符串中: %M 月名字(January……December) %W 星期名字(Sunday……Saturday) %D 有英语前缀的月份的日期(1st, 2nd, 3rd, 等等。) %Y 年, 数字, 4 位 %y 年, 数字, 2 位 %a 缩写的星期名字(Sun……Sat) %d 月份中的天数, 数字(00……31) %e 月份中的天数, 数字(0……31) %m 月, 数字(01……12) %c 月, 数字(1……12) %b 缩写的月份名字(Jan……Dec) %j 一年中的天数(001……366) %H 小时(00……23) %k 小时(0……23) %h 小时(01……12) %I 小时(01……12) %l 小时(1……12) %i 分钟, 数字(00……59) %r 时间,12 小时(hh:mm:ss [AP]M) %T 时间,24 小时(hh:mm:ss) %S 秒(00……59) %s 秒(00……59) %p AM或PM %w 一个星期中的天数(0=Sunday ……6=Saturday ) %U 星期(0……52), 这里星期天是星期的第一天 %u 星期(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 Mysql取系统函数: Select curtime(); Select curdate(): Select sysdate(): select now(); INTERVAL(N,N1,N2,N3,..........) INTERVAL()函数进行比较列表(N1,N2,N3等等)中的N值。该函数如果N<N1返回0,如果N<N2返回1,如果N<N3返回2 等等。如果N为NULL,它将返回-1。 列表值必须是N1<N2<N3的形式才能正常工作。下面的代码是显示 INTERVAL()函数如何工作的一个简单的例子 mysql>SELECT INTERVAL(6,1,2,3,4,5,6,7,8,9,10); +---------------------------------------------------------+ | INTERVAL(6,1,2,3,4,5,6,7,8,9,10) | +---------------------------------------------------------+ | 6 | +---------------------------------------------------------+ 函数 FORMAT(X ,D ) 函数使用说明: 将 number X 设置为格式 '#,###,###.##', 以四舍五入的方式保留到小数点后 D 位 , 而返回结果为一个字符串。 SELECT FORMAT(100,5) +---------------+ | FORMAT(100,5) | +---------------+ | 100.00000 | +---------------+ 函数QUOTE(str ) 函数使用说明:引证一个字符串,由此产生一个在SQL 语句中可用作完全转义数据值的结果。 返回的字符串由单引号标注 ,每例都带有单引号 (‘'’) 、 反斜线符号 (‘\’) 、 ASCII NUL 以及前面有反斜线符号的Control-Z 。如果自变量的值为NULL, 则返回不带单引号的单词 “NULL” 。 引用一个字符串以产生一个结果可以作为SQL语句中正确地转义数据值。返回的字符串由单引号和单引号的各个实例封闭(''),反斜线(''), ASCII NUL 和 Control-Z前面加一个反斜杠。如果参数为NULL,则返回值是词 'NULL' 不包围单引号 QUARTER(date) 返回的一年日期,取值范围为1至4季度。 mysql> SELECT QUARTER('98-04-01'); +---------------------------------------------------------+ | QUARTER('98-04-01') | +---------------------------------------------------------+ | 2 | +---------------------------------------------------------+ 函数 ABS(X) 函数使用说明:返回 X 的绝对值 函数 PI() 函数使用说明:返回 ϖ (pi) 的值。默认的显示小数位数是 7 位 , 然而 MySQL 内部会使用完全双精度值。 SELECT PI() SELECT POW(4,2) 函数 POW(X ,Y ) , POWER(X ,Y ) 函数使用说明:返回 X 的 Y 乘方的结果值。 函数 RAND() RAND(N ) 函数使用说明:返回一个随机浮点值 v ,范围在 0 到 1 之间 ( 即 , 其范围为 0 ≤ v ≤ 1.0) 。若已指定一个整数参数 N ,则它被用作种子值,用来产生重复序列。 SELECT RAND(5) SELECT RAND() 函数 ROUND(X ) ROUND(X ,D ) 函数使用说明:返回参数 X , 其值接近于最近似的整数。在有两个参数的情况下,返回 X ,其值保留到小数点后 D 位,而第 D 位的保留方式为四舍五入。若要接保留 X 值小数点左边的 D 位,可将 D 设为负值。 四舍五入函数 SELECT ROUND(3.4) 3 SELECT ROUND(3.5) 4 SELECT ROUND(3.45,2) 函数TRUNCATE(X ,D ) 函数使用说明: 返回被舍去至小数点后 D 位的数字 X 。若 D 的值为 0, 则结果 不带有小数点或不带有小数部分。可以将 D 设为负数 , 若要截去 ( 归零 ) X 小数点左起第 D 位开始后面所有低位的值 SELECT TRUNCATE(3.54566,3) 3.545 使用Mysql全文检索fulltext的先决条件 表的类型必须是MyISAM 建立全文检索的字段类型必须是char,varchar,text 全文搜索功能函数 必须是FULLTEXT 类型的 col 列明 AGAINST需要匹配的字符串 函数 MATCH (col1,col2,...) AGAINST (expr [IN BOOLEAN MODE | WITH QUERY EXPANSION]) 2.建立全文检索先期配置 由于Mysql的默认配置是索引的词的长度是4,所以要支持中文单字的话,首先更改这个. *Unix用户要修改my.cnf,一般此文件在/etc/my.cnf,如果没有找到,先查找一下find / -name 'my.cnf' 在 [mysqld] 位置内加入: ft_min_word_len = 2 其它属性还有 ft_wordlist_charset = gbk ft_wordlist_file = /home/soft/mysql/share/mysql/wordlist-gbk.txt ft_stopword_file = /home/soft/mysql/share/mysql/stopwords-gbk.txt 稍微解释一下: ft_wordlist_charset 表示词典的字符集, 目前支持良好的有(UTF-8, gbk, gb2312, big5) ft_wordlist_file 是词表文件, 每行包括一个词及其词频(用若干制表符或空格分开,消岐专用) ft_stopword_file 表示过滤掉不索引的词表, 一行一个. ft_min_word_len 加入索引的词的最小长度, 缺省是 4, 为了支持中文单字故改为 2 SELECT * FROM articles -> -> WHERE MATCH (title,body) AGAINST ('database'); 例如下面的这个例子: 搜索title和body中包含 MySQL ,但是不能有 YourSQL 的结果。 SELECT * FROM articles WHERE MATCH (title,body) AGAINST ('+MySQL -YourSQL' IN BOOLEAN MODE); 缺省的 (当既没有加号也没有负号被指定时)词是随意的,但是包含它的记录行将被排列地更高一点。这个模仿没有 IN BOOLEAN MODE 修饰词的 MATCH() … AGAINST() 的行为。 < > 这两个操作符用于改变一个词的相似性值的基值。< 操作符减少基值,> 操作符则增加它。参看下面的示例。 ( ) 圆括号用于对子表达式中的词分组。 ~ 一个领头的否定号的作用象一个否定操作符,引起行相似性的词的基值为负的。它对标记一个噪声词很有用。一个包含这样的词的记录将被排列得低一点,但是不会被完全的排除,因为这样可以使用 – 操作符。 * 一个星号是截断操作符。不想其它的操作符,它应该被追加到一个词后,不加在前面。 ” 短语,被包围在双引号”中,只匹配包含这个短语(字面上的,就好像被键入的)的记录行。 apple banana 找至少包含上面词中的一个的记录行 +apple +juice … 两个词均在被包含 +apple macintosh … 包含词 “apple”,但是如果同时包含 “macintosh”,它的排列将更高一些 +apple -macintosh … 包含 “apple” 但不包含 “macintosh” +apple +(>pie ... 包含 “apple” 和 “pie”,或者包含的是 “apple” 和 “strudel” (以任何次序),但是 “apple pie” 排列得比 “apple strudel” 要高一点 apple* ... 包含 “apple”,“apples”,“applesauce” 和 “applet” "some words" ... 可以包含 “some words of wisdom”,但不是 “some noise words” 6.8.1 全文的限制 MATCH() 函数的所有参数必须是从来自于同一张表的列,同时必须是同一个FULLTEXT 索引中的一部分,除非 MATCH() 是 IN BOOLEAN MODE 的。 MATCH() 列列表必须确切地匹配表的某一 FULLTEXT 索引中定义的列列表,除非 MATCH() 是 IN BOOLEAN MODE 的。 AGAINST() 的参数必须是一个常量字符串。 6.8.2 微调 MySQL 全文搜索 不幸地,全文搜索仍然只有很少的用户可调参数,虽然增加一些在 TODO 上排列很高。如果你有一个 MySQL 源码发行(查看章节 2.3 安装一个 MySQL 源码发行),你可以发挥对全文搜索的更多控制。 注意,全文搜索为最佳的搜索效果,被仔细地调整了。修改默认值的行为,在大多数情况下,只会使搜索结果更糟。不要修改 MySQL 的源代码,除非你知道你在做什么! 被索引的词的最小长度由 MySQL 变量 ft_min_word_len 指定。查看章节 4.5.6.4 SHOW VARIABLES。将它改为你所希望的值,并重建你的 FULLTEXT 索引。 (这个变量只从 MySQL 4.0 开始被支持) stopword 列表可以从 ft_stopword_file 变量指定的文件中读取。查看章节 4.5.6.4 SHOW VARIABLES。在修改了 stopword 列表后,重建你的 FULLTEXT 索引。(这个变量只从 MySQL 4.0.10 开始被支持) 50% 阈值选择由所选择的特殊的衡量模式确定。为了禁止它,修改 `myisam/ftdefs.h' 文件中下面的一行: #define GWS_IN_USE GWS_PROB 改为: #define GWS_IN_USE GWS_FREQ 然 后重新编译 MySQL。在这种情况下,不需要重建索引。 注意:使用了这个,将严重地减少 MySQL 为 MATCH() 提供足够的相似性值的能力。如果你确实需要搜索这样的公共词,最好使用 IN BOOLEAN MODE 的搜索代替,它不遵守 50% 的阈值。 有时,搜索引擎维护员希望更改使用于逻辑全文搜索的操作符。这些由变量 ft_boolean_syntax 定义。查看章节 4.5.6.4 SHOW VARIABLES。然而,这个变量是只读的,它的值在 `myisam/ft_static.c' 中被设置。 对于这些更改,要求你重建你的 FULLTEXT 索引,对于一个 MyISAM 表,最容易的重建索引文件的方式如下面的语句: mysql> REPAIR TABLE tbl_name QUICK; 6.8.3 全文搜索 TODO 使所有对 FULLTEXT 索引的操作更快 邻近(Proximity)操作符 对 “always-index words” 的支持。他们可以是用户希望视为一个词处理的任意字符串,例如 “C++”、”AS/400″、”TCP/IP”,等等 支持在 MERGE 表中的全文搜索 对多字节字符的支持 依照数据的语言建立 stopword 列表 Stemming (当然,依赖于数据的语言) Generic user-suppliable UDF preparser. 使模式更加灵活 (通过为 CREATE/ALTER TABLE 中的 FULLTEXT 增加某些可调整参数) 布尔全文搜索 特点: 它们不使用 50% 域值 它们不会按照相关性渐弱的顺序将行进行分类。你可以从上述问询结果中看到这一点:相关性最高的行是一个包含两个“MySQL” 的行,但它被列在最后的位置,而不是开头位置 即使没有FULLTEXT,它们仍然可以工作,尽管这种方式的搜索执行的速度非常之慢 最小单词长度全文参数和最大单词长度全文参数均适用 停止字适用 布尔全文搜索的性能支持以下操作符: ” + ” 一个前导的加号表示该单词必须 出现在返回的每一行的开头位置 ” – “一个前导的减号表示该单词一定不能出现在任何返回的行中 (无操作符) 在默认状态下(当没有指定 + 或–的情况下),该单词可有可无,但含有该单词的行等级较高。这和MATCH() … AGAINST()不使用IN BOOLEAN MODE修改程序时的运作很类似 ” > < "这两个操作符用来改变一个单词对赋予某一行的相关值的影响。 > 操作符增强其影响,而 <操作符则减弱其影响。请参见下面的例子 " () "括号用来将单词分成子表达式。括入括号的部分可以被嵌套 " ~ "一个前导的代字号用作否定符, 用来否定单词对该行相关性的影响。 这对于标记“noise(无用信息)”的单词很有用。包含这类单词的行较其它行等级低,但因其可能会和-号同时使用,因而不会在任何时候都派出所有无用信息行 " * "星号用作截断符。于其它符号不同的是,它应当被追加到要截断的词上 " " "一个被括入双引号的短语 (‘"’) 只和字面上包含该短语输入格式的行进行匹配。全文引擎将短语拆分成单词,在FULLTEXT索引中搜索该单词。 非单词字符不需要严密的匹配:短语搜索只要求符合搜索短语包含的单词且单词的排列顺序相同的内容。例如, "test phrase" 符合 "test, phrase"。 "configured database "寻找包含至少两个单词中的一个的行 " +configured +database "寻找两个单词都包含的行 " +configured database "寻找包含单词“"configured”的行,若这些行也包含单词“"database”, 则列为更高等级 " +configured -database "寻找包含单词“configured” 但不包含单词 “database”的行 " +configured +(>database<sql) “寻找包含单词“configured”和“database” 的行,或包含“configured” 和“sql”的行 (无先后顺序),然而包含 “configured database”的行较包含“configured sql”的行排列等级更为高 ” mysql* “寻找包含”mysql”或有”mysql”开头单词的行 ” “my sql” “寻找包含原短语“my sql”的行 view plaincopy select * from info where match(title,info) against(“+mysql -yoursql” in boolean mode); select * from info where match(title,info) against(‘+configured +database’); mysql全文搜索有三种模式: 一、自然语言查找。这是mysql默认的全文搜索方式,sql示例: 1 select id,title FROM post WHERE MATCH(content) AGAINST ('search keyword') 或者显式声明使用自然语言搜索方式 1 select id,title FROM post WHERE MATCH(content) AGAINST ('search keyword' IN NATURAL LANGUAGE MODE) 由于自然语言搜索方式是默认模式,所以可以省略声明模式的“IN NATURAL LANGUAGE MODE”部分。 自然语言搜索模式的么特点: 忽略停词(stopword),英语中频繁出现的and/or/to等词被认为是没有实际搜索的意义,搜索这些不会获得任何结果。 如果某个词在数据集中频繁出现的几率超过了50%,也会被认为是停词,所以如果数据库中只有一行数据,不管你怎么全文搜索都不能获得结果。 搜索结果都具有一个相关度的数据,返回结果自动按相关度由高到低排列。 只针对独立的单词进行检索,而不考虑单词的局部匹配,如搜索box时,就不会将boxing作为检索目标。 二、布尔查找。这种查找方式的特点是没有自然查找模式中的50%规则,即便有词语在数据集中频繁出现的几率超过50%,也会被作为搜索目标进行检索并返回结果,而且检索时单词的局部匹配也会被作为目标进行检索。sql示例 1 select id,title FROM post WHERE MATCH(content) AGAINST ('search keyword' IN BOOLEAN MODE) 三、带子查询扩展的自然语言查找。 1 select id,title FROM post WHERE MATCH(content) AGAINST ('search keyword' IN BOOLEAN MODE WITH EXPANSION) 暂时没有明白这种模式。 在我的实际使用中还发现了以下细节: 布尔查找时必须指定返回结果的排序方式,它不会像自然语言查找那样会自动将结果按相关度排序返回。 即使是布尔查找,对长度小于等于3的单词也不会进行检索,因为mysql有一个系统变量FT_MIN_WORD_LEN指定了全文检索时可接受的最小单词长度,默认值是4。. IN BOOLEAN MODE expr里有特殊字符辅助特殊的搜寻语法。 SELECT * FROM article WHERE MATCH(title, body) AGAINST ('+mysql -yoursql' IN BOOLEAN MODE); 一定要有msysql,且不要有yoursql。 IN BOOLEAN MODE的特色: 不剔除50%以上符合的row。 不自动以相关性反向排序。 可以对没有FULLTEXT index的字段进行搜寻,但会非常慢。 限制最长与最短的字符串。 套用Stopwords。 搜寻语法: +:一定要有。 -:不可以有,但这个「不可以有」指的是在符合的row里不可以有指定的字符串,所以不能只下「-yoursql」这样是查不到任何row的,必须搭配其他语法使用。 :(什么都没)预设用法,表示可有可无,有的话排比较前面,没有的排后面。 >:提高该字的相关性。 <:降低相关性。 ( ):条件可以巢状。 +aaa +(>bbb <ccc) // 找到有aaa和bbb,或者aaa和ccc,然后aaa&bbb排在aaa&ccc前面 ~:将其相关性由正转负,表示拥有该字会降低相关性,但不像「-」将之排除,只是排在较后面。 *:万用字,不像其他语法放在前面,这个要接在字符串后面。 " ":用双引号将一段句子包起来表示要完全相符,不可拆字。 IN NATURAL LANGUAGE MODE WITH QUERY EXPANSION 也可以用WITH QUERY EXPANSION。 IN NATURAL LANGUAGE MODE的衍生版。 先用IN NATURAL LANGUAGE MODE做搜寻,得到最相关的字段的字再加到原expr里,再查一次。 神奇功能之一:可以用database查出mysql或oracle,第一次查询用databae得到一些结果,从这些结果里抽取字符串,此时得到mysql与oracle的机率相当高,最后用database和这些出取出来的字符串做一次查询。 神奇功能之二:无法拼出正确字符串时,第一次用「相似」的错误字符串查询,很有可以得到正确的字符串,再用正确的字符串急可以得到想要的结果。 因为这种查询方式会让「噪声」爆增,所以建议第一次的查询字符串尽量精简。 Stopwords请参考http://dev.mysql.com/doc/refman/5.1/en/fulltext-stopwords.html。 全文搜寻的限制: 只能用在MyISAM表格上。 支援UTF-8。 中文支持问题: MySQL不会断中文字:MySQL内建的字依据是空白、逗号和点,对此内建机制的白痴解法是,存中文字时自行塞入空白断字,但是还是有下面的限制。 查询字符串最少四个字符的限制:所以一二三个中文字都不能查,必须将ft_min_word_len从预设的4改成1。 虽然同一个表格可以有不同字符集的字段,但是同一个FULLTEXT index里的字段必须是同一个字符集与collation。 MATCH里的字段必须和FULLTEXT里的一模一样,IN BOOLEAN MODE允许不一样,甚至使用未FULLTEXT index的字段,但速度很慢。 AGAINST里必须是字符串,不可以是变量或域名。 全文搜寻使index hint受限。 MySQL全文搜寻设定: 大部分的参数都是启动参数,也就是修改后必须重新启动MySQL。 有些参数修改必须重新产生索引文件。 mysql> SHOW VARIABLES LIKE 'ft%'; ft_boolean_syntax + -><()~*:""&| ft_min_word_len 4 ft_max_word_len 84 ft_query_expansion_limit 20 ft_stopword_file (built-in) ft_min_word_len:最短的索引字符串,默认值为4,修改后必须重建索引文件。 ft_max_word_len:最长的索引字符串,默认值因版本而不同,余同上一点。 [mysqld] ft_min_word_len=1 ft_stopword_file:stopword档案路径,若留空白不设定表示要停用stopword过滤,修改后必须重新启动MySQL和重建索引;stopword档案内容可以用分行空白与逗号区隔stopword,但底线和单引号视为合法的字符串字符。 50%的门坎限制:配置文件在storage/myisam/ftdefs.h,将 #define GWS_IN_USE GWS_PROB 改为 #define GWS_IN_USE GWS_FREQ,然后重新编译MySQL,因为近低门坎会影响数据的精准度,所以不建议如此,可用IN BOOLEAN MODE即可以避开50%的限制。 ft_boolean_syntax:改变IN BOOLEAN MODE的查询字符,不用重新启动MySQL也不用重建索引。 修改字符串字符的认定,譬如说将「-」认定为字符串的合法字符: 方法一:修改storage/myisam/ftdefs.h的true_word_char()与misc_word_char(),然后重新编译MySQL,最后重建索引。 方法二:修改字符集档,然后在FULLTEXT index的字段使用该字符集,最后重建索引。 重建索引: 每个有FULLTEXT index的表格都要这么做。 mysql> REPAIR TABLE tbl_name QUICK; 要注意如果用过myisamchk,会导致上述的设定值回复成默认值,因为myisamchk不是用MySQL的设定值。 解法一:将修改过得设定值加到myisamchk的参数里。 shell> myisamchk --recover --ft_min_word_len=1 tbl_name.MYI 解法二:两边都要设定。 [mysqld] ft_min_word_len=1 [myisamchk] ft_min_word_len=1 解法三:用REPAIR TABLE、ANALYZE TABLE、OPTIMIZE TABLE与ALTER TABLE取代myisamchk语法,因为这些语法是由MySQL执行的。 六、 加密函数 a) 函数 AES_ENCRYPT(str ,key_str ) , AES_DECRYPT(crypt_str ,key_str ) 函数使用说明:这些函数允许使用官方 AES 进行加密和数据加密 ( 高级加密标准 ) 算法 , 即以前人们所熟知的 “Rijndael” 。 保密关键字的长度为 128 比特, 不过你可以通过改变源而将其延长到 256 比特。我们选择了 128 比特的原因是它的速度要快得多,且对于大多数用途而言这个保密程度已经够用。 b) 函数DECODE(crypt_str ,pass_str ) 函数使用说明:使用 pass_str 作为密码,解密加密字符串 crypt_str , crypt_str 应该是由 ENCODE() 返回的字符串。 c) 函数 ENCODE(str ,pass_str ) 函数使用说明:使用 pass_str 作为密码,解密 str 。 使用 DECODE() 解密结果。 d) 函数 DES_DECRYPT(crypt_str [,key_str ]) 函数使用说明:使用 DES_ENCRYPT() 加密一个字符串。若出现错误,这个函数会返回 NULL 。 e) 函数 DES_ENCRYPT(str [,(key_num |key_str )]) 函数使用说明:用 Triple-DES 算法给出的关键字加密字符串。若出现错误,这个函数会返回 NULL 。 f) 函数 ENCRYPT(str [,salt ]) 函数使用说明:使用 Unix crypt() 系统调用加密 str 。 salt 参数应为一个至少包含 2 个字符的字符串。若没有给出 salt 参数,则使用任意值。 g) 函数 MD5(str ) 函数使用说明:为字符串算出一个 MD5 128 比特检查和。该值以 32 位十六进制数字的二进制字符串的形式返回 , 若参数为 NULL 则会返回 NULL 。例如,返回值可被用作散列关键字 h) 函数 OLD_PASSWORD(str ) 函数使用说明:当 PASSWORD() 的执行变为改善安全性时, OLD_PASSWORD() 会被添加到 MySQL 。 OLD_PASSWORD() 返回从前的 PASSWORD() 执行值 ( 4.1 之前 ) , 同时允许你为任何 4.1 之前的需要连接到你的 5.1 版本 MySQL 服务器前客户端设置密码,从而不至于将它们切断 i) 函数PASSWORD(str ) 函数使用说明:从原文密码str 计算并返回密码字符串,当参数为 NULL 时返回 NULL 。这个函数用于用户授权表的Password 列中的加密MySQL 密码存储 七、 信息函数 a) 函数 BENCHMARK(count ,expr ) 函数使用说明: BENCHMARK() 函数重复 count 次执行表达式 expr 。 它可以被用于计算 MySQL 处理表达式的速度。结果值通常为 0 。另一种用处来自 mysql 客户端内部 , 能够报告问询执行的次数 b) 函数 CHARSET(str ) 函数使用说明:返回字符串自变量的字符集。 c) 函数 COERCIBILITY(str ) 函数使用说明:返回字符串自变量的整序可压缩性值。 d) 函数 COLLATION(str ) 函数使用说明:返回惠字符串参数的排序方式。 e) 函数 CONNECTION_ID() 函数使用说明:返回对于连接的连接 ID ( 线程 ID) 。每个连接都有各自的唯一 ID 。 f) 函数 CURRENT_USER, CURRENT_USER() 函数使用说明:返回当前话路被验证的用户名和主机名组合。这个值符合确定你的存取权限的 MySQL 账户。在被指定 SQL SECURITY DEFINER 特征的存储程序内, CURRENT_USER() 返回程序的创建者 g) 函数 DATABASE() 函数使用说明:返回使用 utf8 字符集的默认 ( 当前 ) 数据库名。在存储程序里,默认数据库是同该程序向关联的数据库,但并不一定与调用语境的默认数据库相同。 h) 函数 FOUND_ROWS() 函数使用说明: A SELECT 语句可能包括一个 LIMIT 子句,用来限制服务器返回客户端的行数。在有些情况下,需要不用再次运行该语句而得知在没有 LIMIT 时到底该语句返回了多少行。 为了知道这个行数 , 包括在 SELECT 语句中选择 SQL_CALC_FOUND_ROWS ,随后调用 FOUND_ROWS() i) 函数 LAST_INSERT_ID() LAST_INSERT_ID(expr ) 函数使用说明:自动返回最后一个 INSERT 或 UPDATE 问询为 AUTO_INCREMENT 列设置的第一个 发生的值。 j) 函数 ROW_COUNT() 函数使用说明: ROW_COUNT() 返回被前面语句升级的、插入的或删除的行数。 这个行数和 mysql 客户端显示的行数及 mysql_affected_rows() C API 函数返回的值相同。 k) 函数 SCHEMA() 函数使用说明:这个函数和 DATABASE() 具有相同的意义 l) 函数 SESSION_USER() 函数使用说明: SESSION_USER() 和 USER() 具有相同的意义。 m) 函数 SYSTEM_USER() 函数使用说明: SYSTEM_USER() 合 USER() 具有相同的意义 n) 函数 USER() 函数使用说明:返回当前 MySQL 用户名和机主名 o) 函数 VERSION() 函数使用说明:返回指示 MySQL 服务器版本的字符串。这个字符串使用 utf8 字符集。 八、 其他函数 a) 函数 DEFAULT(col_name ) 函数使用说明:返回一个表列的默认值。若该列没有默认值则会产生错误。 b) 函数 FORMAT(X ,D ) 函数使用说明:将数字 X 的格式写为 '#,###,###.##', 以四舍五入的方式保留小数点后 D 位, 并将结果以字符串的形式返回。若 D 为 0, 则返回结果不带有小数点,或不含小数部分。 c) 函数 GET_LOCK(str ,timeout ) 函数使用说明:设法使用字符串 str 给定的名字得到一个锁, 超时为 timeout 秒。若成功得到锁,则返回 1 ,若操作超时则返回 0 ( 例如 , 由于另一个客户端已提前封锁了这个名字 ), 若发生错误则返回 NULL ( 诸如缺乏记忆或线程 mysqladmin kill 被断开 ) 。假如你有一个用 GET_LOCK() 得到的锁,当你执行 RELEASE_LOCK() 或你的连接断开 ( 正常或非正常 ) 时,这个锁就会解除 d) 函数 INET_ATON(expr ) 函数使用说明:给出一个作为字符串的网络地址的点地址表示,返回一个代表该地址数值的整数。地址可以是 4 或 8 比特地址。 e) 函数 INET_NTOA(expr ) 函数使用说明:给定一个数字网络地址 (4 或 8 比特 ), 返回作为字符串的该地址的电地址表示 f) 函数 IS_FREE_LOCK(str ) 函数使用说明:检查名为 str 的锁是否可以使用 ( 换言之 , 没有被封锁 ) 。若锁可以使用,则返回 1 ( 没有人在用这个锁 ), 若这个锁正在被使用,则返回 0 ,出现错误则返回 NULL ( 诸如不正确的参数 ) 。 g) 函数 IS_USED_LOCK(str ) 函数使用说明:检查名为 str 的锁是否正在被使用 ( 换言之 , 被封锁 ) 。若被封锁,则返回使用该锁的客户端的连接标识符。否则返回 NULL 。 h) 函数 MASTER_POS_WAIT(log_name ,log_pos [,timeout ]) 函数使用说明:该函数对于控制主从同步很有用处。它会持续封锁,直到从设备阅读和应用主机记录中所有补充资料到指定的位置。返回值是其为到达指定位置而必须等待的记录事件的数目。 若从设备 SQL 线程没有被启动、从设备主机信息尚未初始化、参数不正确或出现任何错误,则该函数返回 NULL 。若超时时间被超过,则返回 -1 。 若在 MASTER_POS_WAIT() 等待期间,从设备 SQL 线程中止,则该函数返回 NULL 。若从设备由指定位置通过,则函数会立即返回结果。 i) 函数 NAME_CONST(name ,value ) 函数使用说明:返回给定值。 当用来产生一个结果集合列时 , NAME_CONST() 促使该列使用给定名称。 j) 函数 RELEASE_LOCK(str ) 函数使用说明:解开被 GET_LOCK() 获取的,用字符串 str 所命名的锁。若锁被解开,则返回 1 ,若改线程尚未创建锁,则返回 0 ( 此时锁没有被解开 ), 若命名的锁不存在,则返回 NULL 。 若该锁从未被对 GET_LOCK() 的调用获取,或锁已经被提前解开,则该锁不存在。 k) 函数 SLEEP(duration ) 函数使用说明:睡眠 ( 暂停 ) 时间为 duration 参数给定的秒数,然后返回 0 。若 SLEEP() 被中断 , 它会返回 1 。 duration 或许或包括一个给定的以微秒为单位的分数部分。 l) 函数 UUID() 函数使用说明:返回一个通用唯一标识符 (UUID) , UUID 被设计成一个在时间和空间上都独一无二的数字。 2 个对 UUID() 的调用应产生 2 个不同的值,即使这些调用的执行是在两个互不相连的单独电脑上进行。 m) 函数 VALUES(col_name ) 函数使用说明:在一个 INSERT … ON DUPLICATE KEY UPDATE … 语句中,你可以在 UPDATE 子句中使用 VALUES(col_name ) 函数,用来访问来自该语句的 INSERT 部分的列值。 换言之, UPDATE 子句中的 VALUES(col_name ) 访问需要被插入的 col_name 的值 , 并不会发生重复键冲突。这个函数在多行插入中特别有用。 VALUES() 函数只在 INSERT ... UPDATE 语句中有意义,而在其它情况下只会返回 NULL 九、 聚合函数 a) 函数 AVG([DISTINCT] expr ) 函数使用说明:返回 expr 的平均值。 DISTINCT 选项可用于返回 expr 的不同值的平均值。 b) 函数 BIT_AND(expr ) 函数使用说明:返回expr 中所有比特的 bitwise AND 。计算执行的精确度为64 比特(BIGINT) 。若找不到匹配的行, 则这个函数返回18446744073709551615 。( 这是无符号 BIGINT 值,所有比特被设置为 1 )。 c) 函数 BIT_OR(expr ) 函数使用说明:返回expr 中所有比特的bitwise OR 。计算执行的精确度为64 比特(BIGINT) 。若找不到匹配的行,则函数返回 0 。 d) 函数BIT_XOR(expr ) 函数使用说明:返回expr 中所有比特的bitwise XOR 。计算执行的精确度为64 比特(BIGINT) 。若找不到匹配的行,则函数返回 0 。 e) 函数 COUNT(expr ) 函数使用说明:返回SELECT 语句检索到的行中非NULL 值的数目。若找不到匹配的行,则COUNT() 返回 0 f) 函数 COUNT(DISTINCT expr ,[expr ...]) 函数使用说明:返回不同的非NULL 值数目。若找不到匹配的项,则COUNT(DISTINCT) 返回 0 g) 函数 GROUP_CONCAT(expr ) 函数使用说明:该函数返回带有来自一个组的连接的非NULL 值的字符串结果。其完整的语法如下所示: GROUP_CONCAT([DISTINCT] expr [,expr ...] [ORDER BY {unsigned_integer | col_name | expr } [ASC | DESC] [,col_name ...]] [SEPARATOR str_val ]) h) 函数 MIN([DISTINCT] expr ), MAX([DISTINCT] expr ) 函数使用说明:返回 expr 的最小值和最大值。 MIN() 和 MAX() 的取值可以是一个字符串参数;在这些情况下, 它们返回最小或最大字符串值。 i) 函数 STD(expr ) STDDEV(expr ) 函数使用说明:返回 expr 的总体标准偏差。这是标准 SQL 的延伸。这个函数的 STDDEV() 形式用来提供和 Oracle 的兼容性。可使用标准 SQL 函数 STDDEV_POP() 进行代替 j) 函数 STDDEV_POP(expr ) 函数使用说明:返回expr 的总体标准偏差(VAR_POP() 的平方根) 。你也可以使用 STD() 或STDDEV(), 它们具有相同的意义,然而不是标准的 SQL 。若找不到匹配的行,则STDDEV_POP() 返回 NULL k) 函数 STDDEV_SAMP(expr ) 函数使用说明:返回expr 的样本标准差 ( VAR_SAMP() 的平方根) 。若找不到匹配的行,则STDDEV_SAMP() 返回 NULL l) 函数 SUM([DISTINCT] expr ) 函数使用说明:返回expr 的总数。 若返回集合中无任何行,则 SUM() 返回NULL 。DISTINCT 关键词可用于 MySQL 5.1 中,求得expr 不同值的总和。 若找不到匹配的行,则SUM() 返回 NULL m) 函数 VAR_POP(expr ) 函数使用说明:返回 expr 总体标准方差。它将行视为总体,而不是一个样本, 所以它将行数作为分母。你也可以使用 VARIANCE(), 它具有相同的意义然而不是 标准的 SQL n) 函数 VAR_SAMP(expr ) 函数使用说明:返回expr 的样本方差。更确切的说,分母的数字是行数减去1 。若找不到匹配的行,则VAR_SAMP() 返回NULL o) 函数VARIANCE(expr ) 函数使用说明:返回expr 的总体标准方差。这是标准SQL 的延伸。可使用标准SQL 函数 VAR_POP() 进行代替。若找不到匹配的项,则VARIANCE() 返回NULL SQL CREATE INDEX 语法 在表上创建一个简单的索引。允许使用重复的值: CREATE INDEX index_name ON table_name (column_name) 在表上创建一个唯一的索引。唯一的索引意味着两个行不能拥有相同的索引值。 CREATE UNIQUE INDEX index_name ON table_name (column_name) CREATE INDEX 实例 本例会创建一个简单的索引,名为 "PersonIndex",在 Person 表的 LastName 列: CREATE INDEX PersonIndex ON Person (LastName) 如果您希望以降序索引某个列中的值,您可以在列名称之后添加保留字 DESC: CREATE INDEX PersonIndex ON Person (LastName DESC) 假如您希望索引不止一个列,您可以在括号中列出这些列的名称,用逗号隔开: CREATE INDEX PersonIndex ON Person (LastName, FirstName) LEAST(X,Y,...) 返回最小值(如果返回值被用在整数(实数或大小敏感字串)上下 文或所有参数都是整数(实数或大小敏感字串)则他们作为整数(实 数或大小敏感字串)比较,否则按忽略大小写的字符串被比较) 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" 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计算两个日期的时间差函数TIMESTAMPDIFF用法: 语法: TIMESTAMPDIFF(interval,datetime_expr1,datetime_expr2) 说明: 返回日期或日期时间表达式datetime_expr1 和datetime_expr2the 之间的整数差。其结果的 单位由interval 参数给出。interval 的法定值同TIMESTAMPADD()函数说明中所列出的相同。 SELECT TIMESTAMPDIFF(MONTH,'2009-10-01','2009-09-01'); interval可是: SECOND 秒 SECONDS MINUTE 分钟 MINUTES HOUR 时间 HOURS DAY 天 DAYS MONTH 月 MONTHS YEAR 年 YEARS