MySQL必知必会——第十章创建计算字段

2023-11-02

创建计算字段

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

计算字段

存储在数据库表中的数据一般不是应用程序所需要的格式。例如,想在一个字段中显示公司名和地址,但公司名和地址在不同的列中等等。

我们需要直接从数据库中检索出转换、计算或格式化过的数据;而不是检索出数据,再让客户机应用程序或报告程序中重新格式化。

这就需要计算字段来实现了。计算字段并不实际存在于数据库表中。它是运行时在SELECT语句内创建的。但只有数据库知道SELECT语句中哪些列是实际的表列,哪些列是计算字段。从客户机角度看,它们没有差别。

  • 字段(field) 基本上与列(column)的意思相同,经常互换使用。但数据库列一般称列,而字段通常用在计算字段的连接上。

客户机与服务器格式 许多转换和格式化工作都可在SQL语句或客户机应用程序上完成,但一般SQL语句比客户机应用程序快很多,因为DBMS就是设计来快速有效地完成这种处理的。


拼接字段

vendors表包含供应商名和位置信息。假设我们要生成一个供应商报表,需要在供应商名中按name(location)的格式列出供应商位置。

这列的信息,分别储存在vend_name列和vend_country列中。此外我们还需要用括号将地址括起来。为了解决问题,我们可以把两个列拼接起来。

  • 拼接(concatenate) 将值联结到一起构成单个值。
  • MySQL的不同之处 多数DBMS使用+或者||来实现拼接,MySQL则使用Concat()函数来实现。

MySQL的SELECT语句中,可使用Concat()函数来拼接两个列:

mysql> SELECT Concat(vend_name, ' (', vend_country, ')')
    -> FROM vendors
    -> ORDER BY vend_name;
+--------------------------------------------+
| Concat(vend_name, ' (', vend_country, ')') |
+--------------------------------------------+
| ACME (USA)                                 |
| Anvils R Us (USA)                          |
| Furball Inc. (USA)                         |
| Jet Set (England)                          |
| Jouets Et Ours (France)                    |
| LT Supplies (USA)                          |
+--------------------------------------------+
6 rows in set (0.03 sec)

Concat()拼接串,即把多个串连接起来形成一个较长的串。Concat()需要一个或多个指定的串,各个串之间用逗号分隔。以上语句拼接4个元素:

  1. 存储在vend_name列中的名字。
  2. 包含一个空格和一个左圆括号的串。
  3. 存储在vend_country列中的国家。
  4. 包含一个右圆括号的串。

结果返回包含以上元素的单个列值(计算字段)。

第八章(MySQL必知必会——第八章用通配符进行过滤)中提到的通过删除数据右侧多余空格来整理数据,可以使用MySQL的RTrim()函数来完成:

mysql> SELECT Concat(RTrim(vend_name), ' (', RTrim(vend_country), ')')
    -> FROM vendors
    -> ORDER BY vend_name;
+----------------------------------------------------------+
| Concat(RTrim(vend_name), ' (', RTrim(vend_country), ')') |
+----------------------------------------------------------+
| ACME (USA)                                               |
| Anvils R Us (USA)                                        |
| Furball Inc. (USA)                                       |
| Jet Set (England)                                        |
| Jouets Et Ours (France)                                  |
| LT Supplies (USA)                                        |
+----------------------------------------------------------+
6 rows in set (0.00 sec)

RTrim()函数去掉值右边的所以空格。

  • Trim函数 MySQL除了支持RTrim(),还支持LTrim()以及Trim(),去掉右、左以及两端空格。

使用别名

SELECT语句可以拼接字段。但新计算的列并没有名字,它只是一个值。未命名的列不能应用于客户机应用,因为客户机没有办法引用它。

为了解决这个问题,SQL支持列别名。列名(alias)是一个字段或值的替换名。别名用AS关键字赋予。

mysql> SELECT Concat(RTrim(vend_name), ' (', RTrim(vend_country), ')') AS vend_title
    -> FROM vendors
    -> ORDER BY vend_name;
+-------------------------+
| vend_title              |
+-------------------------+
| ACME (USA)              |
| Anvils R Us (USA)       |
| Furball Inc. (USA)      |
| Jet Set (England)       |
| Jouets Et Ours (France) |
| LT Supplies (USA)       |
+-------------------------+
6 rows in set (0.00 sec)

此语句除计算字段后跟了AS vend_title其他都与前面一致。它指示了SQL创建一个包含指定计算的名为vend_title的计算字段。任何客户机都可以通过名字来引用这个计算字段。

  • 别名的其他用途 别名还要其他用途。常见的用途包括,实际列名不合法时重新命名,原列名易混淆时扩充它,等等。
  • 导出列 别名有时也称为导出列(derived column),它们代表相同的东西。

