前提要述:参考书籍《MySQL必知必会》
9.1 计算字段
存储在数据库表中的数据一般不是应用程序所需要的格式。比如:
- 如果想要在一个字段中既显示公司名,又显示公式的地址,但这两个信息一般包含在不同的表列中。
- 城市、州和邮政编码存储在不同的列中,但邮件标签打印程序却需要把它们作为一个恰当格式的字段检索出来。
- 列数据是大小写混合的,但报表程序需要把所有数据按大写表示出来。
在上面举的例子中,存储在表中的数据都不是应用程序所需要的。我们需要直接数据库中检索出转换、计算或格式化过的数据;而不是检索出数据,然后在客户机应用程序或报告程序中重新格式化。
所以就需要计算字段。计算字段并不实际存储于数据库表中,而是运行时在SELECT语句内创建的。
这里的字段(field)基本上跟列(column)的意思相同,经常互换使用,不过数据库列一般称为列,而术语字段通常用在计算字段的连接上。
可在SQL语句内完成的许多转换和格式化工作都可以直接在客户机应用程序内完成。但是一般来说,在数据库服务器上完成这些操作比在客户机中完成要快得多,因为DBMS是设计来快速地完成这种处理的。
9.1.1 计算字段的使用
举一个创建由两列组成的标题的简单例子。
vendors表包含供应商名和位置信息。假如要生成一个供应商报表,需要在供应商的名字中按照name(location)这样的格式列出供应商的位置。
此报表需要单个值,而表中数据存储在两个列vend_name和vend_country中。此外,需要用括号将vend_country括起来,这些东西都没有明确存储在数据库表中。来看看如何用SELECT来编写这样的格式。
拼接(concatenate)将值联结到一起构成单个值。
解决的方法就是将两个列拼接起来。在MySQL的SELECT语句中,可使用CONCAT()函数来拼接两个列。
多数DBMS使用+或者||来实现拼接,而MySQL则使用Concat()函数来实现。当把SQL语句转换成MySQL语句时一定要把这个区别铭记在心。
结果:
SELECT CONCAT(vend_name, '(', vend_country, ')')
FROM vendors
ORDER BY vend_name;
输出:
+-------------------------------------------+
| CONCAT(vend_name, '(', vend_country, ')') |
+-------------------------------------------+
| ACME(USA) |
| Anvils R Us(USA) |
| Jet Set(England) |
| LT Supplies(USA) |
+-------------------------------------------+
4 rows in set (0.06 sec)
解释:
- CONCAT()拼接串),即把多个串连接起来形成一个较长的串。CONCAT()需要一个或多个指定的串,各个串之间用逗号分隔。(关于更多函数的使用后面会讲)
- 上面的SELECT语句连接以下4个元素:
- 存储在vend_name列中的名字;
- 包括一个空格和一个左圆括号的串;
- 存储在vend_country列中的国家;
- 包括一个右圆括号的串。
9.1.2 使用别名
你拿上面那条语句去执行,会发现新计算出的列名,列名好长而且列名的意义不能明确看出。实际上它是没有名称,它只是一个值。如果仅在SQL查询工具中查看一下结果,这样没什么不好。但是,一个未命名的列不能用于客户机应用中,因为客户机没有办法引用它。这时候SQL就引出别名。
别名(alias)是一个字段或值的替换名。别名用AS关键字赋予。
使用别名修改上面的SQL语句
SELECT CONCAT(vend_name, '(', vend_country, ')')
AS vend_title
FROM vendors
ORDER BY ve