Stairway to T-SQL DML Level 1

该系列
这篇文章是阶梯系列的一部分:t-sql DML的阶梯
这段阶梯将为您提供一个基本的理解,即如何使用SQL Server的Transact-SQL(T-SQL)方言来处理来自SQL Server表的数据。DML是数据操作语言,它是处理数据的语言的一个方面。它包括语句选择、插入、更新和删除。这段阶梯还将提供一些SQL语言的历史和一些关于集合理论的一般概念。每一个级别都将建立在前面的级别上,所以在您完成的时候,您将很好地理解如何从SQL Server中选择和修改数据。

以下是在这个阶梯系列中所涵盖的不同级别:
第1级:基本选择语句
层次2:结构化查询语言(SQL)的历史
第3级:关系数据库设计
第4级:SQL的数学:第1部分
第5级:SQL的数学:第2部分
第6级:使用ORDER BY子句排序数据的基础知识
第7级:使用一个简单的GROUP BY子句总结数据
第8级:数据修改:更新
第9级:数据修改:删除

第1级:基本选择语句
在SQL Server数据库中管理数据有很多不同的方面。在您进入与管理应用程序数据相关的复杂管理问题之前,您需要从一个表中检索数据的基础开始。为了从SQL Server表返回数据,您可以使用SELECT语句。在这个级别,我将介绍基本SELECT语句的组件,以及如何使用它从单个SQL Server表检索数据。
选择语句中的三个部分
从单个表返回数据的基本SELECT语句由三个不同的部分组成:列列表、FROM子句和WHERE子句。使用这些不同的组件构造一个基本SELECT语句的语法如下:
SELECT
FROM


WHERE ;

“<列表>”将包含一个列的清单,你想要返回的查询中,将包含“< table_name >”表的数据被选中时,和““确定将用于限制的搜索条件从SELECT语句返回的行。注意WHERE子句是可选的。
请注意,我在这个阶段上的所有例子都将使用在这个位置可以从网站获得的示例数据库SQL Server 2005数据库:http://sqlserversamples.codeplex.com/
让我们看一下下面的非常简单的SELECT语句,它从示例数据库中的表中选择一些数据。您可以通过在SQL Server Management Studio中使用查询窗口运行本文中描述的每一个查询语句,同时将数据库设置为示例数据库。
SELECT ProductCategoryID ,
Name
FROM Production.ProductCategory
WHERE ProductCategoryID < 2 ;
在这里,我从生产中选择了两种不同的列,产品类别和名称。ProductCategory表。因为这个SELECT语句有一个WHERE子句,它限制从表返回的各行,只局限于那些拥有产品类别id值小于2的行。
现在您已经有了一个SELECT语句的基本思想,让我更详细地了解SELECT语句的每个组件。
列表
列表遵循SELECT关键字,你可以在其中指定想要从表格返回的列。列通过指定列名来标识。如果列出多个列,则用逗号分隔。在以后的级别中,我们将看到从指定的表中返回值以外的值的可能性,在第一级,我们将坚持基本原则。在上面的例子中,让我们来探索一个列表如果它只选择一个列,或者一个表格的所有列,那么它可能是什么样子。
如果我只想返回生产的Name列。
产品类别表,我的查询是这样的:
Stairway to T-SQL DML Level 1
在这里,你可以看到,我只在SELECT和上述查询中的关键字之间指定了Name列。
但是如果我想要指定生产中的所有列ProductCategory表I将运行以下查询:
Stairway to T-SQL DML Level 1

在这个SELECT语句中,你可以看到我已经确定了4个不同的列,每个列都用逗号分隔。
这些列都可以在一行中列出,也可以在不同的行中分开,就像我所做的那样。还有另一种方法可以从表格中选择所有列,这是通过指定一个星号而不是指定单个列名。下面是一个使用星号规范的SELECT语句:Stairway to T-SQL DML Level 1

