在MySQL中我们可以编写关于常量、函数调用或表列引用的表达式。这些值可利用不同类型的运算符进行组合,诸如算术运算符或比较运算符。运算符用来结合表达式中的项以完成算术、比较、位逻辑或逻辑操作以及模式匹配。
在MySQL遇到一个表达式时,它对其求值得出结果。例如,(5×8)/(9-5)求值得10。另外,表达式求值可能涉及类型转换。例如,MySQL在数030312用于需要日期值的环境时,将其转换为日期“2003-03-12”。
接下来,我们就来讨论怎样编写MySQL的表达式,以及在表达式求值中MySQL所使用的类型转换规则。
1、表达式
表达式可以只是一个简单的常量,也可以进行函数调用。有的函数需要参数(圆括号中有值),而有的不需要。多个参数应该用逗号分隔。如以下的两个函数例子:
·NOW():无参数函数。
·STRCMP(“a b c”,“d e f”):有两个参数的函数。
注意:参数有空格是合法的,但函数名后跟空格是不合法的。如果函数名后有一个空格,MySQL的分析程序可能会将函数名解释为一个列名,导致一个语法错误。
表达式中可使用表列。最简单的情形是,当某个列所属的表在上下文中是明确的,则可简单地给出列名对该列进行引用。下面的每个SELECT语句中惟一地出了一个表名,因此,列的引用不会出现错误:
SELECT first_name, last name FROM classmates
SELECT first_name, last name FROM friends
如果使用哪个表的列不明确,可在列名前加上表名。如果使用哪个数据库中的表也不明确的话,可在表名前加上数据库名。如果只是希望意思更明显,也可以在无歧义的上下文中利用这种更为具体的表示形式,可以组合所有这些值以得到更为复杂的表达式。如:
SELECT
classmates.first_name;
classmates.last_name;
friends.first_name;
friends.last_name;
FROM classmates;friends
WHERE classmates.last_name=friends.last_name
SELECT zyz.friends.name FROM zyz.friends
2、运算符的类型
MySQL有几种类型的运算符,如算术运算符、逻辑运算符、位运算符、比较运算符、模式匹配等等,这些各种各样的运算符都有其各自独特的作用,为了更好的给出解决某个实际问题的表达式,我们必须首先熟悉这些繁多的运算符的特性。下面我们先里对这些运算符做个简要介绍。
⑴、算术运算符
算术运算符一般包括加、减、乘、除以及模运算符。模运算符是指取操作数除后的余数,其它算术运算符大家都比较熟悉,不再一一赘述。
⑵、逻辑运算符
逻辑运算符的主要功能是对表达式进行估计以确定其为真(非零)或假(零)。MySQL包含有C风格的&&(和)、||(或)和!(非)运算符,可替换AND、OR和NOT。要特别注意“||”运算符,ANSI SQL指定“||”作为串连接符,但在MySQL中,它表示一个逻辑或运算。
举个例子说,如果执行查询“SELECT "abc"||"def"”,则返回数0。因为MySQL运算前,先将“abc”和“def”转换为整数,且两者都转换为0,然后进行或运算,结果为还是为0。所以,在MySQL中,必须首先用CONCAT(“abc”,“def”)来完成串的连接。
⑶、位运算位运算符完成按位“与”和“或”,其中结果的每一位按两个操作数的对应位的逻辑AND或OR求值。还可以进行位的左移或右移。位运算符语法说明如下:
·& 按位AND(与),如果两个操作数的对应位为1,则该结果位为1。
·| 按位OR(或),如果两操作数的对应位中有一位为1,则该结果位为1。
·<
·>> 语法如下:a>>b。将a右移b个二进制位。
⑷、比较运算符
比较运算符包括测试相对大小或数和串的顺序的运算符,以及完成模式匹配和测试NULL值的运算符。其中“< = >”运算符是MySQL特有的。
比较运算符语法说明如下:
·= 两操作数相等,为真
·!=,<> 两操作数不等,为真
·
·<= 如果小于等于,为真
·>= 如果大于等于,为真
·> 如果大于,为真
·<=> 如果两操作数相同(即使为N U L L),为真
·IN 表达式如“a IN(b1, b2, ...)”如果a为b1,b2,...中任意一个,为真
·BETWEEN 表达式如“a BETWEEN b AND c”,如果a在值b和c之间或等于,为真
·LIKE 模式匹配;如果a与b匹配,为真
·NOT LIKE 如果a与b不匹配,为真
·REGEXP 扩展正规表达式匹配;如果a与b匹配,为真
·NOT REGEXP 如果a与b扩展正规表达式不匹配,为真
·IS NULL 如果操作数为N U L L,为真
·IS NOT NULL 如果操作数不为N U L L,为真
从MySQL 3.23版本开始,可使用BINARY运行符,此运算符可用来将一个串转换为一个二进制串,这个串在比较中是区分大小写的。如果希望使一个列既能在区分大小写又能在不区分大小写的环境中使用,则应该利用不区分大小写的列并对希望区分大小写的比较使用BINARY。
对于总是区分大小写的列类型实现不区分大小写的比较,可利用UPPER()或LOWER()来转换成相同的大小写。
⑸、模式匹配
模式匹配在查询表达式中应用非常广泛,它允许查找值而不必给出精确的直接值。但是由于它规则多、运用灵活,使初学者不好掌握。但是不要怕,我们这里先将匹配的一些主要原则展现给大家。
MySQL利用LIKE提供了SQL的模式匹配,利用REGEXP提供了扩展正规表达式模式匹配。除非要匹配的串或模式串为二进制串,否则SQL模式匹配是不区分大小写的。扩展正规表达式模式匹配总是区分大小写的。
下面我们首先来说说LIKE如何在MySQL中使用。
a、LIKE结合通配符“%”
LIKE利用通配符“%”(匹配任意的字符序列)和“_”(匹配任意单个字符),提供SQL的模式匹配。
用于LIKE运算符模式“Lansy%”,因为使用的通配符“%”与任何串匹配,其中包括与空字符序列匹配,因此“Lansy%”与任何以“Lansy”起头的串匹配,包括与“Lansy”本身匹配:
"Lansy-Studio" LIKE "Lansy%" <=>1
"LansyClub" LIKE "Lansy%" <=>1
"Lansy" LIKE "Lansy%"<=>1
但是,“%”不与NULL匹配。事实上,具有NULL操作数的任何模式匹配都将失败:
"Lansy" LIKE NULL <=> NULL
NULL LIKE "Lansy%" <=> NULL
另外,关于大小写的敏感性还是值得注意的,MySQL的LIKE运算符是不区分大小写的,除非它至少有一个操作数是二进制串。因此,缺省时“Lansy%”与串“Lansy”和“lansystudio”匹配,但在二进制比较中,它只与其中之一匹配,这不同于ANSI SQL的LIKE运算符,它是区分大小写的:
"Lansy-Studio" LIKE "Lansy%" <=>1
"lansy-studio" LIKE "Lansy%" <=>1
BINARY "Lansy-Studio" LIKE "Lansy%" <=>1
BINARY "lansy-studio" LIKE "Lansy%" <=>0
通配符可在模式中任何地方给出。“%cde”与“abcde”、“bcde”和“acde”匹配。“%bert%”也与所有这些串匹配,而且还与如像“abcdef”、“cdefg”、和“bcdefg”这样的串匹配。
b、LIKE结合通配符“_”
LIKE所允许的另一个通配符是“_”,它与单个字符匹配。“_ _”与三个字符的串匹配。“c_t”与“cat”、“cut”甚至“c_t”匹配,因为“_”可与自身匹配。
c、正规表达式REGEXP
MySQL的另一种形式的模式匹配使用了正规表达式REGEXP。扩展正规表达式类似于UNIX实用程序“grep”和“sed”所用的模式,首先请记住的一点是模式不需要与整个串匹配,只需要在串中某处找出它即可。
最常用的正规表达式模式字符如下:
str REGEXP pat
如果模式串pat与串表达式str匹配,则REGEXP求值为1,否则为0。NOT REGEXP正好相反。所以下列两个表达式是等价的:
str NOT REGEXP pat
NOT (str REGEXP pat)
如果其中有一个串为N U L L,则结果为N U L L。
[...]和[^...]结构指定字符类。在一个类中,字符的取值范围可用两个端点字符中间加一短划线来表示。如,[a-z]与任何小写字母匹配,而[0-9]与任意数字匹配。为了能够在类中表示字符“]”,它必须为相应类的第一个字符。为了能够表示字符“-”,它必须是相应类的第一个或最后一个字符。而为了能够表示“^”,它必须不是“[”之后的第一个字符。如果在要匹配的串中的任何地方找到相应模式,则扩展正规表达式匹配成功,但可用“^”和“$”强制模式只在串的开始或结尾处进行匹配:
"abcd" REGEXP "c" <=>1
"abcd" REGEXP "^c" <=>0
"abcd" REGEXP "^a" <=>1
"abcd" REGEXP "a$" <=>0
"abcd" REGEXP "c$" <=>1
"abcd" REGEXP "^a,*d$" <=>1
最后需要提醒的是,扩展正规表达式模式匹配是区分大小写的:
"abcd" REGEXP "ABCD" <=>0
"ABCD" REGEXP "ABCD" <=>1