Download presentation
Presentation is loading. Please wait.
Published byJohanna Håkansson Modified 5年之前
1
第6章 数据操作与SQL语句 本章导读: 知识要点: SQL语言概述 数据查询select 数据更新update 数据插入insert
查询是SQL语言中最重要的、最核心的功能,广义的查询包括select、update、insert和delete语句,狭义的查询是指select语句。select不会更改数据库的数据,可以避免误操作修改源数据,而update、insert、delete可以实现对数据库数据更新、插入和删除等操作。 知识要点: SQL语言概述 数据查询select 数据更新update 数据插入insert 数据删除delete 数据传输DTS
2
6.1 数据操作 创建表的目的是为了利用表来存储和管理数据,实现数据存储的前提是向表中插入(添加)数据,实现表的良好管理则经常需要更新(修改)、删除表中的数据。插入、更新和删除等操作既可以通过企业管理器完成,也可以通过T-SQL语句完成。 6.1.1 使用企业管理器操作表数据 SQL语言特点 SQL语法规则 T-SQL语言概述
3
6.1.1 使用企业管理器操作表数据
4
6.1.2 使用Transact-SQL语句操作表数据
SQL起源于IBM公司的关系数据库管理系统System R上的一种查询语言,由于具有结构简洁,功能强大,简单易学的特点,得到了广泛的应用。后来,美国国家标准局(ANSI)着手制定和强化下,使其成为美国标准,稍后被ISO组织采纳为国际标准SQL-86。1992年,ISO和IEC发布了SQL国际标准,称为SQL-92。目前,绝大多数流行的关系数据库管理系统都在支持SQL语言标准基础上进行了必要的扩充和修改。
5
1. SQL语言特点 SQL之所以能够为用户和业界所支持,成为关系数据库的标准语言,是因为它是一个综合的、通用的、功能极强同时又简单易学的语言。SQL语言主要特点如下: (1)高度综合统一:SQL集数据定义语言DDL、数据查询DQL、数据操纵语言DML和数据控制语言DCL于一体,语言风格统一,可以独立完成数据生命周期中的全部活动。 (2)高度非过程化:用SQL语言进行数据操作,用户只需提出“做什么”,而不必指明“怎么做”,有利于提高数据的独立性。 (3)面向集合的操作方式:查询的结果可以是元组的集合,插入、删除、更新操作的对象也是元组的集合。 (4)SQL语言既可以作为独立的自含式语言直接操作数据库,也可以作为嵌入式语言嵌入到其它程序设计语言中使用。两种不同的使用方式下,SQL的语法结构基本上是一致的。 (5)语言简洁,易学易用:SQL语言功能极强,但由于设计巧妙,语言十分简洁,并且语法简单,容易学习和使用。SQL语言完成DDL、DQL、DML、DCL语句如表6-1所示。
6
6.1.2 SQL语言特点 表6-1 SQL语句命令及其功能 符号 命令 功能 DDL create table 创建表 DQL
select 查询 create index 创建索引 DML insert 插入记录 create view 创建视图 update 修改记录 drop table 删除表 delete 删除记录 drop index 删除索引 DCL grant 给用户授权 drop view 删除视图 revoke 收回用户权限 alter table 修改表结构 alter view 修改视图
7
2. SQL语法规则 符号 含义 | [ ] { } [ ,…n ] [ …n ] <标签> <标签> :: =
SQL作为数据库语言,有它自己的语法和语法结构,并有其专有的语言符号,不同的系统稍有不同差别,主要的符号都相同。SQL语法中定界符号及其规则含义如表6-2所示。 表6-2 SQL符号及其规则含义 符号 含义 | 分隔括号或大括号内的语法项目,只能选一项 [ ] 可选的语法项 { } 必选的语法项 [ ,…n ] 前面的项可重复n次,各项之间用逗号分隔。 [ …n ] 前面的项可重复n次,各项之间用空格分隔。 <标签> 语法块的名称。用于对过长语法或语法单元部分进行标记。 <标签> :: = 对语法中<标签>指定位置进行进一步的定义。
8
3. T-SQL语言概述 SQL语言是一种标准的数据库查询语言,而Transact-SQL语言是Sybase公司和Microsoft公司联合开发,后来被Microsoft公司移植到SQL Server的一种SQL语言,简称T-SQL语言。它不仅包含了SQL-2的大多数功能,而且还对SQL进行了一系列的扩展,增加了许多新特性,增强了可编程性和灵活性。 T-SQL语言主要组成包括以下几部分: (1)数据定义语言:用来建立数据库、数据库对象和定义序列,大部分是以create开头的命令,如create database、create view等。 (2)数据操纵语言:用来操纵数据库中的命令,如select、insert、update、delete等。 (3)数据控制语言:用来控制数据库访问权限的许可、拒绝和撤销等命令,包括grant和revoke等。 (4)流程控制语言:用于设计应用程序的语句,如if,while,case等。 (5)其它语言要素:包括变量、运算符、函数和注释等。
9
6.2 数据查询Select 数据查询是数据库中最重要、最常见的操作,也是SQL语句的灵魂。所有查询都是通过select语句实现的,查询不会更改数据库中的数据,它只为用户提供一个结果集。结果集是一个来源于一个或多个表中满足给定条件的行和列的数据集合。 查询格式 查询操作 表中数据 简单查询 连接查询 嵌套查询 联合查询
10
查询格式 SQL提供了select语句进行数据的查询,select语句灵活的使用方式和丰富的功能是通过一系列的子句实现的,其一般格式为: select [all|distinct|top n|top n percent]<*|字段列表|列表达式> [into <新表名>] from <表名> [where 搜索条件] [group by分组表达式[having搜索表达式]] [order by排序表达式[asc|desc] [compute子句]
11
6.2.1 查询格式 说明: (1)select子句:用来指定由查询返回的列,包括列名、表达式、函数表达式、常量等;
查询格式 说明: (1)select子句:用来指定由查询返回的列,包括列名、表达式、函数表达式、常量等; (2)into子句:用来创建新表,并将查询结果行插入到新表中; (3)from子句:用来指定查询的源表; (4)where子句:用来限制返回的搜索条件; (5)group by子句:用来指定查询结果的分组条件; (6)having子句:指定组或聚合的搜索条件; (7)order by子句:用来指定结果的排序方式; (8)compute子句:用来在结果的末尾生成一个汇总数 据行。
12
第6章 数据操作与SQL语句 本章导读: 知识要点: SQL语言概述 数据查询select 数据更新update 数据插入insert
数据存储到数据库之后,如果束之高阁,不加利用,则毫无价值。用户对数据的应用主要是查询,查询是SQL语言核心的功能。查询是SQL语言中最重要、最核心的功能,广义的查询包括select、update、insert和delete语句,狭义的查询是指select语句。Select语句只能查询数据,可以避免误操作修改源数据,而update、insert、delete语句的功能分别是对数据库中的数据进行更新、插入和删除。 知识要点: SQL语言概述 数据查询select 数据更新update 数据插入insert 数据删除delete
13
6.1 SQL语言概述 SQL起源于IBM公司的关系数据库管理系统System R上的一种查询语言,由于具有结构简洁,功能强大,简单易学的特点,得到了广泛的应用。后来,美国国家标准局(ANSI)着手制定和强化下,使其成为美国标准,稍后被ISO组织采纳为国际标准SQL-86。1992年,ISO和IEC发布了SQL国际标准,称为SQL-92。目前,绝大多数流行的关系数据库管理系统都在支持SQL语言标准基础上进行了必要的扩充和修改。 SQL语言特点 SQL语法规则 T-SQL语言概述
14
SQL语言特点 SQL之所以能够为用户和业界所支持,成为关系数据库的标准语言,是因为它是一个综合的、通用的、功能极强且简单易学的语言。SQL语言主要特点如下: (1)高度综合统一:SQL集数据定义(DDL)、数据操纵(DML)和数据控制(DCL)于一体,语言风格统一,可以独立完成数据生命周期中的全部活动。 (2)高度非过程化:用SQL语言进行数据操作,用户只需提出“做什么”,而不必指明“怎么做”,有利于提高数据的独立性。 (3)面向集合的操作方式:查询的结果可以是元组的集合,插入、删除、更新操作的对象也是元组的集合。 (4)两种操作方式:既可以作为独立的自含式语言直接操作数据库,又可以作为嵌入式语言嵌入到其它程序设计语言中使用。 (5)类似自然语言:SQL语言虽然功能极强,但由于设计巧妙,语言十分简洁,语法简单,易学易用。SQL语言能够完成DDL、DQL、DML、DCL等功能,如表6-1所示。
15
6.1.1 SQL语言特点 表6-1 SQL语句命令及其功能 符号 命令 功能 DDL create table 创建表 DQL
select 查询 create index 创建索引 DML insert 插入记录 create view 创建视图 update 修改记录 drop table 删除表 delete 删除记录 drop index 删除索引 DCL grant 给用户授权 drop view 删除视图 revoke 收回用户权限 alter table 修改表结构 commit 提交事务 alter view 修改视图 rollback 撤销事物
16
SQL语法规则 SQL作为数据库语言,有它自己的语法、语法结构,以及专有的语言符号,不同的系统稍有不同差别,但主要的符号都相同。SQL语法中定界符号及其规则含义如表6-2所示。 表6-2 SQL符号及其规则含义 符号 含义 | 分隔括号或大括号内的语法项目,只能选一项 [ ] 可选的语法项 { } 必选的语法项 [ ,…n ] 前面的项可重复n次,各项之间用逗号分隔 [ …n ] 前面的项可重复n次,各项之间用空格分隔 <标签> 语法块的名称,用于对过长语法或语法单元部分进行标记 <标签> :: = 对语法中<标签>指定位置进行进一步的定义
17
T-SQL语言概述 SQL语言是一种标准的数据库查询语言,而Transact-SQL语言是Sybase公司和Microsoft公司联合开发,后来被Microsoft公司移植到SQL Server中的一种SQL语言,简称T-SQL语言。它不仅包含了SQL-2的大多数功能,而且对SQL进行了一系列的扩展,增加了许多新特性,增强了可编程性和灵活性。T-SQL语言主要包括以下几部分: (1)数据定义语言:用来建立数据库、数据库对象和定义序列,大部分是以create开头的命令,如create database、create view等。 (2)数据操纵语言:用来操纵数据库中数据的命令,如select、insert、update、delete等。 (3)数据控制语言:用来控制数据库访问权限的许可、拒绝和撤销命令,如grant、revoke、commit、rollback等。 (4)流程控制语言:用于设计应用程序的语句,如if,while,case等。 (5)其它语言要素:包括变量、运算符、函数和注释等。
18
6.2 数据查询 数据查询是数据库中最重要、最常见的操作,也是SQL语言的“灵魂”。所有查询都是通过select语句实现的,查询不会更改数据库中的数据,它只为用户提供一个结果集。结果集是一个来源于一个或多个表中满足给定条件的行和列的数据集合。 表中数据 查询操作 表中数据 简单查询 连接查询 嵌套查询 联合查询
19
6.2.1 表中数据 “班级”表数据见5.6.1节,“学生”表数据见6.2.3节的图6-6,其它表数据内容分别如下: 1.课程表数据内容
表中数据 “班级”表数据见5.6.1节,“学生”表数据见6.2.3节的图6-6,其它表数据内容分别如下: 1.课程表数据内容 课程表数据内容如图6-1所示。 2.教师表数据内容 教师表数据内容如图6-2所示。
20
6.2.1 表中数据 图6-1 “课程“表数据 图6-2 “教师”表数据
21
6.2.1 表中数据 3.选修表数据内容 教师表数据内容如图6-3所示。 4.授课表数据内容 教师表数据内容如图6-4所示。
22
6.2.1 表中数据 图6-3 “课程“表数据 图6-4 “教师”表数据
23
查询格式 SQL提供了select语句进行数据的查询,select语句灵活的使用方式和丰富的功能是通过一系列的子句实现的,其一般格式为: select [all|distinct|top n|top n percent]<*|字段列表|列表达式> [into <新表名>] from <表名> [where 搜索条件] [group by分组表达式[having搜索表达式]] [order by排序表达式[asc|desc] [compute子句]
24
6.2.2 查询格式 说明: (1)select子句:用来指定由查询返回的列(列名、表达式、常量),必选子句;
查询格式 说明: (1)select子句:用来指定由查询返回的列(列名、表达式、常量),必选子句; (2)into子句:用来创建新表,并将查询结果行插入到新表中; (3)from子句:用来指定查询的源表,必选子句; (4)where子句:用来限制返回的搜索条件; (5)group by子句:用来指定查询结果的分组条件; (6)having子句:指定组或聚合的搜索条件; (7)order by子句:用来指定结果的排序方式; (8)compute子句:用来在结果的末尾生成一个汇总数据行。
25
查询操作 编写、修改和执行select查询语句和查看查询执行结果有两种操作方式:一种在企业管理器中进行操作,另一种在查询分析器中进行操作。 1.在企业管理中执行select语句 【例6-1】 查询“jxgl”数据库中“学生”表的所有信息。 方法一: (1)展开企业管理器控制台目录,直至“表”节点,右击“学生”表,弹出快捷菜单,选择“打开表”→“查询”命令,如图6-1所示。
26
查询操作 图6-1 “企业管理器”对话框1
27
查询操作 (2)单击“查询”命令后,弹出“查询设计器”对话框,从上到下依次显示“关系图、网格、SQL、结果”等4个窗格;再单击工具栏上的“!”(运行)按钮,“结果”窗格中立即显示运行结果,如图6-2所示。 图6-2 “查询设计器”对话框
28
6.2.3 查询操作 方法二: (1)展开企业管理器控制台目录,直至“表”节点,右击“学生”表,弹出快捷菜单,选择“打开表”→“返回所有行”命令,如图6-3所示。 图6-3 “企业管理器”对话框2
29
6.2.3 查询操作 (2)单击“返回所有行”命令后,弹出表浏览对话框,如图6-4所示。 图6-4 “表浏览”对话框
30
6.2.3 查询操作 2.在查询分析器中执行select语句 查询分析器主要用来编辑、执行SQL语句,并显示查询结果的工具,操作步骤如下:
在企业管理器中,单击“工具”→“SQL查询分析器”命令,弹出查询分析器对话框,然后输入SQL语句,如图6-5所示,单击“执行查询”按钮即可,运行结果如图6-5所示。
31
查询操作 图6-5 “查询分析器”对话框
32
6.2.4 简单查询 简单查询是指只涉及一个表的查询,是一种最基本最简单的查询操作。其标准格式如下:
简单查询 简单查询是指只涉及一个表的查询,是一种最基本最简单的查询操作。其标准格式如下: 格式:select <*|列名|列名表达式> from <表名> where <条件> 说明:从指定表中查询满足条件的全部列或指定列的数据信息。 1.select子句 select子句有投影列、选择行两种操作。 (1)投影列 select子句指定列一共有4种形式,分别如下: ①指定部分列 格式:select <列名1,列名2[,..列名n]> from <表名> 说明:从指定的表中查询部分列的信息。
33
6.2.4 简单查询 【例6-2】 查询“班级”表中各班级的班级号、班级名称和招生性质。
简单查询 【例6-2】 查询“班级”表中各班级的班级号、班级名称和招生性质。 select 班级号,班级名称,招生性质 from 班级 ②指定所有列 格式:select [<表名.>]* from <表名> 说明:从指定的表中查询所有列的信息,*代表所有列。 【例6-3】 查询班级表中各班级的基本信息。 select * from 班级 ③指定包含表达式的列 格式:select <表达式列1,表达式列2[,..表达式列n]> from <表名> 说明:查询中可以包含表达式的列,也可以为包含列的表达式。 【例6-4】 查询学生表中学生的学号,姓名,性别和年龄的基本信息。 select 学号,姓名,性别,year(getdate())-year(出生日期) from 学生 注意:可以为包含表达式的列指定列别名,指定列别名可以有三种方式:
34
6.2.4 简单查询 格式1:<原列名> as <列别名> 格式2:<原列名> <列别名>
简单查询 格式1:<原列名> as <列别名> 格式2:<原列名> <列别名> 格式3:<列别名> = <原列名> 【例6-5】 查询“班级”表中各班级的基本信息。 select 班级号 as '班级代码',招生性质 '培养方式',班级人数, '学习年限'=学制 from 班级 注意:列别名的单引号不是必须的,只有当列别名中含有空格时,才是必须的。④增加说明列 为了增加查询结果的可读性,可以在select语句中增加一说明列,以保证前后列的信息连贯性,说明列列值一般置于两个单引号之间。 【例6-6】 为“教师”表列工作日期之前增加一个说明列,说明列值:来校日期是。 select 工号,姓名,性别,'来校日期是',工作日期 from 教师 运行结果如图6-10所示。
35
简单查询 (2)选择行 选择行主要通过select子句中短语[all|distinct|top n|top n percent]和where子句两种方式实现。有关where子句内容见后面知识,这里只讨论select子句。 格式:select [all|distinct|top n|top n percent] <列名> from <表名> 说明: ①all表示返回所有行; ②dinstinct表示取消重复行; ③top n表示返回最前面的n行,n是一具体整数数字; ④top n percent表示返回最前面的百分之n行,n取值0~100之间的数字。 【例6-7】 查看教师表中职称种类。 select distinct 职称 from 教师 注意:注意区别select 职称 from 教师 【例6-8】 查看学生表中前4行记录。 select top 4 * from 学生 【例6-9】 查看学生表中前20%的记录。 select top 20 percent * from 学生
36
6.2.4 简单查询 表6-3 where条件运算符 2.where子句 格式:where <条件> 说明:查询满足条件的行。
简单查询 2.where子句 格式:where <条件> 说明:查询满足条件的行。 Where子句中常用的条件运算符如表6-3所示。 表6-3 where条件运算符 查询条件 谓词 比较运算符 =,>,<,>=,<=,<>,!>,!< 确定范围 between and,not between and 确定集合 in,not in 字符匹配 [not] like ‘<通配符>’[escape’<换码符>’] 空值 is null(为空),is not null(非空) 逻辑运算符 and,or,not
37
6.2.4 简单查询 (1)比较 【例6-10】 查询学生表中性别为男的学生记录。
简单查询 (1)比较 【例6-10】 查询学生表中性别为男的学生记录。 select * from 学生 where 性别=’男’ (2)确定范围 【例6-11】 查询教师表中基本工资 之间的教师信息。 select * from 教师 where 基本工资 between 1300 and 1800 等价于 select * from 教师 where 基本工资>=1300 and 基本工资<=1800 (3)确定集合 【例6-12】 查询教师表中职称为讲师或助教的教师信息。 select * from 教师 where 职称 in(助教,讲师) select * from 教师 where 职称=’助教’ or 职称=’讲师’
38
6.2.4 简单查询 【例6-14】 假设有一门课程叫DB_design,现在查询课程表中DB_design的基本信息。
简单查询 (4)字符匹配 【例6-13】 查询教师表中职称含有教授字样的教师信息。 select * from 教师 where 职称 like '%教授%' 注意:使用字符匹配运算符like时,注意如下几点: ①通配符主要有以下几个: %:表示任意长度的字符串; _:表示当前位置的任意单个字符; []:表示方括号中列出的任意一个字符; [^]表示排除方括号中列出的任意一个字符; ②当like查询的字符串中本身含有%、_和^时,需要用escape '<换码符>'将其进行转义; ③当like查询的字符串中不含有通配符,则可以用=运算符替代like谓词,用!=或<>运算符代替not like谓词。 【例6-14】 假设有一门课程叫DB_design,现在查询课程表中DB_design的基本信息。 select * from 课程 where 课程名称 like 'db\_design' escape '\'
39
6.2.4 简单查询 【例6-15】 查询学生表中所有姓介于“陈”到“方”或者“许”到“张”的学生记录。 (5)空值
简单查询 【例6-15】 查询学生表中所有姓介于“陈”到“方”或者“许”到“张”的学生记录。 select * from 学生 where 姓名 like '[陈-方,许-张]%' (5)空值 【例6-16】 查询选修课程中成绩为空的记录。 select * from 选修 where 成绩 is null 3.order by子句 格式:order by <列名>[asc|desc][,…n] 说明:查询结果按照指定的列名排序输出,asc表示升序,也是缺省值,desc表示降序。 【例6-17】 查询选修课程各同学的成绩信息,并按照学号,课程号升序输出记录。 select * from 选修 where 成绩 order by 学号,课程号 注意:排序时,数值型数据按大小比较,字符型数据按照英文字母顺序比较,汉字按照拼音首字母比较。
40
简单查询 4.group by子句 格式:group by <列名>[having<分组筛选条件>]说明: (1)将查询结果按照group by子句指定的列名分组,列值相同的元组归并为一组; (2)group by子句中不支持列的别名,也不支持任何使用聚集函数的集合列; (3)select子句中的列名只能包含group by子句中的列名或聚集函数中的列名; (4)having子句用于设置分组筛选条件,只有符合having条件的记录才进行分组输出; (5)having子句与where子句的区别如下: where子句中的条件是针对基本表或视图,而having子句中的条件是针对每个分组; having子句中的条件可以包含聚集函数,但where子句不可以包含聚集函数。 【例6-18】 查询“选修”表中每门课程的课程号及相应的选课人数。 select 课程号,count(课程号) from 选修 group by 课程号 【例6-19】在“选修”表中查询至少有3门以上课程成绩在90分以上的学生学号。 select 学号 from 选修 where 成绩>=90 group by 学号 having count(*)>=3 【例6-20】 查询“选修”表中平均成绩大于85分的学生信息。 select 学号,avg(成绩) from 选修 group by 学号 having avg(成绩)>85
41
简单查询 5.into 子句 格式:select <列名表> into<新表名> from <原表名> 说明:将查询结果存储到一个新表中,新表名由into子句指定,并且into子句要紧跟在select子句之后。 【例6-21】 将“学生”表中前5条记录的“学号,姓名,性别”列内容存储到新表stu中,并查询显示。 select top 5 学号,姓名,性别 into stu from 学生 go select * from stu 运行结果如图6-11所示。 【例6-22】 将“选修”表中前10条记录的“学号,课程号,成绩”列内容存储到新表score中,并查询显示。 select top 10 学号,课程号,成绩 into score from 选修 Select * from score 运行结果如图6-12所示。
42
6.2.4 简单查询 6.*compute by子句和compute子句
简单查询 6.*compute by子句和compute子句 格式:compute {avg|count|max|min}(<列名>) [by<列名>] 说明: (1)compute [by]子句中的列名必须出现在select子句中,且不能用别名; (2)compute [by]子句不能与into <表名>子句同时使用; (3)聚集函数均会忽略NULL值,且不能使用distinct; (4)compute by子句必须与order by子句同时使用,且两者包含的列名同名同序; (5)compute by与compute的区别:compute by是按照by子句中的列进行聚合函数计算,而compute则是对所有列值进行聚合函数计算。 【例6-23】 查询“选修”表中不及格学生的学号、课程号和成绩,并统计不及格学生的人数。 select 学号,课程号,成绩 from 选修 where 成绩<60 compute count(成绩) 【例6-24】 查询“选修”表中不及格学生的学号、课程号和成绩,并按照课程号统计不及格学生的人数。 select 学号,课程号,成绩 from 选修 where 成绩<60 order by 课程号 compute count(成绩) by 课程号
43
6.2.4 简单查询 格式:with {rollup | cube} 说明:
简单查询 7.*with rollup和with cube子句 格式:with {rollup | cube} 说明: (1)with {rollup | cube}必须与group by子句一同使用; (2)with {rollup | cube}对汇总结果再汇总,生成超级组; (3)with rollup子句对group by子句中指定的列名,按照列名的逆序依次进行汇总; (4)with cube子句对group by子句中指定的列名,按照列名的所有组合(交叉分组)进行汇总; (5)如有having子句时,having 子句必须放在其后,且逻辑表达式只能包含使用了聚合函数的列。 【例6-25】 统计每个班级中籍贯是安徽的男生人数、女生人数、男女生总人数及安徽籍学生总人数。 select left(学号,6),性别,count(*) as 人数 from 学生 where 籍贯='安徽' group by left(学号,6),性别 with rollup 运行结果如图6-13所示。 【例6-26】 统计每个班级中籍贯是安徽的男生人数、女生人数、男女生总人数及安徽籍男生人数,女生人数,男女生合计总人数。 select left(学号,6),性别,count(*)as 人数 from 学生 where 籍贯='安徽' with cube 运行结果如图6-14所示。
44
简单查询 图6-13 例6-21运行结果 图6-14 例6-22运行结果
45
简单查询 8.聚集函数 一般来说,聚集函数总是作用于整个查询结果集,并返回一个值。但当查询语句包含group by子句时,聚集函数作用于每个分组,并返回多个值。在SQL Server中,常见的聚集函数如表6-4所示。
46
6.2.4 简单查询 函数名 说明 avg 求组中值的平均值 binary_checksum
简单查询 函数名 说明 avg 求组中值的平均值 binary_checksum 返回对表中的行或表达式列表计算的二进制校验值,可用于检测表中行的更改 checksum 返回在表的行上或在表达式列表上计算的校验值,用于生成哈希索引 checksum_agg 返回组中值的校验值 count 求组中项数,返回int类型整数 count_big 求组中项数,返回bigint类型整数 grouping 产生一个附加的列,标志结果集由with {cube|rollup}产生的列 max 求最大值 min 求最小值 sum 返回表达式中所有值的和 stdev 返回给定表达式中所有值的统计标准偏差 stdevp 返回给定表达式中所有值的填充统计标准偏差 var 返回给定表达式中所有值的统计方差 varp 返回给定表达式中所有值的填充的统计方差
47
简单查询 【例6-27】 求各门课程的选课人数,并按照课程号排序输出。 select 课程号,count(*) as 选课人数 from 选修group by 课程号 order by 课程号
48
连接查询 连接查询是指涉及两个或两个以上表的查询。连接查询实际上是通过各个表之间共同列的关联性来查询数据的,而用来连接多表之间的条件称为连接条件或连接谓词。 在SQL server 中,连接查询有两种方式:一种使用标准的SQL语句在where子句中定义;另一种是使用T-SQL扩展关键字join…on在from子句中定义。其语法格式如下: 格式1: select <表别名.列名1[,…n]> from {表名1,表名2[,…n]} where {连接条件 [and | or查询条件]}[,…n] 格式2: select <表别名.列名1[,…n] from {表名1[连接类型] join 表名2 on 连接条件}[,…n] where {查询条件} 说明:
49
连接查询 (1)格式1在where子句中使用比较运算符给出连接条件对两表进行连接,且只适用内连接; (2)格式2在from子句中使用join…on关键字定义连接形式,并可以进一步定义三种连接类型:内连接(inner join)、外连接(outer join)、交叉连接(cross join); (3)参与连接的两表存在同名列时,任何子句引用同名列时,都必须加表别名前缀,否则引起“列名不明确”错误; (4)内连接是缺省连接,即内连接关键字inner可以省略。
50
连接查询 1.内连接(inner join) 内连接是指两个表通过连接条件中共有列的值进行比较的匹配连接,连接结果是从两个表的组合中挑选出符合连接条件的元组,它使用比较运算符比较连接列的值。在内连接中,所有表地位上是平等的,没有主次之分。 根据比较运算符和输出列的不同,内连接又分为三种:等值连接、自然连接和自连接。 (1)等值连接:等值连接存在冗余列,等值连接时,只有参与连接的两个表同时满足给定条件的数据记录才能输出。 【例6-28】 查询每个教师及其授课的基本信息。 select 教师.*,授课.* from 教师 inner join 授课 on 教师.工号=授课.工号 或 select 教师.*,授课.* from 教师,授课 where 教师.工号=授课.工号 注意:任何select子句中引用的列名存在于两个以上表中时,都必须加表别名前缀。
51
连接查询 (2)自然连接:特殊的等值连接,去掉重复属性的等值连接就是自然连接,自然连接不存在冗余列,在不引起混淆的情况下,内连接就是指自然连接。 【例6-29】 查询参加选修课的学生学号,姓名,性别及成绩。 select 学生.学号,姓名,性别,成绩 from 学生,选修 where 学生.学号=选修.学号 或 select 学生.学号,姓名,性别,成绩 from 学生 inner join 选修 on 学生.学号=选修.学号
52
连接查询 (3)自连接:连接操作不仅可以在两个表之间进行,也可以在一个表内进行(表的自连接)。自连接可以看作一个表的两个副本之间的连接,由于两个副本同表名同属性名,因而必须给表定义两个别名,使之在逻辑上成为两个表。 【例6-30】 列出“学生”表总分相同的学生,并按照总分排序输出。 select a.学号,a.姓名,a.总分,b.学号,b.姓名 from 学生 as a inner join 学生 as b on a.总分=b.总分 where a.学号<>b.学号 order by a.总分 注意:一旦为表指定别名时,则在查询语句中,所有用到表名的地方只能引用别名。
53
连接查询 2.外连接(outer join) 与内连接不同的是,参与外连接的两表有主从之分,主表的所有数据行直接返回到结果集中,并以主表的每行连接列数据去匹配从表的数据行连接列数据,符合连接的从表数据行将直接返回到查询结果中,如果主表的行连接列数据在从表中没有匹配的行连接列数据,则在结果集中以NULL值填入从表相对应的列位置。根据主次表的选择,外连接又分为三种:左连接、右连接和全连接。 (1)左连接(left [outer] join) 以左表为主表,右表为从表,查询结果中包括左表中所有数据行,如果左表的某行连接列数据在右表中没有找到相匹配的数据行(连接列数据),则结果集中的右表的相对应的位置为NULL值。 【例6-31】 对stu和score表做左连接,查询学生的学号,姓名,性别,课程号及成绩相关信息。 select stu.学号,姓名,性别,score.学号,课程号,成绩 from stu left outer join score on stu.学号=score.学号 运行结果如图6-15所示。
54
6.2.5 连接查询 (2)右连接(right [outer] join)
连接查询 (2)右连接(right [outer] join) 以右表为主表,左表为从表,查询结果中包括右表中所有数据行,如果右表的某行连接列数据在左表中没有找到相匹配的数据行(连接列数据),则结果集中的左表的相对应的位置为NULL值。 【例6-32】对stu和score表做右连接,查询学生的学号,姓名,性别,课程号及成绩相关信息。 select stu.学号,姓名,性别,score.学号,课程号,成绩 from stu right outer join score on stu.学号=score.学号 运行结果如图6-16所示。
55
6.2.5 连接查询 (3)全连接(full [outer] join)
连接查询 (3)全连接(full [outer] join) 先以左表为主表,右表为从表,执行左连接;再以右表为主表,左表为从表,执行右连接;然后去掉重复的行。 【例6-33】对stu和score表做全连接,查询学生的学号,姓名,性别,课程号及成绩相关信息。 select stu.学号,姓名,性别,score.学号,课程号,成绩 from stu full outer join score on stu.学号=score.学号 运行结果如图6-17所示。
56
6.2.5 连接查询 3.交叉连接(cross join)
连接查询 3.交叉连接(cross join) 交叉连接为两表的广义笛卡尔积(集合运算的一种),即结果集为两表各行的所有可能组合,行数为两表行数乘积,交叉连接结果会产生一些无意义的元组,这种运算实际很少用到。 【例6-34】 对stu和score表做交叉连接查询。 select stu.*,score.* from stu,score (所影响的行数为 50 行) 或 select stu.*,score.* from stu cross join score 注意:如果交叉表连接带有where子句,则交叉表连接的作用将同内连接一样。
57
嵌套查询 在SQL语句中,一个select-from-where语句为一个查询块。将一个查询块嵌入在另一个查询块的where子句或having子句中的查询称为嵌套查询。外层的select语句称为外(父)查询,内层的select语句称为内(子)查询。 使用嵌套查询注意以下几点: (1)子查询的select语句块必须置于一对圆括号( )内; (2)子查询不能使用compute和into子句; (3)子查询使用order by子句时,则必须同时使用top子句,否则不能使用; (4)比较运算符([not] exists|in操作除外)连接时,子查询中的列名只能有一个; (5)包含group by子句的子查询不能使用distinct关键字; (6)外查询的where子句中的列与子查询中select子句的列在连接上必须是兼容的; (7)text、ntext和image数据类型的列名不能出现在子查询的select子句中。 嵌套查询又分为两种:不相关子查询和相关子查询。
58
嵌套查询-----1.不相关子查询 不相关子查询是指子查询不依赖外部查询,其求解方法是由内向外。在不相关子查询中,一次性将子查询的结果求解出来,但不显示出来,而是直接传递给父查询,作为父查询的查询条件,然后执行父查询,并显示父查询结果。 (1)比较运算符 带比较运算符的子查询是指父查询与子查询之间用比较运算符进行连接。只有子查询结果是单列值(单行一列)时,才可以用比较运算符(>、>=、<=、<、!>、!<和<>、!=)进行连接,如果子查询结果是多列值(多行一列)时,则应使用[not] in、all、some(any)、[not] exists谓词连接。其语法格式如下: where <父查询列或表达式> <比较运算符> (子查询结果集) 【例6-35】 查询个人单科成绩小于所有学生平均成绩的的选修信息。 select * from 选修 where 成绩<(select avg(成绩) from 选修) 【例6-36】 查询个人平均成绩大于所有学生的平均成绩的记录。 select 学号,avg(成绩) as 平均成绩 from 选修 group by 学号 having avg(成绩)>(select avg(成绩) from 选修) 【例6-37】 查询与赵大伟籍贯相同的学生。 select * from 学生 where 籍贯 = (select 籍贯 from 学生 where 姓名='赵大伟') 等价于 select a.* from 学生a,学生b where a.籍贯= b.籍贯and b.姓名='赵大伟'
59
6.2.6 嵌套查询-----1.不相关子查询 (2)[not] in谓词
嵌套查询-----1.不相关子查询 (2)[not] in谓词 带[not] in谓词的子查询是指父查询与子查询之间用[not] in谓词进行连接,判断父查询某个属性值是否在子查询的结果集中。要求子查询的结果是某列的0~n个属性值组成的集合,父查询使用这些集合作为判断条件的依据。其语法格式如下: where <父查询列或表达式> [not] in (子查询结果集) 【例6-38】 在选修表中查询选修了学号“ ”的学生选修的课程的选修信息。 select * from 选修 where 课程号 in (select 课程号 from 选修 where 学号=' ') 【例6-39】 查询课酬大于1500的教师姓名。 select distinct 姓名 from 教师 where 工号 in (select 工号 from 授课 where 课酬>1500) 等价于 Select distinct 姓名 from 教师,课酬 where教师.工号=课酬.工号 and 课酬>1500 【例6-40】 查询选修了课程名为“ASP程序设计”的学生学号和姓名 select 学号,姓名 from 学生 where 学号 in (select 学号 from 选修 where 课程号 = (select 课程号 from 课程 where 课程名称='ASP程序设计'))
60
6.2.6 嵌套查询-----1.不相关子查询 (3)any(some)或all谓词
嵌套查询-----1.不相关子查询 (3)any(some)或all谓词 Any(some)或all谓词用于一个值与一组值的比较。any(some)表示一组值中的任何一个,all表示一组值中的每一个。其语法格式如下: where <父查询列或表达式> <比较运算符> [< any|some|all >] (子查询结果集) 【例6-41】 查询比某女生年龄小的男生姓名和出生日期。 select 姓名,出生日期 from 学生 where 性别='男' and 出生日期>any(select 出生日期 from 学生 where 性别='女') 等价于 and 出生日期>(select min(出生日期) from 学生 where 性别='女') 【例6-42】 查询有学生成绩不及格的课程的授课教师工号。 select distinct 工号 from 授课 where 课程号 = any (select 课程号 from 选修 where 成绩 <60) where 课程号 in (select 课程号 from 选修 where 成绩 <60) 注意:any(some)或all谓词必须与比较运算符同时使用才有意义,两者结合时含义如表6-5所示。
61
6.2.6 嵌套查询-----1.不相关子查询 运算符 说明 >any
嵌套查询-----1.不相关子查询 运算符 说明 >any 大于子查询结果的某个值,比最小值大即可,等价于>min() <any 小于子查询结果的某个值,比最大值小即可,等价于<max() >all 大于子查询结果的所有值,比最大值大即可,等价于>max() <all 小于子查询结果的所有值,比最小值小即可,等价于<min() >=any 大于等于子查询结果的某个值,比最小值大或等于即可,等价于>=min() <=any 小于等于子查询结果的某个值,比最大值小或等于即可,等价于<=max() >=all 大于子查询结果的所有值,比最大值大或等于即可,等价于>=max() <=all 小于子查询结果的所有值,比最小值小或等于即可,等价于<=min() =any 等于子查询结果某个值,等价于in =all 等于子查询结果所有值 != any 不等于子查询结果某个值 != all 不等于子查询结果任何一个值 表6-5 any(some)或all与比较运算符结合含义
62
嵌套查询 .相关子查询 相关子查询是指子查询依赖外部查询,其求解方法是内外反复求解。在相关子查询中,子查询的执行依赖于父查询的某个列值,通常在子查询的where子句中引用了父查询的表;对于父查询的每一行元组,子查询都要重复执行一次;如果子查询的任何行与父查询匹配,则父查询就返回结果行。 (1)非[not] exists谓词 【例6-43】 查询学生单科成绩大于其所有课程的平均成绩的记录。 Select * from 选修 a where 成绩>(select avg(成绩) from 选修 b where a.学号=b.学号) 注意:相当于先用“select avg(成绩) from 选修 group by学号”求出每个同学的平均成绩,然后依次比较每个同学的单科成绩与其平均成绩,求出符合条件的记录。
63
6.2.6 嵌套查询------2.相关子查询 (2)[not] exists谓词
嵌套查询 .相关子查询 (2)[not] exists谓词 相关子查询主要是通过[not] exists谓词实现的。带[not] exists谓词的子查询相当于进行一次子查询,结果集是否存在数据的测试,不返回任何列值,只产生逻辑值true和false。使用exists谓词,若内查询结果为非空,则外查询where子句为真值,否则为假值;使用not exists谓词,若内查询结果为空,则外查询where子句为真值,否则为假值。其语法格式如下: where [not] exists (子查询) 1)测试被子查询检索到的行集是否为空 【例6-44】 查询有选修成绩不及格的学生名单。 select 姓名 from 学生 where exists (select * from 选修 where 学号= 学生.学号 and 成绩<60) 其执行过程:对外查询表“学生”中每一条记录,检查内查询是否为空,若不为空,则输出该记录。 等价于 select 姓名 from 学生,选修where学生.学号= 选修.学号 and 成绩<60 也等价于 select 姓名from 学生where 学号in (select 学号from 选修where 成绩<60)
64
6.2.6 嵌套查询------2.相关子查询 2)用not exists谓词实现关系代数的差运算
嵌套查询 .相关子查询 2)用not exists谓词实现关系代数的差运算 【例6-45】 查询没选课程号“01”的学生名单。 select 学号,姓名 from 学生 where not exists (select * from 选修 where 学号= 学生.学号 and 课程号='01') 等价于 select 学号,姓名from 学生 where 学号not in (select 学号from 选修 where 课程号='01') 也等价于 except select 学号,姓名from 学生 where 学号in ( select 学号from 选修where 课程号='01')
65
6.2.6 嵌套查询------2.相关子查询 3)用not exists谓词实现全称量词的查询
嵌套查询 .相关子查询 3)用not exists谓词实现全称量词的查询 SQL语言中没有全称量词∀(for all),但可以转换为等价的带有存在量词∃的谓词: (∀x)P≡ᄀ(∃x(ᄀP)) 【例6-46】 查询选修了所有课程的学生名单(没有一门课程是不选的)。 分析:查询这样的学生x,没有一门课程y是x不选修的。 select 姓名 from 学生 where not exists /*查询学生x*/ (select * from 课程 where not exists /*不存在课程y*/ (select * from 选修 where 学号=学生.学号 and 课程号=课程.课程号)) /*x不选课程*/
66
6.2.6 嵌套查询------2.相关子查询 4)用not exists谓词实现逻辑蕴涵运算
嵌套查询 .相关子查询 4)用not exists谓词实现逻辑蕴涵运算 SQL语言中没有逻辑蕴涵运算,但可以用谓词演算转换一个逻辑蕴涵: (∀y)p→q≡ᄀ(∃y(ᄀ(p→q))≡ᄀ(∃y(ᄀ(ᄀp∨q)))≡ᄀ(∃y(p∧ᄀq)) 【例6-47】 查询至少选修了学号为 的学生选修的全部课程的学生学号。 分析:查询这样的学生x,不存在这样的课程y,学号为 的学生选修了,而学生x没选。逻辑蕴涵表达式:(∀y)p → q,其中p表示学号为 的学生选修了课程y,q 表示学生x选修了课程y。 select distinct 学号 from 选修 a where not exists (select * from 选修 b where b.学号=' ' and not exists (select * from 选修 c where c.学号=a.学号 and c.课程号=b.课程号)) 注意:有些[not] exists谓词的子查询不能被其它形式的子查询代替,但所有in谓词,比较运算符、any和all谓词的子查询都能用带[not] exists谓词的子查询代替。
67
集合查询 集合查询不同于连接查询:集合查询是组合两个表中的行,而连接查询是匹配两个表中的列。在SQL Server 2005中,集合查询是通过集合运算符实现的,除了交叉连接以外,还包括并运算(union)、差运算(except)和交运算(intersect)。集合查询的语法格式如下: select <列名列表> from <表名1> [where <条件>] {union[all]|except|intersect} select <列名列表> from <表名2> [where <条件>][oder by <列名>] 说明: (1)各select子句中列名列表的列数相同,且同名同序,数据类型兼容或一致; (2)集合运算后的结果集中的列名来自第一个select子句; (3)若使用order by子句,则只能排序整个结果集,且必须放在最后; (4)union运算可使用all关键字来保留结果集中重复的行,否则自动删除重复的行。
68
联合查询 1.并集查询 并集(联合)查询是指用运算符union将两个查询的结果集合并成一个结果集的查询。 【例6-48】列出女学生和女教师的姓名,性别,并增加说明列“身份”。 select 姓名,性别,'学生' as 身份 from 学生 where 性别 = '女' union select 姓名,性别,'教师' as 身份 from 教师 where 性别 = '女' 运行结果如图6-18所示。 图6-18 例6-48运行结果
69
6.2.7 联合查询 2.差集查询 差集查询是指用运算符except将第一个查询的结果集中那些出现第二个查询结果集中的记录排除。
联合查询 2.差集查询 差集查询是指用运算符except将第一个查询的结果集中那些出现第二个查询结果集中的记录排除。 【例6-49】 查询出“130101”号教师讲授,但“wp0101”号教师未讲授的课程号。 select 课程号 from 授课 where 工号='130101' except select 课程号 from 授课 where 工号='wp0101' 3.交集查询 交集查询是指用运算符intersect将两个查询的结果集中相同的记录保留下来。 【例6-50】 查询出“130101”号教师和“wp0101”号教师共同讲授的课程的课程号。 intersect
70
6.3 数据插入Insert 数据表结构一旦确定以后,就可以向表中插入数据生成记录,插入数据是操作数据表最基本的操作。SQL语言提供了insert语句向表插入数据,Insert语句向表插入数据的方式有两种:一种使用values子句插入一行数据,另外一种是通过select子句插入来源于其它表或视图中的多行数据。
71
6.3.1 语法格式 T-SQL语言中用insert语句向表或视图中插入新的数据行。其一般语法格式为:
语法格式 T-SQL语言中用insert语句向表或视图中插入新的数据行。其一般语法格式为: Insert [into] {表名 [[as] 表别名]| 视图名 [[as] 视图别名]} {[(列名列表)] values ({default |表达式} [,…n]) |default values |select_statement |execute_statement} } 说明:
72
语法格式 说明: (1)列名列表说明为指定的列插入数据。在给表或视中的部分列插入数据时,必须指定这部分列的列名。未指定的列名的列值,视其默认值和空值属性等情况而定,可取值如下: 对于timestamp列或具有identity属性列,列值由SQL Server计算后自动赋值。 对于列有默认值约束设置或默认对象,列值为默认值或默认对象中指明的值。 对于列没有默认值约束设置时,但允许空值时,列值为空值NULL。 对于列既没有默认值约束设置,也不允许空值,则必须指定列名和列值,否则导致插入操作失败。 (2)省略列名列表子句时,需按列名定义顺序提供所有列数据,而使用列名列表子句则可以自由调整列顺序并提供数据,只要values子句的数据顺序与列名列表子句的列顺序一致。
73
语法格式 (3)values子句为列名列表子句指定列提供数据,数据可以以常量、表达式形式提供,也可以使用关键字default向列中插入其默认值; (4)default values说明向表中所有列插入其默认值。对于具有Indentity属性或timestamp数据类型的列,系统将自动插入下一个适当值。对于没有设置默认值的列,如果它们允许空值,SQL Server将插入NULL,否则返回一错误消息。 (5)select_statement是子查询SQL语句,它是带子查询的数据插入方式。insert语句将select_statement子句返回的结果集合数据插入到指定表中; (6)SQL Server为insert语句提供的一种通过执行存储过程的方式插入数据; (7){表名 [[as] 表别名]| 视图名 [[as] 视图别名]}表示插入数据的表或视图名称。
74
单行插入inert into values 格式:Insert [into]<表名|视图名>[(<列名1>[,<列名2>][,…n])] values (<值1>[,<值2>][,…n]) 说明: (1)列名和列值在个数、顺序和数据类型上应保持一致; (2)列名可以省略,省略列名时,必须按顺序提供所有列的列值; (3)列值可以是default、NULL或表达式; (4)不能为有identity属性的列、timestamp数据类型的列、有默认值的列、用newid()函数生成guid值的列、计算列提供指定值; (5)提供的列值不能违反表的现有约束和规则,且行的总长度不能超过8060字节。
75
单行插入inert into values 【例6-51】 向表“课程”中添加一新行,并按顺序为所有列提供列值:'12','电子商务安全技术','考查',36,2,'电子商务方向'。 use jxgl insert into 课程 values('12','电子商务安全技术','考查',36,2,'电子商务方向') 【例6-52】 向表“课程”中添加一新行,仅为部分列(课程号,课程名称,备注)提供列值'13','决策科学','信息决策方向'。 insert into 课程(课程号,课程名称,备注) values ('13','决策科学','信息决策方向') 注意:identity属性的列的值由系统自动生成,如果要指定有identity属性列的值,必须使用开关配置语句set identity_insert <列名> on打开,允许插入大于表当前identity属性的列的值,插入后使用开关配置语句set identity_insert <列名> off关闭。 【例6-53】 向表“选修”表中添加一新行,并为列“成绩编码”提供列值。 select * from 选修 set identity_insert 选修 on insert into 选修(成绩编码,学号,课程号,成绩)values(12,' ','02',90) set identity_insert 选修 off
76
多行插入 格式:Insert [into]<目标表名|目标视图名>[(<列名1>[,<列名2>][,…n])] select <列名1>[,<列名2>][,…n] from <源表名|源视图名> [where<查询条件>] 说明: (1)可以将子查询(select)的结果添加数据到目标表或目标视图; (2)目标表和源表在列个数、顺序和数据类型上完全一致,并且不违反完整性约束; (3)源表可以有多个,即一次性插入的多行数据可以来自多个源表; (4)where子句指明插入数据的条件。 【例6-54】 向表“选修”表中添加09信管(1)班的学生学号和01课程号,成绩为空。 use jxgl insert into 选修(学号,课程号,成绩) select 学号,'01',null from 学生 where left(学号,6) = (select 班级号 from 班级 where 班级名称='09信管(1)班')
77
存储过程插入 格式:Insert [into]<目标表名|目标视图名>[(<列名1>[,<列名2>][,…n])] execute <过程> 说明: (1)过程既可以是一个已存在的系统存储过程或用户自定义的存储过程,也可以是在insert语句中直接编写的存储过程; (2)所插入的数据实质是存储过程中select语句子查询的结果集。 【例6-55】 向表“选修”表中添加一新行,并为列“成绩编码”提供值。 use jxgl go create table cj (学号 char(8),课程号 char(2),成绩 tinyint) create proc ty as select 学号,课程号, 成绩 from 选修 insert into cj (学号,课程号, 成绩 ) execute ty
78
6.4 数据更新Update 对存放在表中的数据进行修改也是数据库日常维护的一项重要工作。使用SQL的update语句可以修改表中的一行或多行记录,一列或多列数据。 SQL提供了update语句用于修改表中现有数据的方式有两种:一种通过直接赋值进行修改,另一种是使用select子句将要取代列中原有值的数据先查询出来,再修改原有列值。
79
6.4.1 语法格式 T-SQL语言中用update向表修改数据。
语法格式 T-SQL语言中用update向表修改数据。 格式:update <表名> set <列名1>=<表达式1>[,列名2>=<表达式2>[,…n]] [where <条件>] 说明: (1)update <表名>表示要修改数据的表名; (2)set子句指定要用表达式的值替换指定列名的值,一般要求列不可以有identity属性。表达式可以是常量、变量、default、NULL或返回单个值的子查询; (3)where子句设置修改表中记录的条件表达式,省略时修改表中的所有记录; (4)更新列数据时不能违反完整性约束和规则。
80
简单更新 Update语句更新现有表中的数据,可以更新表中一行的一列或多列,利用where子句还可以实现有条件的更新,更新表中多行数据。 【例6-56】 更新“授课”表中评价内容为“学生对教师评价应建立在公平公正的基础上,教师也要积极面对学生评价,注意加强沟通和理解”。 use jxgl go update 授课 set 评价='学生对教师评价应建立在公平公正的基础上,教师也要积极面对学生评价,注意加强沟通和理解' 【例6-57】 更新“教师”表中朱惠恩老师的信息,修改基本工资为原来的90%,调整职称为“教授退”。 update 教师 set 基本工资=基本工资*0.9,职称='教授退' where 姓名='朱惠恩'
81
6.4.3 更新子查询 利用where子句,可以更新符合内部条件的记录;而使用select子句,则可以利用子查询来指定外部条件。
更新子查询 利用where子句,可以更新符合内部条件的记录;而使用select子句,则可以利用子查询来指定外部条件。 【6-56】 更新“学生”表,将所有成绩低于60分的同学的备注填写“补考”。 use jxgl go update 学生 set 备注='补考' where 学号 in (select 学号 from 选修 where 成绩<60)
82
6.5 数据删除Delete 伴随数据库的使用和修改,表中可能存在着一些无用的数据,如果不及时将他们删除,不仅会占用空间,还会影响修改和查询速度。
83
语法格式 SQL提供了delete语句删除数据,delete语句删除数据的方式有两种:一种是直接删除表中的数据,另一种是带子查询的删除。 格式:delete [from] <表名> [where <条件> ] 说明: (1)<表名>表示删除数据的表名; (2)where子句设置筛选要删除表中记录的条件表达式,如果省略,则表示删除表中所有记录行; (3)可以删除基于其它表中的数据。
84
简单删除 简单删除是指不带子查询的删除,使用where子句可以删除一条或多条记录,若不带where子句将删除所有数据,使数据表为空。 【例6-59】 删除“学生”表中籍贯是安徽的同学。 use jxgl go delete from 学生 where 籍贯='安徽'
85
6.5.3 删除子查询 带子查询的删除同样可以嵌套在where子句中,用于构造删除的条件。
删除子查询 带子查询的删除同样可以嵌套在where子句中,用于构造删除的条件。 【例6-60】 删除“学生”表中09财务(1)班的学生。 use jxgl go delete 学生 where left(学号,6) = (select 班级号 from 班级 where 班级名称='09财务(1)班')
86
清空表内容 另外,SQL语言提供了truncate table命令删除表中所有数据,类似于不带where子句的delete语句,但比delete语句运行速度快,原因在于delete语句删除数据时要在事务日志中做记录,以防止删除失败时可以使用事务处理日志来恢复数据。 格式:truncate table <表名> 说明:清空指定表的数据内容。
87
6.6 数据传输DTS SQL Server提供了一种转换数据的方法DTS(Data Transaction Service,数据转换服务),使得SQL Server中不同的数据库间可以相互转移数据,也可以实现其它类型的数据与SQL Server类型的数据相互换换。
88
DTS概述 不同的人、不同的单位可能由于习惯偏好、技术水平和工作性质等原因,保存了不同格式的数据文件,如文本格式文件、excel表格文件、access数据库文件。为了有效利用这些不同格式数据文件,SQL Server提供了DTS数据导入/导出向导,将来自不同源的数据进行分析,合并、转换到单个或多个目的数据。 DTS是SQL Server提供的一组图形化工具和可编程对象,通过DTS工具图形化生成DTS包或使用DTS对象模型编制包,实现数据导入、数据导出和数据转换等功能。 DTS工具包括一些简化创建、执行和管理的工具: (1)DTS导入/导出向导:用于生成包以导入、导出和转换或复制数据库对象。 (2)DTS设计器:一个图形化应用程序,使得一个或多个数据库与SQL Server实例之间进行导入和导出以及转换异类数据变得方便。
89
DTS概述 DTS包由DTS连接,DTS任务、DTS转换和DTS工作流约束组成。当DTS包运行时,每个包含一个或多个顺序或并行执行的步骤步骤。执行后,DTS包连接到正确的数据源,复制数据和数据库对象、转换数据、然后通知其它用户或进程。 (1)DTS连接:建立源数据与目的数据的连接,包括各种数据库、电子表格数据等; (2)DTS任务:一组独立的功能,单步骤执行,包括导入/导出数据、转换数据等; (3)DTS转换:使得导入和导出期间执行复杂的数据验证、数据清理和变换更加容易; (4)DTS工作流:约定执行过程的步骤和顺序。
90
6.5.2 DTS向导 DTS向导包括导入和导出两个功能,借助DTS向导可以实现不同类型的数据转换和传输。
【例6-61】 将学生表中的数据转换到一个Excel电子表格数据中。 操作步骤如下: (1)单击“开始”→“Microsoft SQL Server”→“导入和导出数据”,打开“DTS导入和导出向导”对话框的“数据转换服务导入/导出向导”界面,如图6-19所示。 (2)单击“下一步”按钮,弹出“DTS导入和导出向导”对话框的“选择数据源”界面,选择数据库jxgl,如图6-20所示。
91
DTS向导 图6-19 “数据转换服务导入/导出 向导”界面 图6-20 “选择数据源”界面
92
DTS向导 (3)单击“下一步”按钮,弹出“选择目的”界面1,在“目的”列表框中选择“Microsoft Excel ”选项,如图6-21所示;释放后,弹出“选择目的”界面2,如图6-22所示,并在“文件名”文本框中输入文件名及其路径,如d:\学生.xls。
93
DTS向导 图6-22 “目的”界面2 图6-21 “目的”界面1
94
6.5.2 DTS向导 (4)单击“下一步”按钮,弹出“指定表复制或查询”界面,选择“用一条查询指定要传输的数据”,如图6-23所示。
注意:由于学生表中存在照片列image数据类型,而excel不支持image数据类型,所以必须选择第2选项,即“用一条查询指定要传输的数据”,以保证后续操作顺利完成。如果选择第1项,即“从源数据库复制表或视图”,那么后续界面有所不一样。 (5)单击“下一步”按钮,弹出“插入SQL语句”界面1,如图6-24所示。
95
DTS向导 图6-23 “指定表复制或查询”界面 图6-24 “插入SQL语句”界面1
96
DTS向导 (6)单击“查询生成器”按钮,弹出“选择列”界面,展开源表“学生”各列,依次选择除照片以外的各列,包括“学号、姓名、性别、出生日期、总分、籍贯、备注”等列,并单击“”按钮,如图6-25所示。 (7)单击“下一步”按钮,弹出“指定排列顺序”界面,不做任何选择,如图6-26所示。
97
DTS向导 图6-25 “选择列”界面 图6-26 “指定列排序”界面
98
6.5.2 DTS向导 (8)单击“下一步”按钮,弹出“指定查询条件”界面,选择默认选项,如图6-27所示。
(9)继续单击“下一步”按钮,返回“插入SQL语句”界面2,单击“分析”按钮,弹出“DTS导入/导出向导”对话框,如图6-28所示。
99
DTS向导 图6-27 “选择列”界面 图6-28 “插入SQL语句”界面2
100
6.5.2 DTS向导 (10)单击“确定”和“下一步”按钮,弹出“选择源表和视图”界面,如图6-29所示。
(11)单击“下一步”按钮,弹出“保存、调度和复制包”对话框,如图6-30所示。
101
DTS向导 图6-29 “选择列”界面 图6-30 “指定列排序”界面
102
6.5.2 DTS向导 (12)单击“下一步”按钮,弹出“正在完成DTS导入/导出向导”对话框,如图6-31所示。
(13)单击“完成”按钮,弹出“正在执行包”对话框,稍后显示状态信息,如图6-32所示。单击“确定”按钮,然后单击“完成”按钮,操作完成。
103
DTS向导 图6-31 “正在完成DTS导入/导出向导”界面 图6-32 “正在执行包”对话框
104
本章小结 T-SQL语言是一种高效快速的结构化查询语言,其主要功能是实现对表的查询,以及插入、更新和删除等操作。实现同一查询可有多种方法,但执行效率会有差别。如嵌套查询与连接查询相比,嵌套查询逐步求解,层次清晰,易于构造,连接查询执行效率高。
Similar presentations