作者:明日科技庞娅娟房大伟张跃廷编著
出版社:信息技术第二出版分社
格式: AZW3, DOCX, EPUB, MOBI, PDF, TXT
SQL范例完全自学手册试读:
前言
SQL(Structured Query Language,结构化查询语言)语言是一种组织、管理和检索计算机数据库存储数据的工具。它是一种计算机语言,可以用它与数据库交互。事实上,S QL使用的是一种特殊类型的数据库,即关系数据库。SQL本身不是一个数据库管理系统,也不是一个独立的产品,而是数据库管理系统不可缺少的组成部分,它是与DBMS通信的一种语言和工具。由于其功能丰富,语言简洁,使用方法灵活,因此备受用户和计算机业界的青睐,被众多计算机公司和软件公司采用。经过多年的发展,SQL语言已成为关系数据库的标准语言。
目前,虽然介绍SQL的图书多不胜数,但真正适合初学者自学的图书并不多,本书就在这种情况下应运而生,本书精选了大量SQL项目开发中常见的热点和关键问题,并以实例的形式对这些问题进行了逐个击破,使得读者能够在实践中学习SQL,并迅速成为SQL项目开发高手。
为何选用本书
对于初学者,本书提供了四位一体的全新学习方式,可以帮助读者在编程中不断体会编程乐趣,快速提高编程能力。下面是四位一体式学习方式图。
图书(光盘源程序)+视频录像讲解(本书提供8小时实例录像)+实践练习任务(光盘提供实践练习源程序)+网上支持(实例视频讲解和论坛支持服务)。
对于中高级开发人员,本书提供了312个实例(包括实践练习),涉及400多个开发技术难点和重点,很多实例是开发者多年的总结。可以使用本书提供的实例,快速解决开发任务及难题。下面是本书(光盘)的内容结构。
如何使用本书
本书既可满足初学者的学习需要,也适合开发人员使用,在使用时,为达到更好的学习效果,要遵循以下原则。
第一,对于初学者,首先应该了解SQL的概念和用途,逐步培养SQL编程思想,建立发现问题、分析问题、解决问题的能力。使用本书时,应尽量从第1章开始学习,并在学习中多思考。遇到障碍,多琢磨,多尝试。
第二,本书提供了实例索引和技术索引,读者可以快速查询实例及技术,以解决开发过程中所遇到的问题。
第三,为帮助初学者解决学习中的困难,书中部分实例均提供了声图并茂的视频教学录像,读者可以根据视频讲解的步骤一步一步完成实例的编写,感受编程的快乐和成就感,增强进一步学习的信心。本书所有实例的视频讲解,读者可以到www.mingribook.com下载。
第四,坚持就是胜利。学习编程是一个艰苦的过程,即使再好的图书,也不能解决所有问题。学习中遇到障碍非常正常,只要肯钻研、勤思考、有恒心,就没有不能克服的难题。希望读者在学习本书时,注意学习解决不同问题的思路和方法,不单纯为做实例而做实例。这样在学完本书后,一定能成为SQL编程高手。
本书内容
本书共分为17章,包含154个典型实例,所选实例覆盖了SQL开发中的热点问题和关键问题。内容涉及SQL基本查询,WHERE子句过滤,ORDER BY子句排序,数值查询,字符串查询,日期查询,聚合数据检索,分组统计数据,子查询,连接查询,组合查询,交叉表、递归查询与分布式查询,插入、更新和删除数据,XML数据检索,优化操作,管理和维护数据库,SQL编程与应用等各方面的内容。
在实例讲解上,全书采用了统一的编排方式,每个实例都包括“实例说明”、“技术要点”、“实现过程”、“实践练习”4个部分。在“实例说明”中,以图文结合的方式给出了实例的功能说明及运行效果。在“技术要点”中给出了实例的重点、难点技术和相关编程技巧。在“实现过程”中介绍了该实例的设计过程和主要程序代码。在“实践练习”中给出了相关实例的扩展应用,并在光盘中附有完整源代码。
本书使用指南
◆ 为使读者快速使用书中实例的源程序和视频讲解,书中给出了程序所在光盘中的路径和视频所在路径,比如实例001对应的源程序位置为“光盘\mr\01\001\sl”,实例001对应的视频位置为“光盘\mr\01\001\sp”,读者可以根据需要使用。
◆ 书中给出了每个实例对应实践练习源程序在光盘中的路径,比如实例001的第1个实践练习对应的光盘位置为“光盘\mr\01\001\sj\01”,读者在做完实践练习后可以进行验证。
◆ 本书将使用的SQL Server 2000/2005数据库文件保存在数据库文件的文件夹中,附加对应数据库文件就能运行本书关于SQL Server 2000/2005的所有实例。
◆ 本书附带光盘中提供所有实例及实践练习源代码。使用本书实例光盘前,请仔细阅读光盘中的“光盘使用说明”。
本书光盘内容
◆ 本书实例、实践练习的源程序及相关素材。
◆ 8小时视频教学录像。为便于读者自学本书,本书光盘提供了8小时视频教学录像(如下表所示),可以帮助读者轻松通过编程的第一道关口。
本书读者对象
初学编程的自学者
编程爱好者
大中专院校的老师和学生
相关培训机构的老师和学员
初、中级程序开发人员
程序测试及维护人员
学习本书遇到问题怎么办
如果您在使用本书时遇到任何困难或疑惑,可以联系我们,我们将在5个工作日内给您提供解答。我们的服务方式如下:
服务网站:www.mingrisoft.com
服务QQ:100310286 100310063
服务信箱:mingrisoft@mingrisoft.com
服务电话:0431-84978981/84978982
本书作者
本书由明日科技组织编写,参加编写的有庞娅娟、房大伟、张跃廷等。虽然对于本书我们力求做到完美,其中仍可能有疏漏和不足之处,欢迎读者朋友不吝赐教。
明日科技
2009年7月第1章SQL基本查询
◎ 在SELECT语句中使用计算列及列别名
◎ 定义批处理(BEGIN…END语句)
◎ 查询指定行数据
◎ 去除结果集中的重复行/列数据(DISTINCT关键字)
◎ 计算数据在结果集中的行号(ROW_NUMBER()函数)
◎ 随机查询 n行数据(NEWID()函数)
◎ 查询指定长度的文本类型数据(READTEXT命令)
◎ 格式化结果集数据(CONVERT()函数、CAST()函数)
◎ 使用 iif()函数根据指定条件显示查询结果
◎ 利用查询结果集生成表/临时表实例001 在SELECT语句中使用计算列及列别名
实例位置:光盘\mr\01\001\sl
实例说明
在查询数据时,有时需要对表中的字段进行计算,然后输出数据。经过计算的列需要使用列别名来标识产生的新列。本实例查询pubs数据库中的title表,在查询语句SELECT子句中的字段列表分别是图书名称、原销售额(即图书单价与销售数量的乘积)、现销售额(即图书单价降低1.5%后与销售数量的乘积),其中每个字段均定义了列别名以方便阅读查询结果。实例运行结果如图1.1所示。图1.1 在SELECT 语句中使用计算列及列别名
技术要点
使用SELECT语句可以从数据库中检索行,并允许从一个或多个表中选择一个或多个行或列。SELECT语句的语法结构如下:
SELECT select_list FROM table_name
参数说明如下。
● select_list:选择的一个或多个列。选择列表是以逗号分隔的一系列表达式。
● table_name:为查询所操作的表名。
注意
在SELECT语法格式中,SELECT子句和FROM子句是必需的。
例如,查询出版商信息表publishers中出版商名称,代码如下:
SELECT pub_name FROM publishers
查询出版商编号、出版商名称及所在城市,代码如下:
SELECT pub_id, pub_name , city FROM publishers
在查询语句的SELECT子句中,使用“*”可以查询表中的所有行和所有列。
例如,查询表publishers中的所有数据,代码如下:
SELECT * FROM publishers
查询图书信息表titles中的所有数据,代码如下:
SELECT * FROM titles(1)使用计算列。
在查询的SELECT子句中针对列可以使用乘法(*)、除法(/)、加法(+)、减法(−)等算式运算符,使之成为计算列。这样,执行查询时即可显示运算后的结果。常用的算术运算符如表1.1所示。表1.1 常用的算术运算符
例如,查询图书的销售额,代码如下:
SELECT title, price * ytd_sales FROM titles
在使用算术运算符进行算术组合运算时应该注意算术运算符的优先级别,SQL Server 2000、Oracle等数据库都遵循以下标准的运算顺序:
● 等式中从左向右计算,首先计算乘法和除法;
● 先计算乘法和除法之后再计算任何加法和减法,也是在等式中从左向右进行计算。要覆盖这种计算顺序,可以使用圆括号包括等式中应该首先完成的任何部分。
注意
应严格区分求余运算符“%”与除法运算符“/”。例如“数1%数2”是计算数1和数2相除后的余数,“数1/数2”是计算数1和数2相除后的商。求余运算符“%”的优先级和乘除的运算符等同,高于加减运算符。(2)定义列别名。
在SELECT子句中可以使用别名来代替原来的列名。可以通过以下4种方式来定义列别名。
● 使用AS关键字,代码如下:
SELECT name AS 姓名 FROM student
● 带双引号的列别名,代码如下:
SELECT math "数学成绩" FROM stu_score
● 带单引号的列别名,代码如下:
SELECT chinese '语文成绩' FROM stu_score
● 不带引号的列别名,代码如下:
SELECT english 英语成绩 FROM stu_score
说明
如果列别名包含空、特殊符号等,那么必须将列别名放在双引号或单引号内。
下面介绍使用列别名的几种常用情况。
● 字段为英文。为了方便查看,可以使用中文列别名代替英文字段。
● 多表查询时出现相同的列名。如果对多个数据表进行查询,查询结果中可能会出现相同的列名,很容易造成误解。这时应采用列别名来解决上述问题。
● 在查询结果中添加列。在表中出现计算产生新的列时,可以使用列别名。
● 统计结果中出现的列。使用聚合函数语句对数据查询时,需要对产生的统计字段使用列别名。
注意
字段别名可以使用在ORDER BY子句中,但是不能使用在WHERE、GROUP BY或HAVING子句中。
实现过程
下面以SQL Server 2000为例,通过操作pubs示例图书数据库中的titles表介绍本实例的实现过程。(1)依次单击“开始”→“程序”→“Microsoft SQL Server”→“查询分析器”菜单命令。在弹出的连接对话框中选择“SQL Server身份验证”,这里输入登录名sa,密码为空。(2)在查询分析器中选择要连接的数据库为pubs。(3)在代码编辑区中输入的SQL语句如下:
USE pubs
GO
SELECT title AS 图书名称,
price * ytd_sales AS 原销售额,
(price-price*0.15) * ytd_sales AS 现销售额
FROM titles(4)单击执行按钮,执行本实例,其实现过程如图1.2所示。图1.2 本实例的实现过程
实践练习
在查询语句的WHERE子句中使用计算列(实例源码:光盘\mr\01\001\sj\01)。
使用表别名查询数据(实例源码:光盘\mr\01\001\sj\02)。实例002 定义批处理(BEGIN…END语句)
实例位置:光盘\mr\01\002\sl
实例说明
在实际应用中,经常需要执行多个SQL语句,以完成特定的任务。这时,就需要将多个SQL语句视为一个整体来执行,即执行批处理。本实例操作pubs示例数据库,首先声明了3个变量,然后查询titles表中指定图书编号的图书信息,并将图书名称、类型以及图书单价分别赋予声明的变量。如果此图书单价小于 22,则通过批处理输出“图书名称”和“图书类型”字符串;如果图书单价不小于 22,则输出“此书价格大于22”字符串。实例运行结果如图1.3所示。图1.3 定义批处理(BEGIN…END语句)
技术要点
本实例应用BEGIN…END语句来定义批处理。语法格式如下:
BEGIN
{…代码…}
END
BEGIN…END语句中BEGIN与END关键字必须成对使用。即BEGIN后为Transact-SQL语句块,END指示语句块结束。
BEGIN…END 语句用于将多个 Transact-SQL 语句组合为一个逻辑块。当执行的控制流是一个包含两条或两条以上Transact-SQL语句的语句块时,应使用BEGIN…END语句。此语句适用于下列情况。
● WHILE循环内包含的语句块。
● CASE()函数的元素包含语句块时。
● IF 或 ELSE 子句中包含语句块时。
例如,当IF语句内仅包含一条Transact-SQL语句时,则不需要使用BEGIN…END语句,代码如下:
DECLARE @ErrVar int
IF (@@ERROR <> 0)
SET @ErrVar =@@ERROR
以上代码表示如果@@ERROR为0,则仅跳过SET语句。
用BEGIN…END语句语句可以使IF语句在不满足条时跳过语句块,而执行ELSE语句,代码如下:
DECLARE @ErrVar int
IF (@@ERROR <> 0)
BEGIN
SET @ErrVar =@@ERROR
PRINT '错误号为:' +
CAST(@ErrVar AS VARCHAR(10))
END
ELSE
PRINT '正确执行!'
注意
BEGIN...END 语句块允许嵌套。
批处理是包含一个或多个Transact-SQL语句的组,从应用程序一次性地发送到SQL Server执行。SQL Server将批处理语句编译成一个可执行单元。
如果在一个批处理中包含任何语法错误,则整个批处理就不能被成功地编译和执行。但如果是在一个批处理中某句有执行错误,它仅影响该条语句的执行,并不影响批处理中其他语句的执行。
建立批处理时,应该注意以下几点。
● CREATE DEFAULT、CREATE PROCEDURE、CREATE RULE、CREATE TRIGGER及CREATE VIEW 不能与其他语句放在一个批处理中。此批处理必须以 CREATE 语句开始,也就是说批处理中必须含有CREATE语句,并且只有一个。
● 不能在一个批处理中引用其他批处理中所定义的变量。
● 不能把规则和默认值绑定到表字段或用户自定义数据类型上之后,立即在同一个批处理中使用它们。
● 批处理中的第一个语句是 EXECUTE 语句,则 EXECUTE 关键字可以省略;如果 EXECUTE 语句不是第一个语句,则必须使用EXECUTE关键字,或简写为“EXEC”。
实现过程
下面以SQL Server 2000为例,通过操作pubs示例图书数据库中的titles表介绍本实例的实现过程。(1)依次单击“开始”→“程序”→“Microsoft SQL Server”→“查询分析器”。在弹出的连接对话框中选择“SQL Server身份验证”,这里输入登录名sa,密码为空。(2)在查询分析器中选择要连接的数据库为pubs。(3)在代码编辑区中输入的SQL语句如下:
USE pubs
GO
--定义局部变量
DECLARE @title varchar(200),@type varchar(30),@price money
--查询表titles并对变量赋值
SELECT @title=title, @type=type, @price=price
FROM titles
WHERE title_id='PC8888'
--根据条件输出字符串
IF @price < 22
BEGIN
PRINT '图书名称为:' +@title
PRINT '图书类型为:' +@type
END
ELSE
PRINT '此书价格大于22'
GO(4)单击执行按钮,执行本实例。
实践练习
在IF…ELSE语句中使用批处理执行多条SQL语句(实例源码:光盘\mr\01\002\sj\01)。实例003 查询指定行数据
视频位置:光盘\mr\01\003\sp 实例位置:光盘\mr\01\003\sl
实例说明
数据表中的数据是按照一定顺序排列的。有时查询数据不是需要前几行或后几行,而是需要查询中间区域的数据,或者查询具体的某一行数据。本实例查询商品信息表goods,根据指定的行范围(例如5~7行)、具体的行(例如第 3 行)查询数据。通过本实例可以实现查询用户需要的行数据,而不是查询全部表数据。实例运行结果如图1.4所示。图1.4 查询指定行数据
技术要点
本实例在SQL语句中使用TOP关键字实现查询指定范围内以及指定具体行的数据,并使用GO命令实现批处理。(1)使用TOP关键字查询前n条记录。
在SELECT子句中采用TOP关键字返回满足条件的前n条记录,语法如下:
SELECT TOP n [PERCENT]
FROM table
WHERE…
ORDER BY…
参数说明如下。
● n:返回满足WHERE条件的前n条记录。n为整数。
● [PERCENT]:为可选项,从结果集中返回百分之n的记录,而不是n行。n必须是0~100之间的整数。
如果SELECT语句中没有ORDER BY子句,TOP n返回满足WHEER子句的前n条记录。如果子句中满足条件的记录少于n,那么仅返回满足条件的记录。
如果SELECT语句中包含ORDER BY子句。TOP n返回满足查询的前n行,但不删除重复组,这样可能输出大于n条的记录。
例如,返回考试总成绩大于550、排名前3的学生考试信息,代码如下:
SELECT TOP 3 * FROM result WHERE score_tot > 550 ORDER BY score_tot DESC(2)使用GO命令结束批处理。
执行GO命令,即标识一批Transact-SQL语句的结束。
GO命令和Transact-SQL语句不可在同一行上,但在GO命令行中可包含注释。
例如,创建两个批处理。第一个批处理只包含一条 USE pubs 语句,用于设置数据库上下文。第二个批处理声明了一个局部变量、定义了一条SELECT语句。值得注意的是,所有声明的局部变量必须在一个批处理中使用,所以应在最后一条引用局部变量的语句后使用GO命令。代码如下:
USE pubs
GO
DECLARE @num int
SELECT @num = COUNT(*)
FROM titles
PRINT '图书数量为:' +
CAST(@num AS char (8))
GO
实现过程
下面以SQL Server 2000为例,介绍本实例的实现过程。(1)依次单击“开始”→“程序”→“Microsoft SQL Server”→“查询分析器”菜单命令。在弹出的连接对话框中选择“SQL Serve身份验证”,这里输入登录名sa,密码为空。(2)在查询分析器中选择要连接的数据库为db_sql2000。(3)在代码编辑区中输入的SQL语句如下:
USE db_sql2000
GO
--查询5至7行的记录
SELECT TOP 3 *
FROM (
SELECT TOP 7 * FROM goods
) AS goods2
ORDER BY g_id DESC
GO
--查询第3行的记录
SELECT TOP 1 *
FROM (
SELECT TOP 3 * FROM goods
) AS goods2
ORDER BY g_id DESC
GO(4)单击执行按钮,执行本实例,其实现过程如图1.5所示。图1.5 本实例的实现过程
实践练习
查询数据表中倒数第二行数据(实例源码:光盘\mr\01\003\sj\01)。实例004 去除结果集中的重复行/列数据(DISTINCT关键字)
实例位置:光盘\mr\01\004\sl
实例说明
如果不是查询数据表中的全部列,而是一个或多个列,所得到的结果集中就可能存在重复的记录。这时,需要去除重复数据,以满足用户的需求,并能计算出准确的无重复记录数。本实例操作订单信息表Order(此表中一个订单号可能对应着多条记录,即一个订单中有多种商品),生成3个结果集。一是查询一个订单号对应的会员名、订单商品总数以及订单状态;二是按“提交时间”降序查询无重复的订单号以及订单的提交时间;三是查询共有几笔订单,即查询无重复订单号的数量。实例运行结果如图1.6所示。图1.6 去除结果集中的重复行/列数据(DISTINCT 关键字)
技术要点
使用DISTINCT关键字可以从查询的结果集中去掉重复的记录。
在使用DISTINCT关键字去除重复记录时,需将DISTINCT关键字放在第一个字段名之前。
DISTINCT的语法格式如下:
SELECT [DISTINCT | ALL]select_list
如果未使用DISTINCT关键字,在查询结果中不会消除重复的记录。使用ALL关键字可以明确指示要保留重复记录,此项为默认的行为。
注意
在SELECT列表中只能使用一次DISTINCT关键字。
如果查询时用户没有指定DISTINCT关键字,那么系统默认将返回符合条件的所有记录,其中包括重复记录。
例如,查询订单信息表Order中的订单号、会员名、订单商品总数、订单状态数据时,未使用DISTINCT关键字,那么将返回如图1.7所示的运行结果。代码如下:
USE db_sql2000
GO
SELECT ord_id AS 订单号,
user_name AS 会员名,
g_num_tot AS 订单商品总数,
ord_status AS 订单状态
FROM [Order]
GO图1.7 未指定DISTINCT 关键字
说明
DISTINCT是SUM()、AVG()和COUNT()函数的可选关键字。如果使用DISTINCT关键字,那么在计算总和、平均值或计数之前,先消除重复的值。
实现过程
下面以SQL Server 2000为例,介绍本实例的实现过程。(1)依次单击“开始”→“程序”→“Microsoft SQL Server”→“查询分析器”菜单命令。在弹出的连接对话框中选择“SQL Server身份验证”,这里输入登录名sa,密码为空。(2)在查询分析器中选择要连接的数据库为db_sql2000。(3)在代码编辑区中输入的SQL语句如下:
USE db_sql2000
GO
--去除重复的行数据
SELECT DISTINCT ord_id AS 订单号,
user_name AS 会员名,
g_num_tot AS 订单商品总数,
ord_status AS 订单状态
FROM [Order]
GO
--去除重复列数据
SELECT DISTINCT (ord_id) AS 订单号, order_date AS 提交时间
FROM [Order]
ORDER BY order_date DESC
GO
--返回无重复记录总数
SELECT COUNT(*) AS 订单数量
FROM (
SELECT DISTINCT ord_id
FROM [Order]) AS Order_num
GO(4)单击执行按钮,执行本实例,其实现过程如图1.8所示。图1.8 本实例的实现过程
实践练习
查询选修课成绩表中有几门选修课(实例源码:光盘\mr\01\004\sj\01)。实例005 计算数据在结果集中的行号(ROW_NUMBER()函数)
实例位置:光盘\mr\01\005\sl
实例说明
如果数据表的主键未设置自动编号或者数据表中未设置主键,那么很难观察查询的结果集中记录的行号。本实例在SQL Server 2005中调用ROW_NUMBER()函数,来显示数据在结果集中的行号,以便于查看和整理资料。实例运行结果如图1.9所示。图1.9 计算数据在结果集中的行号(ROW_NUMBER()函数)
技术要点
SQL Server 2005及以上版本中的ROW_NUMBER()函数是用于返回结果集分区内行的序列号,每个分区的第一行序号从1开始。
语法如下:
ROW_NUMBER ( ) OVER ( [
参数说明如下。
●
●
值得注意的是,ROW_NUMBER()函数的返回值类型为bigint。
说明
使用ORDER BY 子句可以为应用了ROW_NUMBER()函数的分区中的行分配惟一顺序。
实现过程(1)依次单击“开始”→“程序”→“Microsoft SQL Server 2005”→“SQL Server Management Studio”。连接到数据库实例,启动SQL Server Management Studio。(2)在工具栏上单击“新建查询”按钮,打开一个新的查询窗口。(3)在查询窗口中输入的SQL语句如下:
USE db_sql2005
GO
SELECT ROW_NUMBER ( ) OVER(ORDER BY g_date DESC) AS 行号,
g_name AS 商品名, g_lprice AS 会员价,
g_provider AS 提供商, g_date AS 出厂日期
FROM [Goods]
GO(4)单击按钮,执行本实例,其实现过程如图1.10所示。图1.10 本实例的实现过程
实践练习
在SQL Server 2005 中根据结果集的行号降序排序数据(实例源码:光盘\mr\01\005\sj\01)。实例006 随机查询n行数据(NEWID()函数)
视频位置:光盘\mr\01\006\sp 实例位置:光盘\mr\01\006\sl
实例说明
在对事物进行验证时,可以通过随机取样来检验事物的性质。本实例首先创建销售信息表 Sales,其中定义sal_id字段为uniqueidentifier数据类型(存储16字节的二进制值),然后向表中添加数据,使用NEWID()函数为sal_id字段赋值。定义查询语句,通过NEWID()函数随机查询两条销售信息。实例运行结果如图1.11所示。图1.11 随机查询n行数据(NEWID()函数)
技术要点
本实例使用NEWID()函数为uniqueidentifier数据类型的字段赋值,在查询时通过该函数及TOP关键字实现随机查询n行数据。(1)NEWID()函数。
NEWID()函数用于创建uniqueidentifier类型的惟一值。语法如下:
NEWID ( )
该函数的返回值类型为uniqueidentifier。(2)uniqueidentifier数据类型。
uniqueidentifier数据类型用于存储16字节的二进制值,该值的使用与全局惟一标识符(GUID)一样。GUID是一个惟一的二进制数字,即世界上的任何两台计算机不会生成重复的 GUID 值。GUID 主要用于在拥有多个节点、多台计算机的网络中,以分配必须具有惟一性的标识符。
调用NEWID()函数可以获得uniqueidentifier列的GUID值。
例如,定义一个uniqueidentifier类型的变量,调用NEWID()函数为该变量赋值,代码如下:
DECLARE @var uniqueidentifier
SET @var = NEWID()
PRINT '@var变量值为: '+ CONVERT(varchar(255), @var)
也可以定义uniqueidentifier常量,代码如下:
DECLARE @var uniqueidentifier
SET @var = 'F898F262-8CE6-4817-B3D3-EB368FB42A3D'
uniqueidentifier 数据类型具有 16 个字节,相对于 int 数据类型 4 字节的整数要大很多。这样,在uniqueidentifier键实现索引就要慢一些。所以,如果字段的全局惟一性是必须的(例如计算机的网卡序号),才需考虑使用uniqueidentifier数据类型;如果全局惟一性不是必须的,或者需要一个连续递增的键,则可以考虑使用IDENTITY属性。
实现过程
下面以SQL Server 2000为例,介绍本实例的实现过程。(1)依次单击“开始”→“程序”→“Microsoft SQL Server”→“查询分析器”菜单命令。在弹出的连接对话框中选择“SQL Server身份验证”,这里输入登录名sa,密码为空。(2)在查询分析器中选择要连接的数据库为db_sql2000。(3)在代码编辑区中输入的SQL语句如下:
USE db_sql2000
GO
--如果已存在表Sales,则删除此表
if exists (select * from dbo.sysobjects
where id = object_id(N'[dbo].[Sales]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
drop table [dbo].[Sales]
GO
--创建表Sales
CREATE TABLE Sales
(
sal_id uniqueidentifier NOT NULL
DEFAULT NEWID(),
book_code char(30) NOT NULL,
book_price money NOT NULL,
sal_num int NOT NULL default 1 ,
sal_tot as book_price * sal_num
)
GO
--向表中插入数据
INSERT Sales SELECT NEWID(),'ISBN 7-456-852',29,12
INSERT Sales SELECT NEWID(),'ISBN 857-7-357',19.5,10
INSERT Sales SELECT NEWID(),'ISBN 7-756-423',11,9
INSERT Sales SELECT NEWID(),'ISBN 873-7-964',32,15
GO
--随机返回2行数据
SELECT TOP 2 * FROM Sales
ORDER BY NEWID()
GO(4)单击执行按钮,执行本实例,其实现过程如图1.12所示。图1.12 本实例的实现过程
实践练习
在用户信息表中随机抽取一位用户作为幸运之星(实例源码:光盘\mr\01\006\sj\01)。实例007 查询指定长度的文本类型数据(READTEXT命令)
实例位置:光盘\mr\01\007\sl
实例说明
在设计数据表时,经常使用text数据类型。这时,不能使用一般的字符串函数(例如LEFT()函数等)对此列数据进行操作,而需要使用专有函数来查询text文本数据。本实例首先创建图书信息表Bookinfo,其中 b_intro 字段的数据类型为 text,然后向表中插入数据。连接查询图书信息表 Bookinfo 与图书销售表Sales,查询销售额最高的图书简介信息。在查询语句的SELECT子句中应用TEXTPTR()函数返回b_intro字段文本数据的指针,并调用READTEXT语句根据具体字段及文本指针读取指定长度的数据。实例运行结果如图1.13所示。
技术要点
本实例同时使用READTEXT语句与TEXTPTR()函数,读取指定长度的text文本数据。(1)READTEXT语句。
READTEXT语句可用于读取text、ntext或image列中的数据。在该语句中可以指定偏移量以读取指定的字节数。图1.13 查询指定长度的文本类型数据(READTEXT 命令)
语法如下:
READTEXT { table.column text_ptr offset size } [ HOLDLOCK ]
参数说明如下。
● table.column:读取的表和列的名称,表名和列名必须符合标识符的命名规则。值得注意的是,必须指定表名和列名,可以选择是否指定数据库名称和所有者名称。
● text_ptr:有效的文本指针。text_ptr包含的是16字节二进制binary(16)数据。
● offset:开始读取 text、image 或 ntext 数据之前跳过的字节数(使用 text 或 image 数据类型时)或字符数(使用ntext数据类型时)。
● size:是要读取数据的字节数(使用text或image数据类型时)或字符数(使用ntext数据类型时)。如果size是0,则表示读取4KB字节的数据。
● HOLDLOCK:锁定文本一直到事务结束。其他用户可以读取该值,但是不能对其进行修改。(2)TEXTPTR()函数。
调用TEXTPTR()函数将返回对应于text、ntext或image列的文本指针,返回值为varbinary格式。检索到的文本指针可用于READTEXT、WRITETEXT和UPDATETEXT语句。
语法如下:
TEXTPTR ( column )
column表示使用的text、ntext或image列。(3)SET TEXTSIZE语句。
使用SET TEXTSIZE语句可以指定由SELECT语句返回的text和ntext数据的大小。
语法如下:
SET TEXTSIZE { number }
number是一个整数,用于指定text数据的大小,以字节为单位。
SET TEXTSIZE 的最大设置为2GB(以字节为单位指定)。设置值为0 时,表示将数据大小重置为默认值(4KB)。
例如,查询图书信息表返回销售额最高的图书介绍(前40个字节),代码如下:
USE db_sql2000
GO
SET TEXTSIZE 40
SELECT b_name, b_intro
FROM Bookinfo AS b INNER JOIN Sales AS s
ON b.b_code = s.book_code
AND sal_tot =
(SELECT MAX(sal_tot) FROM Sales)
ORDER BY sal_tot desc
GO
执行以上代码的运行结果如图1.14所示。图1.14 使用SET TEXTSIZE语句
实现过程
下面以SQL Server 2000为例,介绍本实例的实现过程。(1)依次单击“开始”→“程序”→“Microsoft SQL Server”→“查询分析器”。在弹出的连接对话框中选择“SQL Server身份验证”,这里输入登录名sa,密码为空。(2)在查询分析器中选择要连接的数据库为db_sql2000。(3)在代码编辑区中输入的SQL语句如下:
USE db_sql2000
GO
--如果已存在表Bookinfo,则删除此表
if exists (select * from dbo.sysobjects
where id = object_id(N'[dbo].[Bookinfo]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
drop table [dbo].[Bookinfo]
GO
--创建表Bookinfo
CREATE TABLE Bookinfo
(
b_code char(30) NOT NULL,
b_name varchar(50) NOT NULL,
b_author varchar(50) NOT NULL,
b_pub varchar(50) NOT NULL,
b_price money NOT NULL,
b_intro text NOT NULL
)
GO
--向表中插入数据
INSERT Bookinfo SELECT 'ISBN 7-456-852','SQL深入编程','李向','人邮',
29,'内容介绍:本书旨在拓展开发者在SQL编程水平'
INSERT Bookinfo SELECT 'ISBN 857-7-357','SQL范例手册','刘一','电子',
19.5,'内容介绍:本书以大量实践为基础给出实用性的范例'
INSERT Bookinfo SELECT 'ISBN 7-756-423','SQL编程规范','白雪','清华',
11,'内容介绍:本书针对数据库设计与编程提出了规则和建议'
INSERT Bookinfo SELECT 'ISBN 873-7-964','SQL结构化查询','赵一','机工',
32,'内容介绍:本书详细介绍SQL查询技术的应用'
GO
--查询text类型的文本数据
DECLARE @temp varbinary(16)
SELECT @temp = TEXTPTR(b_intro)
FROM Bookinfo AS b INNER JOIN Sales AS s
ON b.b_code = s.book_code
AND sal_tot =
(SELECT MAX(sal_tot) FROM Sales)
ORDER BY sal_tot desc
READTEXT Bookinfo.b_intro @temp 10 29
GO(4)单击执行按钮,执行本实例,其实现过程如图1.15所示。图1.15 本实例的实现过程
实践练习
查询商品信息表中部分商品描述信息,其中“商品描述”字段为文本类型(实例源码:光盘\mr\01\007\sj\01)。实例008 格式化结果集数据(CONVERT()函数、CAST()函数)
视频位置:光盘\mr\01\008\sp 实例位置:光盘\mr\01\008\sl
实例说明
根据实际需求,往往要对查询到的结果集数据进行格式化,以便符合用户的需求(例如,制作各种报表等)。本实例综合使用转换函数 CONVERT()、CAST(),以及 SUBSTRING()字符串函数和 PATINDEX()函数,对结果集中money、text及datetime数据类型的数据(即金额、文本、时间)进行格式化显示。实例运行结果如图1.16所示。图1.16 格式化结果集数据(CONVERT()函数、CAST()函数)
技术要点
本实例使用了CONVERT()转换函数、CAST()转换函数、SUBSTRING()字符串函数及PATINDEX()函数,来实现格式化结果集数据。(1)CONVERT()转换函数。
将某种数据类型的表达式显式转换为另一种数据类型。
语法如下:
CONVERT (data_type[(length)], expression [, style])
参数说明如下。
● expression:是任何有效的SQL Server表达式。
● data_type:转换的数据类型,包括bigint和sql_variant。不能使用用户定义的数据类型。
● length:是nchar、nvarchar、char、varchar、binary或varbinary数据类型的可选参数。
● style:可以是日期格式样式,将datetime或smalldatetime 数据转换为字符数据(nchar、nvarchar、char、varchar、nchar或nvarchar数据类型);或者是字符串格式样式,将float、real、money或smallmoney数据转换为字符数据(nchar、nvarchar、char、varchar、nchar或nvarchar数据类型)。
例如,定义一个DATETIME类型的变量,为该变量赋值,使用CONVERT()函数显示不同格式的日期。代码如下:
DECLARE @vartime DATETIME
SET @vartime = '2009-4-14 11:39:12'
SELECT CONVERT(VARCHAR,@vartime,1)
SELECT CONVERT(VARCHAR,@vartime,10)
执行结果:
04/14/09
04-14-09
例如,定义一个money类型的变量,调用CONVERT()函数为该变量赋值,然后使用CONVERT()函数以指定格式(小数点左侧每三位数字之间以逗号分隔,小数点右侧取两位数)显示货币类型的数据。代码如下:
DECLARE @varmoney money
SET @varmoney = CONVERT(money,'200089.564')
SELECT CONVERT(VARCHAR, @varmoney,1)
执行结果:
200,089.56(2)CAST()转换函数。
与CONVERT()转换函数有相同的作用,即将某种数据类型的表达式显式转换为另一种数据类型。
语法如下:
CAST ( expression AS data_type )
参数说明如下。
● expression:是任何有效的SQL Server表达式。
● data_type:转换的数据类型。
CAST()函数与 CONVERT()函数都可用于执行不同数据类型的表达式转换,还可用来获得各种特殊的数据格式。这两个转换函数可用于SELECT子句、WHERE 子句和允许使用表达式的任何地方。
如果希望Transact-SQL程序代码遵从SQL-92标准,则使用CAST()函数;如果要利用CONVERT中的样式功能,则使用CONVERT()函数。(3)SUBSTRING()字符串函数。
用于截取字符串,即返回数据的一部分,操作数据的类型可以为字符型、binary、text 或image。
语法如下:
SubString(字符表达式,start,length)
参数说明如下。
● start:表示起始位置,为整型数值。
● length:表示截取长度,为整型数值。(4)PATINDEX()函数。
用于返回指定表达式中某模式第一次出现的起始位置。如果未找到该模式,则返回零。
语法如下:
PATINDEX ( '%pattern%' , expression )
参数说明如下。
● pattern:一个字符串,字符串内可以使用通配符。pattern的前和后必须有%字符(表示搜索第一个和最后一个字符时除外)。pattern为短字符数据类型类别。
● expression:一个表达式,通常为列名(在其中搜索指定的模式)。expression 为字符串数据类型类别。
PATINDEX()函数的返回类型为int。
实现过程
下面以SQL Server 2000为例,介绍本实例的实现过程。(1)依次单击“开始”→“程序”→“Microsoft SQL Server”→“查询分析器”。在弹出的连接对话框中选择“SQL Server身份验证”,这里输入登录名sa,密码为空。(2)在查询分析器中选择要连接的数据库为db_sql2000。(3)在代码编辑区中输入的SQL语句如下:
USE db_sql2000
GO
SELECT b_code AS 书号,
'¥' + CAST(b_price AS VARCHAR) AS 单价,
'¥' + CONVERT(VARCHAR(20), sal_tot,1) AS 销售总额,
SUBSTRING(b_intro, (PATINDEX('%内容介绍:%', b_intro) + 10), 100) AS 内容介绍,
CONVERT(VARCHAR, b_date,1) AS 出版日期
FROM Bookinfo AS b, Sales AS s
WHERE b.b_code = s.book_code(4)单击执行按钮,执行本实例,其实现过程如图1.17所示。图1.17 本实例的实现过程
实践练习
将数据表中的日期类型字段转换为“月/日/年”的形式(实例源码:光盘\mr\01\008\sj\01)。实例009 使用iif()函数根据指定条件显示查询结果
实例位置:光盘\mr\01\009\sl
实例说明
在数据表中,为了标识数据有时使用True/False或者0/1。但是,在查询结果集中如果不明确列标识的函数,则用户无法理解其含义。本实例查询商品信息表Goods,在SELECT语句中使用Access数据库的iif()函数根据g_status列值(数据类型为“是/否”)输出标识的数据信息。如果g_status列值为True,则结果集中该列值为“已推荐”(即标识此商品为推荐商品);如果g_status列值为Flase,则结果集中该列值为“未推荐”(即标识此商品未被推荐)。本实例演示了如何操作Microsoft Office Access 2007。实例运行结果如图1.18所示。图1.18 使用iif()函数根据指定条件显示查询结果
说明
本实例中使用的Access数据库可以在Access 2000及以上版本中编辑。
技术要点
本实例使用Access数据库的iif()函数根据查询字段值来显示查询结果。
语法如下:
iif(expr, truepart, falsepart)
试读结束[说明:试读内容隐藏了图片]