SQL | 计算字段

7-创建计算字段

7.1-计算字段

存储在数据库中的数据一般不是我们所需要的字段格式,

  • 需要公司名称,同时也需要公司地址,但是这两个数据存储在不同的列中。

  • 省,市,县和邮政编码存储在不同的列中,但是当我们需要发快递时,需要将他们组合在一起。

  • 某一列的数据是大小写混写的,但是偶尔我们需要全部大写输出。

  • 商品信息存储时,我们一般存储的有商品的数量,商品的总价,但是打印发票时我们需要知道商品的总价格。

  • 例如,总数,平均数的计算等等。

上述这些例子,都不是应用程序应该做的事情,只需要我们检索时,经过转换,计算过的数据即可。这就是计算字段可以派上的用场。

字段,与列是相同的概念,经常互换使用,不过数据库列一般称为列,而字段这个术语通常在计算字段这种场合下使用。

需要特别注意,只有数据库知道select语句中,哪些列是实际的数据库表列,哪些列为计算字段。但是从客户端看,计算字段和数据库表列是一样的。

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

7.2-拼接字段

例如:Vendors表包含供应商名和地址信息。假如要生成一个供应商报表,需要在格式化的名称(位置)中列出供应商的位置。

此报表需要一个值,而表中数据存储在两个列vend_name和vend_country中。此外,需要用括号将vend_country括起来,这些东西都没有存储在数据库表中。

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

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

使用加号(+)的例子:

SELECT vend_name + '(' + vend_country + ')'
FROM Vendors
ORDER BY vend_name;

使用两个竖杠(||)的例子:

SELECT vend_name || '(' || vend_country || ')'
FROM Vendors
ORDER BY vend_name;

MySQLMariaDB时需要使用的语句:

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

由结果可以知道,上述语句先取出存储在vend_name中的名称,然后取出vend_country中的国家,然后使用Concat函数进行拼接,拼接后就会输出上述结果。

注意:有些(并不是所有数据库)数据库进行拼接的时候,会输出为列宽,也就是会多很多空格,所以我们需要使用SQL的RTRIM()函数来处理多余的空格。RTRIM()函数去掉值右边的所有空格。

例如:SELECT vend_name + '(' + RTRIM(vend_country) + ')'

TRIM函数:大多数DBMS都支持RTRIM()(正如刚才所见,它去掉字符串右边的空格)、LTRIM()(去掉字符串左边的空格)以及TRIM()(去掉字符串左右两边的空格)。

7.2.1 使用别名

SQL支持列别名。别名(alias)是一个字段或值的替换名。别名用AS关键字赋予。

select Concat(vend_name,'(',vend_country,')')
as vend_title
from vendors
order vend_name;

查询到的列会将列名设置为vend_title

AS: as子句是可选的,但是如果有计算字段和拼接字段出现的时候,最好使用它,这被视为一条最佳实践。

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

别名 别名的名字既可以是一个单词,也可以是一个字符串,可读性太差,无论是取别名还是取字段名应当见名知意。如果是后者,字符串应该括在引号中。虽然这种做法是合法的,但不建议这么去做。多单词的名字可读性高,不过会给客户端应用带来各种问题。因此,别名最常见的使用是将多个单词的列名重命名为一个单词的名字。

导出列 别名有时候也被称为导出列,代表的是相同的东西。

7.3-使用算术计算

计算字段另一个用途是对检索出的字段进行算术计算。Orders表包含收到的所有订单,OrderItems表包含每个订单中的各项物品。

select prod_id,quantity,item_price
from orderitems
where order_num = 20008;

 

上述SQL语句检索订单号为20008的所有订单。

检索到的数据中,item_price为商品单价,如果想要计算每种产品的总价。

select prod_id,quantity,item_price,quantity*item_price as total
from orderitems
where order_num = 20008;

 

 

通过数量×单价=总价,就可以得到每种产品的总价值。

SQL支持的基本操作符:

如何测试计算 SELECT语句为测试、检验函数和计算提供了很好的方法。虽然SELECT通常用于从表中检索数据,但是省略了FROM子句后就是简单地访问和处理表达式,例如SELECT 3 * 2;将返回6,SELECT Trim(' abc ');将返回abc,SELECT Curdate();使用Curdate()函数返回当前日期和时间。现在你明白了,可以根据需要使用SELECT语句进行检验。

