第六周翻译

T-SQL DML 1级阶梯的基本选择

这篇文章是阶梯系列:以T-SQL DML的阶梯

这阶梯将为你提供一个基本的了解如何从SQL Server表的数据,使用SQL ServerTransact-SQLT-SQL)方言。DML是数据操纵语言和数据处理语言方面。它包括语句选择、插入、更新和删除。这个阶梯还提供了SQL语言的一些历史和关于集合论的一些一般概念。每个级别都将建立在前一级,所以当你完成时,你将很好地理解如何从SQL Server中选择和修改数据。

 

以下是在这个阶梯系列中将要涉及的不同级别:

 

1级:基本SELECT语句

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

3级:关系数据库设计

4级:SQL数学:第1部分

5级:SQL数学:第2部分

6级:使用BY子句对数据进行排序的基础知识

7级:使用简单的按组子句汇总数据

8级:数据修改:更新

9级:数据修改:删除

级别1:基本SELECT语句

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

 

SELECT语句中的三个部分

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

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

<列表>”将包含一个列的列表,你想返回查询,<< table_name >”将包含表的数据被选择,和“<标准>“确定搜索的标准,将用于约束的行,将返回的SELECT语句。注意WHERE子句是可选的。

 

注意,这个阶梯我所有的例子将使用AdventureWorks数据库SQL Server 2005,可以在这个位置从CodePlex上获得:HTTP/ / sqlserversamplesCodePlexCOM /

 

让我们在下面的非常简单的SELECT语句,选取一些数据从AdventureWorks数据库中一个表看看。你可以跟随在每个文章在SQLServerManagementStudio使用查询窗口中描述的查询语句,在数据库设置为AdventureWorks

SELECT  ProductCategoryID ,
        NameFROM    Production.ProductCategoryWHERE   ProductCategoryID < 2 ;

在这里,我选择了两个不同的栏目,productcategoryid和名称,从production.productcategory表。由于这个SELECT语句具有WHERE子句限制返回的行从表中只有一行,productcategoryid值小于2

 

现在你已经了解了SELECT语句的基本概念,让我来详细了解SELECT语句的每个组件。

 

列清单

列列表遵循select关键字,并在其中指定要从表中返回的列。通过指定列名来识别列。如果列出多个列,则用逗号分隔。在后面的级别中,我们将查看返回特定表中的列以外的值的可能性。基于上面的例子,让我们来探究一下,如果它只选择一个列或表的所有列,那么列列表可能是什么样子的。

 

如果我只想要回我的名字列production.productcategory表查询看起来像这样:

SELECT  NameFROM    Production.ProductCategoryWHERE   ProductCategoryID < 2 ;

在这里,你可以看到,我仅在上述查询中的SELECT和从关键字之间指定了名称列。但是,如果要指定产品类别表中的所有列,我将运行以下查询:

SELECT  ProductCategoryID ,
        Name ,
        rowguid ,
        ModifiedDateFROM    Production.ProductCategoryWHERE   ProductCategoryID < 2 ;

在这个SELECT语句中,你可以看到,我已经识别出4个不同的列,每个列用逗号分隔。这些列可以全部列在一行上,或者按不同的行分隔,以便可读性,如我所做的那样。还有一种方法可以从表中选择所有列,也就是通过指定星号而不是指定单独的列名。下面是一个使用星号规范的SELECT语句:

SELECT  *FROM    Production.ProductCategoryWHERE   ProductCategoryID < 2 ;

护理需要使用星号时(通常被称为“星”)在你的应用程序。因为星号将返回表中的所有列,如果你改变一个表,包括一个额外的列,然后附加列将返回未修改的实际选择语句。而如果你通过名称指定的所有列,然后添加了一个新列将不退还,除非你把它添加到列表。使用星号的测试是可以接受的,但如果你想遵循最佳实践不使用它在你的应用程序代码。这是一个最好的做法是,因为大多数应用程序要求一个固定数量的列是从一个给定的SELECT语句返回。当柱已被添加到一个表,你用星号的方法来确定表中的列,其他列返回可以打破没有编码来处理这些额外的数据应用。

 

FROM子句

FROM子句中的表你确定要从中选择数据。在这个水平,我们只讨论选择数据从一个单一的FROM子句中的表。请注意,你的进步你的SQL知识的FROM子句可以识别从多个表中选择数据。

 

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

 

第一种方法是通过确定表名和它所属的模式指定一个表。这是我发现我所有的表名在我目前为止的例子。在我的每一个例子,我说的是production.productcategory表名。实际的表名是类,它是包含在生产模式。

 

确定在FROM子句中的表的表名是国家二。在FROM子句中只包含表名,SQL Server将承担表包含默认模式下的数据库用户,或在dbo架构。让我解释得更详细一点这个概念。

 

