1.计算字段
存储在数据库中的数据一般不是应用程序所需要的格式。
下面举几个例子:
- 需要显示公司名,同时还需要显示公司的地址,但这两个信息存储在不同的表列中
- 城市、州和邮政编码存储在不同的列中,但邮件标签打印程序需要把它们作为一个有恰当格式的字段检索出来。
- 列数据是大小写混合的,但报表程序需要把所有数据按大写表示出来。
- 物品订单表存储物品的价格和数量,不存储每个物品的总价格。但为打印发票,需要物品的总价格。
- 需要根据表数据进行诸如总数、平均数的计算
在上述每个例子中,存储在表中的数据都不是应用程序所需要的。
我们需要直接从数据库中检索出转换、计算或格式化的数据,而不是检索出数据,然后再在客户端应用程序中重新格式化。
这就是计算字段可以派上用场的地方了。
字段(field)
基本上与列(column)的意思相同,经常互换使用,不过数据库列一般称为列,而字段这个术语通常在计算字段这种场合下使用。
2.拼接字段
为了说明如何使用计算字段,我们来举一个简单例子,创建由两列组成的标题。
Vendors 表包含供应商名和地址信息。
假如要生成一个供应商报表,需要在格式化的名称中列出供应商的位置。
拼接(concatenate)
将值联结在一起(将一个值附加到另一个值)构成单个值。
解决方法是把两个列拼接起来。
在SQL中的SELECT语句中,可使用一个特殊的操作符来拼接两个列。
根据你所使用的DBMS,此操作符可用加号(+)或两个竖杠(||)表示。
在MySQL和MariaDB中,必须使用特殊的函数。
使用加号例子(多数DBMS使用这种语法)
SELECT vend_name + '('+vend_country+')'
FROM Vendors
ORDER BY vend_name;
使用||语法
SELECT vend_name || '('|| vend_country ||')'
FROM Vendors
ORDER BY vend_name;
使用MySQL或MariaDB时需要使用的语句:
SELECT Concat(vend_name,'(',vend_country,')')
FROM Vendors
ORDER BY vend_name;
"SELECT CONCAT(`主流派`,`次流派`,`其他流派`)
FROM blockbusters
ORDER BY ID"
格式化
正确返回格式化的数据可以使用SQL的RTRIM()函数来完成
说明:TRIM函数
大多数DBMS都支持
RTRIM() --去掉字符串右边的空格
LTRIM() --去掉字符串左边的空格
TRIM() --去掉字符串两边的空格
使用别名
从前面的输出可以看到,SELECT语句可以很好地拼接地址字段。
但是,这个新计算列的名字是什么呢?实际上它没有名字,它只是一个值。
如果仅在SQL查询工具中查看一下结果,这样没有什么不好。
但是,一个未命名的列不能用于客户端应用中,因为客户端没有办法引用它。
为了解决这个问题,SQL支持列别名。
别名(alias)是一个字段或值的替换名。
别名用AS关键字赋予
SELECT RTRIM(vend_name)+'('+RTRIM(vend_country)+')'
AS vend_title
FROM Vendors
ORDER BY vend_name;
从输出可以看到,结果与以前的相同,但现在列名为vend_titele,任何客户端应用都可以按名称引用这个列,就像它是一个实际的表列一样。
说明:AS通常可选
在很多DBMS中,AS关键字是可选的,不过最好使用它
提示:别名的其他用途 别名还有其他用途。常见的用途包括在实际的表列名包含不合法的字符时重新命名它,在原来的名字含混或容易误解时扩充它
3.执行算术计算
计算字段的另一常见用途是对检索出的数据进行算术计算。
举个例子,Orders表包含收到的所有订单,OrderItems表包含每个订单中的各项物品。
SELECT prod_id,quantity,item_price
FROM OrderItems
WHERE order_num = 20008
SQL算术操作符
操作符 | 说明 |
+ | 加 |
– | 减 |
* | 乘 |
/ | 除 |
item_price 列包含订单中每项物品的单价。如下汇总物品的价格(单价乘以订购数量)
SELECT prod_id,
quantity,
item_price,
quantity*item_prices AS expanded_price
FROM OrderItems
WHERE order_num = 20008