大型数据库技术第05章查询处理和表数据_第1页
大型数据库技术第05章查询处理和表数据_第2页
大型数据库技术第05章查询处理和表数据_第3页
大型数据库技术第05章查询处理和表数据_第4页
大型数据库技术第05章查询处理和表数据_第5页
免费预览已结束,剩余46页可下载查看

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、第5章 SQL Server查询处理和表数据编辑 5.1 查询数据 5.2 表数据编辑5.3 大文本和图像数据处理 15.1 查询数据SELECT语句的格式: SELECT DISTINCT ,nFROM ,n WHERE GROUP BY HAVING ORDER BY ASC | DESC SELECT语句的含义 : 根据WHERE条件,从FROM指定的表中找出满足条件的元组,按目标列表达式,选出属性值,形成结果表。 25.1 查询数据5.1.1 简单查询 5.1.2 统计 5.1.3 连接查询 5.1.4 子查询 5.1.5 联合查询 35.1.1 简单查询1最简单的查询 2查询满足条件

2、的元组3对查询结果排序41最简单的查询省略的一些可选成分,得最简单的查询命令: SELECT DISTINCT ,n FROM 对一张表的某些列进行操作,功能为: (1)查询指定列 (2)查询所有列 (3)查询计算列 (4)为列起别名 (5)使用DISTINCT关键字消除重复元组 5(1)查询指定列【例5-1】查询全体学生的姓名、学号和电话号码 SELECT姓名, 学号, 移动电话 FROM学生表 列的输出顺序可以与表中的列顺序不同。6(2)查询所有列【例5-2】查询全体学生的详细信息 SELECT*FROM学生表 用“*”表示查询表的所有列。7(3)查询计算列也可以查询由常量、变量和函数构成

3、的表达式【例5-3】将累计学分降低10后显示出来 SELECT姓名, 累计学分, 累计学分- 累计学分*0.1 FROM学生表 查询结果为: 姓名累计学分 (无列名)王东民160144张小芬160144计算列没有列名8(4)为列起别名目的:满足用户的习惯,为计算列起名。方法: AS = 【例5-4】将累计学分降低10后显示,要求显示字母标题。 SELECT姓名 AS name, 累计学分 Ogpa, Ngpa=累计学分- 累计学分*0.1 FROM学生表 查询结果为: name Ogpa Ngpa 王东民160144当别名含有空格时要用单引号括起9(5)使用DISTINCT关键字消除重复元组无

4、DISTINCT时,结果中可能含重复行有DISTINCT时,自动消除结果中的重复行【例5-5】查询每个院系有在读学生的专业。10 SELECT Sdepa, 专业 FROM 学生表 查询结果为: Sdepa专业信息学院计算机信息学院计算机 结果中含重复行 SELECT DISTINCT 所在院系, 专业 FROM 学生表 查询结果为: 所在院系 专业 信息学院计算机信息学院信息管理 结果中无重复行 DISTINCT应紧跟SELECT 2查询满足条件的元组通过在WHERE子句中指定查询条件来实现 WHERE子句常用的查询条件: 11查询条件运算符() 条件(逻辑表达式) 备注比较大小=, , =

5、, =, !=, , !, !, =, =, !=, , !, !op1 和 op2:由常量、变量、函数构成的算术/字符串表达式【例5-6】查询来自杭州的所有学生。 SELECT * FROM 学生表 WHERE 籍贯=杭州 【例5-7】查询累计学分在160分以下的学生姓名和累计学分。 SELECT 姓名, 累计学分 FROM 学生表 WHERE 累计学分16013返 回(2) 确定范围查询条件: op1 NOT BETWEEN op2 AND op3 op1 、 op2、 op3:由常量、变量、函数构成的算术/字符串表达式。【例5-8】查询累计学分不在150和159之间的学生姓名和累计学分。

