MySQL支持多种类型的运算符和内置函数,可极大提高使用者操作效率,以高效满足大多数实际工程中涉及到的操作场景,本篇文章让我们来一探究竟。本篇文章脉络如下:

一、运算符
MySQL中支持多种类型的运算符,主要包括算术运算符、比较运算符、逻辑运算符和位运算符。
🧷1.1、算术运算符
算术运算符主要是加减乘除操作,MySQL支持如下常见算术操作:
操作符 | 示例 | 描述 |
---|---|---|
+ | a + b | 加法 |
– | a – b | 减法 |
* | a * b | 乘法 |
/ | a / b | 除法 |
DIV | a DIV b | 除法,取商的整数部分 |
% | a % b | 取余 |
mysql> select 1/0;
+------+
| 1/0 |
+------+
| NULL |
+------+
1 row in set, 1 warning (0.00 sec)
mysql> select 1%0;
+------+
| 1%0 |
+------+
| NULL |
+------+
1 row in set, 1 warning (0.01 sec)
mysql> select 1 DIV 0;
+---------+
| 1 DIV 0 |
+---------+
| NULL |
+---------+
1 row in set, 1 warning (0.01 sec)
🧷1.2、比较运算符
在《09|第九话:基础篇-MySQL之初级查询》中已经学习过,我们汇总如下:
操作符 | 示例 | 描述 |
---|---|---|
= | a = b | a等于b |
<>或者!= | a <> b | a不等于b |
< | a < b | a小于b |
<= | a <= b | a小于或等于b |
> | a > b | a大于b |
>= | a >= b | a大于或等于b |
BETWEEN | a BETWEEN b AND c | 满足 b <= a <= c |
NOT BETWEEN | a NOT BETWEEN b AND c | 不满足 b <= a <= c |
in | a IN (b1, b2, …) | a是b1, b2, … 中的某一个 |
NOT IN | a NOT IN (b1, b2, …) | a不是b1, b2, … 中的任意一个 |
IS NULL | a IS NULL | a的值是NULL |
IS NOT NULL | a IS NOT NULL | a的值不是NULL |
LIKE | a LIKE b | a匹配b |
NOT LIKE | a NOT LIKE b | a不匹配b |
由比较操作符连接而成的表达式也称为布尔表达式,表示真或者假,也可以称为TRUE或者FALSE。比如1 > 3就代表FALSE,3 != 2就代表TRUE,由于已经逐个学习过,故不展开赘述。
🧷1.3、逻辑运算符
逻辑运算符又称为布尔运算符,逻辑操作符是用来将多个布尔表达式连接起来,我们主要需要了解如下几种即可:
操作符 | 示例 | 描述 |
---|---|---|
AND | a AND b | 只有a和b同时为真,表达式才为真 |
OR | a OR b | 只要a或b有任意一个为真,表达式就为真 |
XOR | a XOR b | a和b有且只有一个为真,表达式为真 |
这些也在第九话中举例说明过用法,不再赘述。
🧷1.4、位运算符
实际工程中,以上三种使用比较广泛,而位运算符很少使用,我们只需要大概了解即可。
位运算是将给定的操作数转化为二进制后,对操作数的每一位进行指定的逻辑运算,得到二进制结果后转换为十进制数的结果,我们了解如下几种:
操作符 | 示例 | 描述 |
---|---|---|
& | a&b | 位与(即按位AND) |
| | a|b | 位或(即按位OR) |
^ | a^b | 位异或(即按位XOR) |
~ | a~b | 位取反 |
>> | a>>b | 位右移b位 |
<< | a<<b | 位左移b位 |
我们通过几个简单的例子了解下。
“位与”,是对多个操作数的二进制位做逻辑与操作,比如2&3,由于2的二进制数是10,3的二进制数是11,10&11的结果是10,对应十进制还是2:
mysql> select 2&3;
+-----+
| 2&3 |
+-----+
| 2 |
+-----+
1 row in set (0.01 sec)
注意,这里可以是多个操作数,原理是一样的,故不赘述。
“位或”即二进制位做逻辑或操作,比如2|3对应10|11的二进制结果是11,对应十进制数即3:
mysql> select 2|3;
+-----+
| 2|3 |
+-----+
| 3 |
+-----+
1 row in set (0.00 sec)
“位异或”是对二进制位做逻辑异或操作,10^11异或的结果是01,对应十进制是1:
mysql> select 2^3;
+-----+
| 2^3 |
+-----+
| 1 |
+-----+
1 row in set (0.00 sec)
“位取反”,顾名思义就是对二进制数每一位做取反操作,即0变成1、1变成0.我们对1进行取反:
mysql> select ~1;
+----------------------+
| ~1 |
+----------------------+
| 18446744073709551614 |
+----------------------+
1 row in set (0.00 sec)
对1取反后竟然是如此惊人的数字,我们来看下这个数字对应的二进制是多少:
mysql> select bin(18446744073709551614);
+------------------------------------------------------------------+
| bin(18446744073709551614) |
+------------------------------------------------------------------+
| 1111111111111111111111111111111111111111111111111111111111111110 |
+------------------------------------------------------------------+
1 row in set (0.00 sec)
数了数,这里有63个1,所以一共是64位,即8个字节,可以推断出在MySQL中一个常量数字默认占用8个字节。
依据可以翻阅官方文档:https://dev.mysql.com/doc/refman/5.7/en/bit-functions.html
提到了,以上的位操作符的结果(包括位与、位或等操作)都是无符号64位整数:The result is an unsigned 64-bit integer.
最后说下“位右移”和“位左移”,我们以位右移为例,比如100>>3,表示100的二进制0001100100,对于右移三位,左边补0,变成0000001100,对应的十进制数是12:
mysql> select 100>>3;
+--------+
| 100>>3 |
+--------+
| 12 |
+--------+
1 row in set (0.00 sec)
“位左移”同理,向左移动N位,并且右边补0即可。

