当前位置:网站首页>SQL必需掌握的100个重要知识点:创建计算字段
SQL必需掌握的100个重要知识点:创建计算字段
2022-06-27 19:10:00 【谷哥学术】
7.1 计算字段
存储在数据库表中的数据一般不是应用程序所需要的格式,下面举几个
例子。
需要显示公司名,同时还需要显示公司的地址,但这两个信息存储在
不同的表列中。
城市、州和邮政编码存储在不同的列中(应该这样),但邮件标签打
印程序需要把它们作为一个有恰当格式的字段检索出来。
列数据是大小写混合的,但报表程序需要把所有数据按大写表示出来。
物品订单表存储物品的价格和数量,不存储每个物品的总价格(用价
格乘以数量即可)。但为打印发票,需要物品的总价格。
需要根据表数据进行诸如总数、平均数的计算。
在上述每个例子中,存储在表中的数据都不是应用程序所需要的。我们
需要直接从数据库中检索出转换、计算或格式化过的数据,而不是检索
出数据,然后再在客户端应用程序中重新格式化。
这就是计算字段可以派上用场的地方了。与前几课介绍的列不同,计算
字段并不实际存在于数据库表中。计算字段是运行时在 SELECT 语句内
创建的。
字段(field)
基本上与列(column)的意思相同,经常互换使用,不过数据库列一
般称为列,而字段这个术语通常在计算字段这种场合下使用。
需要特别注意,只有数据库知道 SELECT 语句中哪些列是实际的表列,
哪些列是计算字段。从客户端(如应用程序)来看,计算字段的数据与
其他列的数据的返回方式相同。
提示:客户端与服务器的格式
在 SQL 语句内可完成的许多转换和格式化工作都可以直接在客户端
应用程序内完成。但一般来说,在数据库服务器上完成这些操作比在
客户端中完成要快得多。
7.2 拼接字段
为了说明如何使用计算字段,我们来举一个简单例子,创建由两列组成
的标题。
Vendors 表包含供应商名和地址信息。假如要生成一个供应商报表,需
要在格式化的名称(位置)中列出供应商的位置。
此报表需要一个值,而表中数据存储在两个列 vend_name 和 vend_country
中。此外,需要用括号将 vend_country 括起来,这些东西都没有存储
在数据库表中。这个返回供应商名称和地址的 SELECT 语句很简单,但
我们是如何创建这个组合值的呢?
拼接(concatenate)
将值联结到一起(将一个值附加到另一个值)构成单个值。
解决办法是把两个列拼接起来。在 SQL中的 SELECT 语句中,可使用一
个特殊的操作符来拼接两个列。根据你所使用的 DBMS,此操作符可用
加号( + )或两个竖杠( || )表示。在 MySQL和 MariaDB中,必须使用
特殊的函数。
说明:是 + 还是 || ?
SQL Server使用 + 号。DB2、Oracle、PostgreSQL和 SQLite使用 || 。详
细请参阅具体的 DBMS文档。
下面是使用加号的例子(多数 DBMS使用这种语法):
输入▼
SELECT vend_name + '(' + vend_country + ')'
FROM Vendors
ORDER BY vend_name;
输出▼
-----------------------------------------------------------
Bear Emporium (USA )
Bears R Us (USA )
Doll House Inc. (USA )
Fun and Games (England )
Furball Inc. (USA )
Jouets et ours (France )
下面是相同的语句,但使用的是 || 语法:
输入▼
SELECT vend_name || '(' || vend_country || ')'
FROM Vendors
ORDER BY vend_name;
输出▼
-----------------------------------------------------------
Bear Emporium (USA )
Bears R Us (USA )
Doll House Inc. (USA )
Fun and Games (England )
Furball Inc. (USA )
Jouets et ours (France )
下面是使用 MySQL或 MariaDB时需要使用的语句:
输入▼
SELECT Concat(vend_name, ' (', vend_country, ')')
FROM Vendors
ORDER BY vend_name;
分析▼
上面两个 SELECT 语句拼接以下元素:
存储在 vend_name 列中的名字;
包含一个空格和一个左圆括号的字符串;
存储在 vend_country 列中的国家;
包含一个右圆括号的字符串。
从上述输出中可以看到, SELECT 语句返回包含上述四个元素的一个列
(计算字段)。
再看看上述 SELECT 语句返回的输出。结合成一个计算字段的两个列用
空格填充。许多数据库(不是所有)保存填充为列宽的文本值,而实际
上你要的结果不需要这些空格。为正确返回格式化的数据,必须去掉这
些空格。这可以使用 SQL的 RTRIM() 函数来完成,如下所示:
输入▼
SELECT RTRIM(vend_name) + ' (' + RTRIM(vend_country) + ')'
FROM Vendors
ORDER BY vend_name;
输出▼
-----------------------------------------------------------
Bear Emporium (USA)
Bears R Us (USA)
Doll House Inc. (USA)
Fun and Games (England)
Furball Inc. (USA)
Jouets et ours (France)
下面是相同的语句,但使用的是 || :
输入▼
SELECT RTRIM(vend_name) || ' (' || RTRIM(vend_country) || ')'
FROM Vendors
ORDER BY vend_name;
输出▼
-----------------------------------------------------------
Bear Emporium (USA)
Bears R Us (USA)
Doll House Inc. (USA)
Fun and Games (England)
Furball Inc. (USA)
Jouets et ours (France)
分析▼
RTRIM() 函数去掉值右边的所有空格。通过使用 RTRIM() ,各个列都进
行了整理。
说明:TRIM 函数
大多数 DBMS都支持 RTRIM() (正如刚才所见,它去掉字符串右边的
空格)、 LTRIM() (去掉字符串左边的空格)以及 TRIM() (去掉字符
串左右两边的空格)。
使用别名
从前面的输出可以看到, SELECT 语句可以很好地拼接地址字段。但是,
这个新计算列的名字是什么呢?实际上它没有名字,它只是一个值。如
果仅在 SQL查询工具中查看一下结果,这样没有什么不好。但是,一个
未命名的列不能用于客户端应用中,因为客户端没有办法引用它。
为了解决这个问题,SQL 支持列别名。别名(alias)是一个字段或值的
替换名。别名用 AS 关键字赋予。请看下面的 SELECT 语句:
输入▼
SELECT RTRIM(vend_name) + ' (' + RTRIM(vend_country) + ')'
AS vend_title
FROM Vendors
ORDER BY vend_name;
输出▼
vend_title
-----------------------------------------------------------
Bear Emporium (USA)
Bears R Us (USA)
Doll House Inc. (USA)
Fun and Games (England)
Furball Inc. (USA)
Jouets et ours (France)
下面是相同的语句,但使用的是 || 语法:
输入▼
SELECT RTRIM(vend_name) || ' (' || RTRIM(vend_country) || ')'
AS vend_title
FROM Vendors
ORDER BY vend_name;
下面是 MySQL和 MariaDB中使用的语句:
输入▼
SELECT Concat(RTrim(vend_name), ' (',
RTrim(vend_country), ')') AS vend_title
FROM Vendors
ORDER BY vend_name;
分析▼
SELECT 语句本身与以前使用的相同,只不过这里的计算字段之后跟了文
本 AS vend_title 。它指示 SQL 创建一个包含指定计算结果的名为
vend_title 的计算字段。从输出可以看到,结果与以前的相同,但现
在列名为 vend_title ,任何客户端应用都可以按名称引用这个列,就像
它是一个实际的表列一样。
说明:AS 通常可选
在很多 DBMS中, AS 关键字是可选的,不过最好使用它,这被视为一
条最佳实践。
提示:别名的其他用途
别名还有其他用途。常见的用途包括在实际的表列名包含不合法的
字符(如空格)时重新命名它,在原来的名字含混或容易误解时扩
充它。
注意:别名
别名的名字既可以是一个单词,也可以是一个字符串。如果是后者,
字符串应该括在引号中。虽然这种做法是合法的,但不建议这么去做。
多单词的名字可读性高,不过会给客户端应用带来各种问题。因此,
别名最常见的使用是将多个单词的列名重命名为一个单词的名字。
说明:导出列
别名有时也称为导出列(derived column),不管怎么叫,它们所代表
的是相同的东西。
7.3 执行算术计算
计算字段的另一常见用途是对检索出的数据进行算术计算。举个例子,
Orders 表包含收到的所有订单, OrderItems 表包含每个订单中的各项
物品。下面的 SQL语句检索订单号 20008 中的所有物品:
输入▼
SELECT prod_id, quantity, item_price
FROM OrderItems
WHERE order_num = 20008;
输出▼
prod_id quantity item_price
---------- ----------- ---------------------
RGAN01 5 4.9900
BR03 5 11.9900
BNBG01 10 3.4900
BNBG02 10 3.4900
BNBG03 10 3.4900
item_price 列包含订单中每项物品的单价。如下汇总物品的价格(单价乘以订购数量):
输入▼
SELECT prod_id,
quantity,
item_price,
quantity*item_price AS expanded_price
FROM OrderItems
WHERE order_num = 20008;
输出▼
prod_id quantity item_price expanded_price
---------- ----------- ------------ -----------------
RGAN01 5 4.9900 24.9500
BR03 5 11.9900 59.9500
BNBG01 10 3.4900 34.9000
BNBG02 10 3.4900 34.9000
BNBG03 10 3.4900 34.9000
分析▼
输出中显示的 expanded_price 列是一个计算字段,此计算为 quantity*
item_price 。客户端应用现在可以使用这个新计算列,就像使用其他列
一样。
SQL 支持表 7-1 中列出的基本算术操作符。此外,圆括号可用来区分优
先顺序。关于优先顺序的介绍,请参阅第 5课。
表7-1 SQL算术操作符
操 作 符 说 明
+ 加
- 减
* 乘
/ 除
提示:如何测试计算
SELECT 语句为测试、检验函数和计算提供了很好的方法。虽然 SELECT
通常用于从表中检索数据,但是省略了 FROM 子句后就是简单地访问和
处理表达式,例如 SELECT 3 * 2; 将返回 6 , SELECT Trim(' abc ');
将返回 abc , SELECT Curdate(); 使用 Curdate() 函数返回当前日期
和时间。现在你明白了,可以根据需要使用 SELECT 语句进行检验。
边栏推荐
- 非常全面的DolphinScheduler(海豚调度)安装使用文档
- Scrum和看板的区别
- White whoring red team goby & POC, how do you call white whoring?
- Navicat premium connection problem --- host 'XXXXXXXX' is not allowed to connect to this MySQL server
- SQL Server for循环用法
- 基于 TensorRT 的模型推理加速
- 通过CE修改器修改大型网络游戏
- Can Oracle's CTAs bring constraints and other attributes to the new table?
- Prospects for enterprise digitalization (38/100)
- eval函数,全局、本地变量
猜你喜欢