6、 SELECT 姓名, 累计学分 FROM 学生表 WHERE 累计学分 NOT BETWEEN 150 AND 159 【例5-9】查询姓名在陈和李之间的学生学号和姓名。 SELECT 学号, 姓名 FROM 学生表 WHERE 姓名 BETWEEN 陈 AND 李由字符串定义的范围是根据字符内码的顺序确定的(一般按字典顺序 )14返 回(3) 确定集合查询条件: op1 NOT IN op2 op1 :由常量、变量、函数构成的算术/字符串表达式op2:集合,表示为(e1, e2, en),其中e1, e2, en为集合的元素,它们可以是与op1同类型的常量、变量和函数构成的表达式。含义:若

7、op1(不)是集合op2的元素,则条件为真,否则为假。【例5-10】查询来自杭州、宁波或温州的学生学号和姓名。 SELECT 学号,姓名 FROM 学生表 WHERE 籍贯 IN (杭州,宁波,温州)15返回 【例5-11】查询既不来自杭州,也不来自宁波的学号和姓名。 SELECT 学号,姓名 FROM 学生表 WHERE 籍贯 NOT IN (杭州,宁波)【例5-12】查询学号后两位是“09”,或者等于学号前两位或中间两位的学生学号和姓名。 SELECT 学号,姓名 FROM 学生表 WHERE SUBSTRING(学号,6,2) IN (09, SUBSTRING(学号,2,2),SUBS

8、TRING (学号,4,2) ) SUBSTRING(s,p,c):取子串函数,返回字符串s中从第p个字符开始,长度为c的子串。(4) 字符匹配查询条件: s1 NOT LIKE s2 ESCAPE s1和s2是由常量、变量、函数构成的字符串表达式。s1称为主字符串,s2称为模式字符串 。模式字符串除了包含普通字符外,还包含下列特殊字符(称为通配符): %匹配任意长度的字符串(长度可以为0)_ 匹配任意一个字符 c1c2cn 匹配字符c1, c2, , cn中的一个。当c1, c2, , cn连续时可简化为c1-cn c1c2cn 匹配除c1, c2, , cn外的一个字符。当c1, c2,

9、, cn连续时可简化为c1-cn 含义:若s1(不)与s2相匹配,则条件为真,否则为假。 16返回 【例5-13】查询姓名中第二个字为“鹏”的学生学号和姓名。 SELECT 学号,姓名 FROM 学生表 WHERE 姓名 LIKE _鹏% 【例5-14】查询学号长度不等于7,或者学号后6位含有非数字字符的学生学号和姓名。 SELECT 学号,姓名 FROM 学生表 WHERE 学号 NOT LIKE S0-90-90-90-90-90-9 【例5-15】查询学号最后一位既不是“1”和“3”,也不是“9”的学生学号和姓名。 SELECT 学号,姓名 FROM 学生表 WHERE 学号 LIKE

10、%139 ESCAPE短语: 使模式串中的某个通配符恢复原来的含义。 【例5-16】查询课程名以“DB_”开头的课程信息。 SELECT * FROM 课程表 WHERE 课名 LIKE DB_% ESCAPE (5) 空值判断查询条件: exp IS NOT NULL exp 是由常量、变量、函数构成的表达式。含义:exp的值(不)为空值,则条件为真,否则为假。【例5-17】查询没有成绩的学号和开课计划编号。 SELECT 学号, 开课号 FROM 选课表 WHERE 成绩 IS NULL 注意“IS”不能用“=”代替。 【例5-18】查询有成绩的学号和开课计划编号。 SELECT 学号,

11、开课号 FROM 选课表 WHERE 成绩 IS NOT NULL注意“IS NOT”不能用“!=”或“”代替。 17返回 (6) 组合条件查询条件: 用NOT、AND、OR和括号将多个逻辑表达式连接起来所得的复杂逻辑表达式 。括号的优先级最高,NOT次之,AND再次之,OR的优先级最低。【例5-19】查询这样的男生,他的电话号码前3位是“130”,他来自杭州或者宁波,他既不主修电子商务专业,也不主修信息管理专业。 SELECT * FROM 学生表 WHERE 性别=男 AND SUBSTRING(移动电话,1,3)=130 AND (籍贯=杭州 OR 籍贯=宁波) ANDNOT 专业 IN