二、函数
写代码的朋友一定知道函数的重要性,丰富的函数可以大大提高工作效率,函数可以帮助做很多事情,比如字符串的处理、数值的运算、日期的运算等等,MySQL提供了很多内建函数帮助开发人员编写简单快捷的SQL语句,比如:
-
UPPER函数是用来把给定的文本中的小写字母转换成大写字母。
-
NOW函数用来获取当前的日期和时间。
-
……
如果我们想使用这些函数,可以在函数名后加一个小括号()就好,表示调用一下这个函数,简称函数调用。比方说NOW()就代表调用NOW函数来获取当前日期和时间。针对某些包含参数的函数,我们也可以在小括号()里将参数填入,比方说UPPER(‘abc’)表示将字符串’abc’转换为大写格式,下面我们逐一看一看。
🧷2.1、字符串函数
字符串函数是最常用的一种函数,比较常用的有:
名称 | 调用示例 | 示例结果 | 描述 |
---|---|---|---|
LEFT | LEFT(‘abc123’, 3) | abc | 给定字符串从左边取指定长度的子串 |
RIGHT | RIGHT(‘abc123’, 3) | 123 | 给定字符串从右边取指定长度的子串 |
LENGTH | LENGTH(‘abc’) | 3 | 给定字符串的长度 |
LOWER | LOWER(‘ABC’) | abc | 给定字符串的小写格式 |
UPPER | UPPER(‘abc’) | ABC | 给定字符串的大写格式 |
LTRIM | LTRIM(‘ abc’) | abc | 给定字符串左边空格去除后的格式 |
RTRIM | RTRIM(‘abc ‘) | abc | 给定字符串右边空格去除后的格式 |
SUBSTRING | SUBSTRING(‘abc123’, 2, 3) | bc1 | SUBSTRING(str,x,y):返回从字符串str的x位置起y个字符长度的字串 |
CONCAT | CONCAT(‘abc’, ‘123’, ‘xyz’) | abc123xyz | 将给定的各个字符串拼接成一个新字符串 |
当然了,还有很多其他的内置函数,当我们需要使用的时候,不妨去官网看看哪些函数可以为我们所用(https://dev.mysql.com/doc/refman/5.7/en/built-in-function-reference.html)。
重要的一点是我们要学会在SQL中使用这些函数,我们来以CONCAT函数为例来看一下。
这里有一张简单的学生信息表,只有两个字段,数据如下:
mysql> select * from student_info;
+----+---------+
| id | name |
+----+---------+
| 1 | fossi |
| 2 | fossi |
| 3 | fossi |
+----+---------+
3 rows in set (0.00 sec)
假设希望select的结果是一句话:学号是XX的学生名字叫XXX,我们就可以使用CONCAT函数拼接成新的字符串输出:
mysql> select concat("学号是",id,"的学生名字叫",name) as '学生信息'
from stude t_info;
+-------------------------------------+
| 学生信息 |
+-------------------------------------+
| 学号是1的学生名字叫fossi |
| 学号是2的学生名字叫fossi |
| 学号是3的学生名字叫fossi |
+-------------------------------------+
3 rows in set (0.01 sec)
容易想到,如果没有concat函数,实现这么一个简单的功能还是很麻烦的。
由于函数功能的使用对程序员来说是一项基本使用技能,工作中无时无刻不在调用函数来实现各种功能,因此本文只是作为一个引子,就不对函数展开做一个一个详细说明了,相信只要试一下就可以掌握函数的使用了。
🧷2.2、数值函数
MySQL中另外一类很重要的函数就是数值函数,可以用来进行数值运算,比如取绝对值等功能,常用的数值函数有:
名称 | 调用示例 | 示例结果 | 描述 |
---|---|---|---|
ABS | ABS(-1) | 1 | 取绝对值 |
Pi | PI() | 3.141593 | 返回圆周率 |
COS | COS(PI()) | -1 | 返回一个角度的余弦 |
SIN | SIN(PI()/2) | 1 | 返回一个角度的正弦 |
TAN | TAN(0) | 0 | 返回一个角度的正切 |
EXP | EXP(1) | 2.718281828459045 | 返回e的指定次方 |
MOD | MOD(5,2) | 1 | 返回除法的余数 |
RAND | RAND() | 0.7537623539136372 | 返回一个随机数 |
SQRT | SQRT(9) | 3 | 返回一个数的平方根 |
🧷2.3、日期和时间函数
有的时候我们需要处理这样的需求:当前时间是多少?下个月的今天是星期几?统计截止到当前日期前三天的数据。此时就需要用上日期和时间函数,这也是实际工程中使用十分多的函数,比较常见的函数有:
名称 | 调用示例 | 示例结果 | 描述 |
---|---|---|---|
NOW | NOW() | 2022-09-17 21:16:41 | 返回当前日期和时间 |
CURDATE | CURDATE() | 2022-09-17 | 返回当前日期 |
CURTIME | CURTIME() | 21:16:41 | 返回当前时间 |
DATE | DATE(‘2022-09-17 21:16:41’) | 2022-09-17 | 将给定日期和时间值的日期提取出来 |
DATE_ADD | DATE_ADD(‘2022-09-17 21:16:41’, INTERVAL 2 DAY) | 2022-09-19 21:16:41 | 将给定的日期和时间值添加指定的时间间隔 |
DATE_SUB | DATE_SUB(‘2022-09-17 21:16:41’, INTERVAL 2 DAY) | 2022-09-15 21:16:41 | 将给定的日期和时间值减去指定的时间间隔 |
DATEDIFF | DATEDIFF(‘2022-09-17’, ‘2022-09-18’); | -1 | 返回两个日期之间的天数(负数代表前一个参数代表的日期比较小) |
DATE_FORMAT | DATE_FORMAT(NOW(),’%m-%d-%Y’) | 09-17-2022 | 用给定的格式显示日期和时间 |
在使用DATE_ADD和DATE_SUB这两个函数时需要注意,增加或减去的时间间隔单位可以自己定义,下边是MySQL支持的一些时间单位:
-
MICROSECOND:毫秒
-
SECOND:秒
-
MINUTE:分钟
-
HOUR:小时
-
DAY:天
-
WEEK:星期
-
MONTH:月
-
QUARTER:季度
-
YEAR:年
如果我们相让2022-09-17 21:00:00这个时间值增加5分钟,可以这么写:
mysql> SELECT DATE_ADD('2022-09-17 21:00:00', INTERVAL 5 MINUTE);
+----------------------------------------------------+
| DATE_ADD('2022-09-17 21:00:00', INTERVAL 5 MINUTE) |
+----------------------------------------------------+
| 2022-09-17 21:05:00 |
+----------------------------------------------------+
1 row in set (0.00 sec)
🧷2.4、聚集函数
有些函数是用来统计数据的,比方说统计一下表中的行数,某一列数据的最大值是什么,我们把这种函数称之为聚集函数,下边介绍MySQL中常用的几种聚集函数:
函数名 | 描述 |
---|---|
COUNT | 返回某列的行数 |
MAX | 返回某列的最大值 |
MIN | 返回某列的最小值 |
SUM | 返回某列值之和 |
AVG | 返回某列的平均值 |
鉴于这几个聚集函数十分重要,我们逐一说明。
第一个是COUNT函数,COUNT函数使用来统计行数的,它有下边两种使用方式:
-
COUNT(*):对表中行的数目进行计数,不管列的值是不是NULL。
-
COUNT(列名):对特定的列进行计数,会忽略掉该列为NULL的行。
当然了还有COUNT(1),这个跟COUNT(*)
差不多,关于这几个COUNT查询细节,我们以后学习完索引之后再来研究,这里我们直接说结论,一般情况下我们推荐使用COUNT(*)
:COUNT(*)
是SQL92定义的标准统计行数的语法,并且效率高,所以请直接使用COUNT(*)
查询表的行数!
查询下学生信息表的行数:
mysql> select count(*) from student_info;
+----------+
| count(*) |
+----------+
| 3 |
+----------+
1 row in set (0.00 sec)
第二个是MAX函数和MIN函数,MAX函数是用来查询某列中数据的最大值,比如查询学号ID最大的学生信息:
mysql> select max(id) from student_info;
+---------+
| max(id) |
+---------+
| 3 |
+---------+
1 row in set (0.00 sec)
相对地,MIN就是找到最小的那个,这里就不赘述了。
第三个是SUM函数和AVG函数,SUM函数是用来计算某列数据的和,比如计算所有学生ID的和:
mysql> select sum(id) from student_info;
+---------+
| sum(id) |
+---------+
| 6 |
+---------+
1 row in set (0.01 sec)
AVG函数是用来计算某列数据的平均数,比如计算所有学生ID的平均数:
mysql> select avg(id) from student_info;
+---------+
| avg(id) |
+---------+
| 2.0000 |
+---------+
1 row in set (0.00 sec)
以上示例是针对所有数据的统计,其实也可以在后面组合where语句进行范围的限定,只有符合where条件的数据才会纳入到计算范围。
我们的学生信息表目前数据是这样的:
mysql> select * from student_info;
+----+---------+
| id | name |
+----+---------+
| 1 | fossi |
| 2 | fossi |
| 3 | fossi |
+----+---------+
3 rows in set (0.00 sec)
假设我要按照姓名统计不重名的有多少(这里为了演示功能而强行设定的需求,请不要纠结),我们首先想到是这么写:
mysql> select count(name) from student_info;
+-------------+
| count(name) |
+-------------+
| 3 |
+-------------+
1 row in set (0.01 sec)
这里按照name计算学生数量,但是不符合“不重名”的需求,此时可以组合使用DISTINCT关键字:
mysql> select count(DISTINCT name) from student_info;
+----------------------+
| count(DISTINCT name) |
+----------------------+
| 1 |
+----------------------+
1 row in set (0.00 sec)
可以看到,由于三个学生名字都叫fossi,因此就只统计出来一个。
🧷2.5、流程函数
流程函数也是很多场景中会使用到的一类函数,控制流程函数主要是做一些数据的条件判断,按照需求把字段输出指定的内容,用于数据的分类、特征提出等,以便后续有针对性的进行数据分析。主要包括IF、CASE-WHEN、IFNULL、NULLIF。
函数名 | 描述 |
---|---|
IF(value,t,f) | 如果value为真返回t,否则返回f |
IFNULL(value1,value2) | 如果value不为空返回value1,否则返回value2 |
CASE WHEN [value1] THEN[result1]…ELSE[default] END | 如果value1是真则返回result1,否则返回default |
CASE [expr] WHEN [value1] THEN[result1]…ELSE[default] END | 如果expr等于value1则返回result1,否则返回default |
先说说第一个IF函数,我们举个简单的例子就明白啦!针对我们的学生信息表,我们修改表结构为:
CREATE TABLE `student_info` (
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT '学号',
`name` varchar(20) CHARACTER SET utf8 DEFAULT NULL COMMENT '姓名',
`score` int(11) DEFAULT NULL COMMENT '分数',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8mb4 COMMENT='学生基本信息表';
增加了一列考试分数字段,我们插入一些数据后展示如下:
mysql> select * from student_info;
+----+------+-------+
| id | name | score |
+----+------+-------+
| 1 | stu1 | 100 |
| 2 | stu2 | 85 |
| 3 | stu3 | 70 |
| 4 | stu4 | 50 |
+----+------+-------+
4 rows in set (0.00 sec)
需求:如果分数大于等于80,则给出“优秀”评价,否则给出“良好”评价,我们可以这样写:
mysql> SELECT id,name,score,IF(score>=80,"优秀","良好") as "成绩评价" FROM student_info;
+----+------+-------+--------------+
| id | name | score | 成绩评价 |
+----+------+-------+--------------+
| 1 | stu1 | 100 | 优秀 |
| 2 | stu2 | 85 | 优秀 |
| 3 | stu3 | 70 | 良好 |
| 4 | stu4 | 50 | 良好 |
+----+------+-------+--------------+
4 rows in set (0.01 sec)
是不是很简单?再来一个新的需求,将成绩评价分为优秀、良好和不及格:80分及以上的为优秀、60到80分之间的为良好、60分以下为不及格,此时我们可以通过IF的嵌套来实现:
mysql> SELECT id,name,score,IF(score>=80,"优秀",IF(score>=60,"良好","不及格")) as "成绩评价" FROM student_info;
+----+------+-------+--------------+
| id | name | score | 成绩评价 |
+----+------+-------+--------------+
| 1 | stu1 | 100 | 优秀 |
| 2 | stu2 | 85 | 优秀 |
| 3 | stu3 | 70 | 良好 |
| 4 | stu4 | 50 | 不及格 |
+----+------+-------+--------------+
4 rows in set (0.01 sec)
我们继续看IFNULL(value1,value2)函数,如果value不为空返回value1,否则返回value2,假设我们的学生信息数据变为:
mysql> select * from student_info;
+----+------+-------+
| id | name | score |
+----+------+-------+
| 1 | stu1 | 100 |
| 2 | stu2 | 85 |
| 3 | stu3 | 70 |
| 4 | stu4 | 50 |
| 5 | stu5 | NULL |
+----+------+-------+
5 rows in set (0.01 sec)
可以看到stu5的成绩为NULL,我们针对这种情况在学生成绩这一列展示为:“此学生弃考,成绩作废!请家长!”
mysql> SELECT id,name,IFNULL(score,"此学生弃考,成绩作废!请家长!") as "成绩" FROM student_info;
+----+------+-----------------------------------------------+
| id | name | 成绩 |
+----+------+-----------------------------------------------+
| 1 | stu1 | 100 |
| 2 | stu2 | 85 |
| 3 | stu3 | 70 |
| 4 | stu4 | 50 |
| 5 | stu5 | 此学生弃考,成绩作废!请家长! |
+----+------+-----------------------------------------------+
5 rows in set (0.00 sec)
一般我们可以判断,如果该字段为空的,将其置为有意义的数,比如这里的分数其实可以置为0分,方便进行数值运算。
最后我们来说说CASE-WHEN,如果多重判断的情况下,用IF就很麻烦,CASE WHEN语法就能很好地解决,而且实际中也是非常实用的语法。
我们用CASE-WHEN来解决下上面IF语法来实现的两个需求。
需求1:如果分数大于等于80,则给出“优秀”评价,否则给出“良好”评价,我们可以这样写:
mysql> select id,name,score,
case when score >=80 then "优秀"
else "良好" end as "成绩评价"
from student_info;
+----+------+-------+--------------+
| id | name | score | 成绩评价 |
+----+------+-------+--------------+
| 1 | stu1 | 100 | 优秀 |
| 2 | stu2 | 85 | 优秀 |
| 3 | stu3 | 70 | 良好 |
| 4 | stu4 | 50 | 良好 |
| 5 | stu5 | NULL | 良好 |
+----+------+-------+--------------+
5 rows in set (0.01 sec)
需求2:将成绩评价分为优秀、良好和不及格:80分及以上的为优秀、60到80分之间的为良好、60分以下为不及格,我们可以这么写:
mysql> select id,name,score,
case when score >=80 then "优秀"
when score >=60 then "良好"
else "不及格" end as "成绩评价"
from student_info;
+----+------+-------+--------------+
| id | name | score | 成绩评价 |
+----+------+-------+--------------+
| 1 | stu1 | 100 | 优秀 |
| 2 | stu2 | 85 | 优秀 |
| 3 | stu3 | 70 | 良好 |
| 4 | stu4 | 50 | 不及格 |
| 5 | stu5 | NULL | 不及格 |
+----+------+-------+--------------+
5 rows in set (0.00 sec)
最后一种CASE [expr]的语法,可以使用在[expr]有固定几种类型的情况,因为它的判定规则是:如果expr等于value1则返回result1,否则返回default,限于篇幅,这里就不举例展开说明了。
函数就说到这里,其实MySQL还有很多很多内建函数,只是用到比较少,我们也不必太去关心这些函数。

三、隐式类型转换
介绍完了运算符和函数两大块内容后,我们最后来看下MySQL隐式类型转换问题。
只要某个值的类型与上下文要求的类型不符,MySQL就会根据上下文环境中需要的类型对该值进行类型转换,由于这些类型转换都是MySQL自动完成的,所以也可以被称为隐式类型转换。我们列举几种常见的隐式类型转换的场景:
第一种:把操作数类型转换为适合操作符计算的相应类型。
比方说对于加法操作符+来说,它要求两个操作数都必须是数字才能进行计算,所以如果某个操作数不是数字的话,会将其隐式转换为数字,比方说下边这几个例子:
mysql> SELECT 1 + 2, '1' + 2, '1' + '2';
+-------+---------+-----------+
| 1 + 2 | '1' + 2 | '1' + '2' |
+-------+---------+-----------+
| 3 | 3 | 3 |
+-------+---------+-----------+
1 row in set (0.00 sec)
第二种:将函数参数转换为该函数期望的类型。
以用于拼接字符串的CONCAT函数举例,这个函数以字符串类型的值作为参数,如果我们在调用这个函数的时候,传入了别的类型的值作为参数,MySQL会自动把这些值的类型转换为字符串类型的:
mysql> SELECT CONCAT('1', '2'), CONCAT('1', 2), CONCAT(1, 2);
+------------------+----------------+--------------+
| CONCAT('1', '2') | CONCAT('1', 2) | CONCAT(1, 2) |
+------------------+----------------+--------------+
| 12 | 12 | 12 |
+------------------+----------------+--------------+
1 row in set (0.00 sec)
第三种:存储数据时,把某个值转换为某个列需要的类型。
比如有这么一张表:
CREATE TABLE t (
i1 TINYINT,
i2 TINYINT,
s VARCHAR(100)
);
这个表有三个列,列i1和i2是用来存储整数的,列s是用来存储字符串的,如果我们在存储数据的时候填入的不是期望的类型,就像这样:
mysql> INSERT INTO t(i1, i2, s) VALUES('100', '100', 200);
Query OK, 1 row affected (0.01 sec)
mysql> SELECT * FROM t;
+------+------+------+
| i1 | i2 | s |
+------+------+------+
| 100 | 100 | 200 |
+------+------+------+
1 row in set (0.00 sec)
可以看到,仍然可以自动插入成功,在插入数据的时候字符串’100’会被转型为整数100,整数200会被转型成字符串’200’。
另外,在读取数据的时候,MySQL会尽量把值转换为表达式中需要的类型,而不是产生错误。比如下面这种奇葩场景仍然不会报错:
mysql> SELECT '23sfd' + 0, 'sfd' + 0;
+-------------+-----------+
| '23sfd' + 0 | 'sfd' + 0 |
+-------------+-----------+
| 23 | 0 |
+-------------+-----------+
1 row in set, 2 warnings (0.00 sec)
当然了,这个规则不能适用于存储数据。
此外,MySQL在运算时会自动提升操作数的类型,比如下面这张表:
mysql> SELECT * FROM t;
+------+------+------+
| i1 | i2 | s |
+------+------+------+
| 100 | 100 | 200 |
+------+------+------+
1 row in set (0.00 sec)
其中的i1列和i2列的类型都是TINYINT,而TINYINT能表示的最大正整数是127,如果我们把i1列的值和i2列的值相加会发生什么呢?请看:
mysql> SELECT i1 + i2 FROM t;
+---------+
| i1 + i2 |
+---------+
| 200 |
+---------+
1 row in set (0.00 sec)
可以看到最后的结果是200,可是它已经超过TINYINT类型的表示范围了。其实在运算的过程中,MySQL自动将整数类型的操作数提升到了BIGINT,这样就不会产生运算结果太大超过TINYINT能表示的数值范围的尴尬情况了。类似的,有浮点数的运算过程会把操作数自动转型为DOUBLE类型。

四、总结
原文始发于微信公众号(幕后哈土奇):11|第十一话:基础篇-MySQL之运算符和常用函数
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/112839.html