SQL Server中别名与临时表辨析及两段SQL对象类型确认
SQL Server对象辨析与问题解答
Alright,咱们先把SQL Server里的别名、临时表这些核心对象唠明白,再逐个拆解你的问题~
核心对象快速区分
- 别名(Alias):给表、列或者子查询结果集起的“小名”,纯粹是为了简化SQL、提升可读性,作用范围仅限当前查询语句。分两种:列别名(给查询结果的列改名)、表/派生表别名(给数据源起简称)。
- 临时表:存放在
tempdb里的临时数据容器,分两类:- 局部临时表:以
#开头,只有创建它的会话能看见,会话一关自动消失; - 全局临时表:以
##开头,所有数据库会话都能访问,直到所有用到它的会话结束才会被销毁。
- 局部临时表:以
- 派生表:由子查询生成的临时结果集,本质是“临时数据源”,必须给它起别名才能被外层查询引用,这个别名就属于表别名的范畴。
问题1:SecondHighestSalary是列名还是表名?
先看你给出的SQL语句:
select ( select distinct salary from employee order by salary desc offset 1 rows fetch next 1 rows only ) SecondHighestSalary;
这里的SecondHighestSalary是列别名。
解释一下:括号里的是个标量子查询——它只会返回单个数值(员工的第二高薪资),整个子查询作为SELECT子句里的一个列表达式,后面的SecondHighestSalary就是给这个列表达式起的别名,用来指定最终查询结果里这一列的显示名称。它既不是表名,也和临时表没关系,就是给单列结果起的“外号”。
问题2:e是什么对象?
再看这条SQL:
select Max(Salary) as SecondHighestSalary from (select Salary, rank() over (order by Salary desc) as 'rank' from Employee ) e where rank = 2
这里的e是派生表的别名(属于表别名的一种)。
具体来说:括号里的(select Salary, rank() over (order by Salary desc) as 'rank' from Employee )是一个子查询,它运行后会生成一个临时的结果集(包含薪资和对应的排名),这个临时结果集就是派生表。因为外层查询需要引用这个派生表里的列(比如rank列),所以必须给它起个别名e,方便外层查询调用。它不是真实存在的表,也不是列名,就是给这个临时数据源起的简称。
内容的提问来源于stack exchange,提问作者itstoocold




