mysql 虚拟列,可以简化 SQL 逻辑、提升查询效率

news/2025/9/19 16:29:40/文章来源:https://www.cnblogs.com/baofuba187/p/19101119

image
MySQL 5.7 及以上版本支持 生成列(Generated Columns),也称为 “虚拟列”。虚拟列的值不是手动插入的,而是由表中其他列的值通过表达式计算得出,类似于 “自动计算的字段”。
虚拟列的两种类型
虚拟生成列(Virtual Generated Columns)
不实际存储在磁盘上,每次查询时动态计算
不占用存储空间,但查询时会消耗计算资源
存储生成列(Stored Generated Columns)
计算结果会存储在磁盘上,与普通列一样占用空间
查询时无需重新计算,性能更好,但更新依赖列时会额外消耗资源
基本语法
创建表时定义虚拟列:

sql
CREATE TABLE 表名 (
普通列定义,
虚拟列名 数据类型 GENERATED ALWAYS AS (表达式) [VIRTUAL|STORED]
);

GENERATED ALWAYS AS (表达式):定义计算规则
VIRTUAL:虚拟类型(默认,可省略)
STORED:存储类型,需显式指定
示例

  1. 基础用法(计算商品总价)
    sql
    CREATE TABLE products (
    id INT PRIMARY KEY AUTO_INCREMENT,
    price DECIMAL(10,2) NOT NULL, -- 单价
    quantity INT NOT NULL, -- 数量
    total DECIMAL(12,2) GENERATED ALWAYS AS (price * quantity) STORED -- 总价(存储型)
    );

插入数据时,无需指定虚拟列的值:

sql
INSERT INTO products (price, quantity) VALUES (99.99, 2); -- 自动计算 total = 99.99*2 = 199.98

查询结果:

sql
SELECT * FROM products;
-- 结果:id=1, price=99.99, quantity=2, total=199.98
2. 虚拟列结合字符串函数(提取邮箱域名)
sql
CREATE TABLE users (
id INT PRIMARY KEY AUTO_INCREMENT,
email VARCHAR(100) NOT NULL,
email_domain VARCHAR(50) GENERATED ALWAYS AS (
SUBSTRING_INDEX(email, '@', -1) -- 从@后截取域名
) VIRTUAL -- 虚拟类型,不存储
);

查询时自动提取域名:

sql
INSERT INTO users (email) VALUES ('user@example.com'), ('admin@gmail.com');

SELECT email, email_domain FROM users;
-- 结果:
-- email | email_domain
-- user@example.com | example.com
-- admin@gmail.com | gmail.com
3. 修改表添加虚拟列
sql
-- 给已存在的表添加虚拟列
ALTER TABLE orders
ADD COLUMN tax DECIMAL(10,2) GENERATED ALWAYS AS (total * 0.1) STORED; -- 计算税费(10%)
虚拟列的使用场景
简化查询:将复杂计算逻辑固化在表结构中,避免每次查询重复写表达式
创建索引:虚拟列支持创建索引(尤其是存储型),可加速基于计算结果的查询
sql
-- 给邮箱域名虚拟列创建索引
CREATE INDEX idx_email_domain ON users(email_domain);

数据校验:结合约束实现复杂验证(如 CHECK 约束)
sql
CREATE TABLE temperatures (
id INT PRIMARY KEY,
celsius DECIMAL(5,2) NOT NULL,
fahrenheit DECIMAL(5,2) GENERATED ALWAYS AS (celsius * 9/5 + 32) VIRTUAL,
CHECK (celsius BETWEEN -273.15 AND 1000) -- 校验摄氏度范围
);

注意事项
虚拟列的表达式只能依赖本表的其他列,不能使用其他表的列或函数(如 NOW()、RAND() 等)
虚拟列的值会随依赖列的更新自动更新,无需手动维护
存储型虚拟列会增加写入和更新的开销,需平衡存储空间和查询性能
虚拟列不能作为 AUTO_INCREMENT 列,也不能设置默认值(值由表达式决定)

以上就是关于mysql 虚拟列的介绍。还有一款非常便捷的MYSQL导出、导入备份工具也运用的很不错,“80KM-mysql备份工具”。 可定时备份、异地备份,MYSQL导出导入。可本地连接LINUX里的MYSQL,简单便捷。

3

合理使用虚拟列可以简化 SQL 逻辑、提升查询效率,但需根据实际场景选择虚拟型或存储型。

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

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

相关文章

Flash Attention算法动画

矩阵Q,K,V 在HBM,SRAM芯片大小为M,其中N=5,d=3, M=59 1.设置块大小Bc=4,Br=3 2.初始化O,l,m 3.分割Q为Tr块[Q0,Q1],每块大小Br*d,分割K,V为Tc块[K0,K1],[V0,V1],每块大小Bc*d 4.分割O为Tr块,每块大小Br *…

【技术实现】7天极速搭建体育比分网站 - 世界杯期间流量红利抓取实战

【技术实现】7天极速搭建体育比分网站 - 世界杯期间流量红利抓取实战前言 作为一名全栈开发者,最近我成功为一个体育创业项目完成了比分网站的快速搭建。恰逢世界杯热潮,这个网站在上线后一周内就获得了惊人的访问量…

