Stairway to T-SQL DML Level 1: The Basic SELECT Statement

级别1:基本的选择语句。

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

选择语句中的三个部分。

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

SELECT<Column List>

FROM<table name>

WHERE<where criteria>;

  " <列列表> "将包含你想从查询中返回的列的列表," <表名> "将包含选择数据的表格,以及“< where标准>”,将用于确定约束从选择语句返回的行的搜索条件。注意WHERE子句是可选的。

  请注意,我在这上的所有示例将使用AdventureWorks SQL Server 2005数据库,该数据库可以在此位置从Codeplex获得:http://sqlserversamples.codeplex.com/。

  让我们看一下下面非常简单的选择语句,它从AdventureWorks数据库中的表中选择一些数据。您可以使用SQL Server Management Studio中的查询窗口来运行本文中描述的每个查询语句,同时将数据库设置为AdventureWorks。

         

ELECT  ProductCategoryID ,

        Name

FROM    Production.ProductCategory

WHERE   ProductCategoryID < 2 ;

  在这里,我从ProductCategory表中选择了两个不同的列,ProductCategoryID和Name。因为这个选择语句有一个WHERE子句,它将从表返回的行限制为只有那些ProductCategoryID值小于2的。

  现在您已经了解了选择语句的基本思想,让我更详细地介绍选择语句的每个组件。

列列表

  列列表遵循选择的关键字,并且是指定要从表中返回的列的位置。列通过指定列名来标识。如果列出多个列,则用逗号分隔。在以后的级别中,我们将研究从指定表中返回值以外的值的可能性,在第一级中,我们将坚持基础。在上面的例子中,让我们来看看列列表是什么样子的,如果它只选择一个列,或者一个表的所有列。

  如果我只想返回产品的名称列。ProductCategory表我的查询是这样的:

SELECT  Name

FROM    Production.ProductCategory

WHERE   ProductCategoryID < 2 ;

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

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子句可以识别多个表,从中选择数据。

  有许多不同的方法来确定要选择数据的表。事实上有四种不同的方式,其中三种我会在这篇文章中提到,第四种我会提到。

  第一种方法是通过标识表名和它所属的模式来指定一个表。这就是迄今为止我在所有示例中识别所有表名的方法。在我的每一个例子中,我说过表名是Production.ProductCategory。实际的表名只是ProductCategory,它包含在PRODUCTION表中。

  在FROM子句中确定表的第二种方法是只声明表名。当FROM子句只包含表名时,SQL Server将假定表包含在数据库用户的默认模式下,或在dbo模式下。让我再详细解释一下这个概念。

  当你向只标识表名的SQL Server提交一个查询时,SQL Server将需要解析该表所在的模式。这是因为在给定的数据库中,可以有多个具有相同名称的表,只要它们处于不同的模式。要确定一个表驻留在SQL Server中的哪一个模式,需要经过两个步骤。第一步是为提交查询的数据库用户使用默认模式,并将其默认模式附加到表名,然后查找该表。如果SQL Server使用用户默认模式查找表,那么步骤2就不会执行。如果SQL Server没有使用用户默认模式找到表,那么在dbo模式中进行SQL Server检查以找到该表。无论您的数据库是否包含一个模式,最好的做法是使用后跟表名的模式名来标识FROM子句中的表。通过这样做,您可以减少SQL服务器的工作量,以解决表名,并促进计划缓存重用。

  确定表的第三种方法是使用三部分名称,其中最后两部分是模式和表名,第一部分是数据库名称。这里是一个SELECT语句,类似于我之前的SELECT语句,它使用了三个部分的名称:

SELECT  *

FROM    AdventureWorks.Production.ProductCategory

WHERE  ProductCategoryID < 2 ;

  在这里,您可以看到,我将数据库名称AdventureWorks添加到生产中。在FROM子句中标识的ProductCategory表。

  通过对FROM子句中的表使用三部分命名约定,SQL Server Management Studio中的查询窗口的数据库上下文可以设置为任何数据库,数据库引擎仍然知道用于查询的数据库、模式和表。当构建需要在实例中从多个数据库检索数据的应用程序时,使用三个部分的名称有助于在单个应用程序中从多个数据库中检索数据。

  最后一种方法是使用一个四部分的名称,第四部分(在数据库名称前面)标识链接服务器的名称。由于链接服务器不在这个楼梯的范围内,我将不再进一步讨论这个主题。如果您应该运行包含4个部分的表名,您将知道该表与一个链接服务器相关联。

