MySQL 认证指南练习 Qn - View 的列名

标签 mysql sql view

问题是

Which of the following methods for providing explicit names for the columns in a view work?

a. Include a column list
b. Provide column aliases in the view SELECT statement
c. Rename the columns when you select from the view

回答

a. Works: Include a column list
b. Works: Provide column aliases in the view SELECT statement
c. Does not work: Rename the columns when you select from the view

关于 (c) “从 View 中选择时重命名列”是什么意思?

最佳答案

我认为认证指南中的问题措辞不当。当您从 View 中进行选择时,您可以为列指定显式名称,这很有效:

CREATE VIEW MyView AS SELECT a, b, c FROM MyTable;
SELECT a AS d, b AS e, c AS f FROM MyView;

问题不在于显式地为列指定别名。这就是问题所在:如果您依赖于此而不是定义具有不同列名的 View ,并且该 View 由一个连接组成,使得列名不明确,那么您就会遇到麻烦:

CREATE VIEW MyView AS 
  SELECT m.a, m.b, m.c, o.a, o.b, o.c 
  FROM MyTable m JOIN OtherTable o;

这不是一个有效的 View ,因为在 View 定义中,所有的列名必须是不同的。例如,查询 View 时会得到不明确的结果:

SELECT a FROM MyView;

这是选择第一个 a 列还是第二个 a 列?

因此您必须在 View 定义中有一组不同的列名,这不足以在您查询 View 时使它们不同。

这就是我认为认证指南问题措辞不当的原因。这与显式重命名列无关,而是确保 View 的列具有不同的名称。这是重命名列的常见原因,所以这可能就是写问题的人那样写的原因。


问题中提到的任何其他技术都可以解决歧义:

CREATE VIEW MyView (a, b, c, d, e, f) AS 
  SELECT m.a, m.b, m.c, o.a, o.b, o.c 
  FROM MyTable m JOIN OtherTable o;

CREATE VIEW MyView AS 
  SELECT m.a, m.b, m.c, o.a AS d, o.b AS e, o.c AS f 
  FROM MyTable m JOIN OtherTable o;

无论哪种方式,您都会得到别名列:

SELECT * FROM MyView; -- returns result with columns a, b, c, d, e, f

关于MySQL 认证指南练习 Qn - View 的列名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1416853/

相关文章:

sql - 如何将单列转置为单行行

android - 使用 Path 绘制圆形扇区

MySQL View,从存储过程获取结果

sql - 连接两个表并在一行中合并多个关联

mysql - 在 MySql 中使用 SQL 将当前时间与连续时间进行比较

mysql - 如何获取多个不同时间范围的唯一值,其中 exec_datetime >= NOW() - INTERVAL n DAY?

如果任何语句失败,将回滚的 SQL 查询

java - 如何启动SQL Server?

php - 如何通过添加从 HTML 表单收到的数字来更新 SQL 中的表字段?

python - Python 的 MySQL 模块