精华内容
下载资源
问答
  • vlookup 序数是什么意思
    万次阅读
    2021-01-17 18:28:04

    vlookup 列序数指返数据在查找区域的第几列数。

    比如以下vlookup公式中,列序数是2,表示返区域B2到E7的第2列的值,区域B2到E7的第1列是B列,第2列是C列,所以,如果在区域B2到E7的B列中找到B3,那么将返对应C列的值,结果是Oliver。

    a6e45fcc96aeb16ef5386cc8a73d3ff4.png

    扩展资料:

    Vlookup需要四条信息才能构建 VLOOKUP 函数:

    1、要查找的值,也被称为查阅值。

    2、查阅值所在的区域。请记住,查阅值应该始终位于所在区域的第一列,这样 VLOOKUP 才能正常工作。例如,如果查阅值位于单元格 C2 内,那么您的区域应该以 C 开头。

    3、区域中包含返值的列号。例如,如果指定 B2:D11 作为区域,那么应该将 B 算作第一列,C 作为第二列,以此类推。

    4、(可选)如果需要返值的近似匹配,可以指定 TRUE;如果需要返值的精确匹配,则指定 FALSE。如果没有指定任何内容,默认值将始终为 TRUE 或近似匹配。

    现在将上述所有内容集中在一起,如下所示:=VLOOKUP(查阅值、包含查阅值的区域、区域中包含返值的列号以及(可选)为近似匹配指定 TRUE 或者为精确匹配指定 FALSE)。

    参考资料来源:百度百科-VLOOKUP函数

    更多相关内容
  • ,这个词在网络上也是比较常见的,刚开始还以为这是一个新的梗,后来才知道它的意思其实就是“加好友”的意思。不得不说,现在在网络上有很多词语,都换了一种说法了,有的看都看不懂啊。扩cqy是什么意思:cqy...

    扩列,这个词在网络上也是比较常见的,刚开始还以为这是一个新的梗,后来才知道它的意思其实就是“加好友”的意思。不得不说,现在在网络上有很多词语,都换了一种说法了,有的看都看不懂啊。

    6a84790f63c423e25b40f6cab8d34f0b.png

    扩列cqy是什么意思:

    cqy,其实就是“处Q友”的拼音缩写,意思就是指添加QQ好友,在QQ上互相加为好友。在贴吧上就叫cbq(处吧友的意思),也可以说是cpy(处朋友)。还有的人更直接一点,cdx(处对象的意思),而这些不同的社交行为都可以统称cgx(处关系)。

    c6e0b5bf47e05ac11562046b2a27b120.png

    扩列nss又是什么意思:

    nss,是“暖说说”的拼音缩写,意思是指相互点赞、评论、转发说说,增加说说热度,增进彼此线上感情。

    扩列介绍:

    扩列,是网络流行词,“扩”指的是扩展、增加,“列”指的是好友列表,意思合起来就是指请求扩充好友列表,等同于交新朋友的意思。

    在QQ部落、百度贴吧、微博等网络平台中,“求扩列”的内容是比较多的,在“求扩列”的帖子或留言中,通常会放上自己的一些基本信息和信息标签,突出自己的个性。这个词起源于李宫俊吧帖子被二次清空之前,该吧禁止成员留任何联系方式,一切交友类型的帖子都被管理员封禁了,于是吧内成员将交友的帖子成为“扩列”,后来演变为部分00后的通用暗语。

    展开全文
  • 5分钟搞懂MySQL - 行转

    千次阅读 多人点赞 2022-01-09 23:43:03
      MySQL行转,对经常处理数据的同学们来说,一定是不陌生的,甚至是印象深刻,因为它大概率困扰到了你,让你为之一愣~ 但当你看到本文后,这个问题就不在是问题,及时收藏,以后谁再问你这个问题,直接甩他脸上...

    小伙伴想精准查找自己想看的MySQL文章?喏 → MySQL专栏目录 | 点击这里

      MySQL行转列,对经常处理数据的同学们来说,一定是不陌生的,甚至是印象深刻,因为它大概率困扰过你,让你为之一愣~ 但当你看到本文后,这个问题就不在是问题,及时收藏,以后谁再问你这个问题,直接甩他脸上,粘贴即用。

      这里告诉大家一个小秘密,其实我和《小欢喜》里面的几位是同学还是好朋友~~今天我就拿我们哥儿几个高考成绩表来当测试表。嗯,兄弟们不信?我还有我们在学校里的合影呢,高三那年还没有PS,所以照片肯定是真的!😉😉

    在这里插入图片描述

    废话不多说,首先,我们看一下咱们的测试表数据预期查询的结果

    mysql> SELECT * FROM t_gaokao_score;
    +----+--------------+--------------+-------+
    | id | student_name | subject      | score |
    +----+--------------+--------------+-------+
    |  1 | 林磊儿       | 语文         |   148 |
    |  2 | 林磊儿       | 数学         |   150 |
    |  3 | 林磊儿       | 英语         |   147 |
    |  4 | 乔英子       | 语文         |   121 |
    |  5 | 乔英子       | 数学         |   106 |
    |  6 | 乔英子       | 英语         |   146 |
    |  7 | 方一凡       | 语文         |    70 |
    |  8 | 方一凡       | 数学         |    90 |
    |  9 | 方一凡       | 英语         |    59 |
    | 10 | 方一凡       | 特长加分     |   200 |
    | 11 | 陈哈哈       | 语文         |   109 |
    | 12 | 陈哈哈       | 数学         |    92 |
    | 13 | 陈哈哈       | 英语         |    80 |
    +----+--------------+--------------+-------+
    13 rows in set (0.00 sec)
    

    看看我们行转列转完后的结果:

    +--------------+--------+--------+--------+--------------+
    | student_name | 语文   | 数学   | 英语   | 特长加分     |
    +--------------+--------+--------+--------+--------------+
    | 林磊儿       |    148 |    150 |    147 |            0 |
    | 乔英子       |    121 |    106 |    146 |            0 |
    | 方一凡       |     70 |     90 |     59 |          200 |
    | 陈哈哈       |    109 |     92 |     80 |            0 |
    +--------------+--------+--------+--------+--------------+
    4 rows in set (0.00 sec)
    

      好,下面我们一起来看看SQL是如何编写的,对了,创建表结构和导入测试数据的SQL放到文章末尾了,自取~



    一、行转列SQL写法

    • 方法一、使用case..when..then进行 行转列
    SELECT student_name,
    	SUM(CASE `subject` WHEN '语文' THEN score ELSE 0 END) as '语文',
    	SUM(CASE `subject` WHEN '数学' THEN score ELSE 0 END) as '数学',
    	SUM(CASE `subject` WHEN '英语' THEN score ELSE 0 END) as '英语',
    	SUM(CASE `subject` WHEN '特长加分' THEN score ELSE 0 END) as '特长加分' 
    FROM t_gaokao_score 
    GROUP BY student_name;
    

      这里如果不使用SUM()会报sql_mode=only_full_group_by相关错误,需要聚合函数和group by连用使用distinct才可以解决。

      其实,加了SUM()是为了能够使用GROUP BY根据student_name进行分组,每一个student_name对应的subject="语文"的记录毕竟只有一条,所以SUM() 的值就等于对应那一条记录的score的值。当然,也可以换成MAX()

    在这里插入图片描述

    • 方法二、使用IF()进行 行转列:
    SELECT student_name,
    	SUM(IF(`subject`='语文',score,0)) as '语文',
    	SUM(IF(`subject`='数学',score,0)) as '数学',
    	SUM(IF(`subject`='英语',score,0)) as '英语',
    	SUM(IF(`subject`='特长加分',score,0)) as '特长加分' 
    FROM t_gaokao_score 
    GROUP BY student_name;
    

      该方法将IF(subject='语文',score,0)作为条件,通过student_name进行分组,对分组后所有subject='语文’的记录的score字段进行SUM()操作,如果score没有值则默认为0。

      这种方式和case..when..then方法原理相同,相比更加简洁明了,建议使用。

    二、如果领导@你,让你在结果集中加上总数列呢?

    友情提示我们工作中处理行转列数据时,尽量都把总数、平均数等加上,方便领导查阅,省得他循环BB你。

    话说,你还记得上学时的成绩表是啥样的么?你一般从上往下看还是从下往上看呢?文末投票,快来给大家乐呵乐呵!

    写法:利用SUM(IF()) 生成列,WITH ROLLUP 生成汇总列和行,并利用 IFNULL将汇总行标题显示为总数

    SELECT IFNULL(student_name,'总数') AS student_name,
    	SUM(IF(`subject`='语文',score,0)) AS '语文',
    	SUM(IF(`subject`='数学',score,0)) AS '数学',
    	SUM(IF(`subject`='英语',score,0)) AS '英语',
    	SUM(IF(`subject`='特长加分',score,0)) AS '特长加分',
    	SUM(score) AS '总数' 
    FROM t_gaokao_score
    GROUP BY student_name WITH ROLLUP;
    

    查询结果:

    +--------------+--------+--------+--------+--------------+--------+
    | student_name | 语文   | 数学   | 英语   | 特长加分     | 总数   |
    +--------------+--------+--------+--------+--------------+--------+
    | 乔英子       |    121 |    106 |    146 |            0 |    373 |
    | 方一凡       |     70 |     90 |     59 |          200 |    419 |
    | 林磊儿       |    148 |    150 |    147 |            0 |    445 |
    | 陈哈哈       |    113 |    116 |     80 |            0 |    309 |
    | 总数         |    452 |    462 |    432 |          200 |   1546 |
    +--------------+--------+--------+--------+--------------+--------+
    5 rows in set, 1 warning (0.00 sec)
    

    三、领导又双叒叕@你改需求

      让你把分值转化为具体内容显示(优秀、良好、普通、差),430分以上重点大学,400分以上一本,350分及以上二本,350以下搬砖,该怎么写呢?

      真恶心,不说了,先淦饭🐶🐶~~(独门绝技:饭遁

      这里我们就需要case when嵌套一下了,看着高大上,其实就是普通的嵌套而已。在第一层查出分组后的各科分数,在第二层替换成等级即可。

    SELECT student_name,
    MAX(  
            CASE subject  
            WHEN '语文' THEN  
                (  
                    CASE  
                    WHEN score - (select avg(score) from t_gaokao_score where subject='语文') > 20 THEN  
                        '优秀'  
                    WHEN score - (select avg(score) from t_gaokao_score where subject='语文') > 10 THEN  
                        '良好'  
                    WHEN score - (select avg(score) from t_gaokao_score where subject='语文') >= 0 THEN  
                        '普通'  
                    ELSE  
                        '差'  
                    END  
                )  
            END  
        ) as '语文', 
    MAX(  
            CASE subject  
            WHEN '数学' THEN  
                (  
                    CASE  
                    WHEN score - (select avg(score) from t_gaokao_score where subject='数学') > 20 THEN  
                        '优秀'  
                    WHEN score - (select avg(score) from t_gaokao_score where subject='数学') > 10 THEN  
                        '良好'  
                    WHEN score - (select avg(score) from t_gaokao_score where subject='数学') >= 0 THEN  
                        '普通'  
                    ELSE  
                        '差'  
                    END  
                )  
            END  
        ) as '数学',
    MAX(  
            CASE subject  
            WHEN '英语' THEN  
                (  
                    CASE  
                    WHEN score - (select avg(score) from t_gaokao_score where subject='英语') > 20 THEN  
                        '优秀'  
                    WHEN score - (select avg(score) from t_gaokao_score where subject='英语') > 10 THEN  
                        '良好'  
                    WHEN score - (select avg(score) from t_gaokao_score where subject='英语') >= 0 THEN  
                        '普通'  
                    ELSE  
                        '差'  
                    END  
                )  
            END  
        ) as '英语',
    SUM(score) as '总分',
    (CASE WHEN SUM(score) > 430 THEN '重点大学'  
    	  WHEN SUM(score) > 400 THEN '一本'  
    	  WHEN SUM(score) > 350 THEN '二本'  
    	  ELSE '工地搬砖' 
    	  END ) as '结果'
    FROM t_gaokao_score 
    GROUP BY student_name 
    ORDER BY SUM(score) desc;
    

    我们来看一下输出结果:

    +--------------+--------+--------+--------+--------+--------------+
    | student_name | 语文   | 数学   | 英语   | 总分   | 结果         |
    +--------------+--------+--------+--------+--------+--------------+
    | 林磊儿       | 优秀   | 优秀   | 优秀   |    445 | 重点大学     |
    | 方一凡       ||||    419 | 一本         |
    | 乔英子       | 普通   || 优秀   |    373 | 二本         |
    | 陈哈哈       | 普通   | 普通   ||    309 | 工地搬砖     |
    +--------------+--------+--------+--------+--------+--------------+
    4 rows in set (0.00 sec)
    

    过来人的经验来看,老实孩子最吃亏,早知道他娘的走艺体了~

    四、结束语

      好了,SQL方面就是以上这些内容了,有疑问可以写在评论区,哈哥会在摸鱼的时候回复你~~`

      帮忙三连一下哦,比心ღ( ´・ᴗ・` )

    在这里插入图片描述

    附录:创建表结构&测试数据SQL

    表结构:

    DROP TABLE IF EXISTS `t_gaokao_score`;
    CREATE TABLE `t_gaokao_score`  (
      `id` int(0) NOT NULL AUTO_INCREMENT,
      `student_name` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '学生姓名',
      `subject` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '科目',
      `score` double NULL DEFAULT NULL COMMENT '成绩',
      PRIMARY KEY (`id`) USING BTREE
    ) ENGINE = InnoDB AUTO_INCREMENT = 11 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;
    

    导入测试数据

    INSERT INTO `t_gaokao_score` VALUES 
    (1, '林磊儿', '语文', 148),
    (2, '林磊儿', '数学', 150),
    (3, '林磊儿', '英语', 147),
    (4, '乔英子', '语文', 121),
    (5, '乔英子', '数学', 106),
    (6, '乔英子', '英语', 146),
    (7, '方一凡', '语文', 70),
    (8, '方一凡', '数学', 90),
    (9, '方一凡', '英语', 59),
    (10, '方一凡', '特长加分', 200),
    (11, '陈哈哈', '语文', 109),
    (12, '陈哈哈', '数学', 92),
    (13, '陈哈哈', '英语', 80);
    
    展开全文
  • 在 SQL 数据库中,生成(Generated Column)是指由表中其他字段计算得到的,因此也称为计算(Computed Column)。 本文介绍各种主流数据库对于生成/计算的实现,包括 Oracle、MySQL、SQL Server、...

    生成列

    什么是生成列?

    在 SQL 数据库中,生成列(Generated Column)是指由表中其他字段计算得到的列,因此也称为计算列(Computed Column)

    生成列存在两种类型:存储(stored)生成列和虚拟(virtual)生成列。存储生成列和普通列类似,在插入或者更新数据时自动计算并且存储该列的值,需要占用存储空间;虚拟生成列不需要占用存储空间,只在读取时进行计算。因此,虚拟生成列就像是一个视图(字段的视图),而存储生成列就像是一个物化视图(实时更新)。

    ⚠️我们无法直接插入或者更新生成列的值,它的值由数据库自动生成和更新。

    生成列的常见用途包括:

    • 虚拟生成列可以用来简化和统一查询。我们可以将复杂的查询条件定义成一个生成列,然后在查询该表时使用,从而确保所有的查询都使用相同的判断条件。
    • 存储生成列可以作为查询条件的物化缓存(materialized cache),减少查询时的计算成本。
    • 生成列可以模拟函数索引:定义一个基于函数表达式的生成列并且创建索引。对于存储型的生成列,这种方式需要占用更多的存储。

    各种主流 SQL 数据库对于生成列/计算列的支持如下:

    生成列OracleMySQLSQL ServerPostgreSQLSQLite
    存储生成列✔️✔️✔️✔️
    虚拟生成列✔️✔️✔️✔️
    约束支持主键约束
    NOT NULL
    UNIQUE
    CHECK
    外键约束
    主键约束
    NOT NULL
    UNIQUE
    CHECK
    外键约束
    主键约束*
    NOT NULL*
    UNIQUE*
    CHECK*
    外键约束*
    主键约束
    NOT NULL
    UNIQUE
    CHECK
    外键约束

    NOT NULL
    UNIQUE
    CHECK
    外键约束
    索引支持✔️✔️*✔️*✔️✔️

    * 参考下文中的具体讨论。

    Oracle 中的虚拟列

    Oracle 11g 开始支持虚拟的生成列,简称虚拟列。定义虚拟列的语法如下:

    column [ datatype [ COLLATE column_collation_name ] ]
      [ GENERATED ALWAYS ] AS (column_expression) [ VIRTUAL ]
    

    如果省略了 datatype,虚拟列的类型由表达式 column_expression 决定;GENERATED ALWAYS AS表示定义生成列;表达式只能包含当前表中的字段、常量以及确定性的函数;VIRTUAL表示虚拟列,可以省略。以下是一个创建虚拟列的示例:

    CREATE TABLE t_circle(
       id INTEGER PRIMARY KEY,
       x NUMERIC(20,10) NOT NULL,
       y NUMERIC(20,10) NOT NULL,
       radius NUMERIC(20,10) NOT NULL,
       perimeter NUMERIC(20,10) GENERATED ALWAYS AS (2 * 3.14159265 * radius) VIRTUAL
    );
    
    ALTER TABLE t_circle ADD (area AS (3.14159265 * radius * radius));
    

    首先,使用CREATE TABLE语句为表 t_circle 创建了一个虚拟列 perimeter;然后使用ALTER TABLE语句为其增加了一个虚拟列 area。

    接下来我们插入一些数据:

    INSERT INTO t_circle(id, x, y, radius) VALUES (1, 2, 2, 5);
    SELECT * FROM t_circle;
    ID|X|Y|RADIUS|PERIMETER |AREA       |
    --|-|-|------|----------|-----------|
     1|2|2|     5|31.4159265|78.53981625|
    
    INSERT INTO t_circle(id, x, y, radius ,perimeter) VALUES (2, 0, 0, 1, 6.28318530);
    SQL Error [54013] [99999]: ORA-54013: INSERT operation disallowed on virtual columns
    

    第一个插入语句没有指定虚拟列的值,在查询时由数据库自动计算;第二个插入语句指定了虚拟列的值,执行失败。

    Oracle 中的虚拟列支持索引,我们为 t_circle 中的虚拟列创建两个索引:

    CREATE UNIQUE INDEX idx11 ON t_circle(perimeter);
    CREATE INDEX idx12 ON t_circle(area);
    

    除了支持索引之外,虚拟列还支持NOT NULLUNIQUE、主键、CHECK以及外键约束,但是不支持DEFAULT默认值。

    使用 Oracle 虚拟列需要注意以下事项:

    • 如果表达式 column_expression 引用了具有列级安全的字段,虚拟列不会继承基础列上的安全规则。此时,用户需要自己确保虚拟列数据的安全,可以为虚拟列再设置一个列级安全策略或者使用函数对数据进行模糊处理。例如,信用卡号通常会使用一个列级安全策略进行包含,允许客服中心的员工查看最后四位数字以便验证信息。此时,可以定义一个虚拟列保存信用卡号的后四位子串。
    • 基于虚拟列创建的索引等价于函数索引。
    • 不能直接更新虚拟列。因此,不能在UPDATE语句的SET子句中设置虚拟列。不过,可以在UPDATE语句的WHERE子句中使用虚拟列。同理,可以在DELETE语句的WHERE子句中使用虚拟列。
    • FROM子句中使用包含虚拟列的表的查询语句可以缓存结果,具体参考Oracle 官方文档
    • 表达式 column_expression 可以引用明确指定了 DETERMINISTIC 属性的 PL/SQL 函数。但是,如果随后替换了该函数的定义,基于虚拟列的对象不会失效。此时如果表中包含数据,而且虚拟列用于了约束、索引、物化视图或者查询结果缓存,访问虚拟列的查询可能返回不正确的结果。因此,为了替换虚拟列中的确定性函数:
      • 禁用然后再启用虚拟列上的约束。
      • 重建虚拟列上的索引。
      • 完全刷新基于虚拟列的物化视图。
      • 刷新访问了该虚拟列的查询结果缓存。
      • 重新收集该表的统计信息。
    • 虚拟列可以是 INVISIBLE 列,虚拟列的表达式中可以包含 INVISIBLE 列。

    Oracle 中的虚拟列存在以下限制:

    • 只能为关系型的堆表创建虚拟列,索引组织表、外部表、对象表、聚簇表以及临时表不支持虚拟列。
    • 虚拟列表达式 column_expression 存在以下限制:
      • 不能引用其他虚拟列。
      • 只能引用当前表中的列。
      • 可以引用确定性的自定义函数,但此时该虚拟列不能作为分区字段。
      • 表达式的结果必须是一个标量值。
    • 虚拟列不支持 Oracle 提供的数据类型、用户定义类型以及 LOB 和 LONG RAW 类型。
    • 虚拟列可以作为分区字段,但是作为分区字段的虚拟列中不能包含 PL/SQL 函数。

    参考文档:Oracle 官方文档

    MySQL 中的生成列

    MySQL 5.7 引入了生成列,支持虚拟和存储两种类型的生成列。定义生成列的语法如下:

    col_name data_type [GENERATED ALWAYS] AS (expr)
      [VIRTUAL | STORED] [NOT NULL | NULL]
      [UNIQUE [KEY]] [[PRIMARY] KEY]
      [COMMENT 'string']
    

    其中,GENERATED ALWAYS可以省略,AS定义了生成列的表达式;VIRTUAL表示创建虚拟生成列,虚拟列的值不会存储,而是在读取时BEFORE触发器之后立即计算;STORED表示存储生成列;默认创建的是VIRTUAL生成列。

    我们创建一个表 t_circle:

    CREATE TABLE t_circle(
       id INTEGER PRIMARY KEY,
       x NUMERIC(20,10) NOT NULL,
       y NUMERIC(20,10) NOT NULL,
       radius NUMERIC(20,10) NOT NULL,
       perimeter NUMERIC(20,10) AS (2 * 3.14159265 * radius)
    );
    
    ALTER TABLE t_circle ADD area NUMERIC(20,10) AS (3.14159265 * radius * radius) STORED;
    

    其中,perimeter 是一个虚拟的生成列;area 是一个存储的生成列。MySQL 生成列还支持NOT NULLUNIQUE、主键、CHECK以及外键约束,但是不支持DEFAULT默认值。

    MySQL 生成列的表达式必须遵循以下规则:

    • 允许使用常量、确定性的内置函数以及运算符。确定性函数意味着对于表中的相同数据,多次调用返回相同的结果,与当前用户无关。非确定性的函数包括 CONNECTION_ID()、CURRENT_USER()、NOW() 等。
    • 不允许使用存储函数和自定义函数。
    • 不允许使用存储过程和函数的参数。
    • 不允许使用变量(系统变量、自定义变量或者存储程序中的本地变量)。
    • 不允许子查询。
    • 允许引用表中已经定义的其他生成列;允许引用任何其他非生成列,无论这些列出现的位置在前面还是后面。
    • 不允许使用 AUTO_INCREMENT 属性。
    • 不允许使用 AUTO_INCREMENT 字段作为生成列的基础列。
    • 如果表达式的运算导致截断或者为函数提供了不正确的输入,CREATE TABLE 将会失败。

    另外,如果表达式的结果类型与字段定义中的数据类型不同,将会执行隐式的类型转换。

    接下来我们运行一些数据测试:

    INSERT INTO t_circle(id, x, y, radius) VALUES (1, 2, 2, 5);
    SELECT * FROM t_circle;
    id|x           |y           |radius      |perimeter    |area         |
    --|------------|------------|------------|-------------|-------------|
     1|2.0000000000|2.0000000000|5.0000000000|31.4159265000|78.5398162500|
    
    INSERT INTO t_circle(id, x, y, radius ,perimeter) VALUES (2, 0, 0, 1, 6.28318530);
    SQL Error [3105] [HY000]: The value specified for generated column 'perimeter' in table 't_circle' is not allowed.
    

    第一个插入语句没有指定生成列的值,由数据库自动计算;第二个插入语句为 perimeter 提供了数据,执行失败;不过可以使用DEFAULT关键字。

    MySQL 支持存储生成列的索引,InnoDB 还支持虚拟生成列的二级索引,具体参考 MySQL 官方文档 。我们使用以下语句为 t_circle 表的两个生成列分别创建两个索引:

    CREATE UNIQUE INDEX idx1 ON t_circle(perimeter);
    CREATE INDEX idx2 ON t_circle(area);
    

    另外,使用 MySQL 生成列还需要注意以下事项:

    • 对于CREATE TABLE ... LIKE语句,创建的新表将会保留原表中的生成列信息。
    • 对于CREATE TABLE ... SELECT语句,创建的新表不会保留查询语句的原表中的生成列信息;并且SELECT语句不能为目标表中的生成列赋值。
    • 允许基于生成列的分区,具体参考 MySQL 官方文档
    • 存储生成列上的外键约束不能为ON UPDATE操作指定CASCADESET NULL或者SET DEFAULT选项,也不能为ON DELETE操作指定SET NULL 或者SET DEFAULT选项。
    • 存储生成列的基础列上的外键约束也不能为ON UPDATE或者ON DELETE操作指定CASCADESET NULL或者SET DEFAULT选项。
    • 外键约束中的被引用字段不能是虚拟的生成列。
    • 触发器不能通过 NEW.col_name 或者 OLD.col_name 引用生成列。
    • 对于INSERTREPLACE以及UPDATE,如果要明确指定生成列的值,只能使用DEFAULT。视图中的生成列属于可更新列,但是也只能使用DEFAULT显式更新。

    参考文档:MySQL 官方文档

    SQL Server 中的计算列

    SQL Server 2005 增加了生成列的支持,称为计算列。计算列的完整定义如下:

    <computed_column_definition> ::=
    column_name AS computed_column_expression
    [ PERSISTED [ NOT NULL ] ]
    [
        [ CONSTRAINT constraint_name ]
        { PRIMARY KEY | UNIQUE }
            [ CLUSTERED | NONCLUSTERED ]
            [
                WITH FILLFACTOR = fillfactor
              | WITH ( <index_option> [ , ...n ] )
            ]
            [ ON { partition_scheme_name ( partition_column_name )
            | filegroup | "default" } ]
      
        | [ FOREIGN KEY ]
            REFERENCES referenced_table_name [ ( ref_column ) ]
            [ ON DELETE { NO ACTION | CASCADE } ]
            [ ON UPDATE { NO ACTION } ]
            [ NOT FOR REPLICATION ]
      
        | CHECK [ NOT FOR REPLICATION ] ( logical_expression )
    ]
    

    其中,AS表示定义一个计算列;PERSISTED表示需要存储该列的值,即存储型的计算列; 计算列的表达式可以使用其他非计算列、常量、函数、变量,但是不能使用子查询或别名数据类型。SQL Server 中的计算列支持主键、UNIQUE约束,存储计算列还支持NOT NULL、外键以及CHECK约束;但是计算列不支持DEFAULT默认值,也不能作为外键中的被引用字段。

    我们创建一个表 t_circle:

    CREATE TABLE t_circle(
       id INTEGER PRIMARY KEY,
       x NUMERIC NOT NULL,
       y NUMERIC NOT NULL,
       radius NUMERIC NOT NULL,
       perimeter NUMERIC AS (2 * 3.14159265 * radius),
       area NUMERIC AS (3.14159265 * radius * radius) PERSISTED
    );
    
    ALTER TABLE t_circle ADD dt AS GETDATE();
    

    其中,perimeter 是一个虚拟的计算列;area 是一个存储的计算列;ALTER TABLE语句增加了第三个计算列,使用了一个不确定性函数 GETDATE()。

    我们测试一下数据插入和查询:

    INSERT INTO t_circle VALUES (1, 2, 2, 5);
    SELECT * FROM t_circle;
    id|x|y|radius|perimeter  |area     |dt                 |
    --|-|-|------|-----------|---------|-------------------|
     1|2|2|     5|31.41592650|78.539816|2020-02-03 19:02:30|
    
    INSERT INTO t_circle(id, x, y, radius ,perimeter) VALUES (2, 0, 0, 1, 6.28318530);
    SQL Error [271] [S0001]: The column "perimeter" cannot be modified because it is either a computed column or is the result of a UNION operator.
    

    第一个插入语句没有指定生成列的值,由数据库自动计算;查询返回了所有的字段,多次运行的话 dt 字段将会返回不同的日期;第二个插入语句为 perimeter 提供了数据,执行失败;INSERTUPDATE语句不能为生成列指定值。

    SQL Server 支持基于计算列的索引,但是需要满足一定的条件:

    create unique index idx1 on t_circle(perimeter);
    create index idx2 on t_circle(area);
    
    create index idx3 on t_circle(dt);
    SQL Error [2729] [S0001]: Column 'dt' in table 't_circle' cannot be used in an index or statistics or as a partition key because it is non-deterministic.
    

    前两个计算列不包含不确定性的函数,可以创建索引,或者 PRIMARY KEY 和 UNIQUE 约束;但是 dt 列不支持索引,因为它包含了不确定性的函数,每次调用时它的值可能发生变化。

    参考文档:SQL Server 官方文档

    PostgreSQL 中的存储生成列

    PostgreSQL 12 提供了生成列,目前只支持存储型的生成列。通过在CREATE TABLE或者ALTER TABLE语句中指定字段的GENERATED ALWAYS AS约束来创建一个生成列:

    column_name data_type [ COLLATE collation ]
    [ CONSTRAINT constraint_name ]
    GENERATED ALWAYS AS ( generation_expr ) STORED
    

    其中,GENERATED ALWAYS AS表示创建生成列;generation_expr 指定了生成列的表达式;STORED意味着需要存储该列的值。例如以下语句:

    CREATE TABLE t_circle(
       id INTEGER PRIMARY KEY,
       x NUMERIC NOT NULL,
       y NUMERIC NOT NULL,
       radius NUMERIC NOT NULL,
       perimeter NUMERIC GENERATED ALWAYS AS (2 * 3.14159265 * radius) STORED
    );
    
    ALTER TABLE t_circle ADD area NUMERIC GENERATED ALWAYS AS (3.14159265 * radius * radius) STORED;
    

    首先,CREATE TABLE语句为表 t_circle 定义了一个生成列 perimeter,表示圆的周长。然后,使用ALTER TABLE语句增加一个生成列 area ,表示圆的面积。

    接下来我们插入一些数据:

    INSERT INTO t_circle VALUES (1, 2, 2, 5);
    SELECT * FROM t_circle;
    id|x|y|radius|perimeter  |area       |
    --|-|-|------|-----------|-----------|
     1|2|2|     5|31.41592650|78.53981625|
    
    INSERT INTO t_circle(id, x, y, radius ,perimeter) VALUES (2, 0, 0, 1, 6.28318530);
    SQL Error [42601]: ERROR: cannot insert into column "perimeter"
      Detail: Column "perimeter" is a generated column.
    

    第一个插入语句没有指定生成列的值,由数据库自动计算;第二个插入语句为 perimeter 提供了数据,执行失败;INSERTUPDATE语句不能为生成列指定值,不过可以使用DEFAULT关键字。

    PostgreSQL 中的生成列支持索引,我们使用以下语句为 t_circle 表的两个生成列分别创建两个索引:

    create unique index idx1 on t_circle(perimeter);
    create index idx2 on t_circle(area);
    

    第一个索引 idx1 是唯一索引,第二个索引 idx2 是普通索引。

    除了支持索引之外,PostgreSQL 生成列还支持NOT NULLUNIQUE、主键、CHECK以及外键约束,但是不支持DEFAULT默认值。另外,在 PostgreSQL 中使用生成列存在一些限制:

    • 生成列的表达式只能使用不可变(IMMUTABLE)函数,不能使用子查询或者引用非当前数据行的任何其他数据。
    • 生成列的表达式不能引用其他的生成列。
    • 生成列的表达式不能引用除了 tableoid 之外的其他系统字段。
    • 生成列不能指定默认值或者标识列。
    • 生成列不能作为分区键的一部分。
    • 外部表可以支持生成列,参考 CREATE FOREIGN TABLE

    使用生成列时还需要注意以下事项:

    • 生成列的访问权限控制与其表达式中引用的基础列无关。因此,一个用户可能无法读取基础列中的数据,但是可以读取生成列的数据,实现特定的数据安全访问。
    • 从逻辑上讲,生成列的值在 BEFORE 触发器之后进行更新。在 BEFORE 触发器中对基础列的修改会同步到生成列中;但是反过来,在 BEFORE 触发器中不能访问生成列的值。

    参考文档:PostgreSQL 生成列

    SQLite 中的生成列

    SQLite 3.31.0 开始支持生成列,语法上通过“GENERATED ALWAYS”字段约束实现:

    SQlite
    其中的GENERATED ALWAYS可以省略;STORED表示存储型的生成列,VIRTUAL表示虚拟型的生成列,省略的话默认为后者。例如以下示例表:

    CREATE TABLE t_circle(
       id INTEGER PRIMARY KEY,
       x NUMERIC NOT NULL,
       y NUMERIC NOT NULL,
       radius NUMERIC NOT NULL,
       perimeter NUMERIC GENERATED ALWAYS AS (2 * 3.14159265 * radius) VIRTUAL,
       area NUMERIC GENERATED ALWAYS AS (3.14159265 * radius * radius) STORED
    );
    

    其中 radius 表示圆的半径;perimeter 是一个虚拟生成列,表示圆的周长;area 是一个存储生成列,表示圆的面积。

    ⚠️SQLite 中的ALTER TABLE ADD COLUMN命令只能增加VIRTUAL生成列,不支持STORED生成列。

    接下来我们插入一些数据:

    sqlite> INSERT INTO t_circle VALUES (1, 2, 2, 5);
    sqlite> SELECT * FROM t_circle;
    1|2|2|5|31.4159265|78.53981625
    
    sqlite> INSERT INTO t_circle(id, x, y, radius ,perimeter) VALUES (2, 0, 0, 1, 6.28318530);
    Error: cannot INSERT into generated column "perimeter"
    

    第一个插入语句执行成功,查询返回了两个生成列的值;第二个插入语句尝试指定生成列的值,返回了错误。

    SQLite 中的生成列支持以下功能:

    1. 生成列可以指定数据类型。SQLite 使用与普通字段相同的类型亲和性将表达式的结构转换为该类型。
    2. 生成列可以像普通字段一样指定 NOT NULL、CHECK 以及 UNIQUE 约束和外键约束。
    3. 生成列可以像普通字段一样支持索引。
    4. 生成列的表达式可以引用表中的任何列,包括其他的生成列,只要该表达式不会直接或者间接引用自身。
    5. 生成列可以出现在表定义中的任何位置。生成列可以出现在普通列的中间,不一定需要位于字段列表的最后。

    我们可以使用以下语句为 t_circle 表的两个生成列分别创建两个索引:

    sqlite> create unique index idx1 on t_circle(perimeter);
    sqlite> create index idx2 on t_circle(area);
    

    另一方面,SQLite 中的生成列目前还存在一些限制:

    1. 生成列不能指定默认值(DEFAULT)。生成列的值总是由 AS 关键字后的表达式决定。
    2. 生成列不能作为 PRIMARY KEY 的一部分。将来的 SQLite 可能会支持基于 STORED 生成列的主键。
    3. 生成列的表达式只能引用常量字面值和其他字段,或者确定性的标量函数。表达式中不能使用子查询、聚合函数、窗口函数或者表函数。
    4. 生成列的表达式可以引用其他的生成列,但是不能引用直接或者间接依赖于它自身的其他生成列。
    5. 生成列的表达式不能直接引用 ROWID,但是可以引用 INTEGER PRIMARY KEY 列,虽然两者效果相同。
    6. 每个表至少需要包含一个非生成的普通列。
    7. ALTER TABLE ADD COLUMN 语句不支持 STORED 生成列,但是可以添加 VIRTUAL 生成列。
    8. 生成列的数据类型和字符排序顺序由字段定义中的数据类型和 COLLATE 子句决定,与 GENERATED
      ALWAYS AS 表达式的数据类型和字符排序顺序无关。

    参考文档:SQLite 官方文档

    欢迎关注❤️、点赞👍、转发📣!

    展开全文
  • 什么意思 请求扩充好友列表什么梗。八宝网带来相关介绍。扩什么意思1、cqy是「处 Q 友」的拼音缩写,就是在 QQ 上互加好友,在贴吧上就叫 cby,也可以说是 cpy(处朋友)。如果希望关系更上一层楼就 cdx(处对象)...
  • 我也是菜鸟,也是新手,一起学习,一起进步,加油; 1 ... showindexfromtable_name ...下面介绍下 这个命令显示的结果的含义: 1 |Table| Non_unique | Key_name | Seq_in_ind...
  • https://zhidao.baidu.com/question/246098491763043084.html
  • Oracle中伪就像一个表,但是它并没有储存在表中。 伪可以从表中查询,但不能插入,更新和删除它们的值,常用的伪有rowid和rownum。 ROWID rowid是表中行的存储地址,该地址可以唯一地标识数据库中的每...
  • 线图、nomogram到底是什么东西?如何实施?如何解读? 首先:线图、nomogram是logistic回归模型的具象化,就是可视化了的机器学习logistic模型; 其次:本来作者想让一切变得更加直观(门外汉也可以理解模型)...
  • axis=0指的是逐行,axis=1指的是逐 df=pd.DataFrame([[1,1,1,1],[2,2,2,2],[3,3,3,3]]) print(df) ...df.mean(axis=1)# 按照意思axis取1意思是逐计算平均值,那么其实算出来的是行平均mean of row Ou...
  • 。Column()函数是什么意思SQL语句中column的意思和常用法 是怎么的 ???sql:column() 函数 (XQuery) 如主题在 XML 内部绑定关系数据中所述,当使用 XML 数据类型方法在 XQuery 内显示关系值时,可以使用 sql:...
  • mysql的索引 优化 前导

    千次阅读 2018-05-04 10:13:48
    --组合索引之--前导----------------------------------------------------------------1)对于where子句中出现的要想索引生效,会有一些限制,这就和前导有关。2)所谓前导,就是在创建复合索引语句的第一...
  • 在Oracle 11g的官方文档中,指出一张表最大支持的个数是1000个,我们可以通过创建一张超过1000个的测试表来验证这个问题。测试11. 我们创建一张表,包含1个字段。2. 通过PL/SQL块,循环999次,每次都使用alter ...
  • (excle sqrt)excel中的SQRT是什么意思

    千次阅读 2021-07-28 08:15:17
    excel中的SQRT是什么意思?sqrt:表示求开平方。例如:100开平方10^表示多少次方。例如:5^2=25,*表示乘号。字母C5表示C的第5个的位置对应的数字。在excel中怎样开根号第一步:打Excel应用。第二步:新建一个工作...
  • Mysql 5.7 的‘虚拟’是做什么?

    万次阅读 多人点赞 2016-08-16 09:08:49
    虚拟 Generated (Virtual) Columns 对于它的用途,我们通过一个场景来说明 假设有一个表,其中包含一个 date 类型的 `SimpleDate` date SimpleDate 是一个常用的查询字段,并需要对其执行日期函数,例如 ...
  • subplot(2,3,1)啥意思

    千次阅读 2020-12-11 12:14:45
    展开全部subplot(2,3,1)是指一个2行3的图中从左到右从上到下的第一个位置。subplot将多个图画到一个平面上32313133353236313431303231363533e78988e69d8331333431376634的工具。其中,m表示是图排成m行,n表示图排...
  • 式数据库简介

    千次阅读 2020-06-26 21:13:35
    什么是式数据库? 数据存储区也称为面向的DBMS或式数据库管理系统。存储DBMS将数据存储在而不是行中。关系数据库管理系统(RDBMS)将行中的数据和数据属性存储为标题。基于行的DBMS和基于的DBMS都...
  • Hbase簇简单介绍

    万次阅读 2017-12-16 21:04:00
    二、 逻辑视图 ...划分为若干个族(row family) Row Key column-family1 column-family2 column-family3 column1 column1 column1 column2 column3 column1 key1 t1:abc
  • 原始数据和要求如下: !... 也就是说要求得到的二月份的数据是是原有的一二月的总和,三月份的数据是原有数据一二三月的总和,以此类推 ...恳请大神出手相助,看看用python怎么样把这数据按要求弄出来,谢了
  • HTML表格的使用 与 跨行跨

    千次阅读 2021-06-12 04:19:38
    col为意思,colspan即跨 单元格内容 代码示例: 姓名 年龄 性别 张三 18 小红 18 女 第二行年龄18跨两列,所以要把同一行的后一删除。跨两列就是连占两个格子。所以要删掉多余的 效果图: 2、跨行:跨行是...
  • MySQL 5.7 虚拟 (virtual columns)

    千次阅读 2018-03-01 15:37:21
    MySQL 5.7 虚拟 (virtual columns)Generated Column在MySQL 5.7中,支持两种Generated Column,即Virtual Generated Column和Stored Generated Column,前者只将Generated Column保存在数据字典中(表的元数据)...
  • 很多同学在使用wireshark的时候,想把某一个字段作为单独的一来显示,下面教大家一下怎么做。 通常wireshark默认的配置中,是没有ttl这一,下面我们在加一下 没有修改的之前,如下图 添加 对着TTL这个这段...
  • 很多朋友在用mysql进行调优的时候都肯定会用到explain来看select语句的执行情况,这里简单介绍结果中两个的含义。1 type官方的说法,说这表示的是“访问类型”,更通俗一点就是:mysql找到需要的数据行的方式。...
  • 只匹配索引第一的字符前缀 匹配范围值 值匹配第一的值范围 精确匹配某一,并全职匹配另外一 索引第一全值匹配,第二前缀匹配 B-TREE索引使用限制 必须从最左开始查找,否则索引无法使用 不能跳过索引...
  • column是什么意思

    千次阅读 2021-01-19 08:10:52
    sheet1!$C$7:$C$112中查找$C12的值,并返回同行第column()-column($M12)+11的...column()-column($M12)+11与公式所在相关,column()是公式所在标,column($M12)是M标,也就是13,column()-column($M12...
  • 利用jquery实现的表格冻结(固定)功能

    万次阅读 热门讨论 2018-04-23 13:51:32
    有时候希望一个表格当内容超出了之后,有滑动条,并且希望在滑动的时候某几列固定不动,下面介绍一种利用jquery动态修改的属性的方法实现的冻结(固定)功能:下面的jquery文件路径读者可以自己根据自己的情况...
  • 数组 || 按行按存储【转载】

    千次阅读 2018-09-23 23:27:04
    写了一下才发现数组存储还分按行和按的存储方式。 个人觉得答案有个应该是这样的: 感觉不难,但很容易写错。 下面PO上一些转载来的关于数组按行、按存储的小知识: 二维数组 二维数组Amn可视为由m个行...
  • 千次阅读 2018-03-07 21:41:27
    HBase式存储格式允许用户存储大量的信息到相同的表中,而在RDBMS模型中,大量信息则需要切分成多张表存储。通常的数据库范式化规则不适合HBase,因此HBase中表的数量相对较少。 虽然理论上HBase表是由行和组成...
  • Notepad++的编辑模式_小技巧

    千次阅读 2019-03-28 14:41:25
    但是如果被粘贴的内容,像后面的同一中,既有1个字符宽度的,又有2个和3个字符宽度的,甚至其他更多字符的,那么一个完全的,就被分为多个不连续的,可供编辑操作的了。 那结果就又几乎回到了之前的手工...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 488,008
精华内容 195,203
关键字:

列是啥意思