Stairway to T-SQL DML Level 1: The Basic SELECT Statement
2018-04-12 16:09
387 查看
第1级:基本SELECT语句
SQLServer数据库中的数据管理有很多不同的方面。在您能够进入与管理应用程序数据相关的复杂管理问题之前,首先需要从表检索数据的基础上开始。若要从一种表返回数据,请使用select语句。在这个级别上,我将覆盖基本select语句的组件以及如何使用它从单个SQL表检索数据。
ELECT语句中的三个部分
从单个表返回数据的基本SELECT语句由三个不同的部分组成:列列表、FROM子句和WHERE子句。使用这些不同组件构建基本select语句的语法如下:
注意,在这个Stairway中的所有示例都将使用adventureworks可从该网站从CodePlex获得的SQL 2005数据:http://sqlserversamples.codeplex.com/.
下面我们来看看下面一个非常简单的select语句,该语句从adventureworks数据库。您可以通过运行本文中描述的每个查询语句,使用sqlservermanagementstudio中的查询窗口来跟踪每个查询语句,同时将数据库设置为adventureworks。
SELECT ProductCategoryID ,
Name
FROM Production.ProductCategory
WHERE ProductCategoryID < 2 ;
这里,我选择了两个不同的列,n.ProductCategoryID和名字,从n.Production.ProductCategory桌子。由于这个select语句有一个where子句,所以它将从表返回的行限制为只有n.ProductCategoryID值小于2。
既然您已经有了一个select语句的基本思想,那么让我更详细地探究select语句的每个组件。
列表
列表遵循选择关键字,并指定您希望从表返回的列。如果列出多个列,则用逗号分隔。在后面的层次上,我们将查看从指定表中返回列以外的值的可能性,在第一层中,我们将坚持基本的内容。根据上面的示例,我们来探究列列表是否会看起来像只选择单个列或表的所有列。
如果我只想返回名称列的n.Production.ProductCategory表中的查询将看起来如下:
在这里您可以看到,我只指定名称列在上述查询中的选择和关键字之间。但是如果我想指定在表中的所有列,我将运行以下查询:
在这个select语句中,您可以看到,我已经确定了4个不同的列,每个列都是逗号分隔的。这些列都可以在一行上列出,或者在不同的行上进行分离,以便可读性,正如我所做的那样。另一种方法是从表中选择所有列,这是指定星号而不是指定单个列名称。下面是一个使用星号规范的select语句:
根据条款
在FROM子句中,标识要从中选择数据的表。在这个级别上,我们只讨论从FROM子句中的单个表中选择数据。请注意,随着您对SQL的了解不断加深,FROM子句可以标识要从中选择数据的多个表。有许多不同的方法来标识要在其中选择数据的表。事实上,有四种不同的方式,其中三种我将在本文中介绍,第四种我只会提到。
第一种方法是通过标识表名和表所属的架构来指定表。到目前为止,我在所有示例中都是这样标识我的所有表名的。在我的每个示例中,我说表名是n.Production.ProductCategory。实际表名仅为n.ProductCategory它包含在生产模式
识别FROM子句中的表的第二种方法是只声明表名。当FROM子句仅包含表名时,SQLServer将假定该表包含在数据库用户的默认架构下或DBO模式下。让我更详细地解释一下这个概念。
当您向仅标识表名的SQLServer提交查询时,SQLServer将需要解析该表所处的架构。这是因为在给定的数据库中可以有多个同名的表,只要它们在不同的模式中。要确定一个表驻留在SQLServer中的架构,需要经过两个步骤。第一步是对提交查询的数据库用户使用默认架构,并附加他们的默认架构表名,然后查找该表。如果SQLServer使用用户默认架构找到表,则不执行步骤二。如果SQL没有使用用户默认架构查找表,则sqlserver将在DBO模式查找表。无论您的数据库是否包含单个模式,最好的做法是习惯于使用模式名称后面的表名来标识FROM子句中的表。通过这样做,您可以减少SQLServer解析表名和促进计划缓存重新使用所需的工作量。
识别表的第三种方法是使用三个部件名,其中最后两个部分是模式和表名,第一部分是数据库名。下面是一个SELECT语句,类似于我以前的SELECT语句,它使用了三个部分的名称:
通过使用FROM子句中表的三部分命名约定,可以将SQLServerManagementStudio中查询窗口的数据库上下文设置为任何数据库,而且数据库引擎仍将知道用于查询的数据库、架构和表。当构建需要从实例中的多个数据库检索数据的应用程序时,使用三个部件名称有助于从单个应用程序中的多个数据库检索数据。
最后一种方法是使用四部分的名称,第四部分(在数据库名称之前)标识链接服务器的名称。由于链接服务器超出了本阶梯的范围,我将不再进一步讨论这个主题。如果您应该跨包含4个部分的表名运行,您将知道该表与链接服务器相关联。
选择哪条条款
SELECT语句的WHERE子句是可选的。WHERE子句用于约束SELECT语句返回的行。数据库引擎根据WHERE子句计算每一行,然后只返回符合WHERE子句中标识的搜索条件的行。当您编写更多SELECT语句时,您会发现大多数SELECT语句可能包含WHERE子句。
简单WHERE子句将包含单个搜索条件,而更复杂的WHERE子句可能包含许多条件。当在WHERE子句中使用多个条件时,它们将通过使用AND和OR逻辑运算符逻辑地组合在一起。SELECT语句中可能包含的不同条件的数量没有限制。在我的例子中,到目前为止,我只使用了一个条件。让我们回顾一下几个例子,其中子句更复杂。
下面是一个选择语句,它有两个不同的搜索条件:
在本语句中,第一个条件检查该行是否具有值。蓝色在颜色专栏。第二个条件检查是否在生产d列大于900。由于使用了运算符和运算符,所以对于从这个查询返回一行,这些条件都需要true。
让我们来看看一个更复杂的子句:
让我在前面的WHERE子句的基础上添加一个NOT操作符:
对于搜索条件的所有不同可能性的完整列表,请参阅联机丛书:http://msdn.microsoft.com/en-us/library/ms173545.aspx对于逻辑运算符优先级的更多信息,您可以阅读本主题:http://msdn.microsoft.com/en-us/library/ms190276.aspx。
把它们全部放在一起:商业案例
现在轮到您使用我共享的信息来构建您自己的基本选择语句了。
练习#1:
假设您已被人力资源部主管要求生成所有的清单雇员ID有很多病假和休假时间的雇员的价值。为了本列表的目的,人力资源主管告诉您“大量休假”的定义如下:雇员必须拥有n.SickLeaveHours值大于68和an.VacationHours值大于98。您可以找到这些列和雇员ID列中的n.Human.Resources.Employee桌子。编写并测试您的代码,以adventureworks数据库。完成后,检查您的代码,以反对下面的部分的答案。
练习2:
你的经理有一些问题,有些特定的订单号码。您的经理希望您生成与几个特定订单关联的所有列的列表,以便可以查看哪些销售人员与每个订单关联。您的经理指定了她只关心包含n.SalesOrderHeader对于命令行,则n.SalesOrderId当您完成编写此select语句时,请检查下面的答案。
运动#1的答案:
您的查询应该看上去如下:
雇员ID n.SickLeaveHours
EmployeeID
b7a2
SickLeaveHours VacationHours----------- -------------- -------------109 69 99179 69 99224 69 99
练习2:
如果您阅读上面引用的文档,可以了解更多关于搜索条件和操作符之间的信息,那么查询应该会看起来类似于此:
您的查询应该返回11行。五行有一个命令日期2001-07-02年度,五排有一条命令日期2001-07-03年度的淡水河谷及两排命令日期2001-07-04年度价值
对于这个解决方案与以前的解决方案相比,有一点值得注意的是,所有列名都被标识出来,而前面的解决方案使用星号来指定所有列。通过名称来标识所有列是一个更好的编码实践,因为即使添加到表中,您的select语句将始终返回相同数量的列。当应用程序期望从选择语句返回特定数量列时,这一点非常重要。
理解基本select语句
为了成为一个一种应用程序程序员,首先需要理解基本的select语句。了解如何检索表中的所有数据并限制返回的内容对于开发应用程序至关重要。本文和练习为您提供了select语句基础知识,它是本系列的第一个构建块。
SQLServer数据库中的数据管理有很多不同的方面。在您能够进入与管理应用程序数据相关的复杂管理问题之前,首先需要从表检索数据的基础上开始。若要从一种表返回数据,请使用select语句。在这个级别上,我将覆盖基本select语句的组件以及如何使用它从单个SQL表检索数据。
ELECT语句中的三个部分
从单个表返回数据的基本SELECT语句由三个不同的部分组成:列列表、FROM子句和WHERE子句。使用这些不同组件构建基本select语句的语法如下:
SELECT <Column List> FROM <table name> WHERE <where criteria>;“ <列表>”将包含您希望从查询返回的列表,“”将包含选择数据的表,“<标准>”可以识别用于约束从select语句返回的行的搜索条件。注意,where子句是可选的。
注意,在这个Stairway中的所有示例都将使用adventureworks可从该网站从CodePlex获得的SQL 2005数据:http://sqlserversamples.codeplex.com/.
下面我们来看看下面一个非常简单的select语句,该语句从adventureworks数据库。您可以通过运行本文中描述的每个查询语句,使用sqlservermanagementstudio中的查询窗口来跟踪每个查询语句,同时将数据库设置为adventureworks。
SELECT ProductCategoryID ,
Name
FROM Production.ProductCategory
WHERE ProductCategoryID < 2 ;
这里,我选择了两个不同的列,n.ProductCategoryID和名字,从n.Production.ProductCategory桌子。由于这个select语句有一个where子句,所以它将从表返回的行限制为只有n.ProductCategoryID值小于2。
既然您已经有了一个select语句的基本思想,那么让我更详细地探究select语句的每个组件。
列表
列表遵循选择关键字,并指定您希望从表返回的列。如果列出多个列,则用逗号分隔。在后面的层次上,我们将查看从指定表中返回列以外的值的可能性,在第一层中,我们将坚持基本的内容。根据上面的示例,我们来探究列列表是否会看起来像只选择单个列或表的所有列。
如果我只想返回名称列的n.Production.ProductCategory表中的查询将看起来如下:
SELECT Name FROM Production.ProductCategory WHERE ProductCategoryID < 2 ;
在这里您可以看到,我只指定名称列在上述查询中的选择和关键字之间。但是如果我想指定在表中的所有列,我将运行以下查询:
SELECT ProductCategoryID , Name , rowguid , ModifiedDate FROM Production.ProductCategory WHERE ProductCategoryID < 2 ;
在这个select语句中,您可以看到,我已经确定了4个不同的列,每个列都是逗号分隔的。这些列都可以在一行上列出,或者在不同的行上进行分离,以便可读性,正如我所做的那样。另一种方法是从表中选择所有列,这是指定星号而不是指定单个列名称。下面是一个使用星号规范的select语句:
SELECT * FROM Production.Produc 4000 tCategory WHERE ProductCategoryID < 2 ;在应用程序中使用星号(通常称为“星型”)时需要注意。如果您已按名称指定了所有列,那么当添加新列时,将不会返回它,除非您将其添加到列列表中。使用星号是测试可接受的,但是如果您想遵循最佳实践,则不要在应用程序代码中使用它。之所以这样做是最好的做法,是因为大多数应用程序期望从给定的select语句返回固定数量的列。当列添加到表中,并且使用星号方法标识表列时,返回的附加列可以破坏未被编码来处理此额外数据的应用程序。
根据条款
在FROM子句中,标识要从中选择数据的表。在这个级别上,我们只讨论从FROM子句中的单个表中选择数据。请注意,随着您对SQL的了解不断加深,FROM子句可以标识要从中选择数据的多个表。有许多不同的方法来标识要在其中选择数据的表。事实上,有四种不同的方式,其中三种我将在本文中介绍,第四种我只会提到。
第一种方法是通过标识表名和表所属的架构来指定表。到目前为止,我在所有示例中都是这样标识我的所有表名的。在我的每个示例中,我说表名是n.Production.ProductCategory。实际表名仅为n.ProductCategory它包含在生产模式
识别FROM子句中的表的第二种方法是只声明表名。当FROM子句仅包含表名时,SQLServer将假定该表包含在数据库用户的默认架构下或DBO模式下。让我更详细地解释一下这个概念。
当您向仅标识表名的SQLServer提交查询时,SQLServer将需要解析该表所处的架构。这是因为在给定的数据库中可以有多个同名的表,只要它们在不同的模式中。要确定一个表驻留在SQLServer中的架构,需要经过两个步骤。第一步是对提交查询的数据库用户使用默认架构,并附加他们的默认架构表名,然后查找该表。如果SQLServer使用用户默认架构找到表,则不执行步骤二。如果SQL没有使用用户默认架构查找表,则sqlserver将在DBO模式查找表。无论您的数据库是否包含单个模式,最好的做法是习惯于使用模式名称后面的表名来标识FROM子句中的表。通过这样做,您可以减少SQLServer解析表名和促进计划缓存重新使用所需的工作量。
识别表的第三种方法是使用三个部件名,其中最后两个部分是模式和表名,第一部分是数据库名。下面是一个SELECT语句,类似于我以前的SELECT语句,它使用了三个部分的名称:
SELECT * FROM AdventureWorks.Production.ProductCategory WHERE ProductCategoryID < 2 ;在这里,您可以看到我附加了数据库名称。adventureworks到n.Production.ProductCategory从from子句中标识的表。
通过使用FROM子句中表的三部分命名约定,可以将SQLServerManagementStudio中查询窗口的数据库上下文设置为任何数据库,而且数据库引擎仍将知道用于查询的数据库、架构和表。当构建需要从实例中的多个数据库检索数据的应用程序时,使用三个部件名称有助于从单个应用程序中的多个数据库检索数据。
最后一种方法是使用四部分的名称,第四部分(在数据库名称之前)标识链接服务器的名称。由于链接服务器超出了本阶梯的范围,我将不再进一步讨论这个主题。如果您应该跨包含4个部分的表名运行,您将知道该表与链接服务器相关联。
选择哪条条款
SELECT语句的WHERE子句是可选的。WHERE子句用于约束SELECT语句返回的行。数据库引擎根据WHERE子句计算每一行,然后只返回符合WHERE子句中标识的搜索条件的行。当您编写更多SELECT语句时,您会发现大多数SELECT语句可能包含WHERE子句。
简单WHERE子句将包含单个搜索条件,而更复杂的WHERE子句可能包含许多条件。当在WHERE子句中使用多个条件时,它们将通过使用AND和OR逻辑运算符逻辑地组合在一起。SELECT语句中可能包含的不同条件的数量没有限制。在我的例子中,到目前为止,我只使用了一个条件。让我们回顾一下几个例子,其中子句更复杂。
下面是一个选择语句,它有两个不同的搜索条件:
SELECT * FROM Production.Product WHERE Color = 'Blue' AND ProductID > 900 ;
在本语句中,第一个条件检查该行是否具有值。蓝色在颜色专栏。第二个条件检查是否在生产d列大于900。由于使用了运算符和运算符,所以对于从这个查询返回一行,这些条件都需要true。
让我们来看看一个更复杂的子句:
SELECT * FROM Production.Product WHERE ProductID > 900 AND ( Color = 'Blue' OR Color = 'Green' ) ;此示例返回生产.产品行的生产d值大于900,值为颜色列是蓝色或绿。通过查看这个查询,您可以看到我在两个不同的Color列条件周围放置了括号。这设置了条件之间相互评估的顺序,就像在数学表达式中所做的那样。通过使用括号,在计算AND运算符之前,将计算两种颜色条件之间的OR操作。在不带括号的情况下使用AND和OR时,这些逻辑运算符是进程的顺序是基于逻辑运算符优先的规则。优先级规则规定,如果不包含括号,则在OR操作之前执行操作。
让我在前面的WHERE子句的基础上添加一个NOT操作符:
SELECT Name , Color FROM Production.Product WHERE ProductID > 900 AND NOT ( Color = 'Blue' OR Color = 'Green' ) ;我在操作之后添加了非操作符,以指示我想要的产品不是蓝色或绿色。当我对我运行此查询时adventureworks数据库我得到了一些产品,即银、黄和黑。
对于搜索条件的所有不同可能性的完整列表,请参阅联机丛书:http://msdn.microsoft.com/en-us/library/ms173545.aspx对于逻辑运算符优先级的更多信息,您可以阅读本主题:http://msdn.microsoft.com/en-us/library/ms190276.aspx。
把它们全部放在一起:商业案例
现在轮到您使用我共享的信息来构建您自己的基本选择语句了。
练习#1:
假设您已被人力资源部主管要求生成所有的清单雇员ID有很多病假和休假时间的雇员的价值。为了本列表的目的,人力资源主管告诉您“大量休假”的定义如下:雇员必须拥有n.SickLeaveHours值大于68和an.VacationHours值大于98。您可以找到这些列和雇员ID列中的n.Human.Resources.Employee桌子。编写并测试您的代码,以adventureworks数据库。完成后,检查您的代码,以反对下面的部分的答案。
练习2:
你的经理有一些问题,有些特定的订单号码。您的经理希望您生成与几个特定订单关联的所有列的列表,以便可以查看哪些销售人员与每个订单关联。您的经理指定了她只关心包含n.SalesOrderHeader对于命令行,则n.SalesOrderId当您完成编写此select语句时,请检查下面的答案。
运动#1的答案:
您的查询应该看上去如下:
SELECT EmployeeID , SickLeaveHours , VacationHours FROM HumanResources.Employee WHERE SickLeaveHours > 68 AND VacationHours > 98 ;查询的结果应该返回以下三个行:
雇员ID n.SickLeaveHours
EmployeeID
b7a2
SickLeaveHours VacationHours----------- -------------- -------------109 69 99179 69 99224 69 99
练习2:
如果您阅读上面引用的文档,可以了解更多关于搜索条件和操作符之间的信息,那么查询应该会看起来类似于此:
SELECT * FROM Sales.SalesOrderHeader WHERE 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 , ModifiedDate FROM Sales.SalesOrderHeader WHERE SalesOrderID >= 43702 AND SalesOrderID <= 43712 ;
您的查询应该返回11行。五行有一个命令日期2001-07-02年度,五排有一条命令日期2001-07-03年度的淡水河谷及两排命令日期2001-07-04年度价值
对于这个解决方案与以前的解决方案相比,有一点值得注意的是,所有列名都被标识出来,而前面的解决方案使用星号来指定所有列。通过名称来标识所有列是一个更好的编码实践,因为即使添加到表中,您的select语句将始终返回相同数量的列。当应用程序期望从选择语句返回特定数量列时,这一点非常重要。
理解基本select语句
为了成为一个一种应用程序程序员,首先需要理解基本的select语句。了解如何检索表中的所有数据并限制返回的内容对于开发应用程序至关重要。本文和练习为您提供了select语句基础知识,它是本系列的第一个构建块。
相关文章推荐
- Stairway to T-SQL DML Level 3: Implementing a Relational Model in SQL Server
- 翻译Stairway to T-SQL DML Level 3: Implementing a Relational Model in SQL Server
- Try to code some sql statement to catch the consume much CPU time sps.
- Which SQL statement is the trump card to the senior software developer
- This is probably a good time to review the order in which SELECT statement clauses are to be specified. Table 10.2 lists all the clauses we have learned thus far, in the order they must be used.
- ocp 047-141 Evaluate the following SQL statement:SELECT product_name || 'it's not available for orde
- Which SQL statement is the trump card to the senior software developer
- Retrieving Data Using the SQL SELECT Statement
- dbvis MySQL server version for the right syntax to use near 'OPTION SQL_SELECT_LIMIT=DEFAULT' at lin
- Two Solutions to fix issue: ORDER BY items must appear in the select list if the statement contains a UNION, ...
- TOAD: Add the code development tool syntax to the SQL statement in the Editor
- How to select the data type in SQLserver database such as varchar, nvarchar
- SQL Basic Statement(INSERT/DELETE/UPDATE/SELECT)
- MySQL server version for the right syntax to use near 'OPTION SQL_SELECT_LIMIT=DEFAULT' at line 1
- SqlZoo.net习题答案:Using the SELECT statement.【bbc】
- Oracle 学习之SQL(一) Retrieving Data Using the SQL SELECT statement
- Which SQL statement is the trump card to the senior software developer
- SAP HANA 8. SQLScript Basic 之 Create an SQLScript Procedure with SELECT Statement
- 海洋工作室——网站建设专家:How to check the SQL statement execute time on SQL Server ?
- SqlZoo.net习题答案:Using the SELECT statement.【nobel】