MySQL之创建计算字段

存储在数据库表中的数据一般不是应用程序所需要的格式。
如:1.如果想在一个字段中既显示公司名,又显示公司的地址,但这两
个信息一般包含在不同的表列中。
2.列数据是大小写混合的,但报表程序需要把所有数据按大写表示出来。
3.需要根据表数据进行总数、平均数计算或其他计算。
存储在表中的数据都不是应用程序所需要的。我们需要直接从数据库中检索出转换、计算或格式化过的数据;而不是检索出数据,然后再在客户机应用程序或报告程序中重新格式化。这就是计算字段发挥作用的所在了。
计算字段并不实际存在于数据库表中。计算字段是运行时在SELECT语句内创建的。

拼接字段

拼接(concatenate) 将值联结到一起构成单个值。
在MySQL的SELECT语句中,可使用Concat()函数来拼接两个列。
多数DBMS使用+或||来实现拼接,
MySQL则使用Concat()函数来实现。当把SQL语句转换成
MySQL语句时一定要把这个区别铭记在心。

CONCAT函数的基本语法是:CONCAT(text1, [text2], …),其中text1, text2, …是需要连接的文本字符串参数。你可以提供任意数量的文本参数,它们将按顺序连接在一起。

‌连接两个文本字符串‌:假设你有两个文本字符串分别位于A1和B1单元格中,可以使用公式=CONCAT(A1, B1)将它们连接在一起。
‌连接多个文本字符串‌:假设你有多个文本字符串分别位于A1、B1、C1单元格中,可以使用公式=CONCAT(A1, B1, C1)将它们全部连接在一起。
‌连接带有分隔符的文本字符串‌:假设你有两个文本字符串分别位于A1和B1单元格中,可以在它们之间添加一个空格作为分隔符,使用公式=CONCAT(A1, " ", B1)将它们连接在一起。
‌连接数字和文本‌:假设你有一个数字位于A1单元格中,和一个文本字符串位于B1单元格中,可以使用公式=CONCAT(A1, B1)将它们连接在一起,数字会自动转换为文本形式。

执行算术计算

计算字段的另一常见用途是对检索出的数据进行算术计算。
在MySQL中对检索出的数据进行算术计算可以通过使用聚合函数、数学运算符和条件表达式来实现。‌

聚合函数
聚合函数用于对一组数据进行计算并返回单一值。常见的聚合函数包括:

‌SUM()‌:计算数值的总和。
‌AVG()‌:计算数值的平均值。
‌COUNT()‌:计算行数。
‌MAX()‌:返回数值的最大值。
‌MIN()‌:返回数值的最小值。

例如,假设有一个名为employees的表,包含员工的姓名、年龄和工资,可以使用以下SQL语句计算所有员工的平均工资:
SELECT AVG(salary) AS average_salary FROM employees;
数学运算符
数学运算符用于对单个或多个数值进行计算。常见的数学运算符包括:

‌+‌:加法。
‌-‌:减法。
‌*‌:乘法。
‌/‌:除法。
‌%‌:取模。

例如,假设有一个名为products的表,包含产品的价格和折扣,可以使用以下SQL语句计算每个产品的最终价格:

SELECT name, price, (price * (1 - discount)) AS final_price FROM products;

条件表达式允许根据条件返回不同的结果。常见的条件表达式包括:

‌IF()‌:根据条件返回两个值中的一个。
‌CASE‌:类似于IF(),但可以处理更复杂的条件。
例如,假设有一个名为sales的表,包含销售额和销售日期,可以使用以下SQL语句计算每个季度的总销售额:

SELECT CASE
WHEN MONTH(sale_date) IN (1, 2, 3) THEN ‘Q1’
WHEN MONTH(sale_date) IN (4, 5, 6) THEN ‘Q2’
WHEN MONTH(sale_date) IN (7, 8, 9) THEN ‘Q3’
ELSE ‘Q4’
END AS quarter,
SUM(sale_amount) AS total_sales
FROM sales
GROUP BY quarter;

