MySQL虚拟列的使用示例

 更新时间:2024年11月11日 09:48:22   作者:xixingzhe2  
虚拟列是MySQL中的一种特殊列,它不存储在表中,而是在查询时动态计算生成,虚拟列可以提高查询效率、减少存储需求、确保数据一致性、简化查询和保护敏感数据,感兴趣的可以了解一下

1、概述

在 MySQL 中,虚拟列(也称为计算列或生成列)是一种特殊的列,它不存储在数据库表中,而是在查询时动态计算生成。虚拟列可以基于表中的其他列进行计算,或者直接计算出一些值。它们在数据库设计和查询优化中有一些重要的用途:

  • 减少存储需求:由于虚拟列不存储在磁盘上,因此可以减少数据库的存储需求。

  • 提高查询效率:虚拟列在查询时动态生成,可以减少对原始数据的计算,从而提高查询效率。

  • 数据一致性:虚拟列可以确保数据的一致性,因为它们总是基于表中其他列的最新值进行计算。

  • 简化查询:虚拟列可以简化复杂的 SQL 查询,使得查询更易于编写和理解。

  • 数据保护:虚拟列可以用于保护敏感数据,例如,通过计算列来显示部分数据,而实际数据存储在其他列中。

在 MySQL 中,虚拟列可以是存储的(STORED)或非存储的(VIRTUAL)。存储的虚拟列实际上会存储在表中,而非存储的虚拟列则不会存储,仅在查询时计算。

创建虚拟列的语法

以下是创建虚拟列的基本语法:

CREATE TABLE table_name (
    column1 datatype,
    column2 datatype,
    virtual_column AS (expression),
    ...
);

或者在现有的表中添加虚拟列:

ALTER TABLE table_name
ADD COLUMN virtual_column AS (expression);

2、示例

表结构

假设有一个员工表 employees,包含员工的姓名、年龄和出生日期:

