为什么要使用计算字段
存储在数据库表中的数据一般不是应用程序所需要的格式。需要在服务端进行转换、计算或者格式化,计算字段并不实际存在于数据库表中。计算字段是运行时在SELECT语句内创建的。
只有数据库知道SELECT语句中哪些列是实际的表列,哪些列是计算字段。从客户端的角度来看,计算字段的数据是以与其他列的数据相同的方式返回的。
理论上格式化、转换或计算字段,在客户端也可以完成,但是,在服务端完成效率更高。
拼接字段
假设存在表fruit_lists如下:
fruit_name | price | num |
---|---|---|
苹果 | 5 | 20 |
草莓 | 7 | 35 |
荔枝 | 15 | 60 |
冬枣 | 14 | 15 |
需要输出一列格式为:fruit_name(price)
,那么就可以使用MySQL提供的Concat()
函数来拼接两个列。
SELECT Concat(列名1,列名2) FROM 表名;
输出结果如下:
mysql> SELECT Concat(fruit_name,'(',price,'元)') FROM fruit_list;
+------------------------------------+
| Concat(fruit_name,'(',price,'元)') |
+------------------------------------+
| 苹果(5元) |
| 草莓(7元) |
| 荔枝(15元) |
| 冬枣(14元) |
+------------------------------------+
4 rows in set (0.00 sec)
当拼接时发现字段左右存在冗余空格时,可以使用一下函数进行清除:
- RTrim():删除字符串右边的空格
- LTrim():删除字符串左边的空格
- Trim():删除字符串两侧的空格
使用别名
我们通过拼接字段,输出了一个在数据库中不存在的列,但是这一列当前还没有列名,应用程序还无法获取到,因此需要给这一列起一个名字。
在MySQL中,别名是一个字段或值的替换名。别名用AS关键字赋予。
SELECT Concat(列名1,列名2) AS 别名 FROM 表名;
输出结果如下:
mysql> SELECT Concat(fruit_name,'(',price,'元)') AS name_price FROM fruit_list;
+------------+
| name_price |
+------------+
| 苹果(5元) |
| 草莓(7元) |
| 荔枝(15元) |
| 冬枣(14元) |
+------------+
4 rows in set (0.00 sec)
别名还有其他用途。常见的用途包括在实际的表列名包含不符合规定的字符(如空格)时重新命名它,在原来的名字含混或容易误解时扩充它,等等。
执行算术计算
计算字段的另一常见用途是对检索出的数据进行算术计算。
例如需要根据数量和单价计算出水果的总价,可以使用算术操作符。
SELECT 列名1 算术操作符 列名2 FROM 表名;
输出结果如下:
mysql> SELECT fruit_name, price, num, price * num AS total_price FROM fruit_list;
+------------+-------+------+-------------+
| fruit_name | price | num | total_price |
+------------+-------+------+-------------+
| 苹果 | 5 | 20 | 100 |
| 草莓 | 7 | 35 | 245 |
| 荔枝 | 15 | 60 | 900 |
| 冬枣 | 14 | 15 | 210 |
+------------+-------+------+-------------+
4 rows in set (0.00 sec)
MySQL支持下表中列出的基本算术操作符。此外,圆括号可用来区分优先顺序。
操作符 | 说明 |
---|---|
+ | 加 |
- | 剪 |
* | 乘 |
/ | 除 |
可以在不使用数据库和表的情况下在MySQL中测试函数或计算。
测试算术操作符:
mysql> SELECT 2*3;
+-----+
| 2*3 |
+-----+
| 6 |
+-----+
1 row in set (0.00 sec)
测试Trim()
函数,删除字符串左右空格。
mysql> SELECT Trim(' abc ');
+-------------------------------------+
| Trim(' abc ') |
+-------------------------------------+
| abc |
+-------------------------------------+
1 row in set (0.00 sec)
测试Now()函数,获取当前时间。
mysql> SELECT Now();
+---------------------+
| Now() |
+---------------------+
| 2021-04-27 22:56:31 |
+---------------------+
1 row in set (0.00 sec)