翻译5

翻译 2018年04月15日 19:10:59

在T-SOL DML一级阶梯:基本选择(投影)的声明

这系列:

这篇文章是阶梯系列的一部分:T-SQLDML的阶梯

这个阶梯将为你提供如何处理来自SQL表中的数据使用SQL中的处理语言(T-SQL)的方言,DML是数据操纵语言,并且是数据处理语言的一个方面,它包括选择(投影),插入,更新和删除。

级别1.基本选择(投影)的声明

SQLServer数据库中的数据管理有很多不同的方面。在进入与管理应用程序数据相关的复杂管理问题之前,你需要从从表中检索数据的基础开始。若要从SQLServer表返回数据,请使用选择(投影)语句。在这个级别上,我将介绍基本选择(投影)语句的组件,以及你如何使用它从单独SQLServer表中检索数据

三个部分在选择(投影)的声明中

从单个表返回数据的基本选择(投影)语句由三个不同的部分组成:列列表、FROM子句和WHERE子句。使用这些不同组件构造基本选择(投影)语句的语法如下所示:

SELECT <Column List>

FROM <table name>

WHERE <where criteria>;

“表中的列”将包含您要从查询返回的列的列表,“Table_name”将包含从中选择数据的表,以及“其中条件”很好地标识将用于约束将从选择(投影)语句返回的行的搜索条件。请注意,WHERE子句是可选的。

请注意,本楼梯中所有的示例都将使用 AdventureWorks SQL Server 2005数据库,该数据库可以在此位置从codeplex获得: http://sqlserversamples.codeplex.com/.

让我们看看以下非常简单的选择(投影)语句,它从AdventureWorks数据库中的表中选择一些数据。接下来可以使用SQLServer管理平台中的查询窗口运行本文中描述的每个查询语句,同时将数据库设置为AdventureWorks。

SELECT  ProductCategoryID 

        ,Name

FROM    Production.ProductCategory

WHERE   ProductCategoryID < 2 ;

列表的列

列表的列在选择(投影)关键字后面,是指定要返回的列的位置,通过指定列名来标识列。如果在以后的级别上用逗号分隔多个列,那么我们将看到从指定的表中返回列以外的值的可能性,在第一级,我们坚持基本原则。在上面的例子的基础上,让我们探索一下如果一个列列表只选择一个列或一个表的列,那么它会是什么样的呢?

如果我只想返回生产产品类别表的名称列我的查询将看起来像这样:

SELECT  Name

FROM    Production.ProductCategory

WHERE   ProductCategoryID < 2 ;

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

SELECT  ProductCategoryID 

       , Name 

       , rowguid 

       , ModifiedDate

FROM    Production.ProductCategory

WHERE   ProductCategoryID < 2 ;

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

SELECT  *

FROM    Production.ProductCategory

WHERE   ProductCategoryID < 2 ;

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

FROM的子句

在FROM子句中,你标识了你想要从其中选择数据讨论的表,因为From子句中的单独表中的数据属于这个级别,请注意,随着您在SQL知识方面的进步,FROM子句可以识别多个表,从中选择数据。

这里有许多不同的方法来识别你想要选择数据的表格,实际上有四个不同的波形。本文将讨论其中的三个,第四个我将提及。

第一种方法是通过标识表名和表所属的架构来指定表。到目前为止,我在所有示例中都是这样标识我的所有表名的。在我的每个例子中,我都说表名是生产.生产课实际的表名只是生产课,它包含在生产模式中。

在FROM子句中标识表的第二种方法是只声明表名子句只包含数据库用户或DBO模式下的表名模式。让我更详细地解释一下这个概念。

当您向只标识表名的SQL下水道提交查询时。SQLServer将需要解析此表所处的架构。这是因为在给定的数据库中可以有多个同名的表,只要它们在不同的模式中来确定一个表驻留在SQLServer中的哪个模式,呃就会经历两个步骤。第一步是对提交查询的数据库用户使用默认架构,并将其默认架构附加到表名,然后查找该表。如果SQLServer使用用户默认架构查找表,则步骤二不贯穿。如果SQLServer没有使用用户默认架构找到表,则SQL下水道将检查DBO架构以查找表。无论您的数据库是否包含单个模式,最好的做法是习惯于在FROM子句中标识表中的名称和表名--这减少了SOLServer解决表名和所需的工作量.

识别表的第三种方法是使用三个部件名,其中最后两个部分是模式和表名。第一个部分是数据库名。下面是一个SELECT语句,类似于我以前的SELECT语句,它使用了一个三部分名称:

SELECT  *

FROM    AdventureWorks.Production.ProductCategory

WHERE   ProductCategoryID < 2 ;