12、 (电子商务,信息管理)18返回 3对查询结果排序用ORDER BY子句按照一个或多个列升序(ASC)或降序(DESC)输出查询结果,其中ASC为默认值 。语法 :ORDER BY ASC | DESC,n 【例5-20】查询选修了开课计划编号为010101的课程的学生学号和成绩,查询结果按分数降序排列 SELECT 学号, 成绩 FROM 选课表WHERE 开课号 =010101 ORDER BY 成绩 DESC可以用列在SELECT子句中的顺序编号来指定排序列,上例的ORDER BY子句可改为:ORDER BY 2 DESC19返回若需按SELECT子句中的计算列排序,则 ORDER BY

13、子句可用三种方法来表示这个计算列: 1)列表达式;2)列顺序编号;3)列别名。 【例5-21】查询选修了开课计划编号为010101的课程的学生学号、成绩以及加了10分后的新成绩,查询结果按原成绩降序、按新成绩升序排列。 SELECT 学号,成绩,成绩+10 AS New成绩FROM 选课表 WHERE 开课号=010101 ORDER BY 成绩 DESC, 成绩+10上例中的成绩+10也可改写为:New成绩或3。也可按SELECT子句中没有出现的列排序,此时不能用顺序编号来表示排序列。 5.1.2 统计为了有效处理SQL查询结果集,SQL Server提供了一序列的统计函数,用来实现对数据集

14、进行汇总、求平均等各种运算。本节内容包括:1常用的统计函数 2分组查询20返回 1常用的统计函数下表列出了常用的统计函数,其中DISTINCT表示统计时要剔除重复值。 21函数格式函数功能COUNT(DISTINCT *) 统计元组个数COUNT(DISTINCT ) 统计列值的个数SUM(DISTINCT )计算数值型列表达式的总和AVG(DISTINCT )计算数值型列表达式的平均值MAX(DISTINCT )求列表达式的最大值MIN(DISTINCT ) 求列表达式的最小值1常用的统计函数【例5-23】查询所有课本的总价格和平均价格,以及打七折后的总价格和平均价格。 SELECT SUM

15、(定价), AVG(定价), SUM(定价*0.7), AVG(定价*0.7)FROM 课程表查询结果为: (无列名)(无列名)(无列名)(无列名)93 3165.121.7关于本例有如下几条说明: (1) 语句搜索了课程表表的所有行,但只返回一行结果。(2) 统计函数表示的列是计算列,结果无列名,可指定别名。(3) 统计列值为空的元组不参与统计计算。221常用的统计函数若结合WHERE子句来使用统计函数,则只有满足WHERE条件的行才参与统计。 【例5-24】查询课程编号前两位数字是02的课程所用课本的总价格和平均价格。 SELECT SUM(定价), AVG(定价) FROM 课程表WHE

16、RE 课号 LIKE C02% 在统计函数中可以用DISTINCT关键字来剔除重复值。 【例5-25】查询至少选修了一门课程的学生总数。 SELECT COUNT(DISTINCT 学号) FROM 选课表 COUNT(*)用来统计满足条件的元组个数。【例5-26】查询课程编号前两位数字是02的课程总数。 SELECT COUNT(*) FROM 课程表 WHERE 课号 LIKE C02% 23返回2分组查询以上关于统计函数的例子都是针对满足WHERE条件的查询结果集进行的统计。如果想先对查询结果集进行分组,然后再对每个组进行统计,就要用到GROUP BY子句了。GROUP BY子句可以将查

