四、MySQL数据类型和运算符
数据库表由多列字段构成,每一个字段指定了不同的数据类型。指定字段的数据类型之后,也就决定了向字段插入的数据内容。不同的数据类型也决定了MySQL在存储它们的时候使用的方式,以及在使用它们的时候选择什么运算符号进行运算。
一、MySQL数据类型介绍
MySQL支持多种数据类型,主要有数值类型、日期/时间类型和字符串类型。
(1)数值数据类型:包括整数类型TINYINT、SMALLINT、MEDIUMINT、INT、BIGINT,浮点小数数据类型FLOAT和DOUBLE,定点小数类型DECIMAL。
(2)日期/时间类型:包括YEAR、TIME、DATE、DATETIME和TIMESTAMP。
(3)字符串类型:包括CHAR、VARCHAR、BINARY、VARBINARY、BLOB、TEXT、ENUM和SET等。字符串类型又分为文本字符串和二进制字符串。
1.1 整数类型
数值型数据类型主要用来存储数字,MySQL提供了多种数值数据类型,不同的数据类型提供不同的取值范围,可以存储的值范围越大,其所需的存储空间也会越大。MySQL主要提供的整数类型有:TINYINT、SMALLINT、MEDIUMINT、INT(INTEGER)、BIGINT。整数类型的属性字段可以添加AUTO_INCREMENT自增约束条件。下表列出了MySQL中的数值类型:
数据名称 | 说明 | 存储需求 | 默认宽度值 |
TINYINT | 很小的整数 | 1个字节 | 4 |
SMALLINT | 小的整数 | 2个字节 | 6 |
MEDIUMINT | 中等大小的整数 | 3个字节 | 9 |
INT(INTEGER) | 普通大小的整数 | 4个字节 | 11 |
BIGINT | 大整数 | 8个字节 | 20 |
根据占用字节数可以求出每一种数据类型的取值范围,例如TINYINT需要1个字节(8bits)来存储,那么TINYINT无符号数的最大值为28-1,即255;TINYINT有符号数的最大值为27-1,即127。其他类型的整数的取值范围计算方法相同。
在如下创建表的语句中:
CREATE TABLE test ( id INT(11), name VARCHAR(255) )
id字段的数据类型为INT(11),注意到后面的数字11,这表示的是该数据类型指定的显示宽度,指定能够显示的数值中数字的个数。例如,假设声明一个INT类型的字段:
year INT(4)
该声明指明,在year字段中的数据一般只显示4位数字的宽度。
在这里要注意:显示宽度与数据类型的取值范围是无关的。显示宽度只是指明MySQL最大可能显示的数字个数,数值的位数小于指定的宽度时会由空格填充;如果插入了大于显示宽度的值,只要该值不超过该类型整数的取值范围,数值依然可以插入,而且能够显示出来。
其他整数类型也可以在定义表结构时指定所需要的显示宽度,如果不指定,则系统为每一种类型指定默认的宽度值。
1.2 浮点数类型和定点数类型
MySQL中使用浮点数和定点数来表示小数。浮点类型有两种:单精度浮点类型(FLOAT)和双精度浮点类型(DOUBLE)。定点类型只有一种:DECIMAL。浮点类型和定点类型都可以用(M,N)来表示,其中M称为精度,表示总共的位数;N称为标度,是表示小数的位数。
类型名称 | 说明 | 存储需求 |
FLOAT | 单精度浮点型 | 4个字节 |
DOUBLE | 双精度浮点型 | 8个字节 |
DECIMAL (M,D),DEC | 压缩的“严格”定点数 | M+2个字节 |
DECIMAL类型不同于FLOAT和DOUBLE,DECIMAL实际是以串存放的,DECIMAL可能的最大取值范围和DOUBLE一样,但是其有效的取值范围由M和D的值决定。如果改变M而固定D,则取值范围将随M的变大而变大
提示:不论是定点还是浮点类型,如果用户指定的精度超出精度范围,则会四舍五入进行处理。
FLOAT和DOUBLE在不指定精度时,默认会按照实际的精度(由计算机硬件和操作系统决定),DECIMAL如不指定精度,默认为(10,0)。
浮点数相对于定点数的优点是在长度一定的情况下,浮点数能够表示更大的数据范围;它的缺点是会引起精度问题。
提示:在MySQL中,定点数以字符串形式存储,在对精度要求比较高的时候(如货币,科学数据等)使用DECIMAL的类型比较好,另外两个浮点数进行减法和比较运算时也容易出问题,所以在使用浮点型时需要注意,并尽量避免做浮点数比较。
1.3 日期与时间类型
MySQL中有多种表示日期的数据类型,主要有:DATETIME、DATE、TIMESTAMP、TIME和YEAR。例如:当只记录年信息的时候,可以只是用YEAR类型,而没有必要使用DATE。每一个类型都有合法的取值范围,当指定确实不合法的值时系统将“零”值插入到数据库中。
类型名称 | 日期格式 | 日期范围 | 存储要求 |
YEAR | YYYY | 1901~2155 | 1个字节 |
TIME | HH:MM:SS | -838:59:59~838:59:59 | 3个字节 |
DATE | YYYY-MM-DD | 1000-01-01~9999-12-31 | 3个字节 |
DATETIME | YYYY-MM-DD HH:MM:SS | 1000-01-01 00:00:01~9999-12-31 23:59:59 | 8个字节 |
TIMESTAMP | YYYY-MM-DD HH:MM:SS | 1970-01-01 00:00:01 UTC~2038-01-19 03:14:07 UTC | 4个字节 |
1.3.1 YEAR
YEAR类型是一个单字节类型用于表示年,在存储时只需要1个字节。可以使用各种格式指定YEAR值,如下所示:
(1)以4位字符串或者4位数字格式表示的YEAR,范围为‘1901’~‘2155’。输入格式为‘YYYY’或者YYYY,例如,输入‘2010’或2010,插入到数据库的值均为2010。
(2)以2位字符串格式表示的YEAR,范围为‘00’到‘99’。‘00’~‘69’和‘70’~‘99’范围的值分别被转换为2000~2069和1970~1999范围的YEAR值。‘0’与‘00’的作用相同。插入超过取值范围的值将被转换为2000。
(3)以2位数字表示的YEAR,范围为1~99。1~69和70~99范围的值分别被转换为2001~2069和1970~1999范围的YEAR值。注意:这里的0值将被转换为0000,而不是2000。
(4)非法YEAR值将被转换为0000。
1.3.2 TIME
TIME类型用于只需要时间信息的值,在存储时需要3个字节。格式为‘HH:MM:SS’。HH表示小时;MM表示分钟;SS表示秒。TIME类型的取值范围为-838:59:59~838:59:59,小时部分会如此大的原因是TIME类型不仅可以用于表示一天的时间(必须小于24小时),还可能是某个事件过去的时间或两个事件之间的时间间隔(可以大于24小时,甚至为负)。可以使用各种格式指定TIME值,如下所示:
(1)‘D HH:MM:SS’格式的字符串。还可以使用下面任何一种“非严格”的语法:‘HH:MM:SS’、‘HH:MM’、‘D HH:MM’、‘D HH’或‘SS’。这里的D表示日,可以取0~34之间的值。在插入数据库时,D被转换为小时保存,格式为“D*24+HH”。
(2)‘HHMMSS’格式的、没有间隔符的字符串或者HHMMSS格式的数值,假定是有意义的时间。例如:‘101112’被理解为‘10:11:12’,但‘109712’是不合法的(它有一个没有意义的分钟部分),存储时将变为00:00:00。
提示:为TIME列分配简写值时应注意:如果没有冒号,MySQL解释值时,假定最右边的两位表示秒。(MySQL解释TIME值为过去的时间而不是当天的时间)。例如,读者可能认为‘1112’和1112表示11:12:00(即11点过12分),但MySQL将它们解释为00:11:12(即11分12秒)。同样‘12’和12被解释为00:00:12。相反,TIME值中如果使用冒号则肯定被看做当天的时间。也就是说‘11:12’表示11:12:00,而不是00:11:12。
1.3.3 DATE类型
DATE用在仅需要日期值时,没有时间部分,在存储时需要3个字节。日期格式为‘YYYY-MM-DD’其中‘YYYY’表示年;‘MM’表示月;‘DD’表示日。在给DATE类型的字段赋值时,可以使用字符串类型或者数字类型的数据插入,只要符合DATE的日期格式就行,如下:
(1)以‘YYYY-MM-DD’或者‘YYYYMMDD’字符串格式表示的日期,取值范围为‘1000-01-01’~‘9999-12-31’。
(2)以‘YY-MM-DD’或者‘YYMMDD’字符串格式表示的日期,在这里YY表示两位的年值。包含两位年值的日期会令人模糊,因为不知道世纪。MySQL使用以下规则解释两位年值:‘00~69’范围的年值转换为‘2000~2069’;‘70~99’范围的年值转换为‘1970~1999’。
(3)以YY-MM-DD或者YYMMDD数字格式表示的日期,与前面相似,00~69范围的年值转换为2000~2069;70~99范围的年值转换为1970~1999。
(4)使用CURRENT_DATE或者NOW(),插入当前系统日期。
提示:MySQL允许“不严格”语法:任何标点符号都可以作日期部分之间的间隔符。例如:‘98-11-31’、‘98.11.31’、‘98\11\31’和‘98@11@31’是等价的,这些值也可以正确的插入到数据库。
1.3.4 DATETIME
DATETIME类型用在需要包含日期和时间信息的值,在存储时需要8个字节。日期格式为‘YYYY-MM-DD HH:MM:SS’。再给DATETIME类型的字段赋值时,可以使用字符串类型或者数字类型的数据插入,只要符合DATETIME的日期格式即可,如下所示:
(1)以‘YYYY-MM-DD HH:MM:SS’或者‘YYYYMMDDHHMMSS’字符串格式表示的值,取值范围为‘1000-01-01 00:00:00’~‘9999-12-31 23:59:59’。
(2)以‘YY-MM-DD HH:MM:SS’或者‘YYMMDDHHMMSS’字符串格式表示的日期,在这里YY表示两位的年值,与前面相同。
(3)以YYYYMMDDHHMMSS或者YYMMDDHHMMSS数字格式表示的日期和时间,也能正常插入数据库中。
1.3.5 TIMESTAMP
TIMESTAMP的显示格式与DATETIME相同,显示宽度固定在19个字符,日期格式为YYYY-MM-DD HH:MM:SS,在存储时需要4个字节。但是TIMESTAMP列的取值范围小于DATETIME的取值范围,为‘1970-01-01 00:00:01’ UTC~‘2038-01-19 03:14:07’ UTC,其中,UTC(Coordinated Universal Time),为世界标准时间,因此在插入数据时,要保证在合法的取值范围内。
1.4 文本字符串类型
字符串类型用来存储字符串数据,除了可以存储字符串数据之外,还可以存储其他数据,比如图片和声音的二进制数据。MySQL支持两类字符串类型数据:文本字符串和二进制字符串。文本字符串可以进行区分或者不区分大小写的串比较,另外,还可以进行模式匹配查找。MySQL中文本字符串类型指CHAR、VARCHAR、TEXT、EMUN和SET。
类型名称 | 说明 | 存储需求 |
CHAR(M) | 固定长度非二进制字符串 | M字节,1<=M<=255 |
VARCHAR(M) | 变长非二进制字符串 | L+1字节,在此L<=M和1<=M<=255 |
TINYTEXT | 非常小的非二进制字符串 | L+1字节,在此L<2^8 |
TEXT | 小的非二进制字符串 | L+2字节,在此L<2^16 |
DEDIUMTEXT | 中等大小的非二进制字符串 | L+3字节,在此L<2^24 |
LONGTEXT | 大的非二进制字符串 | L+4字节,在此L<2^32 |
ENUM | 枚举类型,只能有一个枚举字符串值 | 1或2个字节,取决于枚举值的数目(最大值65535) |
SET | 一个设置,字符串对象可以有零个或多个SET成员 | 1,2,3,4或8个字节,取决于集合成员的数量(最多64个成员) |
VARCHAR和TEXT类型是变长类型,对于其存储需求取决于列值的实际长度,而不是取决于类型的最大可能尺寸。例如,一个VARCHAR(10)列能保存最大长度为10个字符的一个字符串,实际的存储需要是字符串的长度L,加上1个字节以记录字符串的长度。
1.4.1 CHAR和VARCHAR类型
CHAR(M)为固定长度字符串,在定义时指定字符串列长。当保存时在右侧填充空格以达到指定的长度。M表示列长度,M的范围是0~255个字符。
VARCHAR(M)是长度可变的字符串,M表示最大列长度。M的取值范围是0~65525。VARCHAR的最大实际长度由最长的行的大小和使用的字符集确定,而实际占用的空间为字符串的实际长度加1。
1.4.2 TEXT类型
TEXT列保存非二进制字符串,如文章内容、评论等。当保存或查询TEXT列的值时,不删除尾部空格。TEXT类型分为4种:TINYTEXT、TEXT、MEDIUMTEXT和LONGTEXT。不同的TEXT类型的存储空间和数据长度不同。
1.4.3 ENUM类型
ENUM是一个字符串对象,其值为表创建时在列规定中枚举的一列值。语法格式如下:
字段名 ENUM('值1','值2',......,'值n')
ENUM类型的字段在取值时,只能在定义的枚举列表中取,而且一次只能取一个。如果创建的成员中有空格,其尾部的空格将自动被删除。ENUM值在内部用整数表示,每个枚举值都有一个索引值:列表值所允许的成员值从1开始编号,MySQL存储的就是这个索引编号。枚举最多可以有65535个元素。
例如定义ENUM类型列('first', 'second', 'third'),该列可以取的值和每个值的索引如下所示:
值 | 索引 |
NULL | NULL |
'' | 0 |
first | 1 |
second | 2 |
third | 3 |
查看索引值的语句:
SELECT enu,enu+0 FROM tbname
提示:ENUM列总有一个默认值。如果将ENUM列声明为NULL,NULL值则为该列的一个有效值,并且默认值为NULL。如果ENUM列被声明为NOT NULL,其默认值为允许的值列表的第一个元素。
1.4.4 SET类型
SET是一个字符串对象,可以有零或多个值,SET列最多可以有64个成员,其值为表创建时规定的一列值。指定包括多个SET成员的SET列值时,各成员之间用逗号(,)间隔开。语法格式如下:
SET('值1','值2',......,'值n')
与ENUM类型相同,SET值在内部用整数表示,列表中每一个值都有一个索引编号。当创建表时,SET成员值的尾部空格将自动被删除。但与ENUM类型不同的是,ENUM类型字段只能从定义的列值中选择一个值插入,而SET类型的列可以从定义的列值中选择多个字符的联合。
如果插入SET字段中列值有重复,则MySQL自动删除重复的值;插入SET字段的值的顺序并不重要,MySQL会在存入数据库时,按照定义的顺序显示;如果插入了不正确的值,默认情况下,MySQL将忽略这些值,并给出警告。
1.5 二进制字符串类型
MySQL二进制数据类型有:BIT、BINARY、VARBINARY、TINYBLOB、BLOB、MEDIUMBLOB和LONGBLOB。
类型名称 | 说明 | 存储需求 |
BIN(M) | 位字段类型 | 大约(M+7)/8个字节 |
BINARY(M) | 固定长度二进制字符串 | M个字节 |
VARBINARY(M) | 可变长度二进制字符串 | M+1个字节 |
TINYBLOB(M) | 非常小的BLOB | L+1字节,在此L<2^8 |
BLOB(M) | 小BLOB | L+2字节,在此L<2^16 |
MEDIUMBLOB(M) | 中等大小的BLOB | L+3字节,在此L<2^24 |
LONGBLOB(M) | 非常大的BLOB | L+4字节,在此L<2^32 |
1.5.1 BIT类型
BIT类型是位字段类型。M表示每个值的位数,范围为1~64。如果M被省略,默认为1。如果为BIT(M)分配的值的长度小于M位,在值的左边用0填充。例如,为BIT(6)列分配一个值b'101',其效果与分配b'000101'相同。BIT数据类型用来保存位字段值,例如,以二进制形式保存数据13,13的二进制形式为1101,在这里需要位数至少为4位的BIT类型,即可定义列类型为BIT(4)。大于二进制的数据是不能插入BIT(4)类型的字段中的。
1.5.2 BINARY和VARBINARY类型
BINARY和VARBINARY类型类似于CHAR和VARCHAR,不同的是它们包含的是二进制字节字符串。
BINARY类型的长度是固定的,指定长度之后,不足最大长度的,将在它们右边补充'\0',补齐以达到指定长度。不管存储的内容是否达到指定的长度,其存储空间均为指定的值M。
VARBINARY类型的长度是可变的,指定好长度之后,其长度可以在0到最大值之间。例如:指定列数据类型为VARBINARY(20),如果插入的值的长度只有10,则实际存储空间为10+1,即实际占用的空间为字符串的实际长度+1。
1.5.3 BLOB类型
BLOB是一个二进制大对象,用来存储可变数量的数据。BLOB类型分为4种:TINYBLOB、BLOB、MEDIUMBLOB和LONGBLOB,它们可容纳值的最大长度不同。
数据类型 | 存储范围 |
TINYBLOB | 最大长度为255(2^8-1)B |
BLOB | 最大长度为65535(2^16-1)B |
MEDIUMBLOB | 最大长度为16777215(2^24-1)B |
LONGBLOB | 最大长度为4294967295(2^32-1)B |
BLOB列存储的是二进制字符串(字节字符串);TEXT列存储的是非二进制字符串(字符字符串)。BLOB列没有字符集,并且排序和比较基于列值字节的数值;TEXT列有一个字符集,并且根据字符集对值进行排序和比较。
二、如何选择数据类型
MySQL提供了大量的数据类型,为了优化存储,提高数据库性能,在任何情况下均应使用最精确的类型。即在所有可以表示该列值的类型中,该类型使用的存储最少。
2.1 整数和浮点数
如果不需要小数部分,则使用整数来保存数据;如果需要表示小数部分,则使用浮点数类型。对于浮点数据列,存入的数值会对该列定义的小数位进行四舍五入。例如,如果列的值的范围为1~99999,若使用整数,则MEDIUMINT UNSIGNED是最好的类型;若需要存储小数,则使用FLOAT类型。
浮点类型包括FLOAT和DOUBLE类型。DOUBLE类型精度比FLOAT高,因此,如要求存储精度较高时,应选择DOUBLE类型。
2.2 浮点数和定点数
浮点数FLOAT、DOUBLE相对于定点数DECIMAL的优势是:在长度一定的情况下,浮点数能表示更大的数据范围,但是由于浮点数容易产生误差,因此对精确度要求比较高时见识使用DECIMAL来存储。DECIMAL在MySQL中是以字符串存储的,用于定义货币等对精度要求较高的数据。在数据迁移中,FLOAT(M,D)是非标准SQL定义,数据库迁移可能会出现问题,最好不要这样使用。另外两个浮点数进行减法和比较时也容易出现问题,因此在进行计算的时候,一定要小心。如果进行数值比较,最好使用DECIMAL类型。
2.3 日期与时间类型
MySQL对于不同种类的日期和时间有很多的数据类型,比如YEAR和TIME。如果只需要记录年份,则使用YEAR类型即可;如果只记录时间,只需要使用TIME类型。
如果同时需要记录日期和时间,则可以使用TIMESTAMP或者DATETIME类型。由于TIMESTAMP列的取值范围小于DATETIME的取值范围,因此存储范围较大的日期最好使用DATETIME。
TIMESTAMP也有一个DATETIME不具备的属性。默认的情况下,当插入一条记录但并没有指定TIMESTAMP这个列值时,MySQL会把TIMESTAMP列设为当前的时间。因此当需要插入记录同时当前时间时,使用TIMESTAMP是方便的,另外TIMESTAMP在空间上比DATETIME更有效。
2.4 CHAR和VARCHAR之间的特点与选择
CHAR和VARCHAR的区别如下:
(1)CHAR是固定长度字符,CARCHAR是可变长度字符;
(2)CHAR会自动删除插入数据的尾部空格,VARCHAR不会删除尾部空格。
CHAR是固定长度,所以它的处理速度比VARCHAR要快,但是它的缺点就是浪费存储空间。所以对存储不大,但在速度上有要求的可以使用CHAR类型,反之可以使用VARCHAR类型来实现。
存储引擎对于选择CHAR和CARCHAR的影响:
(1)对于MyISAM存储引擎,最好使用固定长度的数据列代替可变长度的数据列。这样可以使整个表静态化,从而使数据检索更快,用空间换时间。
(2)对于InnoDB存储引擎,使用可变长度的数据列,因为InnoDB数据表的存储格式不分固定长度和可变长度,因此使用CHAR不一定比使用VARCHAR更好,但由于VARCHAR是按照实际的长度存储,比较节省空间,所以对磁盘I/O和数据存储总量比较好。
2.5 ENUM和SET
ENUM只能取单值,它的数据列表是一个枚举集合。它的合法取值列表最多允许65535个成员。因此,在需要从多个值中选取一个时,可以使用ENUM。
SET可取多值。它的合法取值列表最多允许有64个成员。空字符串也是一个合法的SET值。在需要取多个值的时候,适合使用SET类型。
ENUM和SET的值都是以字符串形式出现的,但在内部,MySQL以数值形式存储它们。
2.6 BLOB和TEXT
BLOB是二进制字符串,TEXT是非二进制字符串,两者均可存放大容量的信息。BLOB主要存储图片、音频信息等,而TEXT只能存储纯文本文件。
三、常见运算符介绍
运算符连接表达式中各个操作数,其作用是用来指明对操作数所进行的运算。运用运算符可以更加灵活的使用表中的数据,常见的运算符类型有:算术运算符,比较运算符,逻辑运算符,位运算符。
3.1 运算符概述
运算符是告诉MySQL执行特定算术或逻辑操作的符号。
3.1.1 算术运算符
算术运算符用于各类数值运算,包括加(+)、减(-)、乘(*)、除(/)、求余(或称模运算,%)。
3.1.2 比较运算符
比较运算符用于比较运算。包括大于(>)、小于(<)、等于(=)、大于等于(>=)、小于等于(<=)、不等于(!=),以及IN、BETWEEN AND、IS NULL、GREATEST、LEAST、LIKE、REGEXP等。
3.1.3 逻辑运算符
逻辑运算符的求值所得结果均为1(TRUE)、0(FALSE),这类运算符有逻辑非(NOT或者!)、逻辑与(AND或者&&)、逻辑或(OR或者||)、逻辑异或(XOR)。
3.1.4 位操作运算符
位操作运算符参与运算的操作数按二进制位进行运算。包括位与(&)、位或(|)、位非(~)、位异或(^)、左移(<<)、右移(>>)6种。
3.2 算术运算符
算术运算符是SQL中最基本的运算符。
运算符 | 作用 |
+ | 加法运算 |
- | 减法运算 |
* | 乘法运算 |
/ | 除法运算,返回商 |
% | 求余运算,返回余数 |
3.3 比较运算符
一个比较运算符的结果总是1、0或者是NULL,比较运算符经常在SELECT的查询条件子句中使用,用来查询满足指定条件的记录。
运算符 | 作用 |
= | 等于 |
<=> | 安全的等于 |
<>(!=) | 不等于 |
<= | 小于等于 |
>= | 大于等于 |
> | 大于 |
IS NULL | 判断一个值是否为NULL |
IS NOT NULL | 判断一个值是否不为NULL |
LEAST | 在有两个或多个参数时,返回最小值 |
GREATEST | 在有两个或多个参数时,返回最大值 |
BETWEEN AND | 判断一个值是否落在两个值之间 |
ISNULL | 与IS NULL作用相同 |
IN | 判断一个值是IN列表中的任意一个值 |
NOT IN | 判断一个值不是IN列表中的任意一个值 |
LIKE | 通配符匹配 |
REGEXP | 正则表达式匹配 |
3.4 逻辑运算符
在SQL中,所有逻辑运算符的求值所得结果均为TRUE、FALSE或NULL。在MySQL中,它们体现为1(TRUE)、0(FALSE)和NULL。其大多数都与不同的SQL通用。
运算符 | 作用 |
NOT或者! | 逻辑非 |
AND或者&& | 逻辑与 |
OR或者|| | 逻辑或 |
XOR | 逻辑异或 |
3.5 位运算符
位运算符是用来对二进制字节中的位进行测试、移位或者测试处理。
运算符 | 作用 |
| | 位或 |
& | 位与 |
^ | 位异或 |
<< | 位左移 |
>> | 位右移 |
~ | 位取反,反转所有比特 |
3.6 运算符的优先级
运算符的优先级决定了不同的运算符在表达式中计算的先后顺序。
优先级 | 运算符 |
最低 | =(赋值运算),:= |
||,OR | |
XOR | |
&&,AND | |
NOT | |
BETWEEN、CASE、WHEN、THEN、ELSE | |
=(比较运算),<=>,>=,>,<=,<,<>,!=,IS,LIKE,REGEXP,IN | |
| | |
& | |
<<,>> | |
-,+ | |
*,/(DIV),%(MOD) | |
^ | |
-(负号),~(位反转) | |
最高 | ! |
可以看到,不同运算符的优先级是不同的。一般情况下,级别高的运算符先进行计算,如果级别相同,MySQL按表达式的顺序从左到右依次计算。当然,在无法确定优先级的情况下,可以使用圆括号()来改变优先级,并且这样会使计算过程更加清晰。