下面这个Mysql入门系列:MYSQL表达式求值和MYSQL类型转换教程由图老师小编精心推荐选出,过程简单易学超容易上手,喜欢就要赶紧get起来哦!
【 tulaoshi.com - 编程语言 】
2.4 表达式求值和类型转换
MySQL允许编写包括常量、函数调用和表列引用的表达式。这些值可利用不同类型的运算符进行组合,诸如算术运算符或比较运算符。表达式的项可用圆括号来分组。表达式在SELECT 语句的列选择列表和WHERE 子句中出现得最为频繁,如下所示:
所选择的每列给出了一个表达式,如WHERE 子句中所示的那样。表达式也出现在DELETE 和UPDATE语句的WHERE 子句中,以及出现在INSERT 语句的VALUES( ) 子句中。
在MySQL遇到一个表达式时,它对其求值得出结果。例如, (4 * 3)/(4 - 2) 求值得6。表达式求值可能涉及类型转换。例如, MySQL在数960821用于需要日期值的环境时,将其转换为日期 19 9 6 - 0 8 - 2 1。本节讨论怎样编写MySQL的表达式,以及在表达式求值中MySQL所使用的类型转换规则。每个MySQL的运算符都介绍过了,但MySQL有那么多的函数,我们只接触过几个。每个运算符和函数的进一步介绍可参阅附录C。
2.4.1撰写表达式
表达式可以只是一个简单的常量,如:
0 数值常量
a b c 串常量
表达式可以进行函数调用。有的函数需要参数(圆括号中有值),而有的不需要。多个参数应该用逗号分隔。在调用一个函数时,参数旁边可以有空格,但在函数名与圆括号间不能有空格。下面是一些函数例子:
NOW( ) 无参数函数
STRCMP (a b c, d e f) 有两个参数的函数
STRCMP( a b c, d e f) 参数旁边有空格是合法的
STRCMP (a b c, d e f) 函数名后跟空格是不合法的
如果函数名后有一个空格, MySQL的分析程序可能会将函数名解释为一个列名(函数名不是保留字,如果需要的话,可将它们用作列名)。其结果是出现一个语法错误。表达式中可使用表列。最简单的情形是,当某个列所属的表在上下文中是明确的,则可简单地给出列名对该列进行引用。下面的每个SELECT 语句中惟一地出了一个表名,因此,列的引用无歧义:
如果使用哪个表的列不明确,可在列名前加上表名。如果使用哪个数据库中的表也不明确的话,可在表名前加上数据库名。如果只是希望意思更明显,也可以在无歧义的上下文中利用这种更为具体的表示形式,如:
总之,可以组合所有这些值以得到更为复杂的表达式。
1. 运算符的类型
MySQL有几种类型的运算符,可用来连接表达式的项。算术运算符,如表2-15 所示,一般包括加、减、乘、除以及模运算符。在两个操作数都是整数时,+、-和 *算术运算用BIGINT(64 位)整数值来完成。而在结果预期为一个整数时,/和%也是用BIGINT(64 位)整数值来完成的。应该认识到,如果某个运算涉及更大的值,如结果超过64 位,其结果不可预料。
逻辑运算符如表2 - 16所示,对表达式进行估计以确定其为真(非零)或假(零)。MySQL包含有C 风格的& &、| |和!运算符,可替换A N D、OR 和N O T。要特别注意| |运算符,ANSI SQL 指定| |作为串连接符,但在MySQL中,它表示一个逻辑或运算。如果执行下面的查询,则返回数0:
MySQL为进行运算,将 a b c和d e f转换为整数,且两者都转换为0, 0与0进行或运算,结果为0。在MySQL中,必须用CONCAT (a b c, d e f) 来完成串的连接。
位运算符如表2-17 所示,完成按位与和或,其中结果的每一位按两个操作数的对应位的逻辑AND 或OR 求值。还可以进行位的左移或右移。位运算用BIGINT(64 位)整数值进行。
比较运算符如表2-18 所示,其中包括测试相对大小或数和串的顺序的运算符,以及完成模式匹配和测试NULL 值的运算符。 = 运算符是MySQL特有的,在MySQL3.23版本中引入。
自MySQL3.23版本起,可使用B I N A RY 运行符,此运算符可用来将一个串转换为一个二进制串,这个串在比较中是区分大小写的。下列的第一个比较是不区分大小写的,但第二个和第三个比较是区分大小写的:
没有相应的NOT BINARY 计算。如果希望使一个列既能在区分大小写又能在不区分大小写的环境中使用,则应该利用不区分大小写的列并对希望区分大小写的比较使用BINARY。对于利用二进制串类型(CHAR BINARY、VARCHAR BINARY 和BLOB 类型)定义的列,其比较总是区分大小写的。为了对这样的列类型实现不区分大小写的比较,可利用UPPER( ) 或LOWER( ) 来转换成相同的大小写:
对于不区分大小写的串比较,有可能把多个字符认为是相等的,这取决于所用的字符集。例如e和é对于比较和排序操作可能是相同的。二进制(区分大小写)比较利用字符的ASCII 值来完成。
模式匹配允许查找值而不必给出精确的直接值。MySQL利用LIKE 运算符和通配符%(匹配任意的字符序列)和 _(匹配任意单个字符),提供SQL 的模式匹配。MySQL还基于类似于诸如g r e p、sed 和vi 等UNIX 程序中所用的REGEXP 运算符和扩展正规表达式,提供模式匹配。为了完成模式匹配,必须使用这些模式匹配运算符中的某一个;不能使用 =。为了进行相反的模式匹配,可使用NOT LIKE 或NOT REGEXP。
除了使用的模式运算符和模式字符不同外,这两种模式匹配还在以下重要的方面存在差异:
■ 除非至少有一个操作数为二进制串,否则LIKE 是不区分大小写的。REGEXP 是区分大小写的。(在MySQL3.23.4 以后的版本中,除非至少有一个操作数是二进制串,否则REGEXP 是不区分大小写的。)
■ 仅当整个串匹配,SQL 才是模式匹配的。仅当相应的模式在串中某一处出现,正规表达式才匹配。用于LIKE 运算符的模式可以包括%和_通配符。例如,模式 F r a n k %与任何以F r a n k起头的串匹配:
通配符%与任何串匹配,其中包括与空字符序列匹配,因此 Frank %与 Frank匹配:
(本文来源于图老师网站,更多请访问http://www.tulaoshi.com/bianchengyuyan/)
这也表示模式%与任何串匹配,其中包括与空串匹配。但是,%不与NULL 匹配。事实上,具有NULL 操作数的任何模式匹配都将失败:
MySQL的LIKE 运算符是不区分大小写的,除非它至少有一个操作数是二进制串。因此,缺省时 Frank %与串 Frankly和frankly匹配,但在二进制比较中,它只与其中之一匹配:
这不同于ANSI SQL 的LIKE 运算符,它是区分大小写的。通配符可在模式中任何地方给出。% bert与 Englebert、Bert和Albert匹配。% bert %也与所有这些串匹配,而且还与如像 Berthold、Bertram、和Alberta这样
的串匹配。LIKE 所允许的另一个通配符是 _,它与单个字符匹配。_ _与三个字符的串匹配。c _ t与c a t、c ut甚至c _ t匹配(因为_与自身匹配)。为了关掉%或 _的特殊含义,与这些字符的直接实例相匹配,需要在它们前面放置一个斜杠( %或 _),如:
MySQL的另一种形式的模式匹配使用了正规表达式。运算符为REGEXP 而不是L I K E(RLIKE 为REGEXP 的同义词)。最常用的正规表达式模式字符如下:‘.’与任意单个字符匹配:
‘[ . . . ]’与方括号中任意字符匹配。可列出由短划线‘ -’分隔的范围端点指定一个字符范围。为了否定这种区间的意义(即与未列出的任何字符匹配),指定‘ ^’作为该区间的第一个字符即可:
‘*’表示与其前面字符的任意数目的字符匹配,因此,如‘ x *’与任意数目的‘ x’字符匹配,例如:
任意数目包括0个实例,这也就是为什么第二个表达式匹配成功的原因。‘^pat’和‘pat$’固定了一种模式匹配,从而模式pat 只在它出现在串的前头时匹配,而‘ ^pat$’只在pat 匹配整个串时匹配,例如:
(本文来源于图老师网站,更多请访问http://www.tulaoshi.com/bianchengyuyan/)
REGEXP 模式可从某个表列中取出,虽然如果该列包含几个不同的值时,这样做比常量模式慢。每当列值更改时,必须对模式进行检查并转换成内部形式。MySQL的正规表达式匹配还有一些特殊的模式字符。要了解更详细信息请参阅附录C。
2. 运算符的优先级
当求一个表达式的值时,首先查看运算符以决定运算的先后次序。有的运算符具有较高的优先级;例如,乘和除比加和减的优先级更高。下面的两个表达式是等价的,因为 *和/先于+和-计算:
下面列出了运算符的优先级,从高到低。列在同一行中的运算符具有相同的优先级。优先级较高的运算符在优先级较低的运算符之前求值。
可用圆括号来忽略运算符的优先级并改变表达式的求值顺序,如:
3. 表达式中的NULL 值
请注意,在表达式中使用NULL 值时,其结果有可能出现意外。下列准则将有助于避免出问题。如果将NULL 作为算术运算或位运算符的一个操作数,其结果为NULL:
如果将NULL 用于逻辑运算符,NULL 被认为是假:
NULL 作为任意比较运算符的操作数,除 = 、IS NULL 和IS NOT NULL 运算符(它们是专门扩展来处理NULL 值的)外,将产生一个NULL 结果。如:
如果给函数一个NULL 参数,除了那些处理NULL 参数的函数外,一般返回一个NULL结果。例如,IFNULL( ) 能够处理NULL 参数并适当地返回真或假。STRCMP( ) 期望一个非NULL 的参数;如果它发现传给它的是一个NULL 参数,则返回NULL 而不是真或假。在排序操作中,NULL 值被归到一起。在升序排序中, NULL 将排在所有非NULL 值之前(包括空串),而在降序排序中,NULL 将排在所有非NULL 值之后。
2.4.2 类型转换
MySQL根据所执行的操作类型,自动地进行大量的类型转换,任何时候,只要将一个类型的值用于需要另一类型值的场合,就会进行这种转换。下面是需要进行类型转换的原因:
■ 操作数转换为适合于某种运算符求值的类型。
■ 函数参数转换为函数所需的类型。
■ 转换某个值以便赋给一个具有不同类型的表列。下列表达式涉及类型转换。它由加运算符 +和两个操作数1和2 组成:
1+"2"
其中操作数的类型不同,一个是数,另一个是串,因此, MySQL对其中之一进行转换以便使它们两个具有相同的类型。但是应该转换哪一个呢?因为,+是一个数值运算符,所以MySQL希望操作数为数,因此,将串 2转换为数2。然后求此表达式的值得出3。再举一例。C O N C AT( ) 函数连接串产生一个更长的串作为结果。为了完成此工作,它将参数解释为串,而不管参数实际是何类型。如果传递给C O N C AT( ) 几个数,则它将把它们转换成串,然后返回这些串的连接,如:
来源:http://www.tulaoshi.com/n/20160219/1609582.html
看过《Mysql入门系列:MYSQL表达式求值和MYSQL类型转换》的人还看了以下文章 更多>>