17、询结果集按一列或多列取值相等的原则进行分组。含GROUP BY子句的查询称为分组查询。本节内容包括:(1) 使用GROUP BY子句进行分组 (2) 使用HAVING短语来筛选组 24返回(1) 使用GROUP BY子句进行分组分组目的:细化统计函数的作用对象。如果未对查询结果集分组,统计函数将作用于整个查询结果集,即整个查询结果集只有一个统计值。否则,统计函数将作用于每个组,即每一个组都有一个统计值。GROUP BY子句的语法:GROUP BY ,n 【例5-27】查询各门课程的课程号及相应的选课人数。 SELECT 开课号, COUNT(学号) FROM 选课表GROUP BY 开课号本例

18、先对选课表表按开课号的取值进行分组,所有具有相同开课号值的元组被分为一组,然后用COUNT函数统计每一组的学生人数。 25返回两点注意: GROUP BY中的列名只能是FROM子句所列表的列名,不能是列的别名。例如下列查询是错误的: SELECT 开课号 AS 开课计划编号, COUNT(学号) FROM 选课表 GROUP BY 开课计划编号 使用GROUP BY子句后,SELECT子句的目标列表达式所涉及的列必须满足:要么在GROUP BY子句中,要么在在某个统计函数中。例如下列查询是错误的: SELECT 开课号, 学号 FROM 选课表 GROUP BY 开课号 因为学号既不在GROU

19、P BY子句中,也不在统计函数中。 (2) 使用HAVING短语来筛选组HAVING短语的作用:指定组筛选条件。【例5-28】查询学号前5位为S0601且选修了两门以上(含)课程的学生学号。 SELECT 学号 FROM 选课表WHERE 学号 LIKE S0601%GROUP BY 学号 HAVING COUNT(*)=2 WHERE子句与HAVING短语的区别 (1)作用对象不同:WHERE作用表,HAVING作用于组。 (2)条件构成不同:WHERE条件不能直接包含统计函数,而 HAVING条件所涉及的列必须要么在GROUP BY子句中,要么在某个统计函数中。 26返回5.1.3 连接查

20、询单表查询:仅涉及一个表的查询(FROM子句仅含一个表)。连接查询:涉及多个表的查询(FROM子句包含多个表)。本节内容包括:1.连接查询和单表查询的区别和联系 2.为FROM子句后的表起别名 3.使用JOINON关键字4. 外连接27返回1.连接查询和单表查询的区别和联系区别:单表查询只涉及一张表,而连接查询涉及多张表。联系:连接查询是针对多表笛卡尔积的单表查询。 连接查询的特殊性:(1) 重名列加“.”前缀作为限定。(2) WHERE条件:连接条件 AND 普通查询条件。(3) 涉及n张表的连接查询至少应包括n-1个连接条件。【例5-29】查询学生的基本信息及其选课信息。 SELECT 学

21、生表.*, 开课号, 成绩FROM 学生表, 选课表WHERE 学生表.学号= 选课表 .学号28返回【例5-30】查询选修了开课号为“010101”的课程的学生学号和姓名。 SELECT 学生表.学号, 姓名 FROM 学生表, 选课表WHERE 学生表.学号=选课表.学号 AND 开课号=0101012. 为FROM子句后的表起别名格式 :FROM AS ,n 目的:(1)用别名作为列的前缀,缩短涉及重名列的子句。(2)当FROM子句含多张相同的表时,必须为它们取不同 的别名,在其他子句中用别名作为列的前缀。【例5-31】查询至少选修了学号为“S060110”的学生所选一门课程的学生学号和

22、姓名。 SELECT DISTINCT Z.学号, 姓名FROM 选课表 AS X, 选课表 AS Y, 学生表 AS ZWHERE X.学号=S060110 AND Y.学号!=X.学号 AND Y.开课号 = X.开课号 AND Y.学号=Z.学号29返回3. 使用JOINON关键字目的:将连接条件和普通查询条件分开。格式: SELECT子句FROM JOIN ON n WHERE 其他子句【例5-32】用JOIN和ON关键字实现例5-31的查询。SELECT DISTINCT Z.学号, 姓名FROM 选课表 X JOIN 选课表 Y ON Y.学号!=X.学号 AND Y.开课号 =

