什么是计算字段

很多时候,我们所需要的并不直接是表中的数据

例如,表中存储着每种物品的价格和数量,但是实际需要的是每种物品的总价格

诚然,你可以新建一个字段(列)保存总价,每次手动计算保存,但是很明显有更好的方法

那就是在输出的时候虚拟出一个总价字段,值是价格乘以数量,这就是计算字段

字段(field)

基本上与列(column)的意思相同,经常互换使用,不过数据库列一般称为列,而字段这个术语通常在计算字段这种场合下使用

需要注意的是,只有数据库知道SELECT语句中哪些列是实际的表列,哪些是虚拟的计算字段。从客户端(如应用程序)来看,计算字段与其他列是一模一样的

当然,你也可以在客户端服务器上计算总价,但是在数据库服务器上完成这些工作一般要快得多

拼接字段

Vendors 表包含供应商名(vend_name)地址信息(vend_country),现在需要做一个报表,在一列中返回这两个信息,并且要把地址用括号括起来

解决方法是把两个列拼接起来,在 SQL Server 中,应该使用操作符加号(+),在 DB2OraclePostgreSQLSQLite 中,应该使用两个竖杠(||),而在 MySQLMariaDB 中,必须使用函数Concat()

1
2
3
SELECT Concat(vend_name ,'(' , vend_country , ')')
FROM Vendors
ORDER BY vend_name ;

使用别名

从前面的输出可以看见,SELECT语句可以很好地拼接字段,但是这个新列的名字是什么呢?实际上并没有名字,它只是一个值。所以我们现在需要为它指定别名(alias),这需要用到 AS 关键字

1
2
3
SELECT Concat(vend_name ,'(' , vend_country , ')') AS vend_title
FROM Vendors
ORDER BY vend_name ;

这样,客户端就可以直接引用 vend_title 这个名字,就像一个实际的表列一样

说明:AS 通常可选

在很多 DBMS 中,AS 关键字是可选的,不过最好使用它,这被视为一条最佳实践

提示:别名的其他用途

别名还有其他用途,常见的用途包括在实践的表列名包含不合法的字符(如空格)时重新命名它,在原来的名字含混或容易误解时扩充它

注意:别名

别名可以是一个单词,也可以是一个字符串。如果是后者,字符串应该扩在引号中 。当你去别名的时候,不应该使用表中实际的列名 ,虽然这样也合法,但是许多 DBMS 实现不支持,可能会产生模糊的错误信息

说明:导出列

别名有时候也会称为导出列(derived column),不管怎么叫,它们所代表的是相同的东西

执行算术计算

计算字段的另一常见用途是对检索出的数据进行算术计算

例如, Orders 表包含收到的所有订单,OrderItems 表包含每个订单中的各项物品,下面的语句检索订单号 20008 中的所有物品

1
2
3
SELECT prod_id , quantity , item_price
FROM OrderItems
WHERE order_num = 20008;

表中包含货物的数量和单价,我们可以利用公式算出总价

1
2
3
SELECT prod_id , quantity , item_price , quantity * item_price AS expanded_price
FROM OrderItems
WHERE order_num = 20008;

和大多数编程语言一样,SQL 支持加减乘除和括号