### 如何在 MySQL创建计算字段(Generated Column) #### 计算字段概述 MySQL 的 `Generated Column` 功能允许定义一种特殊的列,其值由其他列通过表达式动态生成。这种功能可以分为两种类型:虚拟列(Virtual Generated Column)和存储列(Stored Generated Column)。前者仅存在于查询结果中而不占用物理存储空间[^2];后者则会将计算后的值保存到磁盘上以优化读取性能[^1]。 #### 创建计算字段的语法 以下是创建带有计算字段的表的基本语法规则: ```sql CREATE TABLE table_name ( col1 datatype, col2 datatype, ... generated_col_name DATATYPE GENERATED ALWAYS AS (expression) [VIRTUAL | STORED] ); ``` - **generated_col_name**: 表示要创建计算字段名称。 - **DATATYPE**: 定义该字段的数据类型。 - **GENERATED ALWAYS AS**: 声明此列为计算列并指定生成逻辑。 - **expression**: 使用 SQL 表达式的具体实现方式来决定列的内容。 - **VIRTUAL 或 STORED**: 明确指定期望采用哪种类型的生成列,默认为 VIRTUAL。 #### 实际案例分析 ##### 示例一:基于现有数据构建简单加法运算的虚拟列 下面的例子展示了如何在一个学生信息表中增加一个表示总分的新列,这个分数是由数学成绩加上英语成绩得出的。 ```sql CREATE TABLE students ( id INT PRIMARY KEY AUTO_INCREMENT, name VARCHAR(50), math_score DECIMAL(5, 2), english_score DECIMAL(5, 2), total_score DECIMAL(7, 2) AS (math_score + english_score) VIRTUAL ); ``` 这里 `total_score` 列不会被持久化写入硬盘,每次访问时都会重新计算得到最新数值。 ##### 示例二:利用JSON函数解析复杂结构化的数据作为存储型生成列 当处理来自外部系统的半结构化输入比如 JSON 文档时,可以通过如下方法提取特定部分的信息存放到关系模型里方便检索操作: ```sql CREATE TABLE products ( product_id INT NOT NULL, details JSON NOT NULL, price DECIMAL(8 , 2 ) AS (CAST(JSON_EXTRACT(details,'$.price') AS DECIMAL(8,2))) STORED ); INSERT INTO products VALUES (1,"{\"name\":\"Laptop\",\"price\":999.99}"), (2,"{\"name\":\"Smartphone\",\"price\":499.99}"); SELECT * FROM products; -- 输出结果应显示每件商品的价格已被成功转换成数字形式,并且已经作为一个独立实体存在表格之中。 ``` 上述代码片段说明了即使原始资料是以非标准化格式呈现出来的,仍然能够借助内置工具轻松完成映射过程[^3]。 ##### 示例三:自动维护年龄记录 为了简化应用程序层面上对于用户出生日期与当前实际岁数之间差异管理的工作量,可以直接依赖数据库引擎内部机制达成目的——即每当有新的注册发生或者系统重启之后恢复运行状态期间都确保相应条目保持同步更新。 ```sql ALTER TABLE users ADD COLUMN age SMALLINT UNSIGNED GENERATED ALWAYS AS ( TIMESTAMPDIFF(YEAR,birthday,CURDATE()) ) STORED; DELIMITER $$ CREATE EVENT update_age ON SCHEDULE EVERY 1 DAY DO BEGIN UPDATE users SET age = TIMESTAMPDIFF(YEAR,birthday,NOW()); END$$ DELIMITER ; ``` 注意,在某些情况下可能还需要额外设置定时任务去周期性校正可能出现偏差的情况[^5]。 ### 总结 以上介绍了三种不同场景下运用 MySQL 提供的 Generated Columns 特性的实例演示,无论是简单的数值相加还是复杂的嵌套对象属性获取亦或是长期跟踪变化趋势的需求都可以很好地满足业务需求的同时兼顾效率考量。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值