执行算术计算

计算字段另一常用用法是,对检索出的数据进行算数运算。

例如,以下是订单号20005中的所有物品:

mysql> SELECT prod_id, quantity, item_price
    -> FROM orderitems
    -> WHERE order_num = 20005;
+---------+----------+------------+
| prod_id | quantity | item_price |
+---------+----------+------------+
| ANV01   |       10 |       5.99 |
| ANV02   |        3 |       9.99 |
| TNT2    |        5 |      10.00 |
| FB      |        1 |      10.00 |
+---------+----------+------------+
4 rows in set (0.01 sec)

item_price列包含订单中每项物品的单价,我们来计算物品的总价(单价*数量):

mysql> SELECT prod_id, quantity, item_price, quantity*item_price AS expanded_price
    -> FROM orderitems
    -> WHERE order_num = 20005;
+---------+----------+------------+----------------+
| prod_id | quantity | item_price | expanded_price |
+---------+----------+------------+----------------+
| ANV01   |       10 |       5.99 |          59.90 |
| ANV02   |        3 |       9.99 |          29.97 |
| TNT2    |        5 |      10.00 |          50.00 |
| FB      |        1 |      10.00 |          10.00 |
+---------+----------+------------+----------------+
4 rows in set (0.00 sec)

结果中的expended_price列是一个计算字段,计算为quantity*item_price,即数量*单价。

MySQL支持的基本算数操作符:

操作符 说明
+
-
*
/

