4.3.4 查询语法基础(2)

从指定了别名的表中引用列会导致混乱,这与代码编写者有关。正是的规则是只存在模糊的列,或者多个表中都有的列才需要表别名。所以在技术上,可以把查询变为:

  1. SELECT PC.Name AS Category  
  2.       ,PSC.Name AS SubCategory  
  3.       ,P.Name AS ProductName  
  4.       ,OrderDate  
  5.       ,OrderQty  
  6.       ,UnitPrice  
  7. FROM   Sales.SalesOrderHeader AS SOH  
  8.     INNER JOIN Sales.SalesOrderDetail AS SOD   
  9.        ON SOH.SalesOrderID = SOD.SalesOrderID  
  10.     INNER JOIN Production.Product AS P   
  11.        ON SOD.ProductID = P.ProductID  
  12.     INNER JOIN Production.ProductSubCategory AS PSC  
  13.        ON P.ProductSubCategoryID = PSC.ProductSubCategoryID   
  14.     INNER JOIN Production.ProductCategory AS PC  
  15.        ON PSC.ProductCategoryID = PC.ProductCategoryID  
  16. WHERE SOH.OrderDate BETWEEN '1/1/2003' AND '12/31/2003' 
  17. ORDER BY PC.Name 
  18.         ,PSC.Name 
  19.         ,P.Name 

注意在这个例子中,对OrderDate、OrderQty和UnitPrice列没有加上它们的源表。这不是好的编程方式,因为如果不熟悉数据库结构,就很难确定OrderDate、OrderQty和UnitPrice列来自哪个表:它们是来自SalesOrderHeader表,还是SalesOrderDetail表呢?因此只要查询引用了多个表,就应总是给列名提供源表或表的别名。

如上一章所述,AS关键字几乎是必选的。大多数SQL程序员都使用该关键字给列指定别名,而不是给表指定别名。给列使用AS关键字可以使代码更容易理解。虽然给表使用这个关键字不会降低可读性,但是否有助于提高可读性就不敢肯定了。重要的是应保持一致。

现在还要注意,只要使用了T-SQL关键字,该关键字就是全大写形式,虽然这不是必须的。T-SQL对代码编写格式没有特殊的要求,只要关键字拼写正确即可。但这种灵活性不应是编写格式混乱的代码的一个借口。格式正确的代码很容易阅读和调试。但因为大写与小写的语句都是可接受的,所以查询也可以写成:

  1. select Name, StandardCost from Production.Product 

上面的语句执行起来没有问题,但写成下面的形式则更易读:

  1. SELECT Name, StandardCost FROM Production.Product 

如果使用的工具没有给T-SQL提供彩色编码功能,就应采用这种格式。另外,有时需要处理数据库中已配置为区分大小写的数据。此时,如果表名是Product,则从product表中选择数据就会出错。

最后要讨论的格式化主题是缩进和逗号。缩进使代码更容易阅读,让代码的外观更为专业化这很重要。如果你像找一样每天阅读大量代码,就会理解为什么程序员会把许多精力放在使代码尽可能容易阅读上。至于逗号,注意在把列表放在多个行上时,每一行的开头而不是结尾都有一个逗号。这与读者在学校中学到的知识不同-逗号当然应放在行尾,而不是行头。在T-SQL中,把逗号放在行头的好处在于:在开发过程中便于删除或注释掉该行。例如,在前面的例子中,要注释掉或删除UnitPrice列,使查询不再返回price value(代码注释参见本章后面的内容):

  1. SELECT PC.Name AS Category  
  2.       ,PSC.Name AS SubCategory  
  3.       ,P.Name AS ProductName  
  4.       ,SOH.OrderDate  
  5.       ,SOD.OrderQty  
  6. --    ,SOD.UnitPrice  
  7. FROM   Sales.SalesOrderHeader AS SOH  
  8.     INNER JOIN Sales.SalesOrderDetail AS SOD   
  9.        ON SOH.SalesOrderID = SOD.SalesOrderID   
  10.     INNER JOIN Production.Product AS P   
  11.        ON SOD.ProductID = P.ProductID  
  12.     INNER JOIN Production.ProductSubCategory AS PSC  
  13.        ON P.ProductSubCategoryID = PSC.ProductSubCategoryID   
  14.     INNER JOIN Production.ProductCategory AS PC  
  15.        ON PSC.ProductCategoryID = PC.ProductCategoryID  
  16. WHERE SOH.OrderDate BETWEEN '1/1/2003' AND '12/31/2003' 
  17. ORDER BY PC.Name 
  18.         ,PSC.Name 
  19.         ,P.Name 

在UnitPrice字段的前面加上两个短横线,就可以从查询中删除该字段。但如果逗号放在行尾,就会破坏查询,因为可能会有一个行尾的逗号没有指定相关的列存在:

  1. SELECT PC.Name AS Category,  
  2.        PSC.Name AS SubCategory,  
  3.        P.Name AS ProductName,  
  4.        SOH.OrderDate,  
  5.        SOD.OrderQty,  
  6. --     SOD.UnitPrice  
  7. FROM   Sales.SalesOrderHeader AS SOH  
  8. …  
  9. MSG 156, Level 15, State 1, Line 7  
  10. Incorrect systax near the keyword 'FROM' 

posted on 2017-03-28 11:15  水碧  阅读(224)  评论(0编辑  收藏  举报

导航