计算字段:
存储在数据库表中的数据一般不是应用程序所需要的格式。比如:
- 如果想在一个字段中既显示公司名,又显示公司的地址,但这两个信息一般包含在不同的表列中;
- 城市、州和邮政编码存储在不同的列中(应该这样),但邮件标签打印程序却需要把它们作为一个恰当格式的字段检索出来;
- 列数据是大小写混合的,但报表程序需要把所有数据按大写表示出来;
- 物品订单表存储物品的价格和数量,但不需要存储每个物品的总价格(用价格乘以数量即可)。为打印发票,需要物品的总价格;
- 需要根据表数据进行总数、平均数计算或其他计算。
在上述每个例子中,存储在表中的数据都不是应用程序所需要的。我们需要直接从数据库中检索出转换、计算或格式化过的数据;而不是检索出数据,然后再在客户机应用程序或报告程序中重新格式化。
计算字段
并不实际存在于数据库表中,计算字段是运行时在SELECT语句
内创建的。
只有数据库知道SELECT语句
中哪些列是实际的表列,哪些列是计算字段。从客户机(如应用程序)的角度来看,计算字段的数据是以与其他列的数据相同的方式返回的。
序号 | 说明 | 操作 |
---|---|---|
1 | 拼接字段 | Concat() 函数 |
2 | 使用别名 | AS 关键字,顺序:AS —FROM —WHERE —ORDER BY —LIMIT |
3 | 执行算术计算 | + 、- 、* 、/ |
4 | 删除多余空格 | Trim() 、RTrim() 、LTrim() |
以下为数据库SQLTEST
中的三张表,其结构和内容如下:
1. 拼接字段
拼接(concatenate):将值联结到一起构成单个值。
MySQL的不同之处:多数DBMS使用+
或||
来实现拼接,MySQL则使用Concat()函数
来实现。所以当把SQL语句转换成MySQL语句时一定要把这个区别铭记在心。
mysql> SELECT Concat(Stu_Name, '(', Class_id, ')')
-> FROM t_stu_profile
-> ORDER BY Class_id;
+--------------------------------------+
| Concat(Stu_Name, '(', Class_id, ')') |
+--------------------------------------+
| 郭东(0611) |
| 钱南(0611) |
| .test(0611) |
| 李西(0612) |
| test(0612) |
| 张北(0613) |
| 王五(0614) |
| 赵七(0615) |
+--------------------------------------+
2. 使用别名
SQL支持列别名。别名(alias)是一个字段或值得替换名,别名用
AS
关键字赋予;
顺序:AS
—FROM
—WHERE
—ORDER BY
—LIMIT
。
mysql> DELETE
-> FROM t_stu_profile
-> WHERE Stu_Name REGEXP 'test$';
mysql> INSERT t_stu_profile
-> VALUES
-> (7, ' test', 'F', 15, '0615'),
-> (8, 'test ', 'M', 18, '0612 ');
mysql> SELECT Concat(LTrim(Stu_Name), '[', RTrim(Class_id), ']')
-> AS new_stu_profile
-> FROM t_stu_profile
-> ORDER BY Class_id DESC;
+-----------------+
| new_stu_profile |
+-----------------+
| 赵七[0615] |
| test[0615] |
| 王五[0614] |
| 张北[0613] |
| test [0612] |
| 李西[0612] |
| 郭东[0611] |
| 钱南[0611] |
+-----------------+
3. 执行算术计算
计算字段的另一常见用途是对检索出的数据进行算术计算。
# 创建新表:orderitems
mysql> CREATE TABLE IF NOT EXISTS orderitems
-> (prd_id TINYINT, quantity INT, item_price FLOAT);
mysql> INSERT orderitems
-> VALUES
-> (1, 10, 5.99),
-> (2, 3, 9.99),
-> (3, 5, 10.00),
-> (4, 1, 10.00);
新添加一列
expanded_price
,用来计算总价(quantity*item_price
)。
mysql> SELECT prd_id,
-> quantity,
-> item_price,
-> quantity*item_price AS expanded_price
-> FROM orderitems;
+--------+----------+------------+--------------------+
| prd_id | quantity | item_price | expanded_price |
+--------+----------+------------+--------------------+
| 1 | 10 | 5.99 | 59.89999771118164 |
| 2 | 3 | 9.99 | 29.969999313354492 |
| 3 | 5 | 10 | 50 |
| 4 | 1 | 10 | 10 |
+--------+----------+------------+--------------------+
4. 删除多余空格
Trim()函数
可去掉串左右两边的空格;RTrim()函数
可去掉值右边的空格;LTrim()函数
可去掉值左边的空格。
mysql> SELECT Concat(LTrim(Stu_Name), '[', RTrim(Class_id), ']')
-> FROM t_stu_profile
-> ORDER BY Class_id DESC;
+----------------------------------------------------+
| Concat(LTrim(Stu_Name), '[', RTrim(Class_id), ']') |
+----------------------------------------------------+
| 赵七[0615] |
| test[0615] |
| 王五[0614] |
| 张北[0613] |
| test [0612] |
| 李西[0612] |
| 郭东[0611] |
| 钱南[0611] |
+----------------------------------------------------+