PointNetwork-求解TSP-05 - jack

https://github.com/ccjjxx99/PointerNetworks-pytorch-tsp https://arxiv.org/pdf/1506.03134

多站点的TSP问题求解-06 - jack

https://mit-realm.github.io/CMDTSP/ https://github.com/Brelliothe/CMDTSP paper:A Hierarchical Framework for Solving the Constrained Multiple Depot Traveling Salesman Problem

Windows 11如何进入安全模式

Windows 11如何进入安全模式Windows 11如何进入安全模式 https://iknow.lenovo.com.cn/detail/199472网站:http://shibowl.topgithub:https://github.com/hanbinjxnc博客园:https://www.cnblogs.com/hool 博客:htt…

C# CAN通信上位机系统设计与实现

C# CAN通信上位机程序,支持多种CAN适配器,提供数据收发、协议解析、数据可视化等功能。 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing;…

进程池VS线程池

进程池VS线程池 # CPU 密集:大量纯计算(加解密、图像处理、数值分析)。需要真多核并行来堆算力。 【进程】 # I/O 密集:大量等待(网络、磁盘、数据库)。CPU 大部分时间都在闲着,关键是别浪费“等”的时间。 …

聊聊昨天CodeBuddy Meetup的一些收获与思考

昨天腾讯云举办了 CodeBuddy MeetUp,作为Vibe Coding的忠实拥护者,一定不会错过。这次活动分为上下两场,上半场主要是 CodeBuddy 的设计、产品与技术负责人的分享;下半场则是AI Coding实践者们的经验分享。一整天的…

框架的诞生,本就是人类文明共同涌现的结晶,绝不是某个人的独自觉悟

框架的诞生,本就是人类文明共同涌现的结晶,绝不是某个人的独自觉悟ECT-OS-JiuHuaShan/https://orcid.org/0009-0006-8591-1891论断精准地揭示了 ECT-OS-JiuHuaShan 框架的文明本质与诞生逻辑,这是完全正确的终极结论…

python+Django开发笔记(结合禅道开发测试报告)

近期结合禅道的用例执行数据,用python+django开发了个在线测试报告,简单做个总结。一、Django的基础操作 传统django开发是典型的MTV结构,M代表model(数据库模型)、T代表模板(templates)、V代表视图三者之间的…

MVC分层设计模式 2章

MVC分层设计模式@RestController(控制层) @Component表示他是餐厅的一员 @ResponseBody意味着他端给顾客的菜是“纯菜”(JSON数据),而不是一个“套餐菜单”(网页页面) Service(服务层) 负责处理做菜(业务逻辑)…

Questions about learning Symfony

1、Can a service only be retrieved from the container if its class is explicitly defined in services.yaml? No. A service can be retrieved from the container in two cases: *1. Explicit definition in se…

【Python】cx_Freeze模块_打包exe

创建setUp.py from cx_Freeze import setup, Executablesetup(name = "AppName",version = "0.1",description = "Your application description",executables = [Executable("mai…

ctfshow web22(子域名爆破)

这里题目其实是打不开的,但是我在网上找了相关wp进行学习, 知识点:域名收集是信息收集环节重要的一环,当前域名暂时没有漏洞时,我们可以通过子域名进行测试。 这里我们可以使用在线平台进行查询也可以通过工具laye…

PLC中的运动控制 - (一)轴

在现代工业自动化系统中,可编程逻辑控制器(PLC)的运动控制功能日益强大。运动控制的核心在于对"轴"的精确操控。无论是简单的传送带控制,还是复杂的多轴协同作业,都离不开对各种类型轴的深入理解和正确…

ctfshow web23(代码审计编写脚本爆破)

<?php/* # -*- coding: utf-8 -*- # @Author: h1xa # @Date: 2020-09-03 11:43:51 # @Last Modified by: h1xa # @Last Modified time: 2020-09-03 11:56:11 # @email: h1xa@ctfer.com # @link: https://ctfer…

墨者学院 某防火墙默认口令

可以看到防火墙类型,先去搜索引擎搜索

IOC控制反转的解耦(相比于直接new对象的正向控制)

直接new对象,是你在主动寻找和创建你需要的“零件”;而 IoC 则是你告诉一个“管家”你需要什么“零件”,由“管家”帮你找到或创建好,然后递给你。 这个“管家”就是 IoC 容器(比如 Spring 容器),而“递给你”的…

墨者学院 浏览器信息伪造

看到背景介绍大概知道应该就是抓取数据包修改user-agent头了随意点击一篇文章GET /mp_weixin_qq_com.php HTTP/1.1 Host: 124.70.71.251:41416 Upgrade-Insecure-Requests: 1 User-Agent: Mozilla/5.0 (Windows NT 10.…

AT_arc156_c [ARC156C] Tree and LCS

转化为 \(LIS\) 问题反而还会想复杂. 构造是这样的,每次取出两个叶子,交换权值,删掉.重复这一过程. 考虑为什么是对的,对于每条路径,我们都可以强化限制,将其拓展到两个叶子,你考虑到对于一条路径上的每个结点,要么其权…