当你提交一个查询的SQL Server只能识别表名称,SQL Server将需要解决方案这张桌子下。这是因为在一个给定的数据库可以有多个同名的表,只要是在不同的模式。确定哪种模式表驻留在SQL Server中通过一个两步的过程。第一步是使用默认模式为谁提交的查询和添加默认模式表的名字然后查找表的数据库用户。如果SQL Server查找表使用用户的默认架构则不进行第二步。如果SQL服务器没有使用用户的默认架构中找到表,然后SQL Server检查在dbo架构中找到表。无论你的数据库包含一个模式或不,这是要确定在FROM子句中使用架构名称后跟表名表的习惯的最佳实践。这样做会降低工作的SQL Server量要解决的表名和促进计划缓存重新使用。

 

确定一个表的使用三部分组成的名称,第三条道路,其中最后两部分架构和表的名称,和第一部分是数据库名称。这里是一个SELECT语句类似于我以前的SELECT语句的使用三部分组成的名称:

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

在这里,你可以看到我将数据库名称冒险工程添加到生产中。在from子句中标识的产品类别表。

 

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

 

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

 

WHERE子句

SELECT语句的WHERE子句是可选的。WHERE子句用于约束从SELECT语句返回的行。数据库引擎根据WHERE子句对每一行进行求值,然后如果返回WHERE子句中确定的搜索条件或条件,则只返回行。当你编写更多SELECT语句时,你会发现大多数SELECT语句都可能包含WHERE子句。

 

一个简单的WHERE子句将包含一个搜索条件,而子句可能包含许多条件的情况更为复杂。当WHERE子句中使用多个条件时,它们将通过使用和或逻辑运算符逻辑地组合在一起。SELECT语句中可能包含的不同条件的数量没有限制。在我的例子中,到目前为止,我只使用了一个条件。让我们回顾一下几个从句中比较复杂的例子。

 

下面是一个SELECT语句,它有两种不同的搜索条件:

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

在这个语句中,第一个条件检查在颜色列中该行是否有蓝色值。第二个条件检查是否在ProductID列的值大于900。由于使用运算符和运算符,为了从该查询返回一行,这些条件都必须是真的。

 

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

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

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

 

让我在前面的WHERE子句中添加一个非操作符:

SELECT  Name ,
        ColorFROM    Production.ProductWHERE   ProductID > 900
        ANDNOT( Color ='Blue'
                  OR Color ='Green'

我在操作和操作之后添加了非操作符,表明我想要的不是蓝色或绿色的产品。当我运行这个查询我的AdventureWorks数据库我知道是锡尔弗的产品,黄色和黑色。

 

一个完整的所有搜索条件参考书网上不同的可能的名单:http://msdn.microsoft.com/en-us/library/ms173545.aspx和逻辑运算符的优先级,你可以阅读更多这方面的信息:http://msdn.microsoft.com/en-us/library/ms190276.aspx

 

把一切放在一起:商业案例

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

 

运动# 1

假设你已经通过人力资源部的负责人要求出示有病假和假期很多员工都EmployeeID值列表。对于这个列表的人力资源主管的目的告诉你“很多离开”的定义如下:员工必须有一个sickleavehours值大于68vacationhours值大于98。你可以找到这些列在表human.resources.employee EmployeeID列。编写和测试你的代码在AdventureWorks数据库。完成后,请在下面的部分检查你的代码。

 

运动# 2

你的经理对一些具体的订单有一些问题。你的经理希望你生成与一些特定订单相关联的所有列的列表,这样她就可以检查哪个销售人员与每个订单相关。你的经理指定她在一个包含salesorderheader行有4370243712之间的SalesOrderID订单报告,只感兴趣。完成此SELECT语句后,请检查下面的答案。

 

练习答案1

你的查询应该如下所示:

SELECT  EmployeeID ,
        SickLeaveHours ,
        VacationHoursFROM    HumanResources.EmployeeWHERE   SickLeaveHours > 68
        AND VacationHours > 98 ;

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

员工身份病假时间假期

练习答案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行。五行有一个2001-07-02 OrderDate的山谷中,五行和2行有一个2001-07-03 OrderDate谷有一个2001-07-04 OrderDate值。

 

与以前的解决方案相比,需要注意的一点是所有列名都被标识出来,而之前的解决方案使用星号来指定所有列。通过名称识别所有列是一种更好的编码实践,因为即使在表中添加了一个列,SELECT语句也将返回相同的列数。当应用程序期望从SELECT语句中返回一定数量的列时,这一点非常重要。

 

理解基本SELECT语句

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

 

 

这篇文章是阶梯部分T-SQL DML的阶梯

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

博主推荐

换一批

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