发现许多mysql的基础知识掌握不是很牢固,手头一本《SQL必知必会》,就参照它,另外再自己做一些扩展学习吧。
以下基本来源手册:第12章:函数和操作符。作为笔记而记录吧。
==========================================================
除非在文档编制中对一个函数或操作符另有指定的情况外,一个包含NULL 的表达式通常产生一个NULL 值。
在默认状态下, 在函数和紧随其后的括号之间不得存在空格。这能帮助 MySQL 分析程序区分一些同函数名相同的函数调用以及表或列。不过,函数自变量周围允许有空格出现。
可以通过选择--sql-mode=IGNORE_SPACE来打开MySQL服务器的方法使服务器接受函数名后的空格。 个人客户端程序可通过选择mysql_real_connect()的CLIENT_IGNORE_SPACE 实现这一状态。在以上两种情况中, 所有的函数名都成为保留字。请参见5.3.2节,“SQL服务器模式”.
MySQL按照以下规则进行数值比较:
以下是引用片段: 若同一个比较运算中的两个参数都是字符串,则按照字符串进行比较。 若两个参数均为整数,则按照整数进行比较。 十六进制值在不需要作为数字进行比较时,则按照二进制字符串进行处理。 假如参数中的一个为 TIMESTAMP 或 DATETIME 列,而其它参数均为常数, 则在进行比较前将常数转为 timestamp。这样做的目的是为了使ODBC的进行更加顺利。 注意,这不适合IN()中的参数!为了更加可靠,在进行对比时通常使用完整的 datetime/date/time字符串。 在其它情况下,参数作为浮点数进行比较。 在默认状态下,字符串比较不区分大小写,并使用现有字符集(默认为cp1252 Latin1,同时对英语也适合)。 为了进行比较,可使用CAST()函数将某个值转为另外一种类型。 使用CONVERT()将字符串值转为不同的字符集 |
注意,在将一个字符串列同一个数字进行比较时, MySQL 不能使用列中的索引进行快速查找。假如str_col 是一个编入索引的字符串列,则在以下语句中,索引不能执行查找功能:
以下是代码片段: SELECT * FROM tbl_name WHERE str_col=1; |
其原因是许多不同的字符串都可被转换为数值 1: '1'、 ' 1'、 '1a'、 ……
以下记录一些我没见过或不熟悉的操作符:
IS boolean_value IS NOT boolean_value
根据一个布尔值来检验一个值,在这里,布尔值可以是TRUE、FALSE或UNKNOWN。
以下是代码片段: mysql> SELECT 1 IS TRUE, 0 IS FALSE, NULL IS UNKNOWN; -> 1, 1, 1 mysql> SELECT 1 IS NOT UNKNOWN, 0 IS NOT UNKNOWN, NULL IS NOT UNKNOWN; -> 1, 1, 0 |
IS NULL IS NOT NULL
检验一个值是否为 NULL。
以下是代码片段: mysql> SELECT 1 IS NULL, 0 IS NULL, NULL IS NULL; -> 0, 0, 1 mysql> SELECT 1 IS NOT NULL, 0 IS NOT NULL, NULL IS NOT NULL; -> 1, 1, 0 |
为了能够顺利的使用ODBC 程序工作,在使用IS NULL时,MySQL支持一下额外特性:
在一个值产生后,立即运行一个以下格式的语句,从而找到最新AUTO_INCREMENT 值的所在行:
以下是代码片段: SELECT * FROM tbl_name WHERE auto_col IS NULL |
当设置SQL_AUTO_IS_NULL=0时,这项操作无法运行。请参见13.5.3节,“SET语法”。
对于命名为NOT NULL 的DATE 和DATETIME列,可通过使用如下的 语句找到特定日期 '0000-00-00':
以下是代码片段: SELECT * FROM tbl_name WHERE date_column IS NULL |
运行这一步需要使用一些 ODBC 应用软件,因为 ODBC本身不支持 一个 '0000-00-00'的时间值。
expr BETWEEN min AND max
假如expr大于或等于 min 且expr 小于或等于max, 则BETWEEN 的返回值为1,或是0。若所有参数都是同一类型,则上述关系相当于表达式 (min <= expr AND expr <= max)。其它类型的转换根据本章开篇所述规律进行,且适用于3种参数中任意一种。
以下是代码片段: mysql> SELECT 1 BETWEEN 2 AND 3; -> 0 mysql> SELECT 'b' BETWEEN 'a' AND 'c'; -> 1 mysql> SELECT 2 BETWEEN 2 AND '3'; -> 1 mysql> SELECT 2 BETWEEN 2 AND 'x-3'; -> 0 |
expr NOT BETWEEN min AND max
这相当于NOT(expr BETWEEN min AND max)。
COALESCE(value,...)
返回值为列表当中的第一个非 NULL值,在没有非NULL 值得情况下返回值为 NULL 。
以下是代码片段: mysql> SELECT COALESCE(NULL,1); -> 1 mysql> SELECT COALESCE(NULL,NULL,NULL); -> NULL |
GREATEST(value1,value2,...)
当有2或多个参数时,返回值为最大(最大值的)参数。比较参数所依据的规律同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' |
在没有自变量为NULL的情况下,GREATEST()的返回值为NULL。
ISNULL(expr)
如expr 为NULL,那么ISNULL() 的返回值为 1,否则返回值为 0。
以下是代码片段: mysql> SELECT ISNULL(1+1); -> 0 mysql> SELECT ISNULL(1/0); -> 1 |
使用= 的NULL 值对比通常是错误的。
ISNULL() 函数同 IS NULL比较操作符具有一些相同的特性。请参见有关IS NULL 的说明。
INTERVAL(N,N1,N2,N3,...)
假如N < N1,则返回值为0;假如N < N2 等等,则返回值为1;假如N 为NULL,则返回值为 -1 。所有的参数均按照整数处理。为了这个函数的正确运行,必须满足 N1 < N2 < N3 < ……< Nn 。其原因是使用了二分查找(极快速)。
以下是代码片段: mysql> SELECT INTERVAL(23, 1, 15, 17, 30, 44, 200); -> 3 mysql> SELECT INTERVAL(10, 1, 10, 100, 1000); -> 2 mysql> SELECT INTERVAL(22, 23, 30, 44, 200); -> 0 |
LEAST(value1,value2,...)
在有两个或多个参数的情况下, 返回值为最小 (最小值) 参数。用一下规则将自变量进行对比:
假如返回值被用在一个 INTEGER 语境中,或是所有参数均为整数值,则将其作为整数值进行比较。
假如返回值被用在一个 REAL语境中,或所有参数均为实值,则 将其作为实值进行比较。
假如任意一个参数是一个区分大小写的字符串,则将参数按照区分大小写的字符串进行比较。
在其它情况下,将参数作为区分大小写的字符串进行比较。
假如任意一个自变量为NULL,则 LEAST()的返回值为NULL 。
以下是代码片段: 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' |
注意,上面的转换规则在一些边界情形中会产生一些奇特的结果:
以下是代码片段: mysql> SELECT CAST(LEAST(3600, 9223372036854775808.0) as SIGNED); -> -9223372036854775808 |
发生这种情况的原因是MySQL在整数语境中读取9223372036854775808.0。整数表示法不利于保存数值,因此它包括一个带符号整数。