WHERE子句

 

  SELECT语句的WHERE子句是可选的。WHERE子句用于约束从SELECT语句返回的行。数据库引擎根据WHERE子句计算每一行,然后如果它们满足WHERE子句中标识的搜索条件或条件,则只返回行。当您编写更多的SELECT语句时,您将发现大多数SELECT语句可能包含WHERE子句。

 

  一个简单的WHERE子句将包含单个搜索条件,而更复杂的WHERE子句可能包含许多条件。当在WHERE子句中使用多个条件时,它们将在逻辑上由使用和逻辑操作符组合在一起。选择语句中可能包含的不同条件的数量没有限制。在我的示例中,到目前为止,我只使用了一个条件。让我们回顾几个例子,其中有更复杂的WHERE子句。


  这里有一个SELECT语句,它有两个不同的搜索条件:

SELECT  *
FROM    Production.Product
WHERE   Color = 'Blue'
        AND ProductID > 900 ;

  在该语句中,第一个条件将检查该行是否在颜色列中具有蓝色值。第二个条件检查ProductId列中的值是否大于900。由于和操作符都使用了这两个条件,因此需要从这个查询返回一个行。

 

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

 
 
 
 SELECT 
   
 * 
FROM Production . Product
WHERE ProductID > 900
AND ( Color = 'Blue'
OR Color = 'Green'
) ;
 
 
 

  这个示例返回生产。产品的值大于900的产品行,颜色列中的值不是蓝色就是绿色。通过查看这个查询,您可以看到我在两个不同的颜色列条件下放置了括号。这就设置了条件被相互计算的顺序,就像你在数学表达式中所做的那样。通过使用括号,在评估和运算符之前,将评估两个颜色条件之间的或操作。在使用和或不加括号的情况下,这些逻辑运算符是进程的顺序是基于逻辑运算符优先级的规则。优先规则规定,如果不包含括号,则执行之前或操作的操作。

 

  让我在我之前的WHERE子句中添加一个NOT运算符:

SELECT  Name ,
        Color
FROM    Production.Product
WHERE   ProductID > 900
        AND NOT ( Color = 'Blue'
                  OR Color = 'Green'
                ) ;

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

有关搜索条件的所有不同可能性的完整列表,请参考在线书籍:http://msdn.microsoft.com/en-us/library/ms173545.aspx,并获得更多关于逻辑运算符优先级的信息,您可以阅读本主题:http://msdn.microsoft.com/en-us/library/ms190276.aspx。

 

把它们放在一起:商业案例

 

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

 

练习# 1:

  假设你已经被人力资源部的负责人要求为那些有很多病假和假期的员工列出所有员工的价值观。在这个列表中,人力资源主管告诉你“大量休假”的定义如下:员工的病假时间必须大于68,休假时间大于98。您可以在Human.Resources中找到这些列和EmployeeID列。员工表。在AdventureWorks数据库中编写和测试代码。完成后,在下面的部分中检查您的代码。

 

练习# 2:

  有一些问题你的经理有一些具体的订单号码。您的经理希望您列出与一些特定订单相关的所有列,这样她就可以查看与每个订单相关的销售人员。您的经理指定她只对包含SalesOrderHeader行的报告感兴趣,该报告包含在43702和43712之间的SalesOrderId。当你写完这个SELECT语句时,请检查下面的答案。

 

答案练习# 1:

  您的查询应该如下所示:

SELECT  EmployeeID ,
        SickLeaveHours ,
        VacationHours
FROM    HumanResources.Employee
WHERE   SickLeaveHours > 68
        AND VacationHours > 98 ;

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

员工的身份证号  病假时间(h)  假期时间(h)

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

 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谷的2001-07-02,5行有一个OrderDate vale of 2001-07-03和2行有一个OrderDate值的2001-07-04。

关于这个解决方案和前面的解决方案的一个值得注意的地方是所有的列名都被标识出来,而前面的解决方案使用星号来指定所有的列。通过名称标识所有列是一种更好的编码实践,因为即使在表中添加了额外的列,您的SELECT语句也总是返回相同的列数。当应用程序期望从SELECT语句返回特定数量的列时,这一点非常重要。

 

理解基本的SELECT语句。

 

  为了成为一个SQL Server应用程序程序员,您需要首先了解基本的SELECT语句。了解如何检索表中的所有数据并限制返回的数据对于开发应用程序是非常重要的。本文和练习为您提供了SELECT语句基础,这是本系列的第一个构建块。

 


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值