mysql---运算符

在数据库操作中,数据的SELECT. UPDATE和DELETE等操作都可以使用条件表达式,用于获取、更新或删除给定条件的数据。例如,获取商品数据表中价格在2000与5000之间的所有商品的打折信息。此时就需要使用MySQL提供的运算符才能完成用户的需求。本节将针对MySQL中运算符的使用进行详细讲解。

1、算术运算符

算术运算符适用于数值类型的数据,通常应用在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中的示例。
算术运算符的使用看似简单,但是在实际应用时还有几点需要注意。下面为了让读者更好地理解,通过案例的方式一一进行演示。

1.1、无符号的加减乘法运算

在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的运算,运算结果依然都为无符号整型。

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。

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位。

4、“/”运算

运算符“/"在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。

5、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)

6、DIV 与MOD运算符

在MySQL中,运算符DIV与“/”都能实现除法运算,区别在于前者的除法运算结果会去掉小数部分,只返回整数部分。

你可能感兴趣的:(mysql)