23、X.开课号 JOIN 学生表 Z ON Y.学号=Z.学号WHERE X.学号=S06011030返回4. 外连接种类:左外连接、右外连接、全外连接 左外连接:将左边关系中的未用元组配上空值加到结果集中。操作符: *= 或 LEFT OUTER JOINON。右外连接:将右边关系中的未用元组配上空值加到结果集中。操作符: =*或 RIGHT OUTER JOINON。全外连接:将两边关系中的未用元组配上空值加到结果集中。操作符: FULL OUTER JOINON。31返回【例5-33】查询学生的学号、姓名、籍贯信息及其选课信息,分别以左外连接、右外连接和全外连接显示。 (1)左外连接 SEL

24、ECT 学生表.学号, 姓名, 籍贯, 开课号, 成绩FROM 学生表, 选课表WHERE 学生表.学号*= 选课表.学号 查询结果为: 学号 姓名 籍贯 开课号 成绩 S060101 王东民 杭州 010101 90.0S060109 陈晓莉 西安 NULL NULL (2)右外连接 SELECT 学生表.学号, 姓名, 籍贯, 开课号, 成绩FROM 学生表 RIGHT OUTER JOIN 选课表 ON 学生表.学号= 选课表.学号(3)全外连接 SELECT 学生表.学号, 姓名, 籍贯, 开课号, 成绩FROM 学生表 FULL OUTER JOIN 选课表 ON 学生表.学号= 选

25、课表.学号5.1.4 子查询查询块: ( SELECT语句 ),代表查询的中间结果集。子查询:将一个查询块嵌入另一个中,称嵌套查询。上层查询块称父查询,下层查询块称子查询。 用途:对子查询进行集合检查来表达查询条件。子查询检查方法: 1.检查给定值是否在结果集中2.用给定值和结果集中的元素进行大小比较3.检查结果集是否为空32返回1. 检查给定值是否在结果集中查询条件:父查询的属性列 IN (子查询)。含义:判断属性列的值是否在子查询的结果中。 【例5-34】查询选修了 “数据库原理”的学生学号和姓名。 SELECT 学号, 姓名 FROM 学生表WHERE 学号 IN ( SELECT 学号

26、 FROM 选课表 WHERE 开课号 IN ( SELECT 开课号 FROM Offering WHERE 课号 IN ( SELECT 课号 FROM 课程表 WHERE 课名=数据库原理 ) ) )嵌套查询的特点: (1)允许多层嵌套,求解顺序:由内向外。(2)对用IN或比较运算符连接的子查询,其SELECT子句只能有一个列表达式,且左边列表达式和右边SELECT中的列表达式含义要相同。33返回2. 用给定值和结果集中的元素进行大小比较含义:指父查询与子查询之间用比较运算符进行连接。分为单值比较和多值比较两类。(1)单值比较当子查询的结果集只包含一个值时,可用比较运算符直接连接父查询的

27、列表达式和子查询结果集,实现其间的大小比较。返回单值的子查询可参加任何合法的表达式运算。【例5-35】查询累计学分比“胡汉民”多2分以上(含)的学生学号、姓名和累计学分。 SELECT 学号, 姓名, 累计学分 FROM 学生表 WHERE 累计学分 = ( SELECT 累计学分 FROM 学生表 WHERE 姓名 = 胡汉民 ) + 234【例5-36】查询学生S060101的姓名和平均成绩 SELECT 姓名, ( SELECT SUM(成绩) FROM 选课表 WHERE 学号=S060101 )2. 用给定值和结果集中的元素进行大小比较(2)多值比较当子查询的结果集包含多个值时,用给