CREATE TABLE `employee` (
  `id` int NOT NULL AUTO_INCREMENT,
  `name` varchar(100) DEFAULT NULL,
  `age` int DEFAULT NULL,
  `birth_date` date DEFAULT NULL,
  `full_name` varchar(255) GENERATED ALWAYS AS (concat(`name`,_utf8mb4' (',`age`,_utf8mb4' years old)')) VIRTUAL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=11 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='员工';

在这个例子中,full_name 是一个虚拟列,它将员工的姓名和年龄结合起来生成一个完整的名称。

初始化数据

INSERT INTO `employee` VALUES (1, 'Lois Simpson', 12, '2022-12-19', DEFAULT);
INSERT INTO `employee` VALUES (2, 'Nakagawa Sakura', 11, '2021-01-23', DEFAULT);
INSERT INTO `employee` VALUES (3, 'Xiang Rui', 10, '2013-04-04', DEFAULT);
INSERT INTO `employee` VALUES (4, 'Ono Momoe', 11, '2002-07-07', DEFAULT);
INSERT INTO `employee` VALUES (5, 'Fukuda Sara', 11, '2020-12-04', DEFAULT);
INSERT INTO `employee` VALUES (6, 'Ryan Dunn', 11, '2021-11-01', DEFAULT);
INSERT INTO `employee` VALUES (7, 'Ku Tsz Hin', 11, '2004-10-31', DEFAULT);
INSERT INTO `employee` VALUES (8, 'Todd Diaz', 11, '2023-05-11', DEFAULT);
INSERT INTO `employee` VALUES (9, 'Yamada Kenta', 11, '2015-06-15', DEFAULT);
INSERT INTO `employee` VALUES (10, 'Leslie Anderson', 5, '2010-08-19', DEFAULT);

查询

注意事项

  • 虚拟列的计算不能依赖于其他表的数据。
  • 虚拟列不能用作存储过程或触发器的参数。
  • 虚拟列不能用于外键约束。

通过这些功能,虚拟列在数据库设计和优化中提供了一种灵活且强大的工具。

3、优缺点

优点

  • 数据一致性

    • 虚拟列的值总是基于表中其他列的当前值计算,确保数据的一致性。
  • 减少存储需求

    • 非存储的虚拟列不需要额外的存储空间,因为它们在查询时动态计算。
  • 简化查询

    • 通过将复杂的计算逻辑封装在数据库中,可以简化应用层的代码和查询语句。
  • 提高查询效率

    • 对于存储的虚拟列,如果这些列经常被查询使用,将它们存储在数据库中可以减少计算时间和提高查询效率。
  • 数据保护

    • 可以利用虚拟列显示部分数据或进行数据格式化,从而保护敏感信息。
  • 业务逻辑封装

    • 将某些业务逻辑封装在数据库层面,减少应用层的计算负担,有助于保持代码的整洁和一致性。

缺点

  • 增加计算负担

    • 每次查询时都需要重新计算非存储的虚拟列,这可能会增加数据库的计算负担,特别是在高并发环境中。
  • 限制使用

    • 虚拟列不能用作外键、存储过程参数或触发器参数,这限制了它们的使用场景。
  • 索引复杂性

    • 虽然可以为存储的虚拟列创建索引,但索引的维护可能会增加额外的复杂性和开销。
  • 存储需求

    • 存储的虚拟列需要额外的存储空间,这可能会增加数据库的存储需求。
  • 更新复杂性

    • 如果虚拟列依赖于其他列,当这些列被更新时,虚拟列的值也需要重新计算,这可能会影响更新操作的性能。
  • 数据冗余

    • 存储的虚拟列可能会引入数据冗余,尤其是在数据频繁更新的情况下,这可能会导致数据不一致的风险。
  • 限制灵活性

    • 虚拟列的计算逻辑在创建时固定,修改这些逻辑可能需要重新设计和调整数据库结构。

到此这篇关于MySQL虚拟列的使用示例的文章就介绍到这了,更多相关MySQL虚拟列内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家! 

相关文章

  • MySQL正则表达式匹配查询(含实例)

    MySQL正则表达式匹配查询(含实例)

    MySQL中正式表达式通常被用来检索或替换符合某个模式的文本内容,根据指定的匹配模式匹配文中符合要求的特殊字符串,下面这篇文章主要给大家介绍了关于MySQL正则表达式匹配查询的相关资料,需要的朋友可以参考下
    2022-09-09
  • ubuntu20.04配置mysql8.0的实现步骤

    ubuntu20.04配置mysql8.0的实现步骤

    本文主要介绍了ubuntu20.04配置mysql8.0的实现步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-05-05
  • mysql数据库脚本如何为表添加字段并设置备注

    mysql数据库脚本如何为表添加字段并设置备注

    这篇文章主要介绍了mysql数据库脚本如何为表添加字段并设置备注方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-04-04
  • 详解MySql存储过程参数的入门使用

    详解MySql存储过程参数的入门使用

    这篇文章主要介绍了MySql存储过程参数的入门使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-04-04
  • MySQL降权运行之MySQL以Guests帐户启动设置方法

    MySQL降权运行之MySQL以Guests帐户启动设置方法

    我们在windows服务器中使用mysql数据的时候,mysql默认都是以system权限运行,如果出现了安全问题,黑客就可以通过mysql提权新建用户什么的,所以mysql低权限运行非常必要
    2014-07-07
  • MySQL超详细实现用户管理实例

    MySQL超详细实现用户管理实例

    MySQL 是一个多用户数据库,具有功能强大的访问控制系统,可以为不同用户指定不同权限。在前面的章节中我们使用的是 root 用户,该用户是超级管理员,拥有所有权限,包括创建用户、删除用户和修改用户密码等管理权限
    2022-06-06
  • MySQL的一条慢SQL查询导致整个网站宕机的解决方法

    MySQL的一条慢SQL查询导致整个网站宕机的解决方法

    通常来说,我们看到的慢查询一般还不致于导致挂站,顶多就是应用响应变慢不过这个恰好今天被我撞见了,一个慢查询把整个网站搞挂了
    2016-07-07
  • Mysql 数字类型转换函数

    Mysql 数字类型转换函数

    Mysql 数字类型转换函数,有此需要的朋友可以参考下用法。
    2009-08-08
  • mysql-8.0.15-winx64 使用zip包进行安装及服务启动后立即关闭问题

    mysql-8.0.15-winx64 使用zip包进行安装及服务启动后立即关闭问题

    这篇文章主要介绍了mysql 使用zip包进行安装以及服务启动后立即关闭问题 ,本实例使用的mysql版本为mysql-8.0.15-winx64,需要的朋友可以参考下
    2019-05-05
  • mysql 5.7.15 安装配置方法图文教程

    mysql 5.7.15 安装配置方法图文教程

    这篇文章主要为大家分享了mysql 5.7.15安装配置方法图文教程,感兴趣的朋友可以参考一下
    2016-09-09

最新评论