308. 2D area and retrieval - variable segment tree / hash

Wechat applet based service management system for college party members' Home System applet graduation design, Party members, activists, learning, punch in, forum

SQL audit platform permission module introduction and account creation tutorial

Covering access to 2w+ traffic monitoring equipment, EMQ creates a new digital engine for all elements of traffic in Shenzhen

Cloud native Security Guide: learn kubernetes attack and defense from scratch

NVIDIA three piece environment configuration

Flood fighting and disaster relief, overcoming difficulties, and City United premium products rushed to the aid of Yingde to donate loving materials

Animal breeding production virtual simulation teaching system | Sinovel interactive

抖音的兴趣电商已经碰到流量天花板?

DO280OpenShift访问控制--security policy和章节实验
随机推荐
展现强劲产品综合实力 ,2022 款林肯飞行家Aviator西南首秀
Kirin V10 installation font
Oracle architecture summary
体验Navicat Premium 16,无限重置试用14天方法(附源码)
Original translation | comparison of machine learning model service tools: kserve, Seldon core and bentoml
GFS distributed file system
通过CE修改器修改大型网络游戏
Tutorial | fNIRS data processing toolkit homer2 download and installation
大促场景下,如何做好网关高可用防护
Full record of 2022 open source moment at Huawei partners and Developers Conference
本周二晚19:00战码先锋第8期直播丨如何多方位参与OpenHarmony开源贡献
Shell command used in actual work - sed
Here are 12 commonly used function formulas for you. All used ones are good
数据平台调度升级改造 | 从Azkaban 平滑过度到Apache DolphinScheduler 的操作实践
Runmaide medical opened the offering: without the participation of cornerstone investors, the amount of loss doubled
爱数课实验 | 第七期-基于随机森林的金融危机分析
Save method of JPA stepping pit series
Cerebral cortex: predicting children's mathematical skills from task state and resting state brain function connections
释放开源数据库创新力量 | 【甘肃】openGauss Meetup圆满结束
Show the comprehensive strength of strong products, and make the first show of 2022 Lincoln aviator in Southwest China