第7课 SQL入门之创建计算字段

文章目录

  • 7.1 计算字段
  • 7.2 拼接字段
    • 使用别名
  • 7.3 执行算术计算

这一课介绍什么是计算字段,如何创建计算字段,以及如何从应用程序中使用别名引用它们。

7.1 计算字段

存储在数据库表中的数据一般不是应用程序所需要的格式,下面举几个例子。

  • 需要显示公司名,同时还需要显示公司的地址,但这两个信息存储在不同的表列中。
  • 城市、州和邮政编码存储在不同的列中(应该这样),但邮件标签打印程序需要把它们作为一个有恰当格式的字段检索出来。
  • 列数据是大小写混合的,但报表程序需要把所有数据按大写表示出来。
  • 物品订单表存储物品的价格和数量,不存储每个物品的总价格(用价格乘以数量即可)。但为打印发票,需要物品的总价格。
  • 需要根据表数据进行诸如总数、平均数的计算。
    在上述每个例子中,存储在表中的数据都不是应用程序所需要的。我们需要直接从数据库中检索出转换、计算或格式化过的数据,而不是检索出数据,然后再在客户端应用程序中重新格式化。
    这就是计算字段可以派上用场的地方了。与前几课介绍的列不同,计算字段并不实际存在于数据库表中。计算字段是运行时在SELECT语句内创建的。

字段(field)

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

需要特别注意,只有数据库知道SELECT语句中哪些列是实际的表列,哪些列是计算字段。从客户端(如应用程序)来看,计算字段的数据与其他列的数据的返回方式相同。

提示:客户端与服务器的格式

在SQL语句内可完成的许多转换和格式化工作都可以直接在客户端应用程序内完成。但一般来说,在数据库服务器上完成这些操作比在客户端中完成要快得多。

7.2 拼接字段

为了说明如何使用计算字段,我们来举一个简单例子,创建由两列组成的标题。
Vendors表包含供应商名和地址信息。假如要生成一个供应商报表,需要在格式化的名称(位置)中列出供应商的位置。
此报表需要一个值,而表中数据存储在两个列vend_name和vend_country中。此外,需要用括号将vend_country括起来,这些东西都没有存储在数据库表中。这个返回供应商名称和地址的SELECT语句很简单,但我们是如何创建这个组合值的呢?

拼接(concatenate)

将值联结到一起(将一个值附加到另一个值)构成单个值。

解决办法是把两个列拼接起来。在SQL中的SELECT语句中,可使用一个特殊的操作符来拼接两个列。根据你所使用的DBMS,此操作符可用加号(+)或两个竖杠(||)表示。在MySQL和MariaDB中,必须使用特殊的函数。

说明:是+还是||?

Access和SQL Server使用+号。DB2、Oracle、PostgreSQL、SQLite和Open Office
Base使用||。详细请参阅具体的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      )