28、定值和结果集中的某个值进行的比较。此时父查询与子查询之间要用比较运算符后缀ANY或ALL进行连接,其含义见下表。35返回比较运算含义ANY、 =ANY大于、大于等于子查询结果集中的某个值ANY、=ANY小于、小于等于子查询结果集中的某个值= ANY等于子查询结果集中的某个值!=ANY或ANY不等于子查询结果集中的某个值 (无意义)ALL、 =ALL大于、大于等于子查询结果集中的所有值ALL、=ALL小于、小于等于子查询结果集中的所有值=ALL等于子查询结果集中的所有值(无意义)!=ALL或ALL不等于子查询结果集中的所有值【例5-37】查询累计学分比计算机专业和信息管理专业所有学生都低的学生名

29、单。 SELECT 姓名 FROM 学生表WHERE 专业 计算机 AND 专业 信息管理 AND 累计学分 ALL ( SELECT 累计学分 FROM 学生表 WHERE 专业 IN (计算机 , 信息管理) )本例也可以用统计函数实现: SELECT 姓名 FROM 学生表WHERE 专业 计算机 AND 专业 信息管理 AND 累计学分 ( SELECT MIN(累计学分) FROM 学生表 WHERE 专业 IN (计算机 , 信息管理) )ANY和ALL与统计函数的对应关系见表5-9。 3.检查结果集是否为空语法:NOT EXISTS (子查询)EXISTS:子查询结果集不空则返回

30、真,否则返回假NOT EXISTS:子查询结果集为空则返回真,否则返回假【例5-38】查询选修了开课计划号为010101的学生姓名。 SELECT 姓名 FROM 学生表 AS SWHERE EXISTS ( SELECT * FROM 选课表 AS E WHERE E.学号=S.学号 AND 开课号=010101 )这类子查询具有如下特点: (1)子查询的条件往往要引用上层查询所涉及的表。 (2)子查询的SELECT子句写成SELECT *即可。36返回5.1.5 联合查询目的:把多个SELECT语句的结果合并为一个格式: SELECT语句 UNION SELECT语句 n 特点: (1)各

31、结果表的列数、对应列的数据类型必须相同。 (2)结果表的列名取第1个SELECT语句定义的列名。 (3)系统会自动去掉重复的元组。【例5-39】查询计算机专业和信息管理专业的学生信息。 SELECT * FROM 学生表 WHERE 专业=计算机UNIONSELECT * FROM 学生表 WHERE 专业=信息管理37返回5.2 表数据编辑表数据编辑又称数据更新,包括插入数据、修改数据和删除数据三类命令。本节内容包括:5.2.1 插入数据 5.2.2 修改数据 5.2.3 删除数据38返回5.2.1 插入数据1插入单个元组: INSERTVALUES语句, 格式为: INSERT INTO

32、( ,n ) VALUES ( ,n ) 注意:(1)未出现在列名列表中的列插入时取空值;(2)表达式数量必须和列名数量相等,表达式的数据类型必须和对应列的数据类型相兼容;(3)关系中的NOT NULL列必须出现在列名列表中;(4)若省略列名列表,则VALUES须指定所有列的值。【例5-40】将(S060102, 010201)插入选课表表。 INSERT INTO 选课表 (学号, 开课号) VALUES (S060102, 010201)39返回2插入子查询的结果: INSERTSELECT语句, 格式为: INSERT INTO ( ,n ) SELECT语句注意:(1)未出现在列名列表

33、中的列插入时取空值;(2)SELECT中的目标列须和INSERT中的列数量相等、类型兼容; (3)关系中的NOT NULL列须出现在列名表和SELECT语句中;(4)若省略列名列表,则SELECT语句须指定所有列的值。【例5-42】求各个专业学生的平均累计学分,把结果存入表中。 CREATE TABLE 主修专业 ( 专业 CHAR(20), Avgpa INT)INSERT INTO 主修专业(专业, Avgpa) SELECT 专业, AVG(累计学分) FROM 学生表 GROUP BY 专业3使用SELECTINTO语句进行数据插入, 格式为: SELECT ,n INTO SELEC

