解析T-SQL的SELECT查询语法

日期: 2010-08-11 作者:Don Jones翻译:吴琳静 来源:TechTarget中国 英文

Select是T-SQL语言中最复杂的语句之一。通常认为select语句是用来检索数据库中的信息。   SELECT语句针对不同要求可以进行无数的组合,包括各个厂商的特定要求。也就是说几乎所有的数据库厂商都有自己独特的语法扩展。

正因为如此,个性SELECT查询语句也给管理员带来了很大的挑战,下面就是一个很糟糕的SELECT语句的例子: SELECT TOP 10 PERCENT c.CustomerName,c.Address,o.OrderDate FROM Customers c INNER JOIN ……

我们一直都在努力坚持原创.......请不要一声不吭,就悄悄拿走。

我原创,你原创,我们的内容世界才会更加精彩!

【所有原创内容版权均属TechTarget,欢迎大家转发分享。但未经授权,严禁任何媒体(平面媒体、网络媒体、自媒体等)以及微信公众号复制、转载、摘编或以其他方式进行使用。】

微信公众号

TechTarget微信公众号二维码

TechTarget

官方微博

TechTarget中国官方微博二维码

TechTarget中国

电子邮件地址不会被公开。 必填项已用*标注

敬请读者发表评论,本站保留删除与本文无关和不雅评论的权力。

Select是T-SQL语言中最复杂的语句之一。通常认为select语句是用来检索数据库中的信息。

  SELECT语句针对不同要求可以进行无数的组合,包括各个厂商的特定要求。也就是说几乎所有的数据库厂商都有自己独特的语法扩展。正因为如此,个性SELECT查询语句也给管理员带来了很大的挑战,下面就是一个很糟糕的SELECT语句的例子:

SELECT TOP 10 PERCENT c.CustomerName,c.Address,o.OrderDate
FROM Customers c INNER JOIN Orders o ON c.CustomerID = o.CustomerID
WHERE o.OrderDate > '2010-01-01' AND o.Status LIKE '%Open%' AND
c.CustomerID IN (SELECT CustomerID FROM LoyalCustomers) ORDER BY
o.OrderDate DESC, o.Status ASC

  这条语句很难理解吧?下面是一个拆分后的版本:

SELECT TOP 10 PERCENT c.CustomerName,c.Address,o.OrderDate
FROM
  Customers c INNER JOIN Orders o ON c.CustomerID = o.CustomerID
WHERE
  o.OrderDate > '2010-01-01'
  AND o.Status LIKE '%Open%'
  AND c.CustomerID IN
    (SELECT CustomerID FROM LoyalCustomers)
ORDER BY
  o.OrderDate DESC,
  o.Status ASC

  下面是关于这条SELECT查询语句的更详细的解释说明。这个也可以作为其他需要转换的SELECT查询语句的一种解释模板:

  •   SELECT关键字为开始,告诉我们这是一个数据检索查询语句。
  •   TOP 10 PERCENT是可选的关键字,不是所有查询语句必须包含的内容。根据这个关键字SQL Server就把匹配检索要求的所有数据行的前面10%的数据行检索出来。其他厂商的数据库产品通常就不包含微软的这个特殊的扩展的关键字。相对应的,他们会在查询语句的末端添加LIMIT子句。
  •   第三部分是说检索结果中要包含这三列数据。c.和o.是数据库中两个数据表的昵称或者别名。这条SELECT语句可以从一个表中取得两列数据,再从另一个表中取出一列数据。
  •   FROM字句告诉我们在哪些表中进行查询。
  •   Customers c是在查询语句中为客户表分配一个别名“c”。只能在这个位置进行“c”这个别名的定义,而且这个定义仅适用于这个查询语句。这样我们就可以检索到c.CustomerName列的数据。如果我们不定义一个别称,在查询语句中就得输入表的全称“Customers.CustomerName”,这样很不方便。
  •   INNER JOIN意思是说查询结果中只显示Customers和Orders两个表中CustomerID值相同的那些数据行。结合这两张表,我们得到的结果数据集中,所有的订单都被顾客替代了。
  •   在这个例子中,WHERE句子中的三个条件都满足的数据行才会在结果的数据集中显示。前两个条件非常简单,是根据OrderDate和Status的值进行筛选。需要注意的是日期格式的数据要放到单引号中,在日期的比较运算中,大于(>)的意思是说“比这个日期要晚”。还要注意LIKE运算符,它是把(%)这个符号做为字符串的通配符使用。
  •   第三个WHERE条件是子查询。括号里面的内容优先执行,查询的结果作为第三个查询条件的范围值。在这个例子中,IN的运算是查看CustomerID的值是否存在于一个可能的值列表中。这个值列表就是子查询创建的列表,根据这条语句,我们可以获得在LoyalCustomers表中存在的客户的订单信息。
  •   最后的ORDER BY字句用来改变排列顺序。首先根据OrderDate进行降序排列——就是说日期最近的排在前面,然后再根据Status值进行升序排列。升序是默认的排序方式,如果在语句中没有看到关键字DESC 或者ASC,那数据集就是按照升序排列。

  SELECT查询语句可以非常复杂,但是如果把他们进行拆分,就很容易解析并计算了。

作者

Don Jones
Don Jones

投稿作者

相关推荐