使用表别名进行选择
SELECT e.Fname, e.LName
FROM Employees e
Employees 表在表名后直接给出别名 e
。这有助于消除多个表具有相同字段名称的情况下的歧义,并且你需要具体说明要从哪个表返回数据。
SELECT e.Fname, e.LName, m.Fname AS ManagerFirstName
FROM Employees e
JOIN Managers m ON e.ManagerId = m.Id
请注意,一旦定义了别名,就不能再使用规范表名。即
SELECT e.Fname, Employees.LName, m.Fname AS ManagerFirstName
FROM Employees e
JOIN Managers m ON e.ManagerId = m.Id
会抛出错误。
值得注意的是,表别名 - 更正式的’范围变量’ - 被引入到 SQL 语言中以解决由 INNER JOIN
引起的重复列问题。1992 年的 SQL 标准通过引入 NATURAL JOIN
(在 mySQL,PostgreSQL 和 Oracle 中实现但在 SQL Server 中尚未实现)纠正了此早期的设计缺陷,其结果从未具有重复的列名。上面的例子很有趣,因为这些表连接在具有不同名称的列(Id
和 ManagerId
)上,但不应该在具有相同名称的列(LName
,FName
)上连接,需要重命名要执行的列在加入之前 :
SELECT Fname, LName, ManagerFirstName
FROM Employees
NATURAL JOIN
( SELECT Id AS ManagerId, Fname AS ManagerFirstName
FROM Managers ) m;
请注意,虽然必须为 dervied 表声明别名/范围变量(否则 SQL 将引发错误),但在查询中实际使用它是没有意义的。