34、T语句的其他子句 注意:(1)系统会自动创建一个新表,新表的结构由目标列表达式定义,然后将 SELECT 语句的结果集插入这个新表 ;(2)当目标列是计算列时,必须为它起别名。 【例5-43】用SELECT INTO语句改写例5-42。 SELECT 专业, AVG(累计学分) AS Avgpa INTO 主修专业 FROM 学生表 GROUP BY 专业5.2.2 修改数据1数据修改语句:UPDATE, 格式为: UPDATE SET = ,n FROM ,n WHERE 注意:(1)UPDATE语句用来修改指定表中满足WHERE条件的元组。修改方法是用SET子句中的值取代相应列的值 ;(2

35、)修改条件和SELECT语句中WHERE条件完全相同,它不仅可以直接使用UPDATE后面的表,也可通过引入FROM子句直接使用其他表,还可以将子查询嵌入修改条件中。40返回2修改给定表的所有行若省略WHERE子句,则UPDATE将修改表的所有行。【例5-44】将所有学生的累计学分增加3分。 UPDATE 学生表 SET 累计学分=累计学分+3 3基于给定表修改某些行 如果省略FROM子句,但含有WHERE子句,则UPDATE语句将修改满足修改条件的行,但是此时的修改条件只能直接使用UPDATE后面的表所包含的列。 【例5-45】将计算机专业所有女生的籍贯改为“杭州”,累计学分增加3分。 UPD

36、ATE 学生表 SET 累计学分=累计学分+3, 籍贯=杭州WHERE 专业 = 计算机 AND 性别 = 女4基于其他表修改某些行 如果修改条件需要使用其他表的列,就要用FROM子句将这些表引入到UPDATE语句中。【例5-46】将计算机专业所有学生的数据库原理课程的成绩增加10分。 UPDATE 选课表 SET 成绩 = 成绩+10FROM Offering AS O, 课程表 AS C, 学生表 AS SWHERE 专业=计算机 AND 课名=数据库原理 AND C.课号 = O.课号 AND O.开课号 = 选课表.开课号 AND 选课表.学号 = S.学号 5用子查询修改某些行 UP

37、DATE中的修改条件还可以通过嵌入子查询进行构造。 【例5-47】用子查询构造例5-46的修改条件,实现相同功能。 UPDATE 选课表 SET 成绩 = 成绩+10FROM 学生表 AS SWHERE 专业=计算机 AND 选课表.学号=S.学号 AND 开课号 IN ( SELECT 开课号 FROM Offering WHERE 课号 IN ( SELECT 课号 FROM 课程表 WHERE 课名=数据库原理 ) )5.2.3 删除数据1数据删除语句:DELETE, 格式为: DELETE FROM FROM ,n WHERE 注意:(1) DELETE语句用来删除指定表中满足删除条件

38、的元组;(2)删除条件和SELECT语句中WHERE条件完全相同,它不仅可以直接使用DELETE后面的表,也可通过引入FROM子句直接使用其他表,还可以将子查询嵌入删除条件中。41返回2删除给定表的所有行若省略WHERE子句,则DELETE将删除表的所有行。【例5-48】将学生表表清空。 DELETE FROM 学生表3基于给定表删除某些行 如果省略FROM子句,但含有WHERE子句,则DELETE语句将删除满足删除条件的行,但是此时的删除条件只能直接使用DELETE后面的表所包含的列。 【例5-49】从学生表表中删除计算机专业所有女生的信息。 DELETE FROM 学生表 WHERE 专业

39、 = 计算机 AND 性别 = 女4基于其他表删除某些行 如果删除条件需要使用其他表的列,就要用FROM子句将这些表引入到DELETE语句中。【例5-50】从选课表表中删除计算机专业所有学生对数据库原理课程的选修信息。 DELETE FROM 选课表 FROM Offering AS O, 课程表 AS C, 学生表 AS SWHERE 专业=计算机 AND 课名=数据库原理 AND C.课号 = O.课号 AND O.开课号 = 选课表.开课号 AND 选课表.学号 = S.学号 5用子查询删除某些行 DELETE中的删除条件还可以通过嵌入子查询进行构造。 【例5-51】用子查询构造例5-5

