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

时间:2009-09-13 04:35:28

标签: 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)“从视图中选择时重命名列”是什么意思?

2 个答案:

答案 0 :(得分:1)

我认为认证指南中的问题措辞不当。当您从视图中进行选择时,可以为列提供显式名称,这样可以:

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

问题不在于明确地为列提供别名。问题在于:如果您依赖于此而不是使用不同的列名定义视图,并且视图由一个连接组成,使得列名不明确,则会遇到麻烦:

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

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

SELECT a FROM MyView;

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

因此,您必须在视图定义中拥有一组不同的列名,在查询视图时,这些名称与它们不同是不够的。

这就是我认为认证指南问题措辞不当的原因。它不是显式重命名列,而是确保视图的列具有不同的名称。这是重命名列的常见原因,因此编写问题的人可能就是这样写的原因。


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

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

答案 1 :(得分:0)

通过“选择时重命名”,它们肯定意味着类似SELECT a AS b FROM theview等。它不适用于“为列提供显式名称”的给定任务的原因是不需要显式,在视图中明确a,您可以“重命名”...除非您已经通过方法(a)或(b)[[在这种情况下您]消除了歧义重命名“这样,但这几乎是次要问题! - )]。