版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第7章 数据查询与更新,(时间:5次课,10学时),第7章 数据查询与更新,教学提示:本章主要介绍使用SQL语句对数据进行查询与更新的方法。 教学目标:掌握使用SQL语句对数据进行查询与更新的方法,熟悉相应SQL语句的语法。能够使用图形界面进行相应的操作。 前面介绍了如何创建数据库和表,本章将介绍如何查询表中的数据,以及如何向表中添加数据,如何修改和删除表中的数据。 在SQL Server 2005中,通常利用数据库应用程序接口执行SQL语句,然后SQL Server 2005以表的形式返回数据结果。,第7章 数据查询与更新,7.1 数据查询 7.2 数据更新 7.3 习题,7.1 数据查询,
2、7.1.1 SQL 查询语句 7.1.2 SELECT子句 7.1.3 FROM子句 7.1.4 WHERE子句和HAVING子句 7.1.5 GROUP BY子句 7.1.6 ORDER BY子句 7.1.7 子查询 7.1.8 联接查询,7.1 数据查询,查询是对存储在 SQL Server 2005 中的数据的一种请求。可以使用下列几种形式发出查询: MS Query 或 Microsoft Access 用户可使用图形用户界面 (GUI) 从一个或多个 SQL Server 表中选择想要查询的数据。 使用 SQL Server Management Studio 或 OSQL 实用工具
3、的用户可发出 SELECT 语句。 客户端或基于中间层的应用程序(如 Microsoft Visual Basic 应用程序)可将 SQL Server 表中的数据映射到绑定控件(如网格)。,7.1 数据查询,虽然 SELECT 语句的完整语法比较复杂,但是大多数 SELECT 语句都描述结果集的4个主要属性。 结果集中的列的数量和属性。对于每个结果集列来说,必须定义下列属性: 列的数据类型。 列的大小以及数值列的精度和小数位数。 返回到列中的数据值的源。 从中检索结果集数据的表,以及这些表之间的所有逻辑关系。 为了符合 SELECT 语句的要求,源表中的行所必须达到的条件。不符合条件的行会被
4、忽略。 结果集的行的排列顺序。,7.1.1 SQL 查询语句,虽然 SELECT 语句的完整语法较复杂,但是它的主要子句可归纳如下: SELECT select_list INTO new_table_name FROM table_list WHERE search_conditions GROUP BY group_by_list HAVING search_conditions ORDER BY order_list ASC | DESC ,7.1.1 SQL 查询语句,SELECT 语句中的子句必须以适当顺序指定。 对数据库对象的每个引用都不得引起歧义。下列情况可能导致多义性: 在一个
5、系统中可能有多个对象具有相同的名称。 在执行 SELECT 语句时,对象所驻留的数据库不一定总是当前数据库。 在 FROM 子句中所指定的表和视图可能有相同的列名。,7.1.2 SELECT子句,选择列表用于定义 SELECT 语句的结果集中的列。选择列表是一系列以逗号分隔的表达式。每个表达式定义结果集中的一列。结果集中列的排列顺序与选择列表中表达式的排列顺序相同。 结果集列的以下这些特性由选择列表中的下列表达式定义。 结果集列与定义该列的表达式的数据类型、大小、精度以及小数位数相同。 结果集列的名称与定义该列的表达式的名称相关联。可选的 AS 关键字可用于更改名称,或者在表达式没有名称时为其
6、分配名称。 结果集列的数据值通过对结果集的每一行相应的表达式求值而得出。,7.1.2 SELECT子句,选择列表中的项目可包括以下几个。 简单表达式:对函数、局部变量、常量或者表或视图中的列的引用。 标量子查询,它是用于对结果集每一行求得单个值的 SELECT 语句。 通过对一个或多个简单表达式使用运算符创建的复杂表达式。 * 关键字,可指定返回表中的所有列。 1. 选择所有列 在 SELECT 语句中,星号 (*) 具有以下特殊的意义。 如果没有使用限定符指定,星号 (*) 将被解析为对 FROM 子句中指定的所有表或视图中的所有列的引用。,7.1.2 SELECT子句,【例7.1】下列示例
7、将检索存储在s_c表中所有选课信息。 USE teaching; GO SELECT * FROM s_c ORDER BY CNO GO 执行结果如图7.1所示。,7.1.2 SELECT子句,图7.1 【例7.1】执行结果,7.1.2 SELECT子句,【例7.2】下列示例将检索 course 表中的所有列,并按照创建 course 表时所定义的顺序显示这些列。 USE teaching GO SELECT * FROM course ORDER BY CREDIT ASC GO 执行结果如图7.2所示。,7.1.2 SELECT子句,图7.2 【例7.2】执行结果,7.1.2 SELEC
8、T子句,2. 选择特定列 若要选择表中的特定列,应在选择列表中明确地列出每一列。 【例7.3】若要仅列出课程编号和它们的学分,可使用下列语句。 USE teaching GO SELECT CNO, CREDIT FROM course ORDER BY CREDIT ASC GO 执行结果如图7.3所示。,7.1.2 SELECT子句,图7.3 【例7.3】执行结果,7.1.2 SELECT子句,3. 分配结果集列的名称 在选择列表中,对列的指定还可以包括指定别名或其他表达式。AS 子句可用来更改结果集列的名称或为派生列分配名称。 【例7.4】指定显示列的列名。 USE teaching G
9、O SELECT CNAME AS Course name FROM course GO 执行结果如图7.4所示。,7.1.2 SELECT子句,图7.4 【例7.4】执行结果,7.1.2 SELECT子句,在选择列表中,有些列进行了具体指定,而不是指定为对列的简单引用,这些列便是派生列。除非使用 AS 子句分配了名称,否则派生列没有名称。 【例7.5】在以下示例中,如果删除 AS 子句,则CREDIT*18表达式指定的派生列将会没有名称。 USE teaching GO SELECT CNO, CREDIT*18 AS CREDIT_HOUR FROM course GO 执行结果如图7.5
10、所示。,7.1.2 SELECT子句,图7.5 【例7.5】执行结果,7.1.2 SELECT子句,4. 使用 DISTINCT 消除重复项 DISTINCT 关键字可从 SELECT 语句的结果中消除重复的行。如果没有指定 DISTINCT,将返回所有行,包括重复的行。 DISTINCT 关键字可从结果集中清除重复的行。 【例7.6】s_c表中含有同一名学生选多门课,以下示例显示了查询选课的学生学号。 USE teaching GO SELECT DISTINCT SNO FROM s_c ORDER BY SNO GO 执行结果如图7.6所示。,7.1.2 SELECT子句,图7.6 【例
11、7.6】执行结果,7.1.2 SELECT子句,5. 使用 TOP 和 PERCENT 限制结果集 可以使用 TOP 子句限制结果集中返回的行数。 TOP ( expression ) PERCENT WITH TIES 其中,expression 是指定返回行数的数值表达式,如果指定了 PERCENT,则是指返回的结果集行的百分比(由 expression 指定)。 【例7.7】以下 SELECT 语句将从 course 表中返回 2门学分最多的课程。 USE teaching GO SELECT TOP 2 CNO, CNAME, CREDIT FROM course ORDER BY C
12、REDIT DESC GO 执行结果如图7.7所示。,7.1.2 SELECT子句,图7.7 【例7.7】执行结果,7.1.2 SELECT子句,6. 选择列表中的计算值 选择列表可包含通过对一个或多个简单表达式应用运算符而生成的表达式。这使结果集中得以包含基表中不存在,但是根据基表中存储的值计算得到的值。这些结果集列被称为派生列。 (1)对数值列或常量使用算术运算符或函数进行的计算和运算。 【例7.8】将学生S2的C1课程的成绩提高15分。 USE teaching; GO SELECT GRADE FROM s_c WHERE SNO=S2 AND CNO=C1; GO SELECT GR
13、ADE+15 AS GradeUpdate FROM s_c WHERE SNO=S2 AND CNO=C1; GO 执行结果如图7.8所示。,7.1.2 SELECT子句,图7.8 【例7.8】执行结果,7.1.2 SELECT子句,(2)在SELECT子句中还可以使用聚合函数。 聚合函数对一组值执行计算,并返回单个值。除了 COUNT 以外,聚合函数都会忽略空值。聚合函数经常与 SELECT 语句的 GROUP BY 子句一起使用。 所有聚合函数均为确定性函数。也就是说,只要使用一组特定输入值调用聚合函数,该函数总是返回相同的值。 聚合函数只能在以下位置作为表达式使用: SELECT 语句
14、的选择列表(子查询或外部查询)。 COMPUTE 或 COMPUTE BY 子句。 HAVING 子句。 AVG函数 SUM函数 COUNT函数 MIN函数 MAX函数,7.1.2 SELECT子句,【例7.9】以下示例列出返回年龄最大的学生的年龄。 USE teaching; GO SELECT MAX(AGE) FROM student; GO 执行结果如图7.9所示。 【例7.10】以下示例列出了有多少学生选课。 USE teaching; GO SELECT COUNT(DISTINCT SNO) FROM s_c; GO 执行结果如图7.10所示。,7.1.2 SELECT子句,图7
15、.9 【例7.9】执行结果,7.1.2 SELECT子句,图7.10 【例7.10】执行结果,7.1.2 SELECT子句,【例7.11】以下示例计算学生总数。 USE teaching; GO SELECT COUNT(*) FROM student; GO 执行结果如图7.11所示。 【例7.12】以下示例显示组合使用 COUNT(*) 和选择列表中的其他聚合函数。统计男生的人数和平均年龄。 USE teaching; GO SELECT COUNT(*), AVG(AGE) FROM student WHERE SEX = M; GO 执行结果如图7.12所示。,7.1.2 SELECT
16、子句,图7.11 【例7.11】执行结果,7.1.2 SELECT子句,图7.12 【例7.12】执行结果,7.1.3 FROM子句,在每一个要从表或视图中检索数据的 SELECT 语句中,都需要使用 FROM 子句。使用 FROM 子句可以: 列出选择列表和 WHERE 子句中所引用的列所在的表和视图。可以使用 AS 子句为表和视图的名称指定别名。 限定联接类型。这些类型由 ON 子句中指定的联接条件限定。 【例7.13】显示所有学生的情况。 USE teaching; GO SELECT * FROM student; GO 执行结果如图7.13所示。,7.1.3 FROM子句,图7.13
17、 【例7.13】执行结果,7.1.3 FROM子句,两个或多个表或视图之间的联接。 【例7.14】显示所有学生的学号、姓名、所选课程名称及成绩。 USE teaching; GO SELECT s.SNO, s.SNAME, c.CNAME, sc.GRADE FROM student AS s JOIN s_c AS sc ON s.SNO = sc.SNO JOIN course AS c ON sc.CNO = c.CNO; GO 执行结果如图7.14所示。,7.1.3 FROM子句,图7.14 【例7.14】执行结果,7.1.4 WHERE子句和HAVING子句,SELECT 语句中的
18、 WHERE 和 HAVING 子句可以控制用于生成结果集的源表中的行。WHERE 和 HAVING 是筛选器。这两个子句指定一系列搜索条件,只有那些满足搜索条件的行才用于生成结果集。我们称满足搜索条件的行包含在结果集中。 【例7.15】下面 SELECT 语句中的 WHERE 子句仅选择出选修了C2课的学生。 USE teaching; GO SELECT s.SNO, s.SNAME, sc.GRADE FROM s_c AS sc JOIN student AS s ON sc.SNO = s.SNO WHERE sc.CNO = C2; GO 执行结果如图7.15所示。,7.1.4 W
19、HERE子句和HAVING子句,图7.15 【例7.15】执行结果,7.1.4 WHERE子句和HAVING子句,【例7.16】在以下示例中,WHERE 子句仅限定选修C2课程的学生,而 HAVING 子句进一步将结果限制为只包括选修两门课程以上的学生。 USE teaching; GO SELECT SNO FROM s_c WHERE CNO = C2 GROUP BY SNO HAVING COUNT(CNO) = 2 GO 执行结果如图7.16所示。,7.1.4 WHERE子句和HAVING子句,图7.16 【例7.16】执行结果,7.1.4 WHERE子句和HAVING子句,1. 比
20、较搜索条件 Microsoft SQL Server 2005 使用表7.1所列的比较运算符。 运算符是在两个表达式之间指定比较的。 【例7.17】以下查询检索s_c表中成绩在80分以上的学生。 USE teaching; GO SELECT SNO, CNO, GRADE FROM s_c WHERE GRADE =80 GO 执行结果如图7.17所示。,7.1.4 WHERE子句和HAVING子句,7.1.4 WHERE子句和HAVING子句,图7.17 【例7.17】执行结果,7.1.4 WHERE子句和HAVING子句,使用 NOT 可对表达式求反。 【例7.18】以下查询从 stud
21、ent 表中检索学生姓名为 WANG 开始的行。 USE teaching; GO SELECT SNAME FROM student WHERE SNAME = WANG ORDER BY SNO; GO 执行结果如图7.18所示。,7.1.4 WHERE子句和HAVING子句,图7.18 【例7.18】执行结果,7.1.4 WHERE子句和HAVING子句,7.1.4 WHERE子句和HAVING子句,图7.19 【例7.19】执行结果,7.1.4 WHERE子句和HAVING子句,2. 范围搜索条件 范围搜索返回介于两个指定值之间的所有值。包括范围返回与两个指定值匹配的所有值。排他范围不
22、返回与两个指定值匹配的任何值。 BETWEEN 关键字指定要搜索的包括范围。 【例7.20】以下查询从 student 表中检索年龄在2022之间的学生。 USE teaching; GO SELECT SNO, SNAME FROM student WHERE AGE BETWEEN 20 AND 22 ORDER BY SNO GO 执行结果如图7.20所示。,7.1.4 WHERE子句和HAVING子句,图7.20 【例7.20】执行结果,7.1.4 WHERE子句和HAVING子句,NOT BETWEEN 查找指定范围之外的所有行。 【例7.21】使用以下查询可查找年龄不在2022之间
23、的学生。 USE teaching; GO SELECT SNO, SNAME FROM student WHERE AGE NOT BETWEEN 20 AND 22 ORDER BY SNO USE teaching; GO 执行结果如图7.21所示。,7.1.4 WHERE子句和HAVING子句,图7.21 【例7.21】执行结果,7.1.4 WHERE子句和HAVING子句,3. 列表搜索条件 IN 关键字使我们可以选择与列表中的任意值匹配的行。例如,如果不使用 IN,要获得“框架”子类别中的一些产品,需要执行如下例所示的查询。 【例7.22】以下查询检索student表中姓名为WAN
24、G或LIU的学生。 USE teaching; GO SELECT SNO, SNAME FROM student WHERE SNAME = WANG OR SNAME = LIU ORDER BY SNO GO 执行结果如图7.22所示。,7.1.4 WHERE子句和HAVING子句,图7.22 【例7.22】执行结果,7.1.4 WHERE子句和HAVING子句,4. 搜索条件中的模式匹配 LIKE 关键字搜索与指定模式匹配的字符串、日期或时间值。LIKE 关键字使用常规表达式包含值所要匹配的模式。模式包含要搜索的字符串,字符串中可包含4种通配符(见表7.2)的任意组合。 【例7.23】
25、以下查询从 student 表中检索学生姓名以字母 W 开头的行。 USE teaching; GO SELECT SNO, SNAME FROM student WHERE SNAME LIKE W% ORDER BY SNO; GO 执行结果如图7.23所示。,7.1.4 WHERE子句和HAVING子句,图7.23 【例7.23】执行结果,7.1.4 WHERE子句和HAVING子句,可以将 NOT LIKE 与同样的通配符结合使用。 【例7.24】若要检索学生姓名不以字母 W 开头的行,可以使用下列等价查询中的任意一个。 USE teaching; GO SELECT SNO, SNA
26、ME FROM student WHERE SNAME NOT LIKE W% ORDER BY SNO; GO 执行结果如图7.24所示。,7.1.4 WHERE子句和HAVING子句,图7.24 【例7.24】执行结果,7.1.4 WHERE子句和HAVING子句,【例7.25】以下查询试图查找学生姓名只由两个字符W%组成的行。该查询将不会查找以W开头的学生。 USE teaching; GO SELECT SNO, SNAME FROM student WHERE SNAME = W% ORDER BY SNO; GO 执行结果如图7.25所示。,7.1.4 WHERE子句和HAVING
27、子句,图7.25 【例7.25】执行结果,7.1.4 WHERE子句和HAVING子句,5. NULL 比较搜索条件 NULL 值表示列的数据值未知或不可用。NULL 值与零(数值或二进制值)、零长度的字符串或空白(字符值)的含义不同。相反,空值可用于区分输入的是零(数值列)或空白(字符列)还是无数据输入(NULL 可用于数字列和字符列)。 可以通过以下两种方式在允许空值的列中输入 NULL 值(根据 CREATE TABLE 语句中的指定): Microsoft 如果无数据输入并且列或数据类型上无默认的或 DEFAULT 约束,则SQL Server 2005 将自动输入值 NULL。 用户
28、可以通过输入不带引号的 NULL 显式输入 NULL 值。如果在字符列中输入带引号的 NULL,则它将被视为字母 N、U、L 和 L,而非空值。 当检索到空值时,应用程序通常会在相应的位置显示诸如 NULL、(NULL) 或 (null) 的字符串。 空值(IS NULL 和 IS NOT NULL)。,7.1.4 WHERE子句和HAVING子句,【例7.26】以下查询从 s_c 表中检索成绩不是 NULL 的行。 USE teaching; GO SELECT * FROM s_c WHERE GRADE IS NOT NULL ORDER BY SNO GO 执行结果如图7.26所示。,
29、7.1.4 WHERE子句和HAVING子句,图7.26 【例7.26】执行结果,7.1.4 WHERE子句和HAVING子句,6. 逻辑运算符 逻辑运算符包括 AND、OR 和 NOT。AND 和 OR 用于连接 WHERE 子句中的搜索条件。NOT 用于反转搜索条件的结果。 AND 连接两个条件,只有当两个条件都符合时才返回 TRUE。 【例7.27】以下查询检索年龄在21岁以上的男学生的情况。 USE teaching; GO SELECT * FROM student WHERE AGE=21 AND SEX = M GO 执行结果如图7.27所示。,7.1.4 WHERE子句和HAV
30、ING子句,图7.27 【例7.27】执行结果,7.1.4 WHERE子句和HAVING子句,【例7.28】下列查询将返回选修C1或C2的学生。 USE teaching; GO SELECT SNO, CNO, GRADE FROM s_c WHERE CNO=C1 OR CNO=C2 执行结果如图7.28所示。 【例7.29】以下查询显示年龄为20岁的学生或年龄为21岁的男学生。 USE teaching; GO SELECT SNO, SNAME, SEX, AGE FROM student WHERE AGE = 20 OR AGE = 21 AND SEX = M 执行结果如图7.2
31、9所示。,7.1.4 WHERE子句和HAVING子句,图7.28 【例7.28】执行结果,7.1.4 WHERE子句和HAVING子句,图7.29 【例7.29】执行结果,7.1.4 WHERE子句和HAVING子句,【例7.30】以下查询查找年龄为20 或 21 的男学生。 USE teaching; GO SELECT SNO, SNAME, SEX, AGE FROM student WHERE (AGE = 20 OR AGE = 21) AND SEX = M GO 执行结果如图7.30所示。,7.1.4 WHERE子句和HAVING子句,图7.30 【例7.30】执行结果,7.1
32、.5 GROUP BY子句,GROUP BY 子句用来为结果集中的每一行产生聚合值。如果聚合函数没有使用 GROUP BY 子句,则只为 SELECT 语句报告一个聚合值。 【例7.31】下面的示例查询每个学生的平均成绩。 USE teaching; GO SELECT SNO, AVG(GRADE) AS avg_grade FROM s_c GROUP BY SNO ORDER BY SNO ; GO 执行结果如图7.31所示。,7.1.5 GROUP BY子句,图7.31 【例7.31】执行结果,7.1.5 GROUP BY子句,【例7.32】下面的示例查询每个学生的及格成绩课程的平均成
33、绩。 USE teaching; GO SELECT SNO, AVG(GRADE) AS avg_grade FROM s_c WHERE GRADE=60 GROUP BY SNO ORDER BY SNO ; GO 执行结果如图7.32所示。,7.1.5 GROUP BY子句,图7.32 【例7.32】执行结果,7.1.5 GROUP BY子句,【例7.33】下面的示例查询平均成绩在80分以上的学生的平均成绩。 USE teaching; GO SELECT SNO, AVG(GRADE) AS avg_grade FROM s_c GROUP BY SNO HAVING AVG(GRA
34、DE)=80 ORDER BY SNO ; GO 执行结果如图7.33所示。,7.1.5 GROUP BY子句,图7.33 【例7.33】执行结果,7.1.6 ORDER BY子句,指定在 SELECT 语句返回的列中所使用的排序顺序。除非同时指定了 TOP,否则 ORDER BY 子句在视图、内联函数、派生表和子查询中无效。 语法:,7.1.6 ORDER BY子句,【例7.34】下面的查询返回student表中按年龄升序排序的结果。 USE teaching; GO SELECT SNO, AGE FROM student ORDER BY AGE GO 执行结果如图7.34所示。,7.1
35、.6 ORDER BY子句,图7.34 【例7.34】执行结果,7.1.6 ORDER BY子句,【例7.35】下面的语句对student表先按性别降序排序,然后按 AGE升序排序。 USE teaching; GO SELECT SNO, SEX, AGE FROM student ORDER BY SEX DESC, AGE GO 执行结果如图7.35所示。,7.1.6 ORDER BY子句,图7.35 【例7.35】执行结果,7.1.6 ORDER BY子句,【例7.36】对student表先按性别升序排序,然后按学号降序排序,可以使用下列语句。 USE teaching; GO SEL
36、ECT SNO AS 学号, SEX AS 性别 FROM student ORDER BY SEX, 学号 GO 执行结果如图7.36所示。,7.1.6 ORDER BY子句,图7.36 【例7.36】执行结果,7.1.7 子查询,子查询是一个嵌套在 SELECT、INSERT、UPDATE 或 DELETE 语句或其他子查询中的查询。任何允许使用表达式的地方都可以使用子查询。,7.1.7 子查询,图7.37 【例7.37】执行结果,7.1.7 子查询,1. 子查询规则 子查询受下列限制的制约: 通过比较运算符引入的子查询选择列表只能包括一个表达式或列名称(对 SELECT * 执行的 EX
37、ISTS 或对列表执行的 IN 子查询除外)。 如果外部查询的 WHERE 子句包括列名称,它必须与子查询选择列表中的列是联接兼容的。 ntext、text 和 image 数据类型不能用在子查询的选择列表中。 由于必须返回单个值,所以由未修改的比较运算符(即后面未跟关键字 ANY 或 ALL 的运算符)引入的子查询不能包含 GROUP BY 和 HAVING 子句。 包含 GROUP BY 的子查询不能使用 DISTINCT 关键字。 不能指定 COMPUTE 和 INTO 子句。 只有指定了 TOP 时才能指定 ORDER BY。 不能更新使用子查询创建的视图。,7.1.7 子查询,2.
38、在子查询中限定列名 在下列示例中,外部查询的 WHERE 子句中的 SNO 列是由外部查询的 FROM 子句中的表名 student 隐性限定的,即外部查询的 WHERE 子句中的 SNO 列是来源于student表的。对子查询的选择列表中 SNO 的引用则是由子查询的 FROM 子句(通过 s_cr 表)来限定的,即子查询的SELECT子句中的SNO 列来源于s_c。 3. 子查询类型 (1)使用别名的子查询 许多其中的子查询和外部查询引用同一表的语句可称为自联接(将某个表与自身联接)。,7.1.7 子查询,图7.38 【例7.38】执行结果,7.1.7 子查询,7.1.7 子查询,(2)使
39、用IN和NOT IN的子查询 通过 IN(或 NOT IN)引入的子查询结果是包含零个值或多个值的列表。子查询返回结果之后,外部查询将利用这些结果。,7.1.7 子查询,图7.39 【例7.39】执行结果,7.1.7 子查询,7.1.7 子查询,图7.40 【例7.40】执行结果,7.1.7 子查询,7.1.7 子查询,图7.39 【例7.39】执行结果,7.1.7 子查询,7.1.7 子查询,图7.41 【例7.41】执行结果,7.1.7 子查询,(3)使用比较运算符的子查询 子查询可以由一个比较运算符(=、 =、! 或 =)引入。 与使用 IN 引入的子查询一样,由未修改的比较运算符(即后
40、面不接 ANY 或 ALL 的比较运算符)引入的子查询必须返回单个值而不是值列表。如果这样的子查询返回多个值,Microsoft SQL Server 2005 将显示一条错误信息。,7.1.7 子查询,图7.42 【例7.42】执行结果,7.1.7 子查询,7.1.7 子查询,图7.43 【例7.43】执行结果,7.1.7 子查询,图7.44 【例7.44】执行结果,7.1.7 子查询,(4)用 ANY、SOME 或 ALL 修改的比较运算符 可以用 ALL 或 ANY 关键字修改引入子查询的比较运算符。SOME 是与 ANY 等效的 SQL-92 标准。,7.1.7 子查询,图7.45 【
41、例7.45】执行结果,7.1.7 子查询,【例7.46】如果将ANY更改为 ALL,查询将只返回成绩高于或等于内部查询返回的所有课程的最高分的学生学号。 执行结果如图7.46所示。 (5)使用 EXISTS和NOT EXISTS 的子查询 使用 EXISTS 关键字引入一个子查询时,就相当于进行一次存在测试。外部查询的 WHERE 子句测试子查询返回的行是否存在。子查询实际上不产生任何数据,它只返回 TRUE 或 FALSE 值。 使用 EXISTS 引入的子查询的语法如下: WHERE NOT EXISTS (subquery),7.1.7 子查询,图7.46 【例7.46】执行结果,7.1
42、.7 子查询,7.1.7 子查询,图7.47 【例7.47】执行结果,7.1.7 子查询,7.1.7 子查询,图7.48 【例7.48】执行结果,7.1.8 联接查询,通过联接,可以从两个或多个表中根据各个表之间的逻辑关系来检索数据。联接指明了 Microsoft SQL Server 2005 应如何使用一个表中的数据来选择另一个表中的行。 联接条件可通过以下方式定义两个表在查询中的关联方式: 指定每个表中要用于联接的列。典型的联接条件在一个表中指定一个外键,而在另一个表中指定与其关联的键。 指定用于比较各列的值的逻辑运算符(例如 = 或 )。,7.1.8 联接查询,【例7.49】下面是使用
43、此联接的一个简单 SELECT 语句:查询成绩在60分以上的男学生所选各门课程的情况。 USE teaching; GO SELECT student.SNO, SNAME,CNO, GRADE FROM student JOIN s_c ON (student.SNO = s_c.SNO) WHERE GRADE =60 AND SEX= F; GO 执行结果如图7.49所示。,7.1.8 联接查询,图7.49 【例7.49】执行结果,7.1.8 联接查询,联接可分为以下几类: 内部联接(典型的联接运算,使用类似于“=”或“”的比较运算符)。内部联接包括同等联接和自然联接。 外部联接。外部联
44、接可以是左向外部联接、右向外部联接或完整外部联接。 交叉联接 交叉联接将返回左表中的所有行。左表中的每一行均与右表中的所有行组合。交叉联接也称作笛卡儿积。,7.1.8 联接查询,1. 使用内部联接 内部联接是使用比较运算符比较要联接列中的值的联接。 在 SQL-92 标准中,可以在 FROM 子句或 WHERE 子句中指定内部联接。这是 WHERE 子句中惟一一种 SQL-92 支持的联接类型。WHERE 子句中指定的内部联接称为旧式内部联接。,7.1.8 联接查询,图7.50 【例7.50】执行结果,7.1.8 联接查询,2. 使用外部联接 仅当两个表中都至少有一个行符合联接条件时,内部联接
45、才返回行。内部联接消除了与另一个表中的行不匹配的行。而外部联接会返回 FROM 子句中提到的至少一个表或视图中的所有行,只要这些行符合任何 WHERE 或 HAVING 搜索条件。将检索通过左外部联接引用的左表中的所有行,以及通过右外部联接引用的右表中的所有行。在完全外部联接中,将返回两个表的所有行。 使用左外部联接 考虑通过 ProductID 列联接 Product 表和 ProductReview 表。结果只显示已编写审核的产品。,7.1.8 联接查询,7.1.8 联接查询,图7.51 【例7.51】执行结果,7.1.8 联接查询,使用右外部联接 SQL-92 右外部联接运算符 RIGH
46、T OUTER JOIN 指明:不管第一个表中是否有匹配的数据,结果中都将包括第二个表中的所有行。,7.1.8 联接查询,图7.52 【例7.52】执行结果,7.1.8 联接查询,使用完全外部联接 若要通过在联接的结果中包括不匹配的行来保留不匹配信息,可以使用完全外部联接。SQL Server 提供了完全外部联接运算符 FULL OUTER JOIN,它将包括两个表中的所有行,不论另一个表中是否有匹配的值。 3. 使用交叉联接 没有 WHERE 子句的交叉联接将产生联接所涉及的表的笛卡儿积。第一个表的行数乘以第二个表的行数等于笛卡儿积结果集的大小。,7.1.8 联接查询,7.1.8 联接查询,
47、图7.53 【例7.53】执行结果,7.1.8 联接查询,7.1.8 联接查询,图7.54 【例7.54】执行结果,7.1.8 联接查询,4. 使用自联接 表可以通过自联接与自身联接。例如,可以使用自联接查找由多个供应商提供的产品。 由于此查询涉及 ProductVendor 表与其自身的联接,因此 ProductVendor 表将以两种角色出现。若要区分这两种角色,必须在 FROM 子句中为 ProductVendor 表给定两个不同的别名(pv1 和 pv2)。这些别名用于限定查询其余部分中的列名。,7.1.8 联接查询,图7.55 【例7.55】执行结果,7.2 数据更新,7.2.1 插
48、入数据 7.2.2 更新数据 7.2.3 删除数据,7.2 数据更新,若对数据进行更新,需要对目标表有相应的 INSERT 权限、UPDATE 权限和DELETE 权限。 默认情况下,INSERT 权限被授予 sysadmin 固定服务器角色成员、db_owner 和 db_datawriter 固定数据库角色成员以及表的所有者。sysadmin、db_owner 和 db_securityadmin 角色成员和表所有者可以将权限传递给其他用户。 UPDATE 权限默认授予sysadmin固定服务器角色的成员、db_owner 和 db_datawriter 固定数据库角色的成员以及表的所有者
49、。sysadmin、db_owner 和 db_securityadmin 角色的成员和表所有者可以将权限传输给其他用户。,7.2 数据更新,更改对表的操作权限步骤如下: (1)在对象管理器中右击要删除数据行的表名,在出现的快捷菜单中选择【属性】命令,如图7.56所示。 (2)在出现的如图7.57所示的【表属性】窗口的左侧窗口中选择【权限】标签,在右侧可以通过【添加】按钮增加数据库角色,然后在下面的权限窗口选择权限,然后单击【确定】按钮即可。,7.2 数据更新,图7.56 数据表快捷菜单,7.2 数据更新,图7.57 【表属性】窗口,7.2.1 插入数据,1. 使用INSERT命令插入数据 I
50、NSERT 语句可向表中添加一个或多个新行。INSERT 语句在简单的情况下有如下形式: INSERT INTO table_or_view (column_list) VALUES data_values 用 VALUES 子句为一行指定数据值。,7.2.1 插入数据,图7.58 【例7.56】执行结果,7.2.1 插入数据,【例7.57】按与表列不同的顺序插入数据。 以下示例使用 column_list 显式指定插入到每个列的值。 USE teaching; GO INSERT INTO student (SNO, SNAME, AGE, SEX) VALUES (S8, JIANG, 2
51、1, M); GO SELECT * FROM student; GO 执行结果如图7.59所示。,7.2.1 插入数据,图7.59 【例7.57】执行结果,7.2.1 插入数据,【例7.58】插入值少于列个数的数据。 USE teaching; GO INSERT INTO student (SNO, SNAME) VALUES (S9, ZHU); GO SELECT * FROM student; GO 执行结果如图7.60所示。 2. 将查询结果插入数据表 INSERT 语句中的 SELECT 子查询可用于将一个或多个表或视图中的值添加到另一个表中。使用 SELECT 子查询还可以同时
52、插入多行。 下面用 SELECT 子查询为一行或多行指定数据值。,7.2.1 插入数据,图7.60 【例7.58】执行结果,7.2.1 插入数据,【例7.59】将所有女学生的学号、姓名放入新表F_student中。 USE teaching; GO CREATE TABLE F_student(SNO char(4) primary key, SNAME char(10) not null); GO INSERT INTO F_student (SNO, SNAME) SELECT SNO, SNAME FROM student WHERE SEX= F; GO SELECT * FROM F
53、_student; GO 执行结果如图7.61所示。,7.2.1 插入数据,图7.61 【例7.59】执行结果,7.2.1 插入数据,3. 使用图形工具插入数据 使用图形工具插入数据的步骤如下。 (1)在对象管理器中右击要插入数据的表名,出现如图7.62所示的快捷菜单。 (2)在出现的快捷菜单中选择【打开表】命令,出现如图7.63所示的输入数据窗口。 (3)输入数据后,单击工具栏上的【执行SQL】按钮,将数据写入数据库引擎中。,7.2.1 插入数据,图7.62 快捷菜单,7.2.1 插入数据,图7.63 输入数据窗口,7.2.2 更新数据,创建表并添加数据之后,更改或更新表中的数据就成为维护数据库的日常操作之一。 1. 使用UPDATE命令更新数据 语句格式:,7.2.2 更新数据,【例7.60】使用简单 UPDATE 语句。 以下示例显示对 student 表中的所有行更新 AGE列中的值。 USE teaching; GO SELECT * FROM student; GO UPDATE student SET A
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年广东省开平市高二生物下册期末考试测试卷带答案(培优A卷)
- 2026年贵州省仁怀市高二生物下册期末考试模拟卷附答案(完整版)
- 2026年四川省彭州市高二生物下册期末考试模拟卷附答案
- 2025年吉林省延吉市高二生物下册期末考试测试卷附参考答案【满分必刷】
- 2026年河北省沙河市高二生物下册期末考试模拟卷含完整答案(网校专用)
- 2025年广东省兴宁市高二生物下册期末考试模拟卷【考试直接用】附答案
- 2026年福建省福清市高二生物下册期末考试测试卷【考点提分】附答案
- 2026年安徽省宁国市高二生物下册期末考试模拟卷【夺冠】附答案
- 2025年河南省孟州市高二生物下册期末考试模拟卷及答案(各地真题)
- 2026年辽宁省庄河市高二生物下册期末考试检测卷及完整答案(典优)
- 2026年马鞍山市人力资源和社会保障局、市社会保险费征缴管理中心编外聘用人员3名招聘笔试参考题库及答案详解
- 2026年河南省初二地生会考真题试卷+解析及答案
- 初中八年级历史《第五单元 国防建设与外交成就》跨学科主题学习教案
- 储油罐浮盘更换安装施工方案模板范文
- 制冷设备安装合同
- 二尖瓣狭窄的护理
- 商业银行重大消费投诉应急预案
- 新应用大学英语第一册新版课件Unit-1-Cam
- 网络攻防原理第07-08讲-拒绝服务攻击
- 果蔬汁饮料加工技术-王芬
- GB 7258-2004机动车运行安全技术条件
评论
0/150
提交评论