- Visual C# 2005+SQL Server 2005数据库与网络开发
- 丁士锋等编著
- 1060字
- 2020-08-26 16:43:00
第二篇 SQL Server 2005入门篇
第3章 操作数据库
数据库是存放数据的一种数据介质,数据以一种特定的形式并通过相关的数据库管理软件进行数据的管理。通过应用程序与数据库接口进行交换,从而实现应用程序对数据的操作。本章介绍与.NET框架结合非常紧密的一种数据库,即SQL Server数据库。SQL Server数据库的最新版本为SQL Server2005,它是微软公司于2005年发布的一种非常强大的关系数据库系统。
3.1 SQL Server 2005简介
SQL Server 2005是用于大规模联机事务处理、数据仓库和电子商务应用的数据库和数据分析平台。作为微软公司数据库方面的产品,SQL Server 2005集成了数据库引擎、数据处理、数据分析服务、数据集成服务、报表服务、通知服务等多个技术领域。
3.1.1 数据库基本知识
数据库通俗的解释是存储数据的仓库。而在计算机里,我们把组成二维形式的表格称为关系型数据库,简称数据库。数据库通常包括两个重要的组成部分,即数据存储以及数据库管理系统。数据存储是指存储数据的物理硬件以及存储数据的格式和接口,在这一层面上分析,即数据以何种方式存储到物理设备中。比如说人的基本信息包括姓名、性别、电话、地址等信息,这些数据需要保存到固定的磁盘中,而这些基本的数据就形成了数据存储。数据库管理系统是指操作数据存储的软件管理系统,即通过固定的工具读取数据信息的方式。数据库具有如下通用的特点。
● 独立性。数据存储应该是与数据库管理系统本身相对独立的。
● 共享性。数据可以供多种程序语言和多个使用者使用。
● 冗余性。数据的存取应该尽量较少冗余,提高资源的使用以及数据的可维护性。
● 结构化。完善的数据存储格式使数据结构之间具有很好的结构性,同时减少数据的不一致性。
● 安全性和完整性。具有数据访问控制的安全性,只有可信任的用户和系统才允许访问,同时保证数据的完整。
3.1.2 SQL Server 2005数据库
由于数据库通常是由软件公司设计出来的产品,所以数据库软件安装之后才能进一步使用。SQL Server 2005数据库安装的时候,会提供两张安装光盘。其中第一张光盘安装的是数据库的基本组件,这些组件包括数据库引擎、分析服务、报表服务等。第二张光盘安装的是数据库的管理系统,即SQL Server 2005数据库的管理控制台,以及实例数据库和帮助手册。
注意:SQL Server 2005分为企业版本、专业版本和开发版本,为了实现其最大的功能,本书安装的SQL Server 2005为企业版。
下面通过图例介绍如何安装微软的SQL Server 2005数据库。
(1)在第一张光盘中,选择安装SQL Server 2005数据库选项,首先启动了如图3-1所示的【最终用户许可协议】窗口。
图3-1 数据库安装用户许可协议
(2)选择【我接受许可条款和条件】复选框,然后单击【下一步】按钮。安装程序会自动检查之前安装的软件组件,如图3-2所示。
图3-2 检查安装必备组件
(3)待检查完毕之后,【安装】按钮会变成可用状态,单击【安装】按钮,程序弹出安装向导页面,如图3-3所示。
图3-3 安装向导页面
(4)在安装向导页面,单击【下一步】按钮,安装过程将进入【系统配置检查】页面,如图3-4所示。
图3-4 安装系统配置检查
(5)安装程序会自动检查待安装的计算机的配置是否满足SQL Server 2005的安装条件,并将检查的结果显示在【状态】和【消息】列中。检查之后,如果系统满足SQL Server 2005的安装条件,则单击【下一步】按钮,进入准备安装过程,如图3-5所示。
图3-5 准备安装过程
(6)待准备安装过程结束后,【下一步】按钮将变成可用状态,单击【下一步】按钮,安装进入【注册信息】填写页面,如图3-6所示。
图3-6 安装注册信息
(7)确认注册信息之后,单击【下一步】按钮,页面进入安装组件的选择页面,如图3-7所示。
图3-7 选择安装组件
(8)由于本书的实例不需要安装分析服务等其他数据库产品,所以只需将【SQL Server Database Services】和【工作站组件、联机丛书和开发工具】复选框选中即可,单击【下一步】按钮,安装进入设定数据库实例名过程,如图3-8所示。
图3-8 设定数据库实例名
(9)在【实例名】页面中,选择【默认实例】选项,然后单击【下一步】按钮,页面进入【服务账户】设定页面,如图3-9所示。
图3-9 数据库服务账户设定
(10)在【服务账户】页面,选择【使用内置系统账户】选项,同时在下拉列表选择【本地系统】选项。在【安装结束时启动服务】选项中,选择【SQL Server】复选框,以确保安装之后,数据库引擎可以被启动。单击【下一步】按钮,页面进入到【身份验证模式】页面,如图3-10所示。
图3-10 设定数据库的身份验证模式
(11)选择【Windows身份验证模式】选项,单击【下一步】按钮,页面进入数据库数据【排序规则设置】页面,如图3-11所示。
图3-11 数据排序规则设置
注意:Windows身份验证模式是指基于操作系统用户名和密码的一种安全认证方式,即用户以相应的本机Windows账户或者域账户进行验证。混合模式是指普通的SQL身份验证和Windows身份验证全部都支持。
(12)保持默认的排序规则设置,单击【下一步】按钮,页面进入【错误和使用情况报告设置】页面,保持默认选项后单击【下一步】按钮,页面进入【准备安装】页面。在该页面中,用户可以检查安装的组件信息,如图3-12所示。
图3-12 数据库准备安装
(13)若组件信息不一致,则单击【上一步】按钮,退回到以前的设置页面,若确认无误,则单击【安装】按钮,进行安装,页面进入到数据库的安装页面,安装成功之后,会出现如图3-13所示的安装进度页面。
图3-13 数据库安装进度
(14)单击【下一步】按钮,进入安装完成页面,如图3-14所示。
图3-14 数据库安装完成
(15)单击【完成】按钮,完成了整个数据库的安装过程。
3.1.3 SQL Server 2005数据库管理工具
上一节中,通过SQL Server 2005的第一张安装光盘,完成了数据库的安装,此时的数据库虽然已经具备了数据的存储和操作功能,但是还不能通过管理工具来进行管理。如果需要更直观的方式对数据库的数据进行管理,还需要进一步安装数据库的管理工具。
下面介绍如何安装SQL Server 2005的数据库管理工具。
(1)在SQL Server 2005的第二张安装光盘中,启动Setup可执行文件。略过前面的安装协议等页面,逐一单击【下一步】按钮,进入如图3-15所示的【功能选择】页面。
图3-15 功能选择
(2)在【功能选择】页面中,单击【客户端组件】根节点,在选项中选择安装整个节点下面的所有项。然后单击【文档、示例和示例数据库】根节点,同样安装该节点下面的所有组件。因为本书后续实例要基于示例数据库进行讲解,所以建议读者安装此选项。
说明:文档用于在开发过程中实现帮助功能,而示例数据库用于后续实例的演示。
设置完成后,单击【下一步】按钮,进入【安装示例数据库】页面,如图3-16所示。
图3-16 安装示例数据库
(3)由于上一节中已经完成了数据库的安装,在【安装示例数据库】页面中,选择【安装并附加示例数据库】选项,同时可以在【SQL Server实例】下拉列表中,选择到上一节已经安装过的数据库实例名称。配置完成后,单击【下一步】按钮,进入【准备安装】页面,如图3-17所示。
图3-17 数据库管理工具准备安装
(4)单击【安装】按钮,进入【安装进度】页面,如图3-18所示。
图3-18 数据库管理工具安装进度
(5)待安装全部完毕之后,确定所有组件的【状态】列全部为【安装完毕】之后,单击【下一步】按钮,完成数据库的安装,如图3-19所示。
图3-19 数据库管理工具安装完成
安装完毕之后,可以启动数据库管理工具。SQL Server 2005数据库管理工具的英文名称为【Management Studio】。启动管理工具可以通过下面的步骤来完成。
(1)可以通过单击【开始】→【程序】→【Microsoft SQL Server 2005】→【SQL Server Management Studio】菜单,启动该管理工具。管理工具启动之后的窗口如图3-20所示。
图3-20 启动管理工具连接到服务器
(2)在弹出的【连接到服务器】对话框中,按图3.20的选项来连接到已经安装完毕的数据库实例。设置完毕之后,单击【连接】按钮,弹出管理工具的控制台,如图3-21所示。
图3-21 数据库管理工具控制台
说明:通过该客户端连接工具,不但可以连接到数据库引擎,还可以连接到分析服务、报表服务等SQL Server组件。
3.2 数据库
在数据库存储中,数据都存储到具有唯一名称的数据库中,可以通过SQL Server 2005数据库管理工具实现数据库的创建以及删除操作,也可以通过SQL语句实现数据库的创建以及删除。
3.2.1 使用Management Studio创建数据库
可以通过SQL Server 2005数据库管理工具Management Studio来完成数据库的创建。
(1)启动Management Studio之后,展开数据库实例树节点,在子节点中找到【数据库】节点,右击数据库节点,在弹出菜单中选择【新建数据库】命令,如图3-22所示。
图3-22 使用Management Studio新建数据库
(2)在弹出的【新建数据库】对话框中,可以输入数据库的名称和存储的路径等信息。如图3-23所示。
图3-23 填写新建数据库基本信息
(3)数据库信息输入完毕之后,单击【确定】按钮,可以看到原来的【对象资源管理器】窗口中的【数据库】节点下,增加了刚刚新建的名称为Demo的数据库,如图3-24所示。
图3-24 查看新建的数据库
通过以上的几个步骤即完成了数据库的创建过程。
注意:新建数据库成功之后,如果数据库节点中不出现该数据库,可以通过单击工具栏上的刷新按钮来重新获取数据库列表。
3.2.2 使用SQL语句创建数据库
除了通过Management Studio创建数据库之外,也可以通过SQL语句直接在查询窗口运行后创建新的数据库。创建数据库的SQL语句为
CREATE DATABASE database_name
其中的database_name为新建的数据库名称。创建数据库的详细语法如下所示。
CREATE DATABASE database_name [ ON [ PRIMARY ] [ <filespec> [ ˌ...n ] [ , <filegroup> [ ˌ...n ] ] [ LOG ON { <filespec> [ ˌ...n ] } ] ] [ COLLATE collation_name ] [ WITH <external_access_option> ] ]
由于在SQL Server 2005数据库管理工具Management Studio中,所有的查询语句都需要在查询窗口中执行,所以完成SQL语句创建数据库的过程,首先需要启动一个查询窗口。
现在,通过SQL语句创建一个名为Test的数据库,应该通过下面的步骤来完成。
(1)在Management Studio启动之后,如图3-21所示。单击管理台工具栏中的【新建查询】按钮,管理台的右侧部分会新建一个查询窗口,如图3-25所示。
图3-25 启动查询窗口执行SQL语句
(2)在查询窗口中,添加创建Test数据库的SQL语句,SQL代码如下所示。
CREATE DATABASE Test
(3)语句编写完毕之后,可以通过F5功能键或者单击工具栏上的【执行】按钮来执行该SQL语句。执行完毕之后,在查询窗口的下半部分,会提示本次执行SQL语句的结果消息,如图3-26所示。
图3-26 创建数据库SQL语句执行结果
通过以上步骤,完成了Test数据库的SQL语句创建,可以通过Management Studio的【对象资源管理器】来查看新建的数据库信息。
注意::查询分析器窗口在数据库操作中是一个重要部分,该功能可以运行任何SQL脚本来操作数据库,适合开发人员在熟悉SQL语法之后,直接编辑代码进行查询。
3.2.3 删除已创建的数据库
同创建数据库一样,删除数据库也可以通过Management Studio控制台或者SQL语句来实现。下面首先介绍如何通过Management Studio删除数据库。
(1)在【对象资源管理器】对话框中,找到需要删除的数据库,本实例中以Demo数据库作为删除对象,右键单击【Demo】数据库节点,在弹出的菜单中,单击【删除】按钮,如图3-27所示。
图3-27 通过Management Studio删除数据库
注意:在删除数据库的时候,如果有数据连接没有关闭,则此时的数据库不允许删除。应先关闭所有数据连接之后才能顺利完成删除工作。
(2)在弹出的【删除对象】对话框中,检查待删除的数据库是否正确,如果没有错误,单击【确定】按钮,完成数据库的删除过程。如图3-28所示。
图3-28 数据库删除对象对话框
通过SQL语句删除数据库相对比较容易,只需要在查询窗口中输入删除的SQL语句之后,执行即可。删除数据库的命令为DROP语句,其语法如下所示。
DROP DATABASE { database_name | database_snapshot_name } [ ˌ...n ]
下面的代码是删除第3.2.2节中,通过SQL语句创建的Test数据库的SQL语句。
DROP DATABASE Test
3.3 操作数据表
数据表(Table)是组成数据库的最基本元素之一,在数据库中,数据都存储在数据表中,之后再基于数据表对数据进行增、删、改、查的操作。本节介绍如何实现对数据表的操作。
3.3.1 创建表
在数据存储之前,首先需要创建存储数据的容器——数据表。表的创建可以通过Management Studio实现界面化的操作,也可以通过SQL语句实现。
本节实例将通过Management Studio和SQL语句创建一个表,该表的名称为Person,表中包括的字段名称和类型如表3-1所示。
表3-1 Person表的字段说明
首先介绍如何通过Management Studio实现该表的创建。该表包含于第3.2节中的Demo数据库中,如果Demo数据库未建立,请参见第3.2节中数据库创建的相关内容。
(1)在Demo数据库树节点中,右击表树节点,在弹出的菜单中,选择【新建表】命令,在Management Studio右侧会显示一张空表信息。将表3.1的字段信息,录入到空表中,录入之后的页面如图3-29所示。
图3-29 录入Person表信息
由于ID数据列是本表的主键,所以需要设置该列是标识种子,同时设定标识增量为1,属性的设定如图3-29下面的列属性信息。右击ID列,在弹出的菜单中单击【设为主键】菜单项,将该列设置为主键列。
(2)编辑完毕之后,单击工具栏中的存盘按钮。如果这是一张新表,则弹出【选择名称】对话框,在对话框中输入该表的名称Person,如图3-30所示。
图3-30 录入Person表的名称
(3)单击【确定】按钮,完成Person表的创建过程。
同样,可以通过SQL语句的形式创建一张新表。由于数据表都要存在于一个数据库中,所以在创建新表的时候,需要选择该表对应的数据库。下面介绍如何通过SQL语句在Demo数据库中建立表Person1的过程。
(1)启动Management Studio的【新建查询】窗口,将该查询窗口与数据库Demo进行绑定。该绑定可以通过两种方式实现。可以先启动查询窗口,然后在工具栏中的数据库下拉列表中,切换运行该查询的数据库名称,或者先选中需要执行SQL的数据库节点,然后再单击工具栏中的【新建查询】按钮,如图3-31所示。
图3-31 设定查询语句的执行数据库
只要确定该查询窗口是基于Demo数据库查询即可,如图3-31中的矩形框部分,可以通过数据库下拉列表,完成数据库的切换操作。
技巧:除了可以通过下拉列表选择数据库名称,还可以通过Use语句来切换当前操作的数据库。如上面操作中,可以在SQL代码的第一行加入Use Demo语句,表示后续的SQL语句是在Demo数据库中执行的。
(2)在查询对话框中,输入创建Person1表的SQL命令,代码如下所示。
CREATE TABLE [dbo].[Person1]( [ID] [int] IDENTITY(1,1) NOT NULL, [Name] [varchar](10) COLLATE Chinese_PRC_CI_AS NOT NULL, [Birth] [datetime] NOT NULL, [Address] [varchar](50) COLLATE Chinese_PRC_CI_AS NULL, [Phone] [varchar](50) COLLATE Chinese_PRC_CI_AS NULL, CONSTRAINT [PK_Person1] PRIMARY KEY CLUSTERED ( [ID] ASC )WITH (IGNORE_DUP_KEY = OFF) ON [PRIMARY] ) ON [PRIMARY]
(3)执行该SQL语句,完成表Person1的创建。
3.3.2 插入数据
数据表数据的插入可以通过Management Studio控制台以文本编辑的方式进行,也可以通过SQL语句中的insert语法实现。下面首先介绍通过Management Studio完成数据的插入。
(1)在【对象资源管理器】窗口中,找到待插入的数据表Person。右键单击该表节点,单击弹出菜单的【打开表】菜单项,可以看到在Management Studio右侧出现了该表中数据的列表。
(2)在数据表的编辑页面中,直接在各个列中实现数据的填写。例如增加一条数据信息,如图3-32所示。
图3-32 通过Management Studio插入数据
(3)由于Person表中的ID为自增类型的列,所以该列可以不用填写。其他字段只要符合表定义的数据类型就可以直接填写。编辑完一行数据之后,直接将焦点移到其他行之后,该行会自动保存。
下面再通过SQL语句实现数据表的数据插入。
注意:SQL语句对数据进行的操作都是通过查询窗口完成的。在后续章节中,如果再涉及SQL语句的执行,一律是指在查询窗口中实现的,本书只提供实现该操作的SQL语句,具体如何实现的操作将不再介绍。
在查询窗口中输入如下的插入数据SQL代码。
INSERT INTO [Demo].[dbo].[Person] ([Name] ,[Birth] ,[Address] ,[Phone]) VALUES ('leo' ,'1980-1-1' ,'beijing' ,'010-88888888')
其中,INSERT INTO是插入SQL语句的核心语法,后面需要提供待插入表的名称,实例中为[Demo].[dbo].[Person],表示Demo数据库中的[dbo].[Person]表,其中的dbo表示该表的所有者。然后需要提供插入表中的对应字段的值,其中列名称为VALUES前面的部分,而对应每个列的值为VALUES后面的部分。各个列名与值需要用逗号分隔开。
3.3.3 修改数据
数据表数据的修改可以通过Management Studio控制台以文本编辑的方式进行,也可以通过SQL语句中的UPDATE语法实现。
通过Management Studio修改数据与插入数据基本一致,此处不再介绍。通过SQL语句修改数据需要首先指定待修改数据的条件,如下面代码修改的就是ID为1的数据记录Name字段的内容,将该列原有的内容修改为carol。
UPDATE [Demo].[dbo].[Person] SET [Name] = 'carol' WHERE [ID]=1
修改数据的时候主要使用的是UPDATE命令,该命令首先需要指定待修改的表名称。然后通过SET语句,对指定列的值进行更改。最后需要通过WHERE语句,指定本次修改满足的条件。本实例中的条件为Person表中ID字段值为1的记录。当然,如果需要更新所有数据,则WHERE条件也可以不必设定。
3.3.4 删除数据
数据表数据的删除可以通过Management Studio控制台进行。删除的方式比较简单,首先选定待删除的行,然后右键单击该行选择【删除】菜单即可。删除数据也可以通过SQL语句中的DELETE语法来实现。下面代码实现了通过SQL语句来删除Person表中ID为2的那条记录。
DELETE dbo.Person WHERE ID=2
删除数据的时候主要使用的是DELETE命令,该命令首先需要指定待修改的表名称。然后通过WHERE语句,指定本次删除满足的条件。本实例中的条件为Person表中ID字段值为2的记录。
技巧:如果需要清空该表中的所有数据,则不需要添加任何的WHERE条件,在这种情况下,也可以使用truncate语句。
下面代码将会删除Person表中的所有数据。
truncate table dbo.Person
3.4 查询数据
查询数据是指从数据库的数据表中,将需要查找的数据返回成查询结果集合的过程。查询数据在数据库编程中是一个特别重要的操作,程序员可以通过查询语句的各种组合,获得数据结果,然后再利用数据的结果进行显示、分析以及下一步的操作等。本节通过几种查询方式,介绍如何实现数据库的查询操作。
3.4.1 查询数据语法
在SQL语句中,查询是通过SELECE语句完成的,有关SELECT的操作语法,如下所示。
SELECT [ ALL | DISTINCT ] [ TOP expression [ PERCENT ] [ WITH TIES ] ] <SELECT_list> <SELECT_list> ::= { * | { table_name | view_name | table_alias }.* | { column_name | [ ] expression | $IDENTITY | $ROWGUID } | udt_column_name [ { . | :: } { { property_name | field_name } | method_name(argument [,...n] ) } ] [ [ AS ] column_alias ] | column_alias = expression } [ ,...n ]
最简单的查询语句是
SELECT+列名+from+表名+WHERE条件
其中,列名表示本次查询中,表所对应的列名称,可以获取多个列,各个列之间需要使用逗号进行分隔,也可以使用【*】符号,完成本次数据表所有字段的查询。表名是指待查询的数据库表名称。而WHERE条件是指本次查询需要指定的条件,通过条件过滤可以使查询的结果集合更加简单。
例如,现在需要查询AdventureWorks数据库中产品表Product中的数据,查询的列是该表中的所有字段,对应的查询语句以及在查询窗口的查询结果如图3-33所示。
图3-33 Product表中的查询结果
3.4.2 使用条件查询
使用条件查询是指在查询语句中使用WHERE条件子句。WHERE条件语句可以与许多SQL谓词结合起来使用。
说明:所谓谓词,是指WHERE条件中用于操作列名与条件值之间的操作符号,比如【=】就可以理解为一种谓词,它表示指定的条件列必须等于某个值。
谓词的使用方式如下代码所示。
WHERE + 列名 + 谓词 + 值 WHERE ProductID = 300
各个WHERE条件子句也可以通过逻辑与或者逻辑或的关系进行条件的组合。比如查询产品ID ProductID为300或者400的产品信息的语句可以通过如下代码实现。
WHERE ProductID = 300 or ProductID = 400
下面介绍几种WHERE条件语句中的谓词。
● 比较谓词:通常用于比较作用,比如等于【=】、大于【>】、小于【<】、大于等于【>=】、小于等于【<=】、不等于【<>】。比如要查询产品ID小于400并且大于等于300的所有产品的产品信息,可以使用如下SQL语句。
SELECT * from Product WHERE ProductID >= 300 and ProductID < 400
● BETWEEN谓词:用于获取某一区间段值,BETWEEN谓词是包含指定值的一个闭区间段。比如要查询产品ID介于300和400之间的所有产品的产品信息,可以使用如下SQL语句。
SELECT * from Product WHERE ProductID BETWEEN 300 and 400
● CONTAINS谓词:用于在包含字符数据类型的列中搜索单个词和短语的精确或模糊(不太精确)匹配项、一定差异范围内的相邻词或加权匹配项。如要查询产品ID介于300和400之间,并且产品名称包含Chainring字段的所有产品的产品信息,可以使用如下SQL语句。
SELECT * from Product WHERE ProductID BETWEEN 300 and 400 and CONTAINS(Name, 'Chainring');
● IN谓词:确定指定的值是否与子查询或列表中的值相匹配,IN谓词之后可以是一个集合,也可以是基于一个子查询返回的某一列值的集合。比如要查询产品ID在集合1、2、3、4之中的所有产品信息,可以使用如下SQL语句。
SELECT * from Product WHERE productID in (1,2,3,4)
● LIKE谓词:可以进行模糊查询的谓词。比如要查询产品名称以Chainring开始的产品信息,可以使用如下SQL语句。
SELECT * from Product WHERE [Name] like 'Chainring%';
3.4.3 联合查询
联合查询是指通过SQL的语句,将多个查询的结果组合到一起之后,再对组合之后的结果进行查询的一种方式。联合查询包括使用UNION查询和使用JOIN查询。
注意:使用UNION关键字,可以在一个结果表中包含两个SELECT语句的结果。任一SELECT语句返回的所有行都可合并到UNION表达式的结果中。
比如要查询产品ID小于400,并且大于等于300的所有产品的产品信息,除了可以使用上一节介绍的and条件语句之外,还可以使用如下SQL语句。
SELECT * from Production.Product WHERE ProductID >= 300 union SELECT * from Production.Product WHERE ProductID < 400
由于UNION返回的是一个查询结果集,所以还可以基于这个结果集再次进行查询。
JOIN查询表示将多个表的某几个字段列进行条件关联之后,将满足关联的所有记录全部查询出来。使用JOIN语句的时候,需要首先关联表的名称,然后通过ON语句,将关联表之间的字段关系指定出来。比如需要查询SalesORDERDetail表中的产品,如果产品的单价小于Product表中的价格,同时产品ID为727的所有产品信息,可以使用如下SQL语句。
SELECT DISTINCT p.ProductID, p.Name, p.ListPrice, sd.UnitPrice FROM Sales.SalesORDERDetail AS sd JOIN Production.Product AS p ON sd.ProductID = p.ProductID AND sd.UnitPrice < p.ListPrice WHERE p.ProductID = 727;
3.4.4 限制查询
限制查询是指在查询的过程中,通过指定查询的行数将符合行数的结果返回成为结果集。SQL语句中的TOP语句就能起到限制查询的作用。TOP语句可以在查询结果中只返回前几行或者按照百分比的形式返回总行数一定百分比的结果行数。
比如需要查询Product表中的前10条产品的产品信息,或者后10条产品的产品信息,查询语句和查询结果如图3-34所示。
图3-34 Product表中的限制查询结果
在SQL语句中,如果想对查询结果进行排序操作,可以使用ORDER by的语句。该语句是指按照某一列进行升序或者降序的排列。ASC表示升序排列,DESC表示降序排列,在这种情况下的TOP语句才更有意义。
技巧:使用TOP语句除了可以指定固定的返回行数之外,也可以根据所有查询结果集合的百分比进行结果的返回。
比如需要查询Product表中的前10%条产品的产品信息,可以使用如下的SQL语句。
SELECT TOP 10 PERCENT WITH TIES * from Production.Product ORDER by productID ASC
3.4.5 对查询输出进行控制
如果按照默认的情况使用SELECT语句,在不指定列名的情况下,返回的都是真实数据表的列名称。但在实际情况下,可能会有需要返回不同列名称的时候,此时可以通过SQL的AS语句,将查询之后的结果集合以新的列名称返回给操作者。
比如,在查询产品表的时候,现在需要通过查询语句,将其中的几个英文列名称变化之后,返回其中文的列名称,此时就可以使用AS语句对结果进行处理。
下面结果中,将产品的前10条信息中编号列、名称列、产品编号列、单价列分别进行AS的转义处理,运行的SQL语句以及查询结果集合如图3-35所示。
图3-35 Product表中的查询输出控制
3.5 操作视图
视图实际是一张虚拟的数据表,它是通过一张或者多张数据表,按照一定的查询规则进行组合之后的结果集。视图包含一系列带有名称的列数据和行数据。
注意:视图在数据库中并不是以数据值存在的。行数据和列数据自由定义视图查询所引用的表,并且在引用视图时动态生成。
3.5.1 使用Management Studio创建视图
视图可以通过Management Studio一步步的图形化操作创建,也可以通过SQL语句直接创建。通过Management Studio创建视图的过程比较容易,只需按照提示进行选择和设定视图的属性即可。
下面通过创建一个视图,将AdventureWorks数据库的产品表Product和产品类别表ProductCategory组合起来。
(1)启动Management Studio,在【对象资源管理器】中,展开【数据库】节点中的【AdventureWorks】数据库,右击【视图】,选择【新建视图】命令,如图3-36所示。
图3-36 通过Management Studio新建视图
(2)在弹出的【添加表】对话框中,通过Ctrl组合键选择Product表和ProductCategory表,然后单击【添加】按钮,如图3-37所示。
图3-37 添加视图中的数据表
(3)单击【关闭】按钮,完成该视图的选择数据表过程。在视图的操作界面中,可以看到Product表和ProductCategory表已经被添加进来。此时选择Product表的Product SubcategoryID字段,将其拖动到ProductCategory表的ProductCategoryID字段中,通过此操作,可以将二表中的两个字段进行关联。关联之后的视图操作界面如图3-38所示。
图3-38 关联数据表在视图中的字段
(4)选择两个表需要在视图中体现的字段,分别将Product表中的ProductID、Name、ProductNumber字段和ProductCategory表中的ProductCategoryID、Name字段前面的复选框选中,表示视图中包含这几个字段。由于选中的结果中包含了两个Name字段,所以需要将ProductCategory表中的Name字段的别名更改为CategoryName。设定结束后,可以单击工具栏中的【执行】按钮,显示该视图的数据。如图3-39所示。
图3-39 设计视图中的字段并查看视图数据
(5)设定成功之后,单击工具栏中的【保存】按钮,在弹出的【选择名称】对话框中,将视图命名为vProductAndCategory,单击【确定】按钮,完成整个视图的定义过程。如图3-40所示。
图3-40 定义视图名称
3.5.2 使用SQL创建视图
除了可以通过Management Studio创建视图之外,还可以通过SQL语句中的CREATE VIEW语句来创建视图。创建视图的语法如下所示。
CREATE VIEW [ schema_name . ] view_name [ (column [ ,...n ] ) ] [ WITH <view_attribute> [ ,...n ] ] AS SELECT_statement [ ; ] [ WITH CHECK OPTION ] <view_attribute> ::= { [ ENCRYPTION ] [ SCHEMABINDING ] [ VIEW_METADATA ] }
同样,如果需要创建第3.5.1节中的关于产品和产品目录的视图,可以通过下面的SQL语句来实现。
CREATE VIEW [dbo].[vProductAndCategory] AS SELECT Production.Product.ProductID,Production.Product.Name,Production. Product.ProductNumber, Production.ProductCategory.ProductCategoryID, Production.ProductCategory.Name AS CategoryName FROM Production.Product INNER JOIN Production.ProductCategory ON Production.Product. ProductSubcategoryID = Production.ProductCategory.ProductCategoryID
3.5.3 创建基于视图的视图
创建基于视图的视图,其实就是把已经创建完成的视图当做一种数据表进行处理。在选择视图的源数据表的时候,将视图添加到待新建的视图列表中。
下面基于第3.5.2节创建的vProductAndCategory视图,再创建一个基于该视图和ProductVendor数据表的新视图。
(1)选择新建视图的操作,在弹出的【添加表】对话框中,首先在【表】选项卡中选择ProductVendor数据表,单击【添加】按钮,然后切换到【视图】选项卡中,选择已创建的vProductAndCategory视图,如图3-41所示。
图3-41 创建基于视图的视图
(2)在视图的数据列选择中,分别选择vProductAndCategory视图中的Name、ProductNumber和CategoryName字段,同时选择ProductVendor数据表中的ProductID和VendorID字段,设定之后的结果如图3-42所示。
图3-42 选择基于视图的视图列字段
(3)保存视图,将视图名称命名为vProductVendor。
创建基于视图的视图,还可以通过SQL语句来实现,实现的SQL语句与第3.5.2节介绍的类似,代码如下。
CREATE VIEW [dbo].[vProductVendor]
AS SELECT Purchasing.ProductVendor.ProductID, Purchasing.ProductVendor. VendorID, dbo.vProductAndCategory.Name, dbo.vProductAndCategory.ProductNumber, dbo.vProductAndCategory.CategoryName FROM Purchasing.ProductVendor INNER JOIN dbo.vProductAndCategory ON Purchasing.ProductVendor. ProductID = dbo.vProductAndCategory.ProductID
3.5.4 修改视图
修改视图,是指对已经创建好的视图进行字段以及源数据表的调整等过程。修改视图的操作比较简单,只需要在已经创建好的视图中右击该视图名称,在弹出的菜单中单击【修改】菜单项,则会弹出修改视图的界面,该界面与创建视图时的界面完全一样,操作人员只需要以创建视图类似的操作即可完成视图的修改,此处不再重复介绍,如图3-43所示。
图3-43 修改视图
3.5.5 删除视图
删除视图可以通过Management Studio以界面的形式完成,也可以通过SQL语句来执行。通过Management Studio删除视图的过程比较简单。
(1)如图3.43中,右键单击视图名称之后,在弹出的菜单中单击【删除】菜单项,弹出【删除对象】对话框,如图3-44所示。
图3-44 删除视图
(2)检查删除的视图没有错误之后,单击【确定】按钮,即可完成视图的删除过程。
如果通过SQL语句完成删除的过程,需要使用DROP VIEW语句,该语句只需要指定待删除的视图名称即可。如下面代码所示,首先判断数据库中是否存在vProductVendor视图,如果存在则进行删除操作。
IF EXISTS (SELECT * FROM sys.views WHERE object_id = OBJECT_ID(N'[dbo]. [vProductVendor]')) DROP VIEW [dbo].[vProductVendor]
3.6 存储过程
存储过程是数据库操作中的一种重要元素,通过存储过程可以完成数据库数据的查询、插入、修改和删除操作。由于存储过程基本由SQL语句完成,所以它的语法与前面介绍过的数据表操作的语法完全一致。
3.6.1 存储过程简介
存储过程是指封装了可重用代码的模块或例程。存储过程可以接受输入参数、向客户端返回表格或标量结果和消息、调用数据定义语言和数据操作语言语句,然后返回输出参数。
存储过程基本可以包括两大部分,即存储过程变量定义和存储过程的程序逻辑。存储过程变量定义是指接受的变量、程序中使用的局部变量以及存储过程返回的变量三种。存储过程的程序逻辑是指在该存储过程中需要实现的数据库操作,比如数据的查询、插入、修改和删除的操作。
注意:存储过程可以直接运行于数据库中,所以在程序开发中,可以根据数据库服务器的性能来考虑数据的操作是使用存储过程比较好还是直接使用SQL语句比较好。
3.6.2 创建存储过程
创建存储过程需要使用CREATE PROCEDURE语句。下面介绍了创建存储的语句格式。
CREATE { PROC | PROCEDURE } [schema_name.] procedure_name [ ; number ] [ { @parameter [ type_schema_name. ] data_type } [ VARYING ] [ = default ] [ [ OUT [ PUT ] ] [ ,...n ] [ WITH <procedure_option> [ ,...n ] [ FOR REPLICATION ] AS { <sql_statement> [;][ ...n ] | <method_specifier> } [;] <procedure_option> ::= [ ENCRYPTION ] [ RECOMPILE ] [ EXECUTE_AS_Clause ] <sql_statement> ::= { [ BEGIN ] statements [ END ] } <method_specifier> ::= EXTERNAL NAME assembly_name.class_name.method_name
下面通过一个实例介绍如何创建存储过程并调试和获取存储过程的输出。该存储过程获取产品表Product最大的产品编号。
(1)在【对象资源管理器】窗口中,展开【数据库】→【AdventureWorks】→【可编程性】→【存储过程】节点。右击【存储过程】节点,在弹出的菜单中,选择【新建存储过程】命令,如图3-45所示。
图3-45 创建存储过程
(2)在右侧的存储过程编辑窗口中,将下面存储过程的代码添加到窗口中。
SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO -- ============================================= -- Author: <Author,,Name> -- Create date: <Create Date,,> -- Description:<Description,,> -- ============================================= CREATE PROCEDURE SP_GetMaxProductID @MaxProductID int output --定义返回的最大产品编号变量 AS BEGIN SET NOCOUNT ON; select @MaxProductID=Max(ProductID) from Production.Product END GO
(3)编写完毕后,按F5键或者单击工具栏中的【执行】按钮,该存储过程就会被建立到对应的数据库中。此时再查看数据库对应的存储过程,就可以刷新出新建的SP_GetMax ProductID存储过程。
(4)右击该存储过程,在弹出的菜单中,选择【执行存储过程】命令,如图3-46所示。
图3-46 执行存储过程
(5)在弹出的【执行过程】对话框中,设定参数的值,由于本实例只有输出参数,所以不需要设定,如果设计的存储过程有输入参数,则可以通过该对话框填写输入参数的初始值,如图3-47所示。
图3-47 设定存储过程值
(6)单击【确定】按钮,存储过程开始被执行,同时在查询窗口返回了测试该存储过程的SQL语句以及执行的结果,如图3-48所示。
图3-48 存储过程的执行结果
技巧:存储过程的调试实际上是基于SQL语句调用存储过程来实现的,如果修改了存储过程,再次调试的时候,可以直接运行调试的SQL代码。
3.7 小结
数据库操作是基于数据库模型编程的一个重要组成部分,只有熟练地掌握了数据库操作的基本过程和语句,才能使程序更好地处理数据库的应用。本章介绍了数据库操作的基本知识,包括数据库以及数据表的相关数据和实体操作。通过本章的学习,读者可以理解后续章节中介绍的数据库编程的相关内容。