数据库

 楼梯到T-SQLDML级别1:基本SELECT语句
                                                               格雷戈里·拉森著,2011/10/07
      系列
本文是楼梯系列的一部分:从楼梯到T-SQLDML的楼梯。此阶梯将为您提供如何使用SQLServer的Transact-SQL(T-SQL)方言处理来自SQLServer表的数据的基本理解。DML是一种数据操作语言,是处理数据的语言的一个方面。它包括SELECT、INSERT、UPDATE和DELETE语句。这个阶梯也将提供一些SQL语言的历史和一些关于集合论的一般概念。每个级别都将建立在以前的级别之上,所以当您完成时,您将很好地了解如何从SQLServer中选择和修改数据。
以下是在这一系列楼梯中将涵盖的不同级别:
第1级:基本SELECT语句
第2级:结构化查询语言(SQL)的历史
第3级:关系数据库设计
第4级:SQL的数学:第1部分
第5级:SQL的数学:第2部分
第6级:使用ORDERBY子句对数据进行排序的基本原理
第7级:根据子句使用简单组汇总数据
第8级:数据修改:更新
第9级:数据修改:删除
第1级:基本SELECT语句
SQLServer数据库中的数据管理有很多不同的方面。在进入与管理应用程序数据相关的复杂管理问题之前,您需要从从表中检索数据的基础开始。若要从SQLServer表返回数据,请使用SELECT语句。在这个级别上,我将介绍基本SELECT语句的组件以及如何使用它从单个SQLServer表检索数据。
SELECT语句中的三个部分
从单个表返回数据的基本SELECT语句由三个不同的部分组成:列列表、FROM子句和WHERE子句。使用这些不同组件构造基本SELECT语句的语法如下所示:

“<Column list>”将包含您希望从查询中返回的列列表,“<table_name>”将包含从中选择数据的表,而“<WHERWERS>>”很好地标识将用于约束SELECT语句返回的行的搜索条件。注意,WHERE子句是可选的。
请注意,我在这个阶梯中的所有示例都将使用AdventureWorksSQLServer 2005数据库,该数据库可以从CodePlex获得,这个位置是:http://sqlserverspreses.codeplex.com/。让我们看看以下非常简单的SELECT语句,它从AdventureWorks数据库中的表中选择一些数据。接下来可以使用SQLServerManagementStudio中的查询窗口运行本文中描述的每个查询语句,同时将数据库设置为AdventureWorks。

在这里,我从Production.ProductClass表中选择了两个不同的列,ProductCatoryID和Name。由于SELECT语句有WHERE子句,所以它将从表返回的行限制为只有那些ProductCatoryID值小于2的行。现在您已经了解了SELECT语句的基本概念,让我更详细地研究SELECT语句的每个组件。
列列表
列列表在SELECT关键字之后,是指定要从表返回的列的位置。通过指定列名来标识这些列。如果列出多个列,则用逗号分隔。在以后的级别中,我们将研究从指定的表返回列以外的值的可能性,在第一个级别中,我们将坚持基本操作。在上面的示例的基础上,让我们探索一下,如果一个列列表只选择一个列,或者一个表的所有列,那么它会是什么样的。
如果我只想返回Production.ProductClass表的Name列,那么我的查询将如下所示:


在这里,您可以看到,在上面的查询中,我只在SELECT和FROM关键字之间指定了Name列。但是,如果我想指定Production.ProductClass表中的所有列,我将运行以下查询:


在这个SELECT语句中,您可以看到我已经识别了4个不同的列,每个列用逗号分隔。这些列都可以在一行上列出,也可以在不同的行上分隔,以提高可读性,就像我所做的那样。还有一种从表中选择所有列的方法,即指定星号,而不是指定单独的列名。下面是使用星号规范的SELECT语句:


在应用程序中使用星号(通常称为“星星”)时要小心。由于星号将返回表中的所有列,如果您碰巧更改了一个表以包含一个额外的列,那么将返回附加列而不修改实际的SELECT语句。但是,如果您已按名称指定了所有列,则添加新列时将不会返回该列,除非将其添加到列列表中。使用星号进行测试是可以接受的,但是如果您想遵循最佳实践,请不要在应用程序代码中使用它。这是最佳实践,因为大多数应用程序期望从给定的SELECT语句返回固定数量的列。当将列添加到表中,并且使用星号方法标识表列时,返回的附加列会破坏未编码以处理这些额外数据的应用程序。

来自条款

在FROM子句中,标识要从中选择数据的表。在这个级别上,我们只讨论从FROM子句中的单个表中选择数据。请注意,随着您对SQL的了解不断加深,FROM子句可以标识要从中选择数据的多个表。有许多不同的方法来标识要在其中选择数据的表。事实上,有四种不同的方式,其中三种我将在本文中介绍,第四种我只会提到。第一种方法是通过标识表名和表所属的架构来指定表。到目前为止,我在所有示例中都是这样标识我的所有表名的。在我的每个例子中,我都说表名是Production.ProductClass。实际的表名只是ProductClass,它包含在生产模式中。识别FROM子句中的表的第二种方法是只声明表名。当FROM子句仅包含表名时,SQLServer将假定该表包含在数据库用户的默认架构下或DBO模式下。让我更详细地解释一下这个概念。当您向仅标识表名的SQLServer提交查询时,SQLServer将需要解析该表所处的架构。这是因为在给定的数据库中可以有多个同名的表,只要它们在不同的模式中。要确定一个表驻留在SQLServer中的架构,需要经过两个步骤。第一步是对提交查询的数据库用户使用默认架构,并附加他们的默认架构表名,然后查找该表。如果SQLServer使用用户默认架构找到表,则不执行步骤二。如果SQLServer没有使用用户默认架构找到表,则SQLServer将检查DBO架构以查找表。无论您的数据库是否包含单个模式,最好的做法是习惯于使用模式名称后面的表名来标识FROM子句中的表。通过这样做,您可以减少SQLServer解析表名和促进计划缓存重新使用所需的工作量。识别表的第三种方法是使用三个部件名,其中最后两个部分是模式和表名,第一部分是数据库名。下面是一个SELECT语句,类似于我以前的SELECT语句,它使用了三个部分的名称:


