什么是MySQL虚拟生成列?
在MySQL中,虚拟生成列(Virtual Generated Columns)是一种在表中定义的计算列。 虚拟生成列不存储实际的数据,而是使用提供的公式根据表中的其他列计算它们的值。 在查询中访问虚拟生成列就像访问实际的表列一样。
虚拟生成列的实际值是在查询时由MySQL动态计算的。因此,即使您更改了用于计算虚拟生成列的公式,也不需要显式更新虚拟生成列的值。
MySQL虚拟生成列的数学表达式
MySQL虚拟生成列可以与数学表达式一起使用,这样可以让我们轻松地将一些简单的算术操作应用于已有的表列。下面我们来看一个简单的例子:
CREATE TABLE temperature_data (
id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
temperature DECIMAL(4,2) NOT NULL
);
INSERT INTO temperature_data (temperature) VALUES (23.2), (24.5), (22.1), (25.3);
在上面的例子中,我们创建了一个名为temperature_data
的表,其中包含一个名为temperature
的列。 该列的数据类型为DECIMAL(4、2),这表示它将包含4位数,其中小数部分有2位。
现在,如果我们想要将这些温度按照华氏度进行排序,可以使用以下公式将摄氏度转换为华氏度:
华氏度 = 摄氏度 x 1.8 + 32
我们可以通过将这个公式应用到虚拟生成列上,来实现按照华氏度排序。 在MySQL中,我们定义虚拟生成列的方式如下:
ALTER TABLE temperature_data ADD COLUMN fahrenheit DECIMAL(4,2) GENERATED ALWAYS AS (temperature * 1.8 + 32) STORED;
在上面的代码中,我们使用ALTER TABLE
语句向现有的temperature_data
表中添加了一个名为fahrenheit
的虚拟生成列。 该列的数据类型仍然是DECIMAL(4,2),用于存储转换后的华氏度温度。 我们定义了一个公式来计算华氏度,然后使用GENERATED ALWAYS
选项告诉MySQL要在每个查询中动态计算虚拟生成列的值。 最后,我们使用STORED
选项告诉MySQL要将计算所得的值保存到dashboard表中,而不是在每次查询中动态计算它们。
使用虚拟生成列进行条件筛选
在MySQL中,虚拟生成列也可以用作条件筛选,这使您可以在查询中过滤行,而无需在表中首先定义新的列。知道上一段已经将温度转成了华氏温度,如果我们现在想从这个表中获取所有低于80华氏度的记录,可以使用以下查询语句:
SELECT id, temperature, fahrenheit
FROM temperature_data
WHERE fahrenheit < 80;
在上面的代码中,我们仅检索id,temperature和fahrenheit列的值,其中fahrenheit列使用虚拟生成列。 然后用WHERE
子句指定了必须满足的筛选条件:fahrenheit必须低于80。 我们没有在表中定义新列,而是在查询中使用了虚拟生成列。
结论
MySQL虚拟生成列是一种强大的功能,它允许我们根据其他列的值动态计算值,甚至可以应用数学计算。使用虚拟生成列可以让我们更快,更简便地进行数据处理和查询筛选。 此外,虚拟生成列的值是在每个查询中动态计算的,这意味着我们不必担心要手动更新虚拟生成列的值。