在数据库操作中,数据的SELECT. UPDATE和DELETE等操作都可以使用条件表达式,用于获取、更新或删除给定条件的数据。例如,获取商品数据表中价格在2000与5000之间的所有商品的打折信息。此时就需要使用MySQL提供的运算符才能完成用户的需求。本节将针对MySQL中运算符的使用进行详细讲解。
算术运算符适用于数值类型的数据,通常应用在SELECT查询结果的字段中,在WHERE条件表达式中应用较少,具体如表5-3所示。
表5-3 算术运算符
运算符 | 描述 | 示例 |
---|---|---|
+ | 加运算 | SELECT 5+2; |
- | 减运算 | SELECT 5-2; |
* | 乘运算 | SELECT 5*2; |
/ | 除运算 | SELECT 5/2; |
% | 取模运算 | SELECT 5%2; |
在表5-3中,运算符两端的数据可以是真实的数据(如5).或数据表中的字段(如price),而参与运算的数据一般称之为操作数,操 作数与运算符组合在一起统称为表达式(如5+2)。另外,在MySQL中可以直接利用SELECT查看数据的运算结果,如表5-3中的示例。
算术运算符的使用看似简单,但是在实际应用时还有几点需要注意。下面为了让读者更好地理解,通过案例的方式一一进行演示。
在MySQL中,若运算符“+” “-”和“*”的操作数都是无符号整型,则运算结果也是无符号整型。例如,商品表sh_goods中的id字段就是无符号整型,下面对sh_goods表中前5 条记录的id进行加1、减1以及乘2操作。具体SQL语句及执行结果如下。
mysql> SELECT id, id+1, id-1, id*2 FROM sh_goods LIMIT 5;
+----+------+------+------+
| id | id+1 | id-1 | id*2 |
+----+------+------+------+
| 1 | 2 | 0 | 2 |
| 2 | 3 | 1 | 4 |
| 3 | 4 | 2 | 6 |
| 4 | 5 | 3 | 8 |
| 5 | 6 | 4 | 10 |
+----+------+------+------+
5 rows in set (0.00 sec)
从上述执行结果可知,sh_goods表中的前5条记录的id值分别为1到5,然后在此基础上实现了id+1.id-1和id*2的运算,运算结果依然都为无符号整型。
MySQL中,默认情况下运算符“-”的操作数若都为无符号整型,则结果一定是无符号的整型,若操作数的差值为负数,那么系统就会报错。例如,对sh_goods表中前5条记录的id执行减3操作,具体SQL语句及执行结果如下。
mysql> SELECT id-3 FROM sh_goods LIMIT 5;
ERROR 1690 (22003): BIGINT UNSIGNED value is out of range in '(`shop`.`sh_goods`.`id` - 3)'
从上述执行结果可知,减法运算的结果已经超出了无符号BIGINT的最大范围。因此,无论运算符“-”的操作数是否含有符号,若要获得一个有符号的运算结果,可以使用CAST(… AS SIGNED)将无符号整型id强制转换为有符号的整型数据。将上述语句修改成以下形式。
mysql> SELECT CAST(id AS SIGNED)-3 FROM sh_goods LIMIT 5;
+----------------------+
| CAST(id AS sIGNED)-3 |
+----------------------+
| -2 |
| -1 |
| 0 |
| 1 |
| 2 |
+----------------------+
5 rows in set (0.00 sec)
上述执行结果,“-2”和“-1”中的符号“-”,表示负号,它是一个一元操作符,仅有一个操作数,如2。而运算符“-”表示减法运算时,是一个二元操作符,有两个操作数,如id-3中的id和3。
算术运算除了可以对整数运算外,还可以对浮点数进行运算。在对浮点数进行加减运算时,运算结果中的精度(小数点后的位数)等于参与运算的操作数的最大精度。例如1.2+1.400,1. 400的精度最大为3,则运算结果的精度就为3;在对浮点数进行乘法运算时,运算结果中的精度,以参与运算的操作数的精度和为准。例如1.2* 1.400,1.2的精度为1,1.400的精度为3,则运算结果中的精度就为4(1+ 3)。
下面查询sh_goods表,获取5星好评的商品添加850件库存后的值,以及75折促销后的价格,具体SQL语句及执行结果如下。
mysql> SELECT name, price, stock, price*0.75, stock+850.00
-> FROM sh_goods WHERE score = 5;
+----------+---------+-------+------------+--------------+
| name | price | stock | price*0.75 | stock+850.00 |
+----------+---------+-------+------------+--------------+
| | 1.00 | 500 | 0.7500 | 1350.00 |
| | 1999.00 | 0 | 1499.2500 | 850.00 |
+----------+---------+-------+------------+--------------+
2 rows in set (0.00 sec)
上述执行结果中,price的精度为2,stock没有精度。因此,price*0.75的运算结果精度为4(2+2),如碳素笔折后价格的小数点后有4位;stock+850.00的运算结果精度为2(0与2比较2大),如碳素笔添加库存后小数点后有2位。
运算符“/"在MySQL中用于除法操作,且运算结果使用浮点数表示,浮点数的精度等于被除数(*/"运算符左侧的操作数)的精度加上系统变量div_precision_increment设置的除法精度增长值,读者可通过以下SQL语句查找其默认值。
mysql> SHOW VARIABLES LIKE 'div_precision_increment';
+-------------------------+-------+
| Variable_name | Value |
+-------------------------+-------+
| div_precision_increment | 4 |
+-------------------------+-------+
1 row in set, 1 warning (0.00 sec)
从上述的执行结果可知,div_precision_increment 的默认值为4。
例如,在活动日,库存量大于200的商品,75折优惠后卖出了4/5,查询活动后剩余的库存量。具体SQL语句及执行结果如下。
mysql> SELECT name, stock, stock/5 FROM sh_goods WHERE stock > 200;
+---------+-------+----------+
| name | stock | stock/5 |
+---------+-------+----------+
|2B铅笔 | 500 | 100.0000 |
|钢笔 | 300 | 60.0000 |
|碳素笔 | 500 | 100.0000 |
|桌面音箱 | 750 | 150.0000 |
+---------+-------+----------+
2 rows in set (0.00 sec)
在上述语句中,首先从sh_goods表中获取库存量大于200的商品,然后再查询对应的商品名称、原库存量以及计算活动后剩余的1/5库存量。如上述执行结果所示,运算的结果精度为4(stock的精度0+除法精度增长的默认值为4)。
值得一提的是,除法运算中除数如果为0,则系统显示的执行结果为NULL。
在算术运算中,NULL是一个特殊的值,它参与的算术运算结果均为NULL。例如,使用NULL参与加减乘除运算,具体SQL语句及执行结果如下。
mysql> SELECT NULL+1, 3-NULL, 7*NULL, 2/NULL, NULL/3;
+--------+--------+--------+--------+--------+
| NULL+1 | 3-NULL | 7*NULL | 2/NULL | NULL/3 |
+--------+--------+--------+--------+--------+
| NULL | NULL | NULL | NULL | NULL |
+--------+--------+--------+--------+--------+
1 row in set (0.00 sec)
在MySQL中,运算符DIV与“/”都能实现除法运算,区别在于前者的除法运算结果会去掉小数部分,只返回整数部分。