FROM子句
在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语句,它使用了三个部分的名称:
Stairway to T-SQL DML Level 1
在这里,您可以看到,我将数据库名称AdventureWorks添加到生产中。在FROM子句中标识的ProductCategory表。
通过对FROM子句中的表使用三部分命名约定,SQL Server Management Studio中的查询窗口的数据库上下文可以设置为任何数据库,数据库引擎仍然知道用于查询的数据库、模式和表。当构建需要在实例中从多个数据库检索数据的应用程序时,使用三个部分的名称有助于在单个应用程序中从多个数据库中检索数据。
最后一种方法是使用一个四部分的名称,第四部分(在数据库名称前面)标识链接服务器的名称。由于链接服务器不在这个楼梯的范围内,我将不再进一步讨论这个主题。如果您应该运行包含4个部分的表名,您将知道该表与一个链接服务器相关联。
WHERE子句
SELECT声明的WHERE子句是可选的。WHERE子句用于约束从SELECT声明返回的行。数据库引擎根据WHERE子句对每一行进行评估,然后只有在它们满足WHERE子句的搜索条件或条件被鉴定时才返回行。当你编写更多的SELECT声明时,你将发现大多数SELECT声明中可能包含WHERE子句。
一个简单的WHERE子句会包含一个单一的搜索条件,而一个更复杂的WHERE子句可能包含许多条件。当在WHERE子句中使用多个条件时,它们将通过使用AND和OR逻辑运算符组合在一起。在SELECT语句中可能包含的不同条件的数量是没有限制的。到目前为止,我的例子只使用了一个单一条件。让我们回顾一些有比较复杂的WHERE子句的例子。
这里有一个有两个不同搜索条件的SELECT声明:
SELECT *
FROM Production.Product
WHERE Color = ‘Blue’
AND ProductID > 900 ;
在此声明中,第一个条件将检查该行在颜色列中是否有蓝色值。第二个条件是检查ProductId列中是否有大于900的值。由于AND操作都使用了这些条件,因此为了使行能从查询中返回,它需要是真的。
看一个更复杂的WHERE子句:
SELECT *
FROM Production.Product
WHERE ProductID > 900
AND ( Color = ‘Blue’
OR Color = ‘Green’
) ;
这个示例返回生产列。ProductID值大于900的产品行,颜色栏中的值为蓝色或绿色。通过查看这个查询,你可以看到我已经在两个不同的颜色列条件下插入了成分。这就设置了条件对彼此进行评估的顺序,就像在数学表达式中一样。通过使用OR操作插入语,在评估AND操作之前,将对两种颜色条件进行评估。在没有插入语的情况下同时使用AND和OR,这些逻辑运算符的处理顺序是基于逻辑运算符优先级的规则。优先级规则规定,如果不包含插入语,AND操作将在OR操作之前执行。
让我在之前的WHERE子句中添加一个NOT操作:
SELECT Name ,
Color
FROM Production.Product
WHERE ProductID > 900
AND NOT ( Color = ‘Blue’
OR Color = ‘Green’
) ;
我在AND操作之后添加了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:
您的查询应该如下所示:
Stairway to T-SQL DML Level 1
查询的结果应该返回以下三行:
Stairway to T-SQL DML Level 1
答案练习# 2:
您的查询应该是这样的,如果您阅读了上面提到的文档,以便了解更多关于搜索条件和操作符之间的信息:
Stairway to T-SQL DML Level 1
Stairway to T-SQL DML Level 1
您的查询应该返回11行。5行有一个OrderDate谷的2001-07-02,5行有一个OrderDate vale of 2001-07-03和2行有一个OrderDate值的2001-07-04。
关于这个解决方案和前面的解决方案的一个值得注意的地方是所有的列名都被标识出来,而前面的解决方案使用星号来指定所有的列。通过名称标识所有列是一种更好的编码实践,因为即使在表中添加了额外的列,您的SELECT语句也总是返回相同的列数。当应用程序期望从SELECT语句返回特定数量的列时,这一点非常重要。
在应用程序中使用星号(通常称为“星号”)时需要注意。由于星号将返回表格中的所有列,如果你碰巧更改了一张表,以包含一个额外的列,那么附加列将会返回,而不会修改实际的SELECT语句。然而,如果你已经按名称指定了所有的列,那么当添加新栏目时,它将不会返回,除非你将它添加到列表中。使用星号可以接受测试,但是如果你想要遵循最佳实践,不要在应用程序代码中使用它。这是最佳实践的原因是,大多数应用程序期望从给定的SELECT语句中返回固定数量的列。当列被添加到表格中时,你已经使用星号方法来识别表格列,返回的附加列可以破坏没有被编码来处理这些额外数据的应用程序。
理解基本选择语句
为了成为一个SQL Server应用程序程序员,你需要首先了解基本的SELECT语句。理解如何检索表格中的所有数据并限制返回的内容是开发应用程序的基础。本文和练习为你提供了SELECT语句基础知识,这是本系列的第一个构建块。
这篇文章是通往T-SQL DML阶段的一部分
注册到我们的RSS提要并在我们在阶段上发布一个新级别时得到通知!