在这里你可以看到我添加数据库名称AdventureWorks到FROM子句中的生产.生产种类鉴定表。

通过使用FROM子句中表的三部分命名约定,可以将SQLServer管理中查询窗口的数据库上下文设置为任何数据库,而且数据库引擎仍将知道用于查询的数据库、架构和表。当构建需要从实例中的多个数据库检索数据的应用程序时,使用三个部件名称有助于从单个应用程序中的多个数据库检索数据。

最后一个方法是使用一个四部分的名称,第四部分(在数据库名称之前)标识链接服务器的名称。由于链接服务器在这个阶梯之外,我不进一步讨论这个主题。如果您应该跨表名(包含4个部件表)运行,则表与链接服务器相关联。

WHERE从句

在选择中声明中的WHERE语句是可选的。WHERE是用来约束选择声明中返回的行的。数据库的引擎对每一行进行评估然后只有在他们遇到搜索系统或被鉴定时才返回行。当你些更多的选择声明时你将会发现大多数你的选择声明会包含一个WHERE语句。

一个简单的WHERE语句只会包含一个的搜索条件,然而一个更加复杂的WHERE语句可能会包含许多条件。当在WHERE从句中使用多个条件时,他们将会通过逻辑运算符AND和OR连接在一起。选择语句中不同条件的数量是没有限制的。在我的例子中,直到现在我们只使用一个单一系统让我们回顾一些更复杂的WHERE例子。

这有一个选择声明包含两种不同的搜索条件:

SELECT  *

FROM    Production.Product

WHERE   Color = 'Blue'

        AND ProductID > 900 ;

在这个声明中,第一个条件检查在颜色之一列中是否有蓝色,第二个条件是检查Productld列中是否有大于900的值。因为AND操作使用了这两个条件为了让行能够从查询中返回值这两个关系必须为真。

让我们看一个更复杂的WHERE语句的例子:

SELECT  *

FROM    Production.Product

WHERE   ProductID > 900

        AND ( Color = 'Blue'

              OR Color = 'Green'

            ) ;

这个例子返回产生。ProductID值比900大并且有颜色列中位蓝色或绿色。通过观察这个例子你可以看到我已经在两个不同的颜色列条件下放置。这就设置了条件互相估值的顺序就像在一个数学表达式中。通过使用插入语OR,在评估AND操作之前将会对这两种颜色进行评估。当用AND和OR是没有插入语,这些逻辑运算符的的执行顺序是基于逻辑运算符的优先级别。优先级别规定AND操作会在OR之前,如果不包含插入语句的话。

让我们在之前的WHERE 从句中添加一个NOT 操作

SELECT  Name ,

        Color

FROM    Production.Product

WHERE   ProductID > 900

        AND NOT ( Color = 'Blue'

                  OR Color = 'Green'

                ) ;

我在AND操作之后添加了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#:答案

您的查询应该如下所示:

SELECT  EmployeeID ,

        SickLeaveHours ,

        VacationHours

FROM    HumanResources.Employee

WHERE   SickLeaveHours > 68

        AND VacationHours > 98 ;

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

EmployeeID  SickLeaveHours VacationHours

----------- -------------- -------------

109         69             99

179         69             99

224         69             99

练习2#:答案

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

SELECT  *

FROM    Sales.SalesOrderHeader

WHERE   SalesOrderID BETWEEN 43702 AND 43712 ;

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

SELECT  SalesOrderID ,

        RevisionNumber ,

        OrderDate ,

        DueDate ,

        ShipDate ,

        Status ,

        OnlineOrderFlag , 

        SalesOrderNumber ,

        PurchaseOrderNumber ,

        AccountNumber ,

        CustomerID ,

        ContactID ,

        SalesPersonID ,

        TerritoryID ,

        BillToAddressID ,

        ShipToAddressID ,

        ShipMethodID ,

        CreditCardID ,

        CreditCardApprovalCode ,

        CurrencyRateID ,

        SubTotal ,

        TaxAmt ,

        Freight ,

        TotalDue ,

        Comment ,

        rowguid ,

        ModifiedDate

FROM    Sales.SalesOrderHeader

WHERE   SalesOrderID >= 43702

        AND SalesOrderID <= 43712 ;

您的查询应该返回11行。5行的OrderDate Vale为2001-07-02,5行的OrderDate Vale为2001-07-03,2行的OrderDate值为2001-07-04。

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

理解基本SELECT语句

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

本文是T-SQLDML楼梯的一部分。

注册我们的RSS提要,并得到通知,一旦我们发布一个新的层次在楼梯上!

 


收藏助手
不良信息举报
您举报文章:翻译5
举报原因:
原因补充:

(最多只允许输入30个字)