第六周翻译

第一:基本的select语句

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

 

选择语句中的三个部分。

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

  第六周翻译

这个" <列表> "会包含你想要从查询中返回的列的列表,“表名”将包含选择数据的表,和“<标准>“确定将用于限制的搜索条件从SELECT语句返回的行。注意WHERE子句是可选的。

 

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

 

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

 第六周翻译

这里我选择了两个不同的列,产品类别和名称,来自生产ProductCategory表。由于这个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个部分的表名,您将知道该表与一个链接服务器相关联。

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

假设你已经被人力资源部的负责人要求为那些有很多病假和假期的员工列出所有的ID,

在这个数据库中,人力资源主管告诉你“大量休假”的应该是这样的:员工的病假时间必须大于68,休假时间大于98。你可以在H人力资源表中找到这些列和EmployeeID列,员工表。在事先工作数据库中编写和测试代码。完成后,在下面的部分中检查您的代码。

练习2

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

对练习一的回答

你的查询应该如下所示:

第六周翻译

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

The results of your query should return the following three rows:

EmployeeID  SickLeaveHours VacationHours

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

109         69             99

179         69             99

224         69             99

对练习二的回答:

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

第六周翻译

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

第六周翻译第六周翻译

您的查询应该返回11行。5行有一个命令数据的2001-07-02,另外5行有一个OrderDate vale of 2001-07-03和2行有一个OrderDate值的2001-07-04。

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

理解基本的SELECT语句

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

这篇文章是T-SQL文章的一部分。