第六周翻译(Stairway to T-SQL DML Level 1: The Basic SELECT Statement)



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

第一级 基本的选择语句

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

选择语句中的三个部分

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

<列清单>”将包含要从查询中返回的列的列表,“< table_name>”将包含选定数据的表,以及“< wherecriteria >”,确定将用于约束将从SELECT语句返回的行的搜索条件。注意WHERE子句是可选的。

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

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

在这里,我从成品中选择了两个不同的列,ProductCategoryIDNameProductCategory表。由于这个SELECT语句有一个WHERE子句,它将从表返回的行限制为只具有ProductCategoryID值小于2的行。

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

列清单

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

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

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

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

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

跟从条款

FROM子句中,您确定要选择数据的表。在这个级别,我们只讨论从from子句中的单个表中选择数据。注意,当您在SQL知识中取得进展时,FROM子句可以识别多个表,从中选择数据。

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

第一种方法是通过标识表名和它所属的模式来指定一个表。这就是迄今为止我在所有示例中识别所有表名的方法。在我的每一个例子中,我说过表名是Production.ProductCategory。实际的表名只是ProductCategory,它包含在成品模式中。在FROM子句中确定表的第二种方法是只声明表名。当FROM子句只包含表名时,SQL Server将假定表包含在数据库用户的默认模式下,或在dbo模式下。让我再详细解释一下这个概念。

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

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

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

 

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

 

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

Where 字句

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

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

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

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

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

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

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

在操作之后,我添加了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行的报告感兴趣,该报告包含在4370243712之间的SalesOrderId。当你写完这个SELECT语句时,请检查下面的答案。

答案练习# 1:

您的查询应该如下所示:

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

答案练习# 2:

您的查询应该是这样的,如果您阅读了上面提到的文档,以便了解更多关于搜索条件和操作符之间的信息:

或者你可能写过类似这样的代码:

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

了解基本的select语句

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

 

阅读更多

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