_7_ SQL 创建计算字段
本文DEMO
https://gitee.com/changsanjiang/SQLDemo/tree/master
我们接下来学习什么是计算字段, 如何创建, 以及如何使用别名引用它们.
计算字段
存储在数据库表中的数据我们一般不是应用程序所需要的格式, 如:
- 需要显示公司名, 同时显示公司的地址, 但这两个信息存储在不同的列中.
- 城市, 州和邮政编码存储在不同的列中, 但邮件标签打印程序需要把它们作为一个有恰当格式的字段检索出来.
- 列数据是大小写混合的, 但报表程序需要把所有的数据按大写表示出来.
- 物品订单表存储物品的价格和数量, 不存储每个物品的总价格(用价格乘以数量). 但为打印发票, 需要物品的总价格.
- 需要根据表数据进行诸如总数, 平均数的计算.
上述例子中, 存储在表中的数据都不是应用程序所需要的. 我们需要直接从数据库中检索出, 转换, 计算或格式化过的数据, 而不是在客户端重新格式化.
这就是计算字段
可以派上用场的地方了. 与前面学习介绍的列有所不同, 计算字段并不实际存储于数据库表中. 计算字段是运行时在SELECT语句内创建的.
**字段(field)**
基本上与列(column)的意思相同, 经常互换使用, 不过数据库`列`一般称为列, 而术语`字段`通常与计算字段一起使用.
从客户端来看, 计算字段的数据与其他列的数据返回方式相同, 但只有数据库知道SELECT语句中哪些列是实际的表列, 哪些列是计算字段.
**提示: 客户端与服务器的格式**
在SQL语句内可完成的许多转换和格式化工作都可以直接在客户端应用程序中完成.
但一般来说, 在数据库服务器上完成这些操作比在客户端中完成要快得多.
拼接字段
拼接: 将值联合到一起(将一个值附加到另一个值)构成单个值.
在SQL中的SELECT语句中, 可使用一个特殊的操作符来拼接两个列. 根据你所使用的DBMS, 此操作符可用+
或||
表示. 在MySQL和MaraDB中, 必须使用特殊的函数.
**说明: 是`+`还是`||`
Access 和 SQL Server 使用`+`号. `DB2`, `Oracle`, `PostgreSQL`, `SQLite`和`Open Office Base`使用`||`. 详细请参阅具体文档.
输入:
SELECT vend_name, vend_country, vend_name || '(' || vend_country || ')'
FROM Vendors
OFRDER BY vend_name;
输出:
image.png分析:
上面SELECT语句拼接以下元素:
- 存储在vend_name列中的名字
- 包含一个空格和一个左圆括号的字符串
- 存储在vend_country列中的国家
- 包含一个右圆括号的字符串
使用别名
别名是一个字段或值的替换名. 别名用 AS 关键字赋予.
输入:
SELECT vend_name || ' (' || vend_country || ')' as vend_title
FROM Vendors
ORDER BY vend_name;
输出:
image.png分析:
SELECT语句中加入了 AS vend_title. 它指示SQL创建一个包含指定计算结果的名为vend_title的计算字段. 从输出可以看出, 结果与以前相同. 但列名为vend_title. 任何客户端都可以引用, 就像他是一个实际的表列一样.
**说明: AS 通常可选**
在很多DBM中, AS关键字是可选的, 不过最好使用它, 这被视为一条最佳实践.
**提示: 别名的其他用途**
别名还有其他用途. 常见的用途包括在实际的表列名包含不合法的字符(如空格)时重新命名它, 在原来的名字含混或容易误解时扩充它.
**注意: 别名**
别名的单词既可以是一个单词, 也可以是一个字符串. 如果是后者, 字符串应该括在引号中.
虽然这种做法是合法的, 但不建议这么去做.
多单词的名字可读性高, 不过会给客户端应用带来各种问题(通常列都是单个单词....).
因此别名最常见的使用时将多个单词的列重命名为一个单词的名字.
**说明: 导出列**
别名有时也称为导出列(derived column), 不管怎么叫, 他们所代表的是相同的东西.
执行算数计算
计算字段的另一个常见用途是对检索出的数据进行算数运算. 举个例子, Orders表包含收到的所有订单, OrderItems表包含每个订单中的各项物品. 下面的SQL语句检索订单号20008中的所有物品:
输入:
SELECT prod_id, quantity, item_price
FROM OrderItems
WHERE order_num = 20008;
输出:
image.png检索结果中, item_price 列包含订单中每项物品的单价. 我们来汇总一下这些物品的总价(item_price * quantity):
输入:
SELECT order_num, prod_id, quantity, item_price, item_price * quantity AS expended_price
FROM OrderItems
WHERE order_num = 20008;
输出:
image.png分析:
输出中显示的expended_price
列是一个计算字段, 此计算为 item_price * quantity. 客户端应用现在可以使用这个新计算列, 就像使用其他列一样.
SQL支持的基本算数操作符为 + - * /
, 即加减乘除. 此外, 圆括号可用来调整优先级.
**提示: 如何测试计算**
SELECT 语句为测试, 检验函数和计算提供了很好的方法.
虽然SELECT通常用于从表中检索数据, 但是省略了FROM子句后就成了简单地访问和处理表达式.
例如`SELECT 3 * 2;`将返回6, `SELECT TRIM(' adc ');`将返回 adc;
现在你明白了, 可以根据需要使用SELECT语句进行检验.