分析▼
上面两个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(vend_name, ' (', 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_idquantityitem_price
RGAN0154.9900
BR03511.9900
BNBG01103.4900
BNBG02103.4900
BNBG03103.4900

item_price列包含订单中每项物品的单价。如下汇总物品的价格(单价乘以订购数量):
输入▼

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

输出▼

prod_idquantityitem_priceexpanded_price
RGAN0154.990024.9500
BR03511.990059.9500
BNBG01103.490034.9000
BNBG02103.490034.9000
BNBG03103.490034.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 Now();使用Now()函数返回当前日期和时间。现在你明白了,可以根据需要使用SELECT语句进行检验。


上一篇:第6课 SQL入门之用通配符进行过滤

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/207517.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

前端Excel导出实用方案(完整源码,可直接应用)

目录 前言: 技术选型: 主要功能点: 核心代码: 完整代码: 开发文档 前言: 在前后端分离开发为主流的时代,很多时候,excel导出已不再由后端主导,而是把导出的操作移…

关于锁的粒度问题——面试

锁的粒度划分主要有三种:表级锁、页级锁和行锁 1.表级锁: 对整张表加锁,粒度最大,加锁的并发度最低,会导致其他事务无法访问该表,只有当前事务提交或者回滚后才能释放锁。表级锁适用于对表进行全表操作的场…

DeepIn,UOS统信专业版安装运行Java,JavaFx程序

因为要适配国产统信UOS系统,要求JavaFx程序能简便双击运行,由于网上UOS开发相关文章少,多数文章没用,因此花了不少时间,踩了不少坑,下面记录一些遇到的问题,我的程序环境是jdk1.8,为…

【K8s】Kubernetes CRD 介绍(控制器)

文章目录 CRD 概述1. 操作CRD1.1 创建 CRD1.2 操作 CRD 2. 其他笔记2.1 Kubectl 发现机制2.2 校验 CR2.3 简称和属性 3. 架构设计3.1 控制器概览 参考 CRD 概述 CR(Custom Resource)其实就是在 Kubernetes 中定义一个自己的资源类型,是一个具…

如何为 3D 模型制作纹理的最佳方法

在线工具推荐: 3D数字孪生场景编辑器 - GLTF/GLB材质纹理编辑器 - 3D模型在线转换 - Three.js AI自动纹理开发包 - YOLO 虚幻合成数据生成器 - 三维模型预览图生成器 - 3D模型语义搜索引擎 您可以通过不同的方式为 3D 模型创建 3D 纹理。下面我们将介绍为 3D …

《opencv实用探索·十四》VideoCapture播放视频和视像头调用

1、VideoCapture播放视频 #include <opencv2/opencv.hpp> #include <iostream>using namespace std; using namespace cv;int main() {// 定义相关VideoCapture对象VideoCapture capture;// 打开视频文件capture.open("1.avi");// 判断视频流读取是否正…

Python os模块及用法

os 模块代表了程序所在的操作系统&#xff0c;主要用于获取程序运行所在操作系统的相关信息。 在 Python 的交互式解释器中先导入 os 模块&#xff0c;然后输入 os.__all__ 命令&#xff08;__all__ 变量代表了该模块开放的公开接口&#xff09;&#xff0c;即可看到该模块所包…

Linux DataEase数据可视化分析工具本地部署与远程访问

文章目录 前言1. 安装DataEase2. 本地访问测试3. 安装 cpolar内网穿透软件4. 配置DataEase公网访问地址5. 公网远程访问Data Ease6. 固定Data Ease公网地址 前言 DataEase 是开源的数据可视化分析工具&#xff0c;帮助用户快速分析数据并洞察业务趋势&#xff0c;从而实现业务…

ExecutorService介绍

参考&#xff1a;https://blog.csdn.net/fwt336/article/details/81530581 前言 在开发中为了提高系统的响应速度和处理能力会使用到多线程&#xff0c;但线程的创建和释放&#xff0c;需要占用不小的内存和资源。如果每次需要使用线程时&#xff0c;都new 一个Thread的话&…

【LeetCode】2723. 两个 Promise 对象相加

两个 Promise 对象相加 题目题解 题目 给定两个 promise 对象 promise1 和 promise2&#xff0c;返回一个新的 promise。promise1 和 promise2 都会被解析为一个数字。返回的 Promise 应该解析为这两个数字的和。 示例 1&#xff1a; 输入&#xff1a; promise1 new Promise…

geoserver根据属性字段值设置不同的颜色

<?xml version"1.0" encoding"UTF-8"?> <StyledLayerDescriptor xmlns"http://www.opengis.net/sld" xmlns:xlink"http://www.w3.org/1999/xlink" xmlns:ogc"http://www.opengis.net/ogc" xmlns:xsi"http:/…

中国聚羟基脂肪酸酯(PHA)市场评估与投资战略报告(2024版)

内容简介&#xff1a; PHA英文名称为 Polyhydroxyalkanoates&#xff0c;是近20多年迅速发展起来的&#xff0c;很多天然原料合成的一种聚酯。PHA是生物基生物降解材料&#xff0c;具有良好的生物相容性和可加工性。防止水汽的穿透是保鲜包装中的重要指标&#xff0c;PHA 有良…

os.walk()遍历文件夹/文件

天行健&#xff0c;君子以自强不息&#xff1b;地势坤&#xff0c;君子以厚德载物。 每个人都有惰性&#xff0c;但不断学习是好好生活的根本&#xff0c;共勉&#xff01; 文章均为学习整理笔记&#xff0c;分享记录为主&#xff0c;如有错误请指正&#xff0c;共同学习进步。…

P3 Qt 控件 —— pushButton

前言 &#x1f3ac; 个人主页&#xff1a;ChenPi &#x1f43b;推荐专栏1: 《C_ChenPi的博客-CSDN博客》✨✨✨ &#x1f525; 推荐专栏2: 《Linux C应用编程&#xff08;概念类&#xff09;_ChenPi的博客-CSDN博客》✨✨✨ &#x1f33a;本篇简介 &#xff1a;这一章我们学一…

Python evalml 库:自动化机器学习的新前景

更多资料获取 &#x1f4da; 个人网站&#xff1a;ipengtao.com 在机器学习领域&#xff0c;evalml 库崭露头角&#xff0c;为开发者提供了一个强大而高效的自动化机器学习框架。本文将深入介绍 evalml 的核心功能、使用方法以及在实际项目中的应用。通过详实的示例代码&#…

前端高频面试题大全-面试必看

内容较多&#xff0c;建议查看目录&#xff0c;方便食用 高频 React和Vue的区别 通常解法&#xff1a;vue是采用指令结合vue-loader实现构件用户界面的渐进式框架&#xff0c;React是采用JSX构件用户界面的组件化开发 详细解法&#xff1a;在渲染界面的时候DOM操作是昂贵的&…

【Linux系统编程】项目自动化构建工具make/Makefile

介绍&#xff1a; make和Makefile是用于编译和构建C/C程序的工具和文件。Makefile是一个文本文件&#xff0c;其中包含了编译和构建程序所需的规则和指令。它告诉make工具如何根据源代码文件生成可执行文件&#xff0c;里面保存的是依赖关系和依赖方法。make是一个命令行工具&a…

智汇恒星科技|控乐屋.全宅智能冠军代言来啦, 智慧家居千亿蓝海

随着5G、大数据、云计算、物联网等技术的发展&#xff0c;智能化正覆盖人们生活的方方面面&#xff0c;全屋智能的出现为“一键式”智能家居生活享受提供无限可能。近年来智能家居行业总体规模增长迅速&#xff0c;数据显示&#xff0c;2022年中国智能家居行业市场规模约为6200…

Java内部类

文章目录 什么是 Java 中的内部类&#xff1f;有哪些类型的内部类&#xff1f;匿名内部类局部内部类&#xff08;定义在方法中的类&#xff09;局部内部类静态内部类 Java 类中不仅可以定义变量和方法&#xff0c;还可以定义类&#xff0c;这样定义在类内部的类就被称为内部类。…

Java期末复习题之封装

点击返回标题->23年Java期末复习-CSDN博客 第1题. 定义一个类Person,定义name和age私有属性&#xff0c;定义有参的构造方法对name和age进行初始化。在测试类中创建该类的2个对象&#xff0c;姓名、年龄分别为lili、19和lucy、20&#xff0c;在屏幕打印出2个对象的姓名和年龄…