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

原文链接:http://www.sqlservercentral.com/articles/Stairway+Series/75772/

通过阶梯到T-SQLDML等级3:基本的select语句

By Gregory Larsen, 2011/10/07

 

该系列

这篇文章楼梯系列的一部分:到T-SQL DML的各阶级

 

  这个阶级使你大概了解如何使用SQL Server表的数据,使用SQL ServerTransact-SQLT-SQL1语言DML是数据操纵语言和数据处理语言方面。它包括语句的选择、插入、更新和删除。这楼梯会也提供了一些历史的SQL语言和一些一般性的概念集。每一级都建立在现有的水平,所以当你完成,你将有一个很好的了解如何选择和修改SQL Server中的数据。

这里有不同的级别:

·1级:基本的SELECT语句

·2级:结构化查询语言(SQL)的历史

·3级:关系数据库设计

·4级:SQL的数学:1

·5级:SQL的数学:2

·6级:排序数据使用ORDER BY子句的基础知识

·7级:汇总数据使用一个简单的GROUP BY子句

·8级:数据修改:更新

·9级:数据修改:删除

1级:基本的SELECT语句

  有很多不同的SQL Server数据库管理数据。你可以管理复杂的应用程序的数据之前,你需要从表中检索基础的数据。为了从使用SELECT语句在SQL Server表中返回的数据。在这个级别将涵盖基本的SELECT语句的组成部分,你如何使用它从一个SQL Server表中检索数据。

SELECT语句三个部分

  一个基本的SELECT语句返回的数据从一个表分为三个部分:列表FROM子句和WHERE子句。构建一个基本的SELECT语句中使用这些不同的组件像这样的语法:

SELECT <Column List>FROM <table name>WHERE <where criteria>;

 

       Column List将包含要从查询返回的列的列表,table_name将包含从中选择数据的表, 而where criteria确定将用于约束将从 SELECT 语句返回的行的搜索条件。请注意, where 子句是可选的。
   

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

  让我们看看下面非常简单的 SELECT 语句, 它从 AdventureWorks 数据库中的表中选择一些数据。通过在 SQL server 管理工作室中使用查询窗口运行本文描述的每个查询语句, 并将数据库设置为 AdventureWorks, 可以继续执行此项工作。

SELECT  ProductCategoryID ,

        NameFROM    Production.ProductCategoryWHERE   ProductCategoryID < 2 ;

 

  在这个地方, 我选择了两个不同的列, ProductCategoryID 和名称,来自于 ProductCategory 表。由于此 SELECT 语句有 where 子句, 因此它将从表返回的行限制为仅具有 aProductCategoryID 值小于2的行。
   

     现在, 你已经有了一个 select 语句的基本概念, 让我更详细地探讨 select 语句的每个组件。

列表

        列表遵循 SELECT 关键字, 并且是指定要从表中返回的列的位置。通过指定列名来标识列。如果列出了多个列, 它们将用逗号隔开。在以后的级别中, 我们将研究从指定表中返回除列以外的值的可能性, 在第一级, 我们将坚持基本知识。在上面的示例中构建, 让我们来探讨当一个列表只选择一列或一个表的所有列时, 它看起来会是什么样子。

   如果我只想返回生产. ProductCategory 表的 "名称" , 那么我的查询将如下所称:

SELECT  ProductCategoryID ,

        Name ,

        rowguid ,

        ModifiedDateFROM    Production.ProductCategoryWHERE   ProductCategoryID < 2 ;在这 SELECT 语句中, 可    以看到, 我已经确定了4个不同的列, 每一个都用逗号隔开。正如我所做的那样, 这些列可以一起列在一行上, 或者在不同的行上分开以获得可读性。还有另一种方法可以从表中选择所有列, 即指定星号而不是指定单个列名。下面是一个使用星号规范的 SELECT 语句:

SELECT  *FROM    Production.ProductCategoryWHERE   ProductCategoryID < 2 ;

 

   在应用程序中使用星号 (通常称为 "星级") 时需要注意。由于星号将返回表中的所有列, 如果发生更改表以包含附加列, 则将返回附加列, 而不修改实际 SELECT 语句。如果已按名称指定了所有列, 则在添加新列时将不会返回, 除非将其添加到列表中。使用星号可以进行测试, 但如果要遵循最佳做法, 请不要在应用程序代码中使用。这是最佳做法的原因是, 大多数应用程序都希望从给定 SELECT 语句返回固定数目的列。当列添加到表中并且已使用星号方法标识表列时, 返回的其他列可能会中断尚未编码以处理此额外数据的应用程序。

from 子句

   在 from 子句中, 可以标识要从中选择数据的表。在此级别, 我们只讨论从 from 子句中的单个表中选择数据。请注意, 随着 SQL 的知识的进步, from 子句可以标识多个表, 从中选择数据。

 

   有许多不同的方式来确定要选择的数据表。事实上,有四种不同的方式,其中三个我将在本文第四,我将只提及覆盖。

 

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

   在 from 子句中标识表的第二种方法是只声明表名。当 from 子句仅包含表名称时, SQL server 将假定该表包含在数据库用户的默认架构或 dbo 架构下。让我稍微详细地解释一下这个概念。

 

   将查询提交到仅标识表名称的 sql server , sql server 将需要解析此表所在的架构。这是因为在给定的数据库中, 可以有多个同名的表, 只要它们位于不同的架构中。要确定表在 SQL server 中驻留的架构, 可通过两步处理。第一步是对提交查询的数据库用户使用默认架构, 并将其默认架构追加到表名, 然后查找该表。如果 SQL server 使用用户默认架构查找该表, 则不执行第二步。如果 sql server 没有使用用户默认架构找到该表, sql server 将在 dbo 架构中检查以查找该表。无论数据库是否包含单个架构, 最好的做法是, 使用架构名称后跟表名称在 from 子句中标识表。通过这样做, 可以减少 SQL server 为解析表名称和促进计划缓存重新使用而必须执行的工作量。

   标识表的第三种方法是使用三部件名, 其中最后两部分是架构和表名, 第一部分是数据库名称。下面是一个与我以前的 select 语句类似的 select 语句, 它使用三部分名称:

