# Virtual column

In relational databases a virtual column is a table column whose value(s) is automatically computed using other columns values, or another deterministic expression. Virtual columns are defined of SQL:2003 as Generated Column, and are only implemented by some DBMSs, like MariaDB, SQL Server, Oracle, PostgreSQL, SQLite and Firebird (database server) (COMPUTED BY syntax).

## Implementation

There are two types of virtual columns:
* Virtual columns
* Persistent columns
Virtual columns values are computed on the fly when needed, for example when they are returned by a SELECT statement. Persistent column values are computed when a row is inserted in a table, and they are written like all other values. They can change if other values change. Both virtual and persistent columns have advantages and disadvantages: virtual columns don't consume space on the disk, but they must be computed every time a query refers to them; persistent columns don't require any CPU time, but they consume disk space. However, sometimes a choice is not available, because some DBMS's support only one column type (or neither of them).

### IBM Db2

IBM Db2 supports Virtual column of Version 8 as Generated column.

### MariaDB

MariaDB is a MySQL fork. Virtual columns were added in the 5.2 tree.
Expressions that can be used to compute the virtual columns have the following limitations:
* They must be deterministic
* They cannot return constant values
* They cannot use user-defined functions or stored procedures
* They cannot include other virtual columns
* They cannot make use of subqueries
Persistent columns can be indexed and can be part of a foreign key, with a few small limitations concerning constraint enforcement.
Virtual columns can only be used on tables which use a storage engine which supports them. Storage engines supporting virtual columns are:
* InnoDB
* MyISAM
* Aria
MRG_MyISAM tables can be based on MyISAM tables which include persistent columns; but the corresponding MRG_MyISAM column should be defined as a regular column.

#### Syntax

A CREATE TABLE or ALTER TABLE statement can be used to add a virtual column. The syntax used to define a virtual column is the following:
* type is the column's data type
* expression is the SQL expression which returns the column's value for each row
* text is an optional column comment

### MySQL

Support for virtual columns, known in MySQL as generated columns, started becoming available in MySQL 5.7. Various limitations on their use have been relaxed in subsequent versions.

### Oracle

Since version 11g, Oracle supports virtual columns.

### SQL Server

Microsoft SQL Server supports virtual columns, but they are called Computed Columns.
SQL Server supports both persisted and non-persisted computed columns.

### Firebird

Firebird has always supported virtual columns as its precursor InterBase supports it, called Computed Columns.
Firebird supports virtual columns, not persistent ones and allows for sub-selects, calling built in functions, external functions and stored routines in the virtual column expression.

#### Syntax

Creating a virtual column can be done during table creation or when adding columns to an existing table. The syntax used to define a virtual column is the following:
or the industry standard

### PostgreSQL

Since version 12, PostgreSQL supports virtual columns, known as generated columns.

### SQLite

Since version 3.31.0 (2020-01-22), SQLite supports virtual columns, known as generated columns.