圆括号可以区分优先顺序。

  • 任何测试计算 SELECT提供了测试和试验函数与计算的一个很好的办法。SELECT可以省略FROM子句来简单地访问和处理表达式。例如:SELECT 3*2; 将返回6,SELECT Trim(’ abc '); 将返回abc,等等。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

MySQL必知必会——第十章创建计算字段 的相关文章

  • 删除原始数据中部分重复的记录

    我需要删除表中时间间隔为 1 或 2 分钟或相同且必须相同的所有记录ID但保留第一个记录 ID Time SN SD WE FW 10 2014 06 30 19 17 37 000 I 0 100 0 10 2014 06 30 19 1
  • Python SQLite3 SQL注入漏洞代码

    我知道下面的代码片段由于 format 的原因很容易受到 SQL 注入的攻击 但我不知道为什么 有谁明白为什么这段代码容易受到攻击以及我从哪里开始修复它 我知道这些代码片段使输入字段保持打开状态 以便通过 SQL 注入执行其他恶意命令 但不
  • 为什么我们不能有多个主键?

    我知道表中不能有超过 1 个主键 但技术原因是什么 直接拉取自SO https stackoverflow com questions 217945 can i have multiple primary keys in a single
  • MySql如何通过过滤多列来限制多个数字?

    我想从数据库中获取 4 个不同类别的 50 个问题 我想要 4 个不同类别中每个类别的不同数量的问题 我的结果集必须包含第一类 12 个问题 第二类 20 个问题 第三类 10 个问题和第四类 8 个问题 我的问题表中总共有 50 个问题
  • SQL:比较不同表中的两个计数

    我有 3 张桌子 一张桌子上有世界上每个国家及其代币 NAME CODE Afghanistan AFG Albania AL Algeria DZ American Samoa AMSA Andorra AND Angola ANG An
  • PHP:使用输入和输出参数(不是“INOUT”)调用 MySQL 存储过程

    我想从 PHP 调用 MySQL 中的存储过程 该过程需要输入and输出参数 not INOUT 参数 举一个简单的例子 假设我在 MySQL 中有以下存储过程 DELIMITER DROP PROCEDURE IF EXISTS test
  • 不唯一的表/别名

    因此 我尝试使用多个联接来运行此查询 以获得我想要的精确行 但我不断收到此错误 不唯一的表 别名 ss prices 我正在运行的查询 select ss accounts id ss accounts bot acc id ss acco
  • 混合语言源目录布局

    我们正在运行一个使用多种不同语言的大型项目 Java Python PHP SQL 和 Perl 到目前为止 人们一直在自己的私有存储库中工作 但现在我们希望将整个项目合并到一个存储库中 现在的问题是 目录结构应该是什么样的 我们应该为每种
  • Oracle:如何查找模式中上次更新(任何表)的时间戳?

    有一个Oracle数据库模式 数据很小 但仍然有10 15个表左右 它包含一种配置 路由表 有一个应用程序必须不时轮询此架构 不得使用通知 如果架构中没有数据更新 应用程序应使用其当前的内存版本 如果任何表有任何更新 应用程序应将所有表重新
  • 返回行位置 - Postgres

    我返回一个带有位置的表 select from select row number over as position from organization result where data1 Hello 返回这个 这是正确的 data1 H
  • ER_ACCESS_DENIED_ERROR:用户 ''@'localhost' 的访问被拒绝(使用密码:NO)

    我有这个问题 我已经研究过但无法解决它 我想它与数据库权限有关 但我无法修复它 if error throw error Error ER ACCESS DENIED ERROR Access denied for user localho
  • 如何在SQL Server数据库表列中存储图像[重复]

    这个问题在这里已经有答案了 我有一张名为FEMALE在我的数据库中 它有ID as Primary Key 它有一个Image column 我的问题是如何使用 SQL 查询存储图像 尝试一下 insert into tableName I
  • 使用 EXPLAIN 进行 MYSQL 存储过程调用

    如何分析和使用 EXPLAIN 来调用我的存储过程 我需要优化查询时间 但是似乎没有地方可以执行 EXPLAIN 调用 proc name 你可以试试 set profiling 1 call proc name show profiles
  • 如何在MySQL中查找上周的数据

    我想显示来自 Q1 每个学生只有最后一周 Q2 每个学生只有最后一个月 我怎样才能实现这个目标 一周演示 http sqlfiddle com 2 f1fbb 3 当月演示 http sqlfiddle com 2 f1fbb 4 CREA
  • MySQL 子查询返回多行

    我正在执行这个查询 SELECT voterfile county Name voterfile precienct PREC ID voterfile precienct Name COUNT SELECT voterfile voter
  • 是否可以使用“WHERE”子句来选择SQL语句中的所有记录?

    晚上好 我很好奇是否可以在 SQL 语句中创建一个 WHERE 子句来显示所有记录 下面一些解释 随机 SQL 语句 Java JSP示例 正常情况 String SqlStatement SELECT FROM table example
  • 具有 LINQ 支持的最完整的 ORM?

    我正在寻找一个提供完整或接近完整的 LINQ 支持的 ORM LINQ 到 SQL 支持 LINQ 内部的所有内容 Contains Math Log 等 在不创建新数据上下文的情况下无法预先加载关系属性 ADO NET 实体框架 糟糕的
  • Spark SQL/Hive 查询通过 Join 永远持续下去

    所以我正在做一些应该很简单的事情 但显然它不在 Spark SQL 中 如果我在 MySQL 中运行以下查询 查询将在不到一秒的时间内完成 SELECT ua address id FROM user u inner join user a
  • 将列的值添加到 LIKE 语句中?

    我有 3 个标签表 标签类别和使用过的标签 我想要获取所有标签的列表以及已使用标签的计数 所使用标签的格式是每个具有标签的文档 ID 的逗号分隔值 我一直在尝试类似的方法 但无法将tags tag 字段的值插入到LIKE 语句中 SELEC
  • 在 MySQL 中分割逗号分隔值

    我正在尝试将字符串中以逗号分隔的 值拆分为多列 样本数据 COL1 COL2 COL3 000002 000003 000042 09 31 51 007 004 007 预期输出 Pno Cno Sno 000002 09 007 000

随机推荐

  • 解决ChatGPT 学术优化 3.44配置域名遇到的Connection error out问题

    一 发现问题 首先我们通过F12通过IP地址直接访问ChatGPT 学术优化可以发现请求路径为ws IP 端口 路径不难发现请求的协议是ws 二 什么是ws协议呢 1 ws协议全称WebScoket协议 WebScoket协议是基于http
  • 禅道服务器修改ip,访问禅道服务器的ip地址

    访问禅道服务器的ip地址 内容精选 换一换 用户的弹性云服务器已绑定EIP 但是无法连接到Internet 弹性云服务器通过EIP访问Internet的流程如图1所示 本问题请按照以下思路进行排查处理 查看弹性云服务器运行是否正常查看弹性云
  • 传导干扰与手机常见EMC处理措施

    原文来自公众号 工程师看海 以前文章讲了空间传导及其屏蔽 这一篇咱们继续解释传导干扰 同时介绍一些手机中常见的EMC抑制措施 差模共模干扰 差模干扰是两条线直线的噪声 这两条线上的电流大小相等 但方向相反 如果电流方向相同 这种模式就称为共
  • 【微信小程序】授权与重新授权

    授权与重新授权 js getUserInfo function e if e detail userInfo 用户按了允许授权按钮 var that this console log 用户的信息如下 console log e detail
  • 关于Proto的学习

    关于Proto的学习 proto文件来预先定义的消息格式 数据包是按照proto文件所定义的消息格式完成二进制码流的编码和解码 proto文件 简单地说 就是一个消息的协议文件 这个协议文件的后缀文件名为 proto proto其实就相当于
  • a标签新开页面sessionStorage丢失

    a标签新开页面sessionStorage丢失 场景 点击标签 新开一个页面 遇到的问题 打开新页面后重新跳转了登录页 查看后发现session空了 分析 cookie 同浏览器 不同tab 同源 同路径 localStorage 同浏览器
  • 外辐射源雷达信号模型

    发射端 基带 发射信号基带 u 基 t u 基 t u基 t 调制 发射信号调制后 u 调 t u 基 t exp j 2 f c t u 调 t u 基 t exp j2 pi f ct u调 t u基 t exp j2 fc t 第 m
  • 使用gdal的ogr创建shapefile文件(c++)

    1 ogr 使用ogr库创建点状要素的shapefile文件以及将经纬度坐标转为投影坐标 实例如下 include ogrsf frmts h include gdal h include gdal priv h include cpl s
  • Ops实践

    关注回复 学习交流群 加入 安全开发运维 答疑交流群 目录 本文为作者原创文章 为尊重作者劳动成果禁止非授权转载 若需转载请在 全栈工程师修炼指南 公众号留言 或者发送邮件到 master weiyigeek top 中我将及时回复 原文连
  • 去水印小程序源码,全新界面无加密,平台支持微信小程序和QQ小程序。支持解析抖音、快手、皮皮虾和微视等平台。带PHP下载接口。支持微信QQ流量主

    去水印小程序源码 平台支持微信小程序和QQ小程序 支持解析抖音 快手 皮皮虾和微视等平台 搭建教程 1 下载源码 并导入微信开发者工具 下载地址 扫描小程序 搜索 去水印小程序 或者联系作者 yhq4918 2 修改remove js中的d
  • LeetCode[动态规划]746.使用最小花费爬楼梯+198.打家劫舍

    746 使用最小花费爬楼梯 题目 给你一个整数数组 cost 其中 cost i 是从楼梯第 i 个台阶向上爬需要支付的费用 一旦你支付此费用 即可选择向上爬一个或者两个台阶 你可以选择从下标为 0 或下标为 1 的台阶开始爬楼梯 请你计算
  • 【操作系统】基本分页和分段存储管理方式

    操作系统 基本分页和分段存储管理方式 参考文章 基本分页 https blog csdn net qq 28602957 article details 53588362 基本分段 https blog csdn net qq 286029
  • Postman 发送接口请求返回401 Unauthorized

    使用postman发送接口请求测试时 返回状态401Unauthorized 最终找到问题所在 是导入了Spring security包的问题 当我们使用了Spring security 之后 Spring Security默认对所有路径进
  • 整合短信验证码

    第一步 点击阿里云云市场 搜索短信 第二步 购买服务 第三步 按照文档操作 添加HttpUtils import org apache commons lang StringUtils import org apache http Http
  • 什么是Gravatar,以及为什么您应该立即开始使用它

    Often new WordPress users ask us about how the grey icon that shows up next to their name Sometimes we get emails from u
  • 李沐_动手学深度学习第5章卷积神经网络第二部分_笔记

    目录 1 卷积神经网络 LeNet 2 深度卷积神经网络 AlexNet 3 使用重复元素的网络 VGG 4 网络中的网络 NiN 5 含并行连结的网络 GoogLeNet 6 批量归一化 7 残差网络 ResNet 8 稠密连接网络 De
  • 跨界融合,共创智能汽车研发新生态(技术大会诚邀您的莅临)

    全球汽车产业正在经历技术变革 智能汽车不仅是汽车与人工智能 云计算 V2X技术 5G通信等多领域技术融合发展的产物 也是创新热点与未来发展的至高点 在软件定义汽车的趋势下 ICT技术向汽车产业不断渗透 SOA新架构 OTA 中央计算平台等新
  • u盘显示需要格式化才能用怎么办?修复方法

    u盘显示需要格式化才能用怎么办 u盘是常用的一款数据存储设备 但不少朋友在使用u盘的过程中 都遇到过这样的一个问题 就是u盘无法打开且提示需要将其格式化 这是什么原因导致的 又该如何解决呢 下面就一起来看看解决方法 造成u盘提示格式化的原因
  • C++日志系统log4cxx

    log4cxx有三个主要组件 loggers 记录器 appenders 输出源 和layout 布局 可以简单理解为日志类别 要输出的地方 输出形式 Logger 创建Logger Logger是有一个String类的名字识别的 且大小写
  • MySQL必知必会——第十章创建计算字段

    创建计算字段 本章介绍什么是计算字段 如何创建计算字段以及怎样从应用程序中使用别名引用它们 计算字段 存储在数据库表中的数据一般不是应用程序所需要的格式 例如 想在一个字段中显示公司名和地址 但公司名和地址在不同的列中等等 我们需要直接从数