数据库系统及应用 第5章结构化查询语言SQL 主编:赖申江 本章学习导航 结构化查询语言SQL是一种功能 结构化查询语言SQL是一种功能 SQL 齐全的数据库语言, 齐全的数据库语言,包含数据定义 功能、数据查询功能、 功能、数据查询功能、数据操纵功 能和数据控制功能。 能和数据控制功能。其中最主要的 功能就是查询。通过本章学习, 功能就是查询。通过本章学习,学 生应掌握SQL语言的使用方法和技巧, SQL语言的使用方法和技巧 生应掌握SQL语言的使用方法和技巧, 提高知识综合运用能力, 提高知识综合运用能力,写出高质 量的SQL查询命令。 SQL查询命令 量的SQL查询命令。 数据库系统及应用 本章学习要点 SQL的数据定义 :熟练运用CREATE TABLE、 ALTER TABLET和DROP TABLE语句完成表的创建、 修改和删除 。 SQL的数据操纵 :熟练运用INSERT、DELETE 和UPDATE语句添加、删除和更新记录 。 SQL的数据查询 :熟练运用SELECT语句完成简 单查询、嵌套查询、连接查询、分组与计算查询 。 教学课时: 课时 教学课时:4课时 数据库系统及应用 第5章 结构化查询语言SQL SQL概述 5.1 SQL概述 结构化查询语言(Structured Query Language, 结构化查询语言( Language, 简称SQL SQL) 简称SQL)是一种介于关系代数和关系演算之间的 语言。它于1974年由Boyce Chamberlin提出 1974年由Boyce和 提出, 语言。它于1974年由Boyce和Chamberlin提出,由 于具有语言简洁、方便实用、功能齐全等优点, 于具有语言简洁、方便实用、功能齐全等优点, 很快得到推广和应用。随着关系数据库的流行, 很快得到推广和应用。随着关系数据库的流行, SQL语言最终发展成为关系数据库的标准语言和数 SQL语言最终发展成为关系数据库的标准语言和数 据库领域中一个主流语言。SQL已经被ANSI( 已经被ANSI 据库领域中一个主流语言。SQL已经被ANSI(美国 国家标准化组织)确定为数据库系统的工业标准, 国家标准化组织)确定为数据库系统的工业标准, 它是数据库系统的通用语言。利用SQL SQL, 它是数据库系统的通用语言。利用SQL,用户可以 用几乎相同的语句在不同的数据库系统上执行同 样的操作。 样的操作。 数据库系统及应用 第5章 结构化查询语言SQL SQL语言的特点 5.1.1 SQL语言的特点 SQL语言之所以能够成为国际标准 是因为它是一个综合的、通用的、 语言之所以能够成为国际标准, SQL语言之所以能够成为国际标准,是因为它是一个综合的、通用的、 功能极强,同时又简单易学的语言。 功能极强,同时又简单易学的语言。 (1)功能强大 SQL语言集数据查询 数据操纵、数据定义和数据控制功能于一体。 语言集数据查询、 SQL语言集数据查询、数据操纵、数据定义和数据控制功能于一体。 (2)高度非过程化 用户只要提出“做什么” 而无需指明“怎么做” 用户只要提出“做什么”,而无需指明“怎么做”,存取路径的选择 以及SQL语言的操作过程由系统自动完成,不但大大减轻了用户负担, SQL语言的操作过程由系统自动完成 以及SQL语言的操作过程由系统自动完成,不但大大减轻了用户负担, 而且有利于提高数据的独立性。 而且有利于提高数据的独立性。 (3)简单易用 SQL语言十分简洁 实现核心功能,一般只要用到下面9个命令动词, 语言十分简洁, SQL语言十分简洁,实现核心功能,一般只要用到下面9个命令动词, 如表5 所示。因此容易学习和掌握。 如表5-1所示。因此容易学习和掌握。 (4)有联机交互和嵌入两种使用方式 SQL语言支持两种不同的使用方式 一种是联机交互使用, 语言支持两种不同的使用方式。 SQL语言支持两种不同的使用方式。一种是联机交互使用,即用户能在 终端直接输入SQL命令对数据库进行操作;另一种是嵌入式,即将SQL SQL命令对数据库进行操作 终端直接输入SQL命令对数据库进行操作;另一种是嵌入式,即将SQL 语句嵌入到其他高级语言中,以便程序员在设计时使用。 语句嵌入到其他高级语言中,以便程序员在设计时使用。 数据库系统及应用 第5章 结构化查询语言SQL SQL数据定义功能 5.1.2 SQL数据定义功能 关系数据库的基本对象是表、视图和索引。因此SQL SQL的数 关系数据库的基本对象是表、视图和索引。因此SQL的数 据定义功能包括定义数据库、 视图和索引,如表5 据定义功能包括定义数据库、表、视图和索引,如表5-2 所示。由于视图是基于表的虚表,索引是依附于表的, 所示。由于视图是基于表的虚表,索引是依附于表的,因 SQL通常不提供修改视图和索引的操作 通常不提供修改视图和索引的操作。 此SQL通常不提供修改视图和索引的操作。 1.数据库的创建和删除 关系数据库被定义为关系( )、索引和视图的集合 索引和视图的集合。 关系数据库被定义为关系(表)、索引和视图的集合。在 创建表、视图和索引前必须首先创建数据库。 创建表、视图和索引前必须首先创建数据库。 例如,创建学生选课数据库stsc 可以用CREATE stsc, 例如,创建学生选课数据库stsc,可以用CREATE stsc语句来实现 语句来实现。 DATABASE stsc语句来实现。 数据库系统及应用 第5章 结构化查询语言SQL 基本表的创建、 2.基本表的创建、修改和删除 DATABASE建立的数据库是一个空的数据库 建立的数据库是一个空的数据库, 用CREATE DATABASE建立的数据库是一个空的数据库,接下来应该在 这个数据库中建立表。 这个数据库中建立表。 (1)创建基本表 表的创建既可以通过表设计器或Visual FoxPro的新建表命令实现 的新建表命令实现, 表的创建既可以通过表设计器或Visual FoxPro的新建表命令实现, 也可以使用SQL中的相应命令创建。 SQL中的相应命令创建 也可以使用SQL中的相应命令创建。 命令格式: <表名 [FREE]( 字段名1> <字段类 表名> 命令格式:CREATE TABLE|DBF <表名> [FREE](<字段名1> <字段类 <(宽度[,<小数位数>])>[,<字段名 <字段类型 <(宽度[,<小 宽度[,<小数位数>])>[,<字段名2> 字段类型> 宽度[,< 型> <(宽度[,<小数位数>])>[,<字段名2> <字段类型> <(宽度[,<小 数位数>])>, >])>,…]) 数位数>])>, ]) 功能:建立一个由<表名>指定的表结构。 功能:建立一个由<表名>指定的表结构。 说明: 说明: 表名> 指定要创建的表的名称。 ①<表名>:指定要创建的表的名称。 FREE:指定创建的表是一个自由表,不被添加到数据库中。 ②FREE:指定创建的表是一个自由表,不被添加到数据库中。 字段名1> <字段类型 <(宽度[,<小数位数>]): 字段类型> 宽度[,<小数位数>]) ③<字段名1> <字段类型> <(宽度[,<小数位数>]):指定相应字段的 名称、类型、宽度及小数位数。 名称、类型、宽度及小数位数。 数据库系统及应用 第5章 结构化查询语言SQL 在学生选课数据库stsc stsc中创建一个学生表 例5-1 在学生选课数据库stsc中创建一个学生表 student。 student。 (学号 c(8),姓名 CREATE TABLE student (学号 c(8),姓名 c(6), c(2),院系 c(8),出生日期 D,入学成绩 性别 c(2),院系 c(8),出生日期 D,入学成绩 N(4,1)) 功能: TABLE语句创建数据库表student。 语句创建数据库表student 功能:用CREATE TABLE语句创建数据库表student。 该表中包含了学号、姓名、性别、院系、 该表中包含了学号、姓名、性别、院系、出生日 期和入学成绩6个字段。 期和入学成绩6个字段。 数据库系统及应用 第5章 结构化查询语言SQL (2)修改表结构 修改表结构命令以ALTER TABLE开头 开头, 修改表结构命令以ALTER TABLE开头,后面根据不同的操作使用不同 的命令动词。 的命令动词。 ①增加字段 格式: <表名 表名> <字段名 <字段类型 <(宽度 字段名> 字段类型> 宽度)> 格式:ALTER TABLE <表名> ADD <字段名> <字段类型> <(宽度)> 功能:对指定的表增加一个字段。 功能:对指定的表增加一个字段。 为学生student表增加一个照片字段。 student表增加一个照片字段 例5-2为学生student表增加一个照片字段。 ALTER TABLE student ADD 照片 G ② 删除字段 格式: <表名 表名> <字段名 字段名> 格式:ALTER TABLE <表名> DROP <字段名> 功能:在指定的表中删除指定字段。 功能:在指定的表中删除指定字段。 删除学生student表中的照片字段。 student表中的照片字段 例5-3删除学生student表中的照片字段。 ALTER TABLE student DROP 照片 数据库系统及应用 第5章 结构化查询语言SQL ③ 修改字段 格式: <表名 表名> <字段名 <字段类型 字段名> 字段类型> 格式:ALTER TABLE <表名> ALTER <字段名> <字段类型> <(宽度 宽度)> <(宽度)> 功能:在指定的表中修改指定字段的类型和宽度, 功能:在指定的表中修改指定字段的类型和宽度,不能修 改字段名。 改字段名。 把学生student表中的姓名字段宽度由6改为10 student表中的姓名字段宽度由 10。 例5-4把学生student表中的姓名字段宽度由6改为10。 ALTER TABLE student ALTER 姓名 c(10) ④修改字段名 格式: <表名 表名> <字段名 字段名1 TO<字段 格式:ALTER TABLE <表名> RENAME <字段名1> TO<字段 名2> 功能:在指定表中将字段名1更名为字段名2 功能:在指定表中将字段名1更名为字段名2。 例5-5把课程表course中的课名改为课程名称。 把课程表course中的课名改为课程名称。 course中的课名改为课程名称 ALTER TABLE course RENAME 课名 TO 课程名称 说明:执行一条命令只能对一个字段进行一种操作。 说明:执行一条命令只能对一个字段进行一种操作。 数据库系统及应用 第5章 结构化查询语言SQL (3)删除表 TABLE语句用于删除表的定义和表中的数据 语句用于删除表的定义和表中的数据、 DROP TABLE语句用于删除表的定义和表中的数据、 建立在表上的索引、视图等。 建立在表上的索引、视图等。 格式: <表名 表名>[/?][RECYCLE] 格式: DROP TABLE <表名>[/?][RECYCLE] 功能:删除指定的表。 功能:删除指定的表。 说明: 说明: [/?]:将显示“移去”对话框, [/?]:将显示“移去”对话框,从中可删除指定 的表。 的表。 [RECYCLE]:将删除的表文件放到回收站, [RECYCLE]:将删除的表文件放到回收站,以后可 以恢复。 以恢复。 数据库系统及应用 第5章 结构化查询语言SQL 3.视图的创建和删除 视图是一个虚表, 视图是一个虚表,是由一个或者几个基本表导出 的表。它本身不独立存储在数据库中, 的表。它本身不独立存储在数据库中,即数据库 中只存放视图的定义而不存放视图对应的数据, 中只存放视图的定义而不存放视图对应的数据, 这些数据仍存放在对应的表中。 这些数据仍存放在对应的表中。当基本表中的数 据发生了变化,视图中对应的数据也随之改变。 据发生了变化,视图中对应的数据也随之改变。 数据库系统及应用 第5章 结构化查询语言SQL (1)创建视图 视图一经创建,就可以通过它来查询数据库中数据, 视图一经创建,就可以通过它来查询数据库中数据,又可以用来定义 新的视图。 新的视图。 格式: <视图名 [(<列名 [,<列名2>]…)]) 视图名> 列名1> 列名2>] 格式:CREATE VIEW <视图名> [(<列名1> [,<列名2>] )]) AS 功能:创建一个由视图名指定的视图。 功能:创建一个由视图名指定的视图。 用视图可以简化基本表的浏览。例如只想了解学生表中的学号、 用视图可以简化基本表的浏览。例如只想了解学生表中的学号、姓名 和院系,可以从学生表student创建一个视图: student创建一个视图 和院系,可以从学生表student创建一个视图: 学号,姓名, CREATE VIEW stuyx AS SELECT 学号,姓名,院系 FROM student 其中,stuyx是视图名 省略了视图的列名,隐含是SELECT 是视图名, SELECT查询语句 其中,stuyx是视图名,省略了视图的列名,隐含是SELECT查询语句 中的列名。 中的列名。 例如,可以通过创建stu_jsj视图查看金融系的学生内容,语句如下: stu_jsj视图查看金融系的学生内容 例如,可以通过创建stu_jsj视图查看金融系的学生内容,语句如下: CREATE VIEW stu_jsj AS SELECT * FROM student WHERE 院 金融” 系=“金融” 数据库系统及应用 第5章 结构化查询语言SQL (2)查询视图 视图定义后,用户就可以像基本表一样对视图进行查询。 视图定义后,用户就可以像基本表一样对视图进行查询。 格式: [(<列名 列名1> [,<列名2>]…)]) 列名2>] <视 格式:SELECT [(<列名1> [,<列名2>] )]) FROM <视 图名> 图名> (3)删除视图 格式: <视图名 视图名> 格式:DROP VIEW <视图名> 视图删除后, 视图删除后,其定义的以及在它基础上再建立的其他视图 将自动删除。 将自动删除。 由于视图是从基本表中衍生出来的, 由于视图是从基本表中衍生出来的,所以不能进行结构修 改。若要改变视图结构,则只能删除后重新定义视图。 若要改变视图结构,则只能删除后重新定义视图。 数据库系统及应用 第5章 结构化查询语言SQL SQL数据查询功能 5.1.3 SQL数据查询功能 数据查询是数据库的核心操作。 数据查询是数据库的核心操作。数据查询是指根 据用户的需要,从数据库中提取所需的数据。 据用户的需要,从数据库中提取所需的数据。SQL 提供了SELECT语句实现查询, SELECT语句实现查询 提供了SELECT语句实现查询,该语句具有灵活的 使用方式和丰富的功能, 使用方式和丰富的功能,既可以完成相对简单的 单表查询, 单表查询,又可以完成复杂的多表连接查询和嵌 套查询。 套查询。 数据库系统及应用 第5章 结构化查询语言SQL SQL查询命令 1.SQL查询命令 一般格式: 一般格式: [ALL|DISTINCT]<目标列表达式>[,<目标列表达式>]…; 目标列表达式>[,<目标列表达式>] SELECT [ALL|DISTINCT]<目标列表达式>[,<目标列表达式>] ; <表名或视图名>[,<表名或视图名>]…; 表名或视图名>[,<表名或视图名>] FROM <表名或视图名>[,<表名或视图名>] ; <条件表达式>]; 条件表达式>] [WHERE <条件表达式>]; <分组列名 分组列名>[HAVING <条件表达式>]]; 条件表达式>]] [GROUP BY <分组列名>[HAVING <条件表达式>]]; BY<排序字段 排序字段>[ASC|DESC]] [ORDER BY<排序字段>[ASC|DESC]] 功能: 功能: 根据WHERE子句的条件表达式, FROM子句指定的基本表或视图中 WHERE子句的条件表达式 子句指定的基本表或视图中, 根据WHERE子句的条件表达式,从FROM子句指定的基本表或视图中, 找出满足条件的记录;再按SELECT子句中的目标表达式, SELECT子句中的目标表达式 找出满足条件的记录;再按SELECT子句中的目标表达式,选出记录中 的属性值,形成结果表。如果有GROUP BY子句 子句, 的属性值,形成结果表。如果有GROUP BY子句,则将结果按分组列名 的值进行分组,该属性列值相等的记录为一个组。如果GROUP BY子句 的值进行分组,该属性列值相等的记录为一个组。如果GROUP BY子句 还带有HAVING短语,则只有满足指定条件的组才能输出。 HAVING短语 还带有HAVING短语,则只有满足指定条件的组才能输出。如果有 BY子句 则结果还要按排序字段的值进行升序或降序排列。 子句, ORDER BY子句,则结果还要按排序字段的值进行升序或降序排列。 数据库系统及应用 第5章 结构化查询语言SQL 说明: 说明: 在使用SQL查询语句时,无论数据库是否打开, SQL查询语句时 (1)在使用SQL查询语句时,无论数据库是否打开,FROM 子句中指定的表所在数据库将自动打开。 子句中指定的表所在数据库将自动打开。 由于FoxPro系统中将Enter键解释为一条语句的结束, FoxPro系统中将Enter键解释为一条语句的结束 (2)由于FoxPro系统中将Enter键解释为一条语句的结束, 在整个语句结束前只能连续写,不能用Enter键来换行。 在整个语句结束前只能连续写,不能用Enter键来换行。 Enter键来换行 SQL中 为了使查询结构清晰,往往把SELECT子句、 SELECT子句 在SQL中,为了使查询结构清晰,往往把SELECT子句、 FROM子句及各层嵌套以分号作为分隔符 子句及各层嵌套以分号作为分隔符, FROM子句及各层嵌套以分号作为分隔符,表示下一行为本 行的后续。 行的后续。 为了便于理解,还是以学生选课数据库stsc stsc为例说明 为了便于理解,还是以学生选课数据库stsc为例说明 SELECT语句的基本用法 学生选课数据库stsc 语句的基本用法。 stsc由三个基本 SELECT语句的基本用法。学生选课数据库stsc由三个基本 表组成: 表组成: 学生表student 学号、姓名、性别、出生日期、院系、 student( 学生表student(学号、姓名、性别、出生日期、院系、 入学成绩); 入学成绩); 成绩表score 学号、课程编号、成绩); score( 成绩表score(学号、课程编号、成绩); 课程表course 课程编号、课程名称、学分)。 course( 课程表course(课程编号、课程名称、学分)。 数据库系统及应用 第5章 结构化查询语言SQL 2.简单查询 简单查询是基于单表的查询, SELECT和FROM短语构成无条件查询或 简单查询是基于单表的查询,由SELECT和FROM短语构成无条件查询或 者由SELECT FROM和WHERE短语构成有条件查询 SELECT、 短语构成有条件查询。 者由SELECT、FROM和WHERE短语构成有条件查询。 (1)选择表中的若干列 查询学生表student中所有院系。 student中所有院系 例5-6 查询学生表student中所有院系。 SELECT 院系 FROM student 该结果中有重复值,若要去掉重复值只需加上DISTINCT短语: DISTINCT短语 该结果中有重复值,若要去掉重复值只需加上DISTINCT短语: SELECT DISTINCT 院系 FROM student 查询全体学生的详细记录。 例5-7 查询全体学生的详细记录。 SELECT * FROM student 其中的“ 表示要查询所有的列。 其中的“*”表示要查询所有的列。 查询全体学生情况,并将结果按入学成绩升序排序。 例5-8 查询全体学生情况,并将结果按入学成绩升序排序。 SELECT * FROM student ORDER BY 入学成绩 ASC 结果表中的记录自动按入学成绩的升序排序。 结果表中的记录自动按入学成绩的升序排序。 数据库系统及应用 第5章 结构化查询语言SQL WHERE子句选择满足条件的记录 (2)用WHERE子句选择满足条件的记录 查找中文系全体学生的名单。 例5-9 查找中文系全体学生的名单。 院系="中文" ="中文 SELECT 姓名 FROM student WHERE 院系="中文" 查找缺少成绩的学生学号和课程号。 例5-10 查找缺少成绩的学生学号和课程号。 学号, SELECT 学号,课程编号 FROM score WHERE 成绩 IS NULL 查找姓“ 的所有学生姓名和院系。 例5-11 查找姓“王”的所有学生姓名和院系。 姓名, SELECT 姓名,院系 FROM student WHERE 姓名 "王 LIKE "王%" 数据库系统及应用 第5章 结构化查询语言SQL 3.连接查询 若查询涉及到两个或两个以上的表,就要用到连接查询。 若查询涉及到两个或两个以上的表,就要用到连接查询。 (1)连接 由于SQL的高度非过程化,用户只需要在FROM子句中指出要用到的表名, SQL的高度非过程化 FROM子句中指出要用到的表名 由于SQL的高度非过程化,用户只需要在FROM子句中指出要用到的表名, WHERE中指出连接条件 连接过程将由系统自动完成。 中指出连接条件, 在WHERE中指出连接条件,连接过程将由系统自动完成。 ①连接条件 用来连接两个表的条件称为连接条件,其一般格式为: 用来连接两个表的条件称为连接条件,其一般格式为: [<表名1>.]<列名 <比较运算符>[<表名2>.]<列名 表名1>.]<列名1> 比较运算符>[<表名2>.]<列名2> [<表名1>.]<列名1> <比较运算符>[<表名2>.]<列名2> 此外,连接条件还可以用下面的形式: 此外,连接条件还可以用下面的形式: [<表名1>.]<列名 表名1>.]<列名1> [<表名2>.]<列名 表名2>.]<列名2> [<表名 表名3>.]< [<表名1>.]<列名1> BETWEEN [<表名2>.]<列名2> AND [<表名3>.]< 列名3> 列名3> 连接条件中的列名称为连接字段,条件中的各连接字段必须是可比的。 连接条件中的列名称为连接字段,条件中的各连接字段必须是可比的。 ②等值连接和非等值连接 当连接运算符为“ 时 称为等值连接。 当连接运算符为“=”时,称为等值连接。使用其他运算符称为非等值 连接。 连接。 数据库系统及应用 第5章 结构化查询语言SQL 查询选修课程编号为“9001”的学生学号和姓名 的学生学号和姓名。 例5-12 查询选修课程编号为“9001 的学生学号和姓名。 学生的姓名在student表中,学生选课信息在score student表中 score成绩表 学生的姓名在student表中,学生选课信息在score成绩表 所以本查询实际上同时student score两个表中的数 student和 中,所以本查询实际上同时student和score两个表中的数 这两个表之间的联系是通过两个表中都有“学号” 据。这两个表之间的联系是通过两个表中都有“学号”字 段实现的。要查询学生及其选修课程的情况, 段实现的。要查询学生及其选修课程的情况,就必须将这 两个表中学号相同的记录连接起来。这是一个等值连接。 两个表中学号相同的记录连接起来。这是一个等值连接。 SQL语句为 语句为: SQL语句为: student.学号 学号, SELECT student.学号,姓名 FROM student, score ; student.学号=score.学号 学号=score. 课程编号="9001" WHERE student.学号=score.学号 AND 课程编号="9001" 注意:student表与score表中均包含学号字段 表与score表中均包含学号字段, 注意:student表与score表中均包含学号字段,访问时要 加前缀。 加前缀。 数据库系统及应用 第5章 结构化查询语言SQL 4.嵌套查询 在SQL语言中,一个SELECT FROM…WHERE语句称为一个查 SQL语言中,一个SELECT…FROM WHERE语句称为一个查 语言中 SELECT FROM WHERE 询块。将一个查询块嵌套在另一个查询块的WHERE WHERE子句或 询块。将一个查询块嵌套在另一个查询块的WHERE子句或 HANVIG短语中的查询称为嵌套查询 短语中的查询称为嵌套查询。 HANVIG短语中的查询称为嵌套查询。嵌套查询使用户可以 用多个简单查询构造复杂的查询,从而增强SQL SQL语言的查 用多个简单查询构造复杂的查询,从而增强SQL语言的查 询能力。 询能力。 用嵌套查询实现例5 12的语句是 的语句是: 例5-13 用嵌套查询实现例5-12的语句是: 学号, SELECT 学号,姓名 FROM student ; WHERE 学号 IN(SELECT 学号 FROM score WHERE 课程编 号="9001") 在本例中,下层查询块SELECT学号FROM SELECT学号 WHERE课程 在本例中,下层查询块SELECT学号FROM score WHERE课程 编号= 9001”是嵌套在查询块SELECT学号 是嵌套在查询块SELECT学号, 编号=“9001 是嵌套在查询块SELECT学号,姓名 FROM WHERE学号 IN中的 上层查询块又称为“ 中的。 student WHERE学号 IN中的。上层查询块又称为“外层查 父查询” 下层查询块称为“内层查询” 询”或“父查询”,下层查询块称为“内层查询”或“子 查询” 一个子查询还可以嵌套其他子查询。 查询”。一个子查询还可以嵌套其他子查询。 数据库系统及应用 第5章 结构化查询语言SQL 5.计算查询 SQL提供了称为库函数的常用统计函数 提供了称为库函数的常用统计函数, SQL提供了称为库函数的常用统计函数,这些库函数增强 了查询功能,进一步方便了用户。 了查询功能,进一步方便了用户。这些库函数及其功能如 下: COUNT(<字段名>): 字段名>) COUNT(<字段名>):对指定字段进行计数 SUM(<字段名>): 求指定字段值的总和( 字段名>) SUM(<字段名>): 求指定字段值的总和(该字段必须为 数值) 数值) AVG(<字段名>): 求指定字段值的平均值( 字段名>) AVG(<字段名>): 求指定字段值的平均值(该字段必须 为数值) 为数值) MAX(<字段名>): 字段名>) MAX(<字段名>): 求指定字段中的最大值 MIN(<字段名>): 字段名>) MIN(<字段名>): 求指定字段中的最小值 以上函数不可以嵌套使用。在使用库函数查询时,常用AS 以上函数不可以嵌套使用。在使用库函数查询时,常用AS 来指定列名。 来指定列名。 数据库系统及应用 第5章 结构化查询语言SQL 查询课程总数。 例5-14 查询课程总数。 SELECT COUNT(*)AS 课程总数 FROM course course表中课程编号的值唯一 表中课程编号的值唯一, 在course表中课程编号的值唯一,所以统计课程总数就是 统计表中的记录数。 统计表中的记录数。 查询选修了课程学生人数。 例5-15 查询选修了课程学生人数。 学号)AS SELECT COUNT(DISTINCT 学号)AS 选课人数 FROM score 由于每个学生选课不止一门课,score表中一个学生可能 由于每个学生选课不止一门课,score表中一个学生可能 有多个记录,因此在COUNT函数中用DISTINCT COUNT函数中用DISTINCT去掉重复记 有多个记录,因此在COUNT函数中用DISTINCT去掉重复记 录。 统计各课程选修的学生人数。 例5-16 统计各课程选修的学生人数。 课程编号,COUNT(学号)AS ,COUNT(学号 SELECT 课程编号,COUNT(学号)AS 学生人数 FROM score GROUP BY 课程编号 本例对score按课程编号分组,对每一组用函数COUNT score按课程编号分组 COUNT求出 本例对score按课程编号分组,对每一组用函数COUNT求出 学生人数。 学生人数。 数据库系统及应用 第5章 结构化查询语言SQL 6.查询结果输出 1)输出部分结果 SELECT语句中常使用 语句中常使用TOP [PERCENT]短语来显示满足条件的前几 在SELECT语句中常使用TOP n [PERCENT]短语来显示满足条件的前几 条记录。不带PERCENT参数时, PERCENT参数时 1~32767之间的整数 说明显示前n 之间的整数, 条记录。不带PERCENT参数时,n是1~32767之间的整数,说明显示前n 条记录;使用PERCENT参数时, PERCENT参数时 0.01~99.99之间的实数 之间的实数, 条记录;使用PERCENT参数时,n是0.01~99.99之间的实数,说明显示 查询结果中前百分之多少的记录。 查询结果中前百分之多少的记录。 TOP短语要与 短语要与ORDER BY短语同时使用才有效 短语同时使用才有效。 TOP短语要与ORDER BY短语同时使用才有效。 查询输出入学成绩在前3 例5-17 查询输出入学成绩在前3名的学生 SELECT * TOP 3 FROM student ORDER BY 入学成绩 DESC 查询输出入学成绩在前3% 3%的学生 例5-18 查询输出入学成绩在前3%的学生 SELECT * TOP 3 PERCENT FROM student ORDER BY 入学成绩 DESC 2)输出去向 SELECT语句中INTO或TO短语 可以指定查询结果的输出去向。 语句中INTO 短语, 在SELECT语句中INTO或TO短语,可以指定查询结果的输出去向。 数据库系统及应用 第5章 结构化查询语言SQL 将所有女同学的信息保存于临时表TEMP TEMP中 例5-19 将所有女同学的信息保存于临时表TEMP中。 SELECT * FROM student WHERE 性别="女" INTO 性别="女 =" CURSOR TEMP 将入学成绩大于450 450分的学生信息保存于 例5-20 将入学成绩大于450分的学生信息保存于 高分.DBF表中。 .DBF表中 高分.DBF表中。 入学成绩>450 SELECT * FROM student WHERE 入学成绩>450 INTO DBF 高分 将中文系的学生信息存放到文件名为“ 例5-21 将中文系的学生信息存放到文件名为“中 的文本文件中。 文”的文本文件中。 院系="中文" ="中文 SELECT * FROM student WHERE 院系="中文" TO FILE 中文 数据库系统及应用 第5章 结构化查询语言SQL SQL操纵功能 5.1.4 SQL操纵功能 SQL的数据操作功能是指对已经存在的数据表进行 SQL的数据操作功能是指对已经存在的数据表进行 记录的插入、删除和修改操作。SQL的数据操作包 记录的插入、删除和修改操作。SQL的数据操作包 括三个语句:INSERT(插入记录 插入记录) DELETE(删除记 括三个语句:INSERT(插入记录)、DELETE(删除记 UPDATE(修改记录 修改记录) 录)和UPDATE(修改记录)。 数据库系统及应用 第5章 结构化查询语言SQL 1.插入数据 命令格式1 (1)命令格式1: INTO<表名>[(字段名 表名>[(字段名1 字段名2 ])]VALUES(表达式1[ ])]VALUES(表达式1[, INSERT INTO<表名>[(字段名1[,字段名2…])]VALUES(表达式1[,表达式 2…]) ]) 功能:在表尾追加一条包含指定字段值的记录。 功能:在表尾追加一条包含指定字段值的记录。 给成绩表添加一条选课记录。 例5-22 给成绩表添加一条选课记录。 (学号 课程编号,成绩) 学号, INSERT INTO score (学号,课程编号,成绩) VALUES ("03036003","001",89) 说明: 说明: 命令中的各表达式和各字段之间相对应的,其数据类型应相同。 命令中的各表达式和各字段之间相对应的,其数据类型应相同。 若插入命令中表的每一个字段都有具体的值,那么字段名列表可以省略。 若插入命令中表的每一个字段都有具体的值,那么字段名列表可以省略。若 只给出部分字段的值,那么必须在命令中列出对应的字段名。 只给出部分字段的值,那么必须在命令中列出对应的字段名。 如上列的命令可改为: 如上列的命令可改为: (“03036003 001 03036003”, 001”,89) INSERT INTO score VALUES ( 03036003 ,”001 ,89) 命令格式2 (2)命令格式2: INTO<表名 表名> ARRAY<数组名>|<内在变量名 数组名>|<内在变量名> INSERT INTO<表名> FROM ARRAY<数组名>|<内在变量名> 功能:从数组或内存变量中导入记录。 功能:从数组或内存变量中导入记录。 数据库系统及应用 第5章 结构化查询语言SQL 2.删除数据 命令格式: 命令格式: FROM<表名 表名>[WHERE <条件 条件>] DELETE FROM<表名>[WHERE <条件>] 功能:从指定的表中对满足条件的那些记录作删除标记。 功能:从指定的表中对满足条件的那些记录作删除标记。 说明: 说明: 该命令执行的是逻辑删除,若要彻底删除记录, 该命令执行的是逻辑删除,若要彻底删除记录,还需要使 PACK命令 命令。 用PACK命令。 如果省略条件子句,表示删除表中所有记录, 如果省略条件子句,表示删除表中所有记录,但是该表的 结构仍然存在。 结构仍然存在。 从课程表中删除课程号为”001”的记录 的记录。 例5-23 从课程表中删除课程号为”001 的记录。 课程编号="001" ="001"。 DELETE FROM course WHERE 课程编号="001"。 数据库系统及应用 第5章 结构化查询语言SQL 3.修改数据 修改数据是指修改指定表中满足条件的记录。 修改数据是指修改指定表中满足条件的记录。 命令格式: 命令格式: <表名 表名> UPDATE <表名> <字段名1>=<表达式1>[,<字段名2>=<表达式2>]… 字段名1>=<表达式1>[,<字段名2>=<表达式2>] SET <字段名1>=<表达式1>[,<字段名2>=<表达式2>] <条件 条件>] [WHERE <条件>] 功能: SET子句中的表达式修改记录的相应的字段值 如果省略条件, 子句中的表达式修改记录的相应的字段值。 功能:按SET子句中的表达式修改记录的相应的字段值。如果省略条件, 表示表中所有记录都要修改,否则仅修改满足条件的部分记录。 表示表中所有记录都要修改,否则仅修改满足条件的部分记录。 将学生表中学号为”03036003”的学生姓名改为 王平” 的学生姓名改为“ 例5-24 将学生表中学号为”03036003 的学生姓名改为“王平”。 姓名="王平" ="王平 学号="03036003" UPDATE student SET 姓名="王平" WHERE 学号="03036003" 将所有学生的入学成绩加上5 例5-25 将所有学生的入学成绩加上5分。 入学成绩=入学成绩+5 UPDATE student SET 入学成绩=入学成绩+5 数据库系统及应用 第5章 结构化查询语言SQL SQL进行表的基本操作案例 5.2 用SQL进行表的基本操作案例 案例说明 本案例要求运用SQL语句的定义功能,创建“学生-成绩SQL语句的定义功能 本案例要求运用SQL语句的定义功能,创建“学生-成绩课程”数据库Stsc 然后在该数据库中创建表, Stsc, 课程”数据库Stsc,然后在该数据库中创建表,并建立表 间联系。基本要求如下: 间联系。基本要求如下: SQL语句创建数据库stsc。 语句创建数据库stsc (1)用SQL语句创建数据库stsc。 在该数据库下创建3张数据库表,分别为: (2)在该数据库下创建3张数据库表,分别为:学生表 student、成绩表score 课程表course score、 course。 student、成绩表score、课程表course。 设置学生表的学号为主索引、 (3)设置学生表的学号为主索引、成绩表的学号和课程 编号为候选索引、课程表的课程编号为主索引。 编号为候选索引、课程表的课程编号为主索引。 建立学生表和成绩表、课程表和成绩表一对多关联。 (4)建立学生表和成绩表、课程表和成绩表一对多关联。 设置数据库表的完整约束性条件。 (5)设置数据库表的完整约束性条件。 向数据库表中添加记录。 (6)向数据库表中添加记录。 数据库系统及应用 第5章 结构化查询语言SQL 5.2.1 操作步骤 创建数据库stsc (1)创建数据库stsc (2)创建数据库表 在命令窗口中输入CREATE TABLE命令 命令, 在命令窗口中输入CREATE TABLE命令,分别建立学生表 student、成绩表score 课程表couse score、 couse, student、成绩表score、课程表couse,并要求对学生表 中的“学号”和课程表中的“课程编号”字段建立主索引, 中的“学号”和课程表中的“课程编号”字段建立主索引, 对成绩表中的“学号” 课程编号”字段建立候选索引。 对成绩表中的“学号”和“课程编号”字段建立候选索引。 在新建成绩表(score)命令中用REFERENCES REFERENCES子句建立了 在新建成绩表(score)命令中用REFERENCES子句建立了 该表与其他两个表的关联。 该表与其他两个表的关联。 (3)修改表结构 给成绩表添加一条记录或从数组中导入记录。 (4)给成绩表添加一条记录或从数组中导入记录。 数据库系统及应用 第5章 结构化查询语言SQL 5.2.2 本节知识点 1.完整性约束条件 在案例中用到了SQL SQL数据定义功能中的完整性约束 在案例中用到了SQL数据定义功能中的完整性约束 条件的使用。 条件的使用。 使用SQL SQL插入命令 2.使用SQL插入命令 当表中定义了主索引或候选索引, 当表中定义了主索引或候选索引,相应的字段设 置成不能为空时, FoxPro的INSERT或者 置成不能为空时,Visuai FoxPro的INSERT或者 APPEND命令就无法使用了 因此这里使用SQL 命令就无法使用了, SQL的插 APPEND命令就无法使用了,因此这里使用SQL的插 入命令。 入命令。 数据库系统及应用 第5章 结构化查询语言SQL SQL查询命令查询数据案例 5.3 用SQL查询命令查询数据案例 案例说明 本案例要求在“学生-成绩-课程”数据库基础上, 本案例要求在“学生-成绩-课程”数据库基础上,运用 SQL查询命令,对stsc数据库中数据实现单表的简单查询、 SQL查询命令, stsc数据库中数据实现单表的简单查询、 查询命令 数据库中数据实现单表的简单查询 多表的连接查询和复杂的嵌套查询, 多表的连接查询和复杂的嵌套查询,灵活地运用数据库内 的数据为实际应用服务。基本要求如下: 的数据为实际应用服务。基本要求如下: SQL的查询命令有选择地显示表中的部分列 的查询命令有选择地显示表中的部分列。 (1)用SQL的查询命令有选择地显示表中的部分列。 利用SQL查询功能实现计算查询和分组计算查询。 SQL查询功能实现计算查询和分组计算查询 (2)利用SQL查询功能实现计算查询和分组计算查询。 SELECT命令进行多表的连接查询 命令进行多表的连接查询。 (3)用SELECT命令进行多表的连接查询。 (4)用嵌套查询构造复杂的查询。 用嵌套查询构造复杂的查询。 数据库系统及应用 第5章 结构化查询语言SQL 5.3.1 操作步骤 1.用简单查询实现表中部分列和记录的显示。 用简单查询实现表中部分列和记录的显示。 查询全体学生的学号和姓名。 (1)查询全体学生的学号和姓名。 在命令窗口中键入下列命令: 在命令窗口中键入下列命令: 学号, SELECT 学号,姓名 FROM student 查询全体学生的姓名和年龄。 (2)查询全体学生的姓名和年龄。 由于表中没有直接的年龄字段,因此可以在SQL SQL查 由于表中没有直接的年龄字段,因此可以在SQL查 询命令中运用表达式来实现。 询命令中运用表达式来实现。在命令窗口中键入 下列命令: 下列命令: 姓名,year({^2003 09-01})-year(出生日 ,year({^2003SELECT 姓名,year({^2003-09-01})-year(出生日 期) as 年龄 FROM student 数据库系统及应用 第5章 结构化查询语言SQL (3)查询学校的院系名称。 查询学校的院系名称。 由于通过学生表可以看到学校的院系名单, 由于通过学生表可以看到学校的院系名单,但是会出现院 系名重复,因此用DISTINCT子句去掉重复。命令如下: DISTINCT子句去掉重复 系名重复,因此用DISTINCT子句去掉重复。命令如下: SELECT 院系 DISTINCT FROM student 查找入学成绩在460分至500分之间的学生信息, 460分至500分之间的学生信息 (4)查找入学成绩在460分至500分之间的学生信息,并 按入学成绩降序排序。 按入学成绩降序排序。 在命令窗口中输入下列命令: 在命令窗口中输入下列命令: SELECT * FROM student ; WHERE 入学成绩 BETWEEN 460 AND 500; ORDER BY 入学成绩 DESC 查找金融系和建筑系学生的姓名和出生日期。 (5)查找金融系和建筑系学生的姓名和出生日期。命令 如下: 如下: 姓名,出生日期, SELECT 姓名,出生日期,院系 FROM student; in("金融 ,"建筑 金融" 建筑") WHERE 院系 in("金融" ,"建筑") 数据库系统及应用 第5章 结构化查询语言SQL 2.利用SQL查询功能实现实现计算查询和分组计算查询。 利用SQL查询功能实现实现计算查询和分组计算查询。 SQL查询功能实现实现计算查询和分组计算查询 求女生的人数、平均入学成绩、往常入学成绩最高分和入学成绩最低分。 (1)求女生的人数、平均入学成绩、往常入学成绩最高分和入学成绩最低分。 SQL中通过计算查询可以直接对查询的结果进行计算 命令如下: 中通过计算查询可以直接对查询的结果进行计算。 在SQL中通过计算查询可以直接对查询的结果进行计算。命令如下: 女生人数,AVG(入学成绩) ,AVG(入学成绩 平均入学成绩,; SELECT COUNT(*) AS 女生人数,AVG(入学成绩) AS 平均入学成绩,; MAX(入学成绩 入学成绩) 最高分入学成绩最高分,MIN(入学成绩) ,MIN(入学成绩 MAX(入学成绩) AS 最高分入学成绩最高分,MIN(入学成绩) AS 入学成绩最低 分; 性别=" ="女 FROM student WHERE 性别="女" 查询各门课程的平均成绩。 (2)查询各门课程的平均成绩。 要统计课程的平均分,需要用查询命令中GROUP子句将课程分组, GROUP子句将课程分组 要统计课程的平均分,需要用查询命令中GROUP子句将课程分组,然后计算平 均分。命令如下: 均分。命令如下: 课程编号,AVG(成绩) ,AVG(成绩 SELECT 课程编号,AVG(成绩) AS 课程平均分 FROM score GROUP BY 课程编 号 查询课程的平均成绩高于70分的课程号和平均成绩. 70分的课程号和平均成绩 (3)查询课程的平均成绩高于70分的课程号和平均成绩. 在分组计算的结果上再进行筛选,可以用HAVING子句实现。HAVING子句总是 HAVING子句实现 在分组计算的结果上再进行筛选,可以用HAVING子句实现。HAVING子句总是 跟在GROUP BY后面的 不可单独使用。查询命令如下: 后面的, 跟在GROUP BY后面的,不可单独使用。查询命令如下: 课程编号,AVG(成绩) ,AVG(成绩 课程平均分; SELECT 课程编号,AVG(成绩) AS 课程平均分; AVG(成绩 成绩)>=70 FROM score GROUP BY 课程编号 HAVING AVG(成绩)>=70 数据库系统及应用 第5章 结构化查询语言SQL SELECT命令进行多表查询 命令进行多表查询。 3.用SELECT命令进行多表查询。 在实际应用中,经常碰到同时要用到两个表或更多表的数据的问题, 在实际应用中,经常碰到同时要用到两个表或更多表的数据的问题, SELECT的连接查询就能解决这样的问题 的连接查询就能解决这样的问题。 用SELECT的连接查询就能解决这样的问题。 查询每个学生的选课情况。 (1)查询每个学生的选课情况。 学生信息在student表中,选课信息在score表中, student表中 score表中 学生信息在student表中,选课信息在score表中,所以本查询涉及 student与score两个表中的数据 两个表中的数据。 student与score两个表中的数据。这两个表的联系是通过两个表中都 具有的字段“学号”实现的。SQL语句为 语句为: 具有的字段“学号”实现的。SQL语句为: student.*,score.课程编号,score.成绩 课程编号,score.成绩; SELECT student.*,score.课程编号,score.成绩; student.学号=score.学号 学号=score. FROM student,score WHERE student.学号=score.学号 查询所有学生的平均成绩。 (2)查询所有学生的平均成绩。 本题需要从score表中查询并统计各个学生的平均成绩, score表中查询并统计各个学生的平均成绩 本题需要从score表中查询并统计各个学生的平均成绩,然后按学号进 行分组。查询命令: 行分组。查询命令: student.学号,student.姓名,AVG(score.成绩 学号,student.姓名,AVG(score.成绩) "平均成 SELECT student.学号,student.姓名,AVG(score.成绩) AS "平均成 绩" ; student.学号=score.学号 学号=score. FROM student,score WHERE student.学号=score.学号 GROUP BY score.学号 score.学号 数据库系统及应用 第5章 结构化查询语言SQL 查询平均成绩在前三名的学生的成绩。 (3)查询平均成绩在前三名的学生的成绩。 本题不仅要查询出所有学生的平均成绩, 本题不仅要查询出所有学生的平均成绩,而且还 要按平均成绩进行降序排序, 要按平均成绩进行降序排序,最后只输出前三名 的学生的信息。查询命令为: 的学生的信息。查询命令为: student.学号,student.姓名 学号,student.姓名,AVG(score. SELECT student.学号,student.姓名,AVG(score. 成绩) "平均成绩 平均成绩" 成绩) AS "平均成绩" ; TOP 3 FROM student,score WHERE student.学 student.学 =score.学号 学号; 号=score.学号; score.学号 GROUP BY score.学号 ORDER BY 平均成绩 DESC 数据库系统及应用 第5章 结构化查询语言SQL 用嵌套查询构造新的数据关系。 4.用嵌套查询构造新的数据关系。 查询选修了“2002”课程的学生姓名 课程的学生姓名。 (1)查询选修了“2002 课程的学生姓名。 本题查询的结果虽然只在student表一张表中, student表一张表中 本题查询的结果虽然只在student表一张表中,但 是查询条件却涉及到了score score表 是查询条件却涉及到了score表,所以要用嵌套来 实现。查询命令为: 实现。查询命令为: 学号, SELECT 学号,姓名 FROM student WHERE 学号 IN; (SELECT 学号 FROM score WHERE 课程编号 ="2002") 数据库系统及应用 第5章 结构化查询语言SQL (2)查询选修“大学英语”的学生信息及成绩。 查询选修“大学英语”的学生信息及成绩。 题意分析:题目要求的是学生的信息,这可以从学生表中获得, 题意分析:题目要求的是学生的信息,这可以从学生表中获得,但是课程名 称只能在选课表才有,而学生表和选课表没有直接联系, 称只能在选课表才有,而学生表和选课表没有直接联系,显然要通过成绩表 建立学生表与选课表之间的联系。下面用等值连接和嵌套两种方法实现。 建立学生表与选课表之间的联系。下面用等值连接和嵌套两种方法实现。 方法1 使用等值连接的SQL语句是: SQL语句是 方法1:使用等值连接的SQL语句是: student.学号,student.姓名,score.成绩,couse.课程名称 学号,student.姓名,score.成绩,couse.课程名称; SELECT student.学号,student.姓名,score.成绩,couse.课程名称; FROM student,score,couse; (student.学号 score.学号 学号= 学号) WHERE (student.学号= score.学号) AND; (score.课程编号=couse.课程编号 课程编号=couse.课程编号) (score.课程编号=couse.课程编号) AND; (couse.课程名称='大学英语 课程名称='大学英语') (couse.课程名称='大学英语') 方法2 使用嵌套查询的SQL语句是: SQL语句是 方法2:使用嵌套查询的SQL语句是: ,成绩 SELECT student.* ,成绩 FROM student; WHERE学号 IN; WHERE学号 IN; SELECT学号 学号FROM (SELECT学号FROM score ; WHERE课程编号 IN; WHERE课程编号 IN; (SELECT课程编号 (SELECT课程编号 FROM course; 课程名称= 大学英语” WHERE 课程名称=“大学英语”)) 数据库系统及应用 第5章 结构化查询语言SQL 5.3.2 本节知识点 嵌套查询是指在SELECT FROM-WHERE查询模块内部再嵌入 SELECT嵌套查询是指在SELECT-FROM-WHERE查询模块内部再嵌入 另一个查询模块,称之为子查询。 另一个查询模块,称之为子查询。嵌套查询只能对外层查 询排序,不能对内层查询排序。 询排序,不能对内层查询排序。 集合成员资格的比较操作的形式如下: 集合成员资格的比较操作的形式如下: 集合1 IN(集合2):用于指出包含在子查询模块的查 (集合1)IN(集合2):用于指出包含在子查询模块的查 询结果中。 询结果中。 集合1 IN(集合2):用于指出不包含在子查询模 (集合1)NOT IN(集合2):用于指出不包含在子查询模 块的查询结果中。 块的查询结果中。 这里集合1 集合2可以是一个SELECT查询语句, SELECT查询语句 这里集合1、集合2可以是一个SELECT查询语句,或元组的 集合,但它们的结构应相同。IN操作表示 如果集合1 操作表示: 集合,但它们的结构应相同。IN操作表示:如果集合1中 每个元素均在集合2 那么操作的逻辑值为TRUE TRUE, 每个元素均在集合2中,那么操作的逻辑值为TRUE,否则 FALSE; IN操作表示 如果集合1 操作表示: 为FALSE;NOT IN操作表示:如果集合1某个元素不在集合 那么操作的逻辑值为TRUE 否则为FALSE TRUE, FALSE。 2中,那么操作的逻辑值为TRUE,否则为FALSE。 数据库系统及应用 第5章 结构化查询语言SQL 5.4 本 章 小 结 本章首先介绍了SQL语言的组成和特点、SQL语言 SQL语言的组成和特点 本章首先介绍了SQL语言的组成和特点、SQL语言 的体系结构,然后较详细地讲述SQL SQL语言的基本功 的体系结构,然后较详细地讲述SQL语言的基本功 包括数据定义功能、数据查询功能、 能,包括数据定义功能、数据查询功能、数据操 纵功能和数据控制功能。最后结合学生-成绩- 纵功能和数据控制功能。最后结合学生-成绩- 课程数据库,用实例方式讲解了如何用SQL SQL语句创 课程数据库,用实例方式讲解了如何用SQL语句创 建数据库和数据表,如何利用SQL SQL的查询功能在数 建数据库和数据表,如何利用SQL的查询功能在数 据库中灵活地搜索数据。 据库中灵活地搜索数据。 数据库系统及应用