40、0的删除条件,实现相同功能。 DELETE FROM 选课表 FROM 学生表 AS SWHERE 专业=计算机 AND 选课表.学号=S.学号 AND 开课号 IN ( SELECT 开课号 FROM Offering WHERE 课号 IN ( SELECT 课号 FROM 课程表 WHERE 课名=数据库原理 ) )5.3 大文本和图像数据处理处理大文本和图像数据的数据类型:TEXT: 长达2GB的ASCII字符串NTEXT:长达1GB的UNICODE字符串IMAGE:长达2GB的二进制数据流 本节内容:5.3.1 大文本和图像数据列的定义和使用5.3.2 用于大文本和图像数据处理的函数

41、和语句42返回5.3.1 大文本和图像数据列的定义和使用TEXT、NTEXT和IMAGE列的定义和使用方法与普通列基本相同,但有如下限制: (1)不能在这种列上定义主键、外键和索引;(2)不能按这种列进行排序或分组;(3)不能在WHERE子句中直接引用这种列,只能作为函数参数,或参与IS NOT NULL和LIKE运算而出现在WHERE子句中。(4)不能对TEXT和NTEXT数据实施字符串连接操作(5)向IMAGE列插人数据时,应在数据前加0 x前缀表示插入的是16进制数据。43返回若这种列值的长度不超过8000字节,就可在SELECT、UPDATE和INSERT语句中引用它们。【例5-52】

42、首先创建表,其中含一个TEXT列,然后插入一些元组,最后用显示内容。 CREATE TABLE Textdemo( Item INT PRIMARY KEY, Textstring TEXT )INSERT INTO Textdemo VALUES(1, NULL)INSERT INTO Textdemo VALUES(2, Education is more all-inclusive than schooling)INSERT INTO Textdemo VALUES(3, REPLICATE(Education is all-inclusive, 4) )SELECT * FROM Te

43、xtdemo 若长度超过8000字节,处理时会发生数据截尾。5.3.2 用于大文本和图像数据处理的函数和语句1获取大文本和图像列的指针和数据长度TEXTPTR(列名):获取大文本和图像列的数据指针DATALENGTH(列名): 获取数据长度。【例5-53】显示例5-52中Textstring列的数据指针和长度。 SELECT Item, TEXTPTR(Textstring) AS指针,DATALENGTH(Textstring) AS长度FROM Textdemo执行结果为: Item 指针 长度 x 1 NULL NULL2 0 xFFFFA00 1000000 463 0 xFFFFA1

44、0 1000200 104445.3.2 用于大文本和图像数据处理的函数和语句452检测大文本和图像列指针的有效性 格式:TEXTVALID(., ) 。返回值:如果数据指针有效,则返回1,否则返回0。 【例5-54】显示例5-52中数据指针有效的列值及其长度。 SELECT DATALENGTH(Textstring) AS 长度, TextstringFROM Textdemo WHERE TEXTVALID ( Textdemo.Textstring, TEXTPTR(Textstring) ) = 1执行结果为: 长度 Textstring x46Education is more a

45、ll-inclusive than schooling 104Education is all-inclusiveEducation is. 5.3.2 用于大文本和图像数据处理的函数和语句463通过指针读大文本和图像列, 格式:READTEXT . offset size HOLDLOCK 含义: 在所指数据中返回从offset开始的size个字符。如果使用了HOLDLOCK关键字,则读取时对数据进行加锁。注意offset是从0开始的。 【例5-55】显示例5-52中Item为2的元组的列值前20个字符。 DECLARE ptr VARCHAR(16) SELECT ptr=TEXTPTR(Textstring) FROM Textdemo WHERE Item=2 READTEXT Textdemo.Textstring ptr 0 20 HOLDLOCK 执行结果为: Textstring xEducation is more al 5.3.2 用于大文本和图像数据处理的函

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论