在这里,您可以看到,我将数据库名AdventureWorks附加到在FROM子句中标识的Production.ProductClass表中。通过使用FROM子句中表的三部分命名约定,可以将SQLServerManagementStudio中查询窗口的数据库上下文设置为任何数据库,而且数据库引擎仍将知道用于查询的数据库、架构和表。当构建需要从实例中的多个数据库检索数据的应用程序时,使用三个部件名称有助于从单个应用程序中的多个数据库检索数据。最后一种方法是使用四部分的名称,第四部分(在数据库名称之前)标识链接服务器的名称。由于链接服务器超出了本阶梯的范围,我将不再进一步讨论这个主题。如果您应该跨包含4个部分的表名运行,您将知道该表与链接服务器相关联。
何地条款

SELECT语句的WHERE子句是可选的。WHERE子句用于约束SELECT语句返回的行。数据库引擎根据WHERE子句计算每一行,然后只返回符合WHERE子句中标识的搜索条件的行。当您编写更多SELECT语句时,您会发现大多数SELECT语句可能包含WHERE子句。简单WHERE子句将包含单个搜索条件,而更复杂的WHERE子句可能包含许多条件。当在WHERE子句中使用多个条件时,它们将通过使用AND和OR逻辑运算符逻辑地组合在一起。SELECT语句中可能包含的不同条件的数量没有限制。在我的例子中,到目前为止,我只使用了一个条件。让我们回顾几个有更复杂的WHERE子句的例子。下面是一个SELECT语句,它有两个不同的搜索条件:


在这个语句中,第一个条件检查行是否在Color列中有值Blue。第二个条件检查Productid列中的值是否大于900。由于使用了and操作符,为了从此查询返回一行,这两个条件都必须为true。让我们看一个WHERE子句,它变得更加复杂了:


此示例返回Production.Product行,其中Productid值大于900,颜色列中的值为Blue或Green。通过查看这个查询,您可以看到我在两个不同的Color列条件周围放置了括号。这设置了条件之间相互评估的顺序,就像在数学表达式中所做的那样。通过使用括号,在计算AND运算符之前,将计算两种颜色条件之间的OR操作。在不带括号的情况下使用AND和OR时,这些逻辑运算符是进程的顺序是基于逻辑运算符优先的规则。优先级规则规定,如果不包含括号,则在OR操作之前执行操作。让我在前面的WHERE子句的基础上添加一个NOT操作符:


我在“和”操作之后添加了“非”运算符,以表明我想要的产品不是蓝色或绿色。当我对AdventureWorks数据库运行这个查询时,我得到的产品是银色、黄色和黑色。

 有关搜索条件的所有不同可能性的完整列表,请参阅联机丛书:http://msdn.microsoft.com/en-us/library/ms173545.aspx.有关逻辑运算符优先级的更多信息,请阅读以下主题: http://msdn.microsoft.com/en-us/library/ms190276.aspx.

把所有的东西放在一起:商业案例

现在轮到您使用我共享的信息来构建您自己的基本SELECT语句了。在本节中,我将为您提供几个练习,您可以练习编写一个SELECT语句来满足所描述的业务案例。

练习1
假设人力资源部门负责人要求您为有大量病假和休假时间的员工提供所有EmployeeID值的列表。就这份清单而言,人力资源部主管告诉你“大量休假”的定义如下:员工的SickLeaveHours值必须大于68,休假值必须大于98。您可以在Human.Resources.Employee表中找到这些列和EmployeeID列。根据AdventureWorks数据库编写和测试代码。完成后,根据下面一节中的答案检查代码。
练习2
这里有一些问题,你的经理有几个具体的订单号码。您的经理希望您生成与几个特定订单相关联的所有列的列表,以便她可以查看与每个订单关联的哪个销售人员。您的经理指定,她只对包含SalesOrderHeader行的报表感兴趣,该报表的订单的SalesOrderId介于43702和43712之间。写完这个SELECT语句后,请检查下面的答案。
练习1的答案:

您的查询应该如下所示:


查询的结果应该返回以下三行:雇员
----------- -------------- -------------


109         69             99


179         69             99


224         69             99
练习2的答案:
如果您阅读上面引用的文档来了解更多关于搜索条件和中间操作符的信息,那么查询应该是这样的:

或者您可能编写的代码类似于


您的查询应该返回11行。5行的OrderDate Vale为2001-07-02,5行的OrderDate Vale为2001-07-03,2行的OrderDate值为2001-07-04。与以前的解决方案相比,要注意的一点是,所有的列名都是标识出来的,而前一个解决方案使用星号来指定所有列。按名称标识所有列是一种更好的编码做法,因为SELECT语句将始终返回相同数量的列,即使向表中添加了其他列。当应用程序期望从SELECT语句返回特定数量的列时,这一点非常重要。

了解基本的选择国家

要成为SQLServer应用程序程序员,首先需要了解基本的SELECT语句。了解如何检索表中的所有数据和约束返回的内容是开发应用程序的基础。本文和练习为您提供了SELECT语句基础,这是本系列的第一个构建块。

本文是T-SQLDML楼梯的一部分。注册我们的RSS提要,并得到通知,一旦我们发布一个新的层次在楼梯上!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值