练习

  1. 别名的常见用法是在检索出的结果中重命名表的列字段(为了符合特定的报表要求或客户需求)。编写SQL语句,从Vendors表中检索vend_id、vend_name、vend_address和vend_city,将vend_name重命名为vname,将vend_city重命名为vcity,将vend_address重命名为vaddress。按供应商名称对结果进行排序(可以使用原始名称或新的名称)。

    select vend_id,vend_name as vname,vend_address as vaddress,vend_city as vcity
    from vendors
    order by vname;

     

  2. 我们的示例商店正在进行打折促销,所有产品均降价10%。编写SQL语句,从Products表中返回prod_id、prod_price和sale_price。sale_price是一个包含促销价格的计算字段。提示:可以乘以0.9,得到原价的90%(即10%的折扣)。

    select prod_id,prod_price,prod_price*0.9 as sale_price
    from products;

     

 

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

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

相关文章

MySQL 数据类型总结

整形数据类型 1字节 8bit 2^8256 MySQL 5.7 整数有个显示宽度 , 8.0 取消了 显示宽度 显示宽带为5,当insert的值不足5为,使用0 填充, create table test_1 ( c1 int(5) zerofill ); 浮点数据 定点数 位类型 BIT 日期和时间 t…

不一般的自定义时间(html+css+js)

自定义时间 写文章的因 关于要写这篇文章的原因 是记录在工作上遇到的困难需求,是希望能给大家提供一些解决问题的思路 接下来我描述这个需求的多样性,难点在哪。 勾选勾选框开始时间与结束时间默认显示昨天与今天。取消勾选框开始时间与结束时间清空。…

camera hal|如何学习一个新平台

全网最具价值的Android Camera开发学习系列资料~ 作者:8年Android Camera开发,从Camera app一直做到Hal和驱动~ 欢迎订阅,相信能扩展你的知识面,提升个人能力~ 我自己目前从事的是android camera hal 的工作,工作上接触到的芯片平台要么是高通的,要么是mtk的。 其实…

面试热题(回文链表)

给定一个链表的 头节点 head ,请判断其是否为回文链表。 如果一个链表是回文,那么链表节点序列从前往后看和从后往前看是相同的。 回文链表类似于回文串,正读倒读的顺序是一样的,那么我们怎么去判断一个链表是否是回文链表呢&…

书单背景图片素材哪里找?这个工具赶紧用起来

好的文案是很重要的,但是如何找到好的文案却是一件很困难的事情。以下是一些可以寻找好的文案的方法分析,以及如何把书单文章转到视频的操作分享。 1.书籍和杂志:阅读关于广告、营销、文案和创意的书籍和杂志可以帮助你了解不同的文案类型和风…

【创作纪念日】我的2周年创作纪念日

创作者的探索与共鸣:用文字创造无限可能 在这特别的时刻,我想对你们说几句话。首先,我衷心感谢你们对我的支持和鼓励。正是因为你们的存在和关注,我才能够坚持不懈地创作和分享。 每一次写作都是一次心灵的倾诉和思想的交流。无论…

【Linux】创建普通用户以及Linux问题解决

创建普通用户 ❓可以看到我们现在是一个root用户,并不是一个普通用户,我们要如何创建普通用户呢? adduser 你的用户名passwd 你的用户名🔥注意这里passwd设置密码的时候,你输入密码电脑不会显示 删除普通用户 userd…

即将发布的 Kibana 版本可运行 Node.js 18

作者:Thomas Watson Kibana 构建在 Node.js 框架之上。 为了确保每个 Kibana 版本的稳定性和使用寿命,我们始终将捆绑的 Node.js 二进制文件保持为最新的最新长期支持 (LTS) 版本。 当 Node.js 版本 18 升级到 LTS 时,我们开始将 Kibana 升级…

uniapp开发小程序-有分类和列表时,进入页面默认选中第一个分类

一、效果: 如下图所示,进入该页面后,默认选中第一个分类,以及第一个分类下的列表数据。 二、代码实现: 关键代码: 进入页面时,默认调用分类的接口,在分类接口里做判断&#xff…

O2OA (翱途) o2server 调用 webServices jaxws 样例

本文分两部分介绍如何在 o2server 服务器中调用 webServices(jaxws)服务. 第一部分介绍如何在tomcat上搭建一个webServices(jaxws)服务. 第二部分介绍如何在o2server服务器上来调用上面创建的服务. O2OA (翱途)官网:http://www.o2oa.net 一、在tomcat上搭建一个…

TransNetR:用于多中心分布外测试的息肉分割的基于transformer的残差网络

TransNetR Transformer-based Residual Network for Polyp Segmentation with Multi-Center Out-of-Distribution Testing 阅读笔记 1. 论文名称 《TransNetR Transformer-based Residual Network for Polyp Segmentation with Multi-Center Out-of-Distribution Testing》 用…

考虑分布式电源的配电网无功优化问题研究(Matlab代码实现)

💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…