SELECT  *FROM    AdventureWorks.Production.ProductCategoryWHERE   ProductCategoryID < 2 ;

 

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

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

   最后一个方法是使用四部分名称, 第四部分 (在数据库名称之前) 标识链接服务器的名称。由于链接服务器超出了本楼梯的范围, 因此我不会进一步讨论这个问题。如果应该跨包含4个部分的表名运行, 将知道该表与链接服务器关联。

WHERE子句

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

   一个简单的 where 子句将包含单个搜索条件, 而更复杂的地方子句可能包含许多条件。当在 where 子句中使用多个条件时, 它们将通过使用 and or 逻辑运算符在逻辑上组合在一起。对 SELECT 语句中可能包含的不同条件的数量没有限制。到目前为止, 我的例子中只使用了一个条件。让我们回顾一下一些比较复杂的 WHERE 子句的示例。
下面是一个具有两种不同搜索条件的 SELECT 语句:

SELECT  *FROM    Production.ProductWHERE   Color = 'Blue'

        AND ProductID > 900 ;

 

   在本语句中, 第一个条件检查行在 "颜色" 列中是否具有蓝色值。第二个条件检查 ProductId 列中的值是否大于900。由于使用 and 运算符, 因此, 为了从该查询返回一行, 这些条件都需要为 true

 

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

SELECT  *FROM    Production.ProductWHERE   ProductID > 900

        AND ( Color = 'Blue'

              OR Color = 'Green'

            ) ;

   本实施例中,其中的ProductID值大于900和在Color列中的值可以是蓝色或绿色返回Production.Product行。通过查看这个查询,你可以看到,我已经把周围的两种不同颜色列条件括号。这将在哪些条件下会相互评估,就像你在一个数学表达式执行顺序。通过使用括号中的两种颜色条件的或操作将评估和运营商之前进行评估。当使用ANDOR在一起而不括号,在其中这些逻辑操作符有处理顺序是基于逻辑运算符的优先级的规则。优先级规则决定了,如果包含没有括号执行操作前或操作。

让我加入了NOT操作建立在我以前的WHERE子句:

SELECT  Name ,

        ColorFROM    Production.ProductWHERE   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语句的信息。在这一节中,我会为提供几个与可以练习一篇SELECT语句,以满足所描述的商业案例练习。

练习#1

   假设你已被要求由人力资源部门的负责人,以生产谁拥有大量的病假和休假时间的员工的所有雇员值的列表。对于此列表中的人力资源头告诉你的很多假的的定义的目的如下:员工必须有一个SickLeaveHours值大于68VacationHours值超过98.5更大的你可以找到这些列与沿雇员列theHuman.Resources.Employee表。写和对AdventureWorks数据库中的测试代码。完成后,检查你的代码针对以下部分的答案。

练习#2

   大约有几个具体的订单号的一些问题你的经理。的经理要你生产出一些具体的订单相关的,所以她可以查看其销售人员与每个订单相关联的所有列的列表。的经理指定她仅在包含有4370243712.当你写完这个SELECT语句之间的SalesOrderID订单的SalesOrderHeader行的报告有兴趣,下面请检查你的答案。

练习答案1

的查询应该是这个样子:

 

SELECT  EmployeeID ,

        SickLeaveHours ,

        VacationHoursFROM    HumanResources.EmployeeWHERE   SickLeaveHours > 68

        AND VacationHours > 98 ;

 

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


雇员SickLeaveHours VacationHours

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

109         69             99

179         69             99

224         69             99

 

练习答案2

如果阅读上面引用的文档, 了解有关搜索条件和运算符之间的更多信息, 则查询应类似于以下内容:

 

SELECT  *FROM    Sales.SalesOrderHeaderWHERE   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 ,

        ModifiedDateFROM    Sales.SalesOrderHeaderWHERE   SalesOrderID >= 43702

        AND SalesOrderID <= 43712 ;

         你的查询应返回11行。五行有200172日的订购日期谷,五排有2001-07-032行的订购日期淡水河谷拥有的2001-07-04订购日期值。

   有一点要注意这个解决方案与以前的解决方案是所有的列名标识,而之前的解决方案中使用星号指定所有列。按名称标识的所有列是一个更好的编码习惯,因为你的SELECT语句将始终返回相同的号码,即使一个附加列被添加到的表列。当你的应用程序期待从你的SELECT语句返回的列的具体数量,这是非常重要的。

了解基本的SELECT语句

   为了一个SQL Server应用程序的程序员,你需要先了解基本的SELECT语句。了解如何检索表中的所有数据和约束返回什么是开发应用程序的基础。这篇文章和练习为你提供了SELECT语句基础知识,这是该系列的第一块基石。

 这篇文章是Stairway to T-SQL DML进阶的一部分

阅读更多
想对作者说点什么?

博主推荐

换一批

没有更多推荐了,返回首页