4.3.4 查询语法基础(2)
从指定了别名的表中引用列会导致混乱,这与代码编写者有关。正是的规则是只存在模糊的列,或者多个表中都有的列才需要表别名。所以在技术上,可以把查询变为:
- SELECT PC.Name AS Category
- ,PSC.Name AS SubCategory
- ,P.Name AS ProductName
- ,OrderDate
- ,OrderQty
- ,UnitPrice
- FROM Sales.SalesOrderHeader AS SOH
- INNER JOIN Sales.SalesOrderDetail AS SOD
- ON SOH.SalesOrderID = SOD.SalesOrderID
- INNER JOIN Production.Product AS P
- ON SOD.ProductID = P.ProductID
- INNER JOIN Production.ProductSubCategory AS PSC
- ON P.ProductSubCategoryID = PSC.ProductSubCategoryID
- INNER JOIN Production.ProductCategory AS PC
- ON PSC.ProductCategoryID = PC.ProductCategoryID
- WHERE SOH.OrderDate BETWEEN '1/1/2003' AND '12/31/2003'
- ORDER BY PC.Name
- ,PSC.Name
- ,P.Name
注意在这个例子中,对OrderDate、OrderQty和UnitPrice列没有加上它们的源表。这不是好的编程方式,因为如果不熟悉数据库结构,就很难确定OrderDate、OrderQty和UnitPrice列来自哪个表:它们是来自SalesOrderHeader表,还是SalesOrderDetail表呢?因此只要查询引用了多个表,就应总是给列名提供源表或表的别名。
如上一章所述,AS关键字几乎是必选的。大多数SQL程序员都使用该关键字给列指定别名,而不是给表指定别名。给列使用AS关键字可以使代码更容易理解。虽然给表使用这个关键字不会降低可读性,但是否有助于提高可读性就不敢肯定了。重要的是应保持一致。
现在还要注意,只要使用了T-SQL关键字,该关键字就是全大写形式,虽然这不是必须的。T-SQL对代码编写格式没有特殊的要求,只要关键字拼写正确即可。但这种灵活性不应是编写格式混乱的代码的一个借口。格式正确的代码很容易阅读和调试。但因为大写与小写的语句都是可接受的,所以查询也可以写成:
- select Name, StandardCost from Production.Product
上面的语句执行起来没有问题,但写成下面的形式则更易读:
- SELECT Name, StandardCost FROM Production.Product
如果使用的工具没有给T-SQL提供彩色编码功能,就应采用这种格式。另外,有时需要处理数据库中已配置为区分大小写的数据。此时,如果表名是Product,则从product表中选择数据就会出错。
最后要讨论的格式化主题是缩进和逗号。缩进使代码更容易阅读,让代码的外观更为专业化这很重要。如果你像找一样每天阅读大量代码,就会理解为什么程序员会把许多精力放在使代码尽可能容易阅读上。至于逗号,注意在把列表放在多个行上时,每一行的开头而不是结尾都有一个逗号。这与读者在学校中学到的知识不同-逗号当然应放在行尾,而不是行头。在T-SQL中,把逗号放在行头的好处在于:在开发过程中便于删除或注释掉该行。例如,在前面的例子中,要注释掉或删除UnitPrice列,使查询不再返回price value(代码注释参见本章后面的内容):
- SELECT PC.Name AS Category
- ,PSC.Name AS SubCategory
- ,P.Name AS ProductName
- ,SOH.OrderDate
- ,SOD.OrderQty
- -- ,SOD.UnitPrice
- FROM Sales.SalesOrderHeader AS SOH
- INNER JOIN Sales.SalesOrderDetail AS SOD
- ON SOH.SalesOrderID = SOD.SalesOrderID
- INNER JOIN Production.Product AS P
- ON SOD.ProductID = P.ProductID
- INNER JOIN Production.ProductSubCategory AS PSC
- ON P.ProductSubCategoryID = PSC.ProductSubCategoryID
- INNER JOIN Production.ProductCategory AS PC
- ON PSC.ProductCategoryID = PC.ProductCategoryID
- WHERE SOH.OrderDate BETWEEN '1/1/2003' AND '12/31/2003'
- ORDER BY PC.Name
- ,PSC.Name
- ,P.Name
在UnitPrice字段的前面加上两个短横线,就可以从查询中删除该字段。但如果逗号放在行尾,就会破坏查询,因为可能会有一个行尾的逗号没有指定相关的列存在:
- SELECT PC.Name AS Category,
- PSC.Name AS SubCategory,
- P.Name AS ProductName,
- SOH.OrderDate,
- SOD.OrderQty,
- -- SOD.UnitPrice
- FROM Sales.SalesOrderHeader AS SOH
- …
- MSG 156, Level 15, State 1, Line 7
- Incorrect systax near the keyword 'FROM'