首页 结构化查询语言

结构化查询语言

举报
开通vip

结构化查询语言 第 4章 结构化查询语言 SQL 知识结构图 SQL(Structured Query Language)是结构化查询语言。“查询”是 SQL 语言的重要组成部 分,但不是全部内容,SQL 语言还包含数据定义、数据操作、数据控制功能。 SQL 是由美国国家标准协会(American National Standards Institute,ANSI)于 1986 年 10 月公布的...

结构化查询语言
第 4章 结构化查询语言 SQL 知识结构图 SQL(Structured Query Language)是结构化查询语言。“查询”是 SQL 语言的重要组成部 分,但不是全部内容,SQL 语言还包含数据定义、数据操作、数据控制功能。 SQL 是由美国国家 标准 excel标准偏差excel标准偏差函数exl标准差函数国标检验抽样标准表免费下载红头文件格式标准下载 协会(American National Standards Institute,ANSI)于 1986 年 10 月公布的,随后 SQL 就被当作关系数据库的工业标准语言。1987 年,这个标准被国际标 准化组织(International Standards Organization,ISO)批准为国际标准,并在此基础上进行 了补充。 SQL 语言成为国际标准后,各数据库公司纷纷推出了自己符合 SQL 标准的数据库管理系 统(DBMS),如 Oracle、Microsoft SQL Server、Informix、Sybase 等。SQL 标准可使不同关 系数据库之间实现一致性和可移植性。Visual FoxPro 作为一种可视化的关系数据语言,也使用 SQL 语言作为数据库定义、数据操作和数据检索的工具。 SQL 语言的主要特点如下: (1)SQL 是一种一体化的语言。它包括了数据定义、数据查询、数据操作和数据控制等 方面的功能,它可以完成数据库活动中的全部工作。以前的非关系模型是数据语言,一般包括 存储模式描述语言、概念模式描述语言、外部模式描述语言等,这种模型的数据语言,一是内 容多,二是掌握和使用起来不像 SQL 那样简单、实用。 SQL 概述 SQL 定义功能 SQL 操作功能 SQL 查询功能 (重点) 插入操作 更新操作 删除操作 SQL:结构化查询语言 SQL 语言的主要特点 SQL 功能 表的定义 表的删除 表结构的修改 视图的定义 基本查询 排序查询 计算与分组查询 带特殊运算符的条件查询 嵌套查询 超连接查询 查询中的几个特殊选项 别名与自连接查询 第 4 章 结构化查询语言 SQL 119 (2)SQL 语言是一种高度非过程化的语言。它没有必要一步步地告诉计算机“如何”去 做,而只需要描述清楚用户要“做什么”,SQL 语言可将要求交给系统,自动完成全部工作。 (3)SQL 语言非常简洁。虽然 SQL 语言功能很强,但它只有为数不多的几条命令,分 别用于完成数据定义、数据操作和数据查询等功能,如表 4-1 所示。另外,SQL 的语法也非常 简单,它很接近 英语 关于好奇心的名言警句英语高中英语词汇下载高中英语词汇 下载英语衡水体下载小学英语关于形容词和副词的题 自然语言,因此容易学习、掌握。 表 4-1 SQL语言的 9个命令动词 SQL功能 命令动词 数据查询 Select 插入 记录 混凝土 养护记录下载土方回填监理旁站记录免费下载集备记录下载集备记录下载集备记录下载 Insert 更新记录 Update 数据操作 删除记录 Delete 定义基本表或索引 Create 删除基本表或索引 Drop 数据定义 修改表结构 Alter 授权 Grant 数据控制 收回权限 Revoke (4)SQL 语言可以直接以命令方式交互使用,也可以嵌入到程序设计语言中以程序方式 使用。现在很多数据库应用开发工具都将 SQL 语言直接融入到自身的语言之中,使用起来更 方便,Visual FoxPro 就是如此。这些使用方式为用户提供了灵活的选择余地。此外,尽管 SQL 的使用方式不同,但 SQL 语言的语法基本是一致的。 SQL 语言的功能很强大,但由于 Visual FoxPro 自身安全控制方面的缺陷,所以它没有提 供数据控制功能。在 Visual FoxPro 中只支持数据定义、数据查询和数据操作功能。 4.1 数据查询 SQL 语言的核心是查询。SQL 的查询命令的基本形式由 Select-From-Where 查询块组成, 多个查询块可以嵌套执行。查询是根据需要,以可读的方式从数据库中提取数据。 SQL SELECT 查询命令的格式如下: SELECT [ALL | DISTINCT][TOP <表达式> [PERCENT]][<别名>.]<列表达式>[AS <别名>]; [,[<别名.>]<列表达式>[AS <别名>]…]; FROM [<数据库名!>]<表名>[,[<数据库名!>]<表名>…]; [INNER | LEFT | RIGHT | FULL JOIN [<数据库名!>]<表名>; [ON <连接条件>…]]; [[INTO TABLE <新表名>] | [TO FILE <文件名> | TO PRINTER | TO SCREEN]]; [WHERE <连接条件>[AND <连接条件>…]; [AND | OR <查询条件> [AND | OR<查询条件>…]]]; [GROUP BY <字段名>[,<字段名>…]][HAVING <分组条件>]; [ORDER BY <字段名>[ASC | DESC][,<字段名>[ASC | DESC]…]] SQL SELECT 命令看上去非常复杂,但常用的只有 6 个子句:SELECT、FROM、WHERE、 GROUP BY、HAVING、ORDER BY。 (1)SELECT 短语:用于说明要查询的数据。 Visual FoxPro 程序设计 120 (2)FROM 短语:用于说明要查询的数据来自哪个或哪些表,可对单个表或多个表进行 查询。 (3)WHERE 短语:用于说明查询条件;如果是多表查询还可通过该子句指明表与表之 间的连接条件进行连接。 (4)GROUP BY 短语:用于对查询进行分组,可利用它进行分组汇总。 (5)HAVING 短语:跟随在 GROUP BY 之后使用,它是用来限定分组,要求只有满足 分组条件的记录才能进行分组查询。 (6)ORDER BY 短语:用于对查询的结果进行排序。 (7)AS 短语:用于指定查询结果中字段的新名称,AS 短语前的表达式可以是一个字段 名、表达式、 函数 excel方差函数excelsd函数已知函数     2 f x m x mx m      2 1 4 2拉格朗日函数pdf函数公式下载 等。 (8)DISTINCT 短语:用于说明在查询结果中去掉重复值。 (9)INTO TABLE 短语:用于指明查询结果保存在哪个表中。 在以后的学习中,常用的 SQL SELECT 语句的具体格式如下: SELECT [ALL | DISTINCT]<检索项>; FROM <表名列表>; [WHERE <查询条件>[AND<连接条件>]]; [GROUP BY <字段列表>[HAVING<分组条件>]]; [ORDER BY <字段名>[ASC | DESC]] [INTO TABLE <新表名>] | [TO FILE <文件名>] 说明: 1)在 SQL SELECT 查询语句中,SELECT…FROM…两个命令动词是最基本的并且是不 可缺少的,其他命令动词可以根据需要选用。 2)SQL SELCET 查询语句的功能是将满足要求的数据查询出来,它不会更改数据库中的 数据。 SELECT 查询命令的使用非常灵活,用它可以构造出各种各样的查询。本节将通过大量的 实例来介绍 SELECT 查询命令的使用,通过实例具体学习各个短语的含义。 为了方便读者对照和验证操作结果,下面给出各个表的具体记录值,如图 4-1 至图 4-4 所示。 图 4-1 学生(student)表 第 4 章 结构化查询语言 SQL 121 图 4-2 课程(course)表 图 4-3 成绩(score)表 图 4-4 教师(teacher)表 4.1.1 基本查询 学习 SQL SELECT 查询语句,首先从几个最简单的查询开始,这些查询可以基于单个表 或者基于多个表,可以有简单的查询条件和连接条件。 1.单表查询 单表查询是基于一个表的所有字段的查询,可以由SELECT…FROM…[WHERE…]子句构成。 (1)单表无条件查询。 格式:SELECT [DISTINCT]<检索项>; FROM <表名> 例 4.1 从 student 表中检索出学生的学号、姓名、性别、出生日期、所在院系。 Visual FoxPro 程序设计 122 SELECT 学号,姓名,性别,出生日期,所在院系 FROM student 查询结果如图 4-5 所示。 例 4.2 查询 teacher 表中的所有信息。 方法一: SELECT 教师编号,教师姓名,性别,出生日期,所在院系,研究方向,职称,学位,学历; FROM teacher 方法二: SELECT * FROM teacher 两种方法查询的结果一致,如图 4-6 所示。 图 4-5 例 4.1 的查询结果 图 4-6 例 4.2 的查询结果 说明: 1)SELECT 短语后面接检索项,即具体要查询的内容。 2)FROM 短语指明检索项来自的表,对于 SELECT 查询语句来说,FROM 子句是必需 的,是不可以省略的。 3)当查询内容为表中所有信息时,可以用通配符“*”,表示输出表中所有字段的值。 例 4.3 将 student 表中的专业名称信息检索出来。 SELECT 专业名称 FROM student 查询结果如图 4-7 所示。 例 4.4 将 student 表中的专业名称信息检索出来(去掉重复值)。 SELECT DISTINCT 专业名称 FROM student 查询结果如图 4-8 所示。 图 4-7 例 4.3 的查询结果 图 4-8 例 4.4 的查询结果 第 4 章 结构化查询语言 SQL 123 说明:Distinct 短语的作用是去掉查询结果中的重复值。注意 Distinct 短语的位置位于需 要去掉重复值的字段名前面。 (2)单表有条件查询。 格式:SELECT [DISTINCT] <检索项> FROM <表名> WHERE <查询条件> 例 4.5 查询女教师的教师姓名、性别、出生日期、所在院系、研究方向、职称等信息。 SELECT 教师姓名,性别,出生日期,所在院系,研究方向,职称; FROM teacher WHERE 性别="女" 查询结果如图 4-9 所示。 说明:当题目中有限定条件时,需要用 WHERE 短语来指定查询条件。WHERE 短语位置 应位于 FROM 短语后面。 例 4.6 从 score 表中检索出选修了课程编号为“10002101”的,并且成绩不及格的课程 编号,课程名称,学号,姓名和成绩等信息。 方法一:SELECT 课程编号,课程名称,学号,姓名,成绩 FROM score; WHERE 课程编号="10002101" AND 成绩<60 方法二:SELECT * FROM score; WHERE 课程编号="10002101" AND 成绩<60 查询结果如图 4-10 所示。 图 4-9 例 4.5 的查询结果 图 4-10 例 4.6 的查询结果 例 4.7 检索出选修了课程编号为“10002103”或“10002115”的,并且成绩大于 70 分 的课程编号、课程名称、姓名、成绩等信息。 SELECT 课程编号,课程名称,姓名,成绩 FROM score; WHERE (课程编号="10002103" OR 课程编号="10002115") AND 成绩>70 查询结果如图 4-11 所示。 说明: 1)在查询中查询条件为两个或两个以上时,应用逻 辑运算符 AND 或 OR 将多个条件连接起来。  AND 表示相与的关系,当 AND 左右两边的条件都成立时,表达式结果才为真。  OR 表示相或的关系,当 OR 左右两边的条件有一个成立时,表达式的结果就为真。 2)在 Visual FoxPro 的命令窗口中,一行是一条命令语句,如果一条命令语句太长放在一 行上不方便,可以分成多行显示,但是需要在分行处加上续行符“;”用来表示续行。 例 4.8 从 student 表中检索出在 1980 年 12 月 31 日之后出生的所有男同学的学号、姓名、 性别、年龄、所在院系、专业名称、家庭住址等信息。 SELECT 学号,姓名,性别,YEAR(DATE())-YEAR(出生日期) AS 年龄,所在院系; 专业名称,家庭住址 FROM student; WHERE 出生日期>{^1980-12-31} AND 性别="男" 查询结果如图 4-12 所示。 图 4-11 例 4.7 的查询结果 Visual FoxPro 程序设计 124 说明: 1)YEAR(DATE())-YEAR(出生日期) 表达式:用于计算学生的年龄。 2)在表达式后可以用 AS 短语为表达式命别名。 例如,YEAR(DATE())-YEAR(出生日期) AS 年龄,则在查询结果中会出现一个新的字段 名“年龄”。 3)对于“出生日期”字段是日期型的数据,所以在书写表达式时要注意类型匹配与类型 格式,如出生日期<{^1980-01-01}。 图 4-12 例 4.8 的查询结果 2.多表连接查询 连接是关系的基本操作之一,当查询涉及多个表时,就要用到多表的连接查询。连接查 询基于多个关系的查询。下面通过几个简单的连接查询实例来学习多表连接查询。 (1)多表无条件的连接查询。 格式:SELECT <检索项> FROM <表名> WHERE <连接条件> 例 4.9 检索出学生的学号、姓名、性别、选修课程名称、所在院系和成绩等信息。 SELECT student.学号, student.姓名,性别,课程名称,所在院系,成绩; FROM student,score; WHERE student.学号=score.学号 查询结果如图 4-13 所示。 图 4-13 例 4.9 的部分查询结果 说明: 1)FROM 短语后面接多个表名。当查询涉及多个表时,将所有的表名都放在 FROM 短语 后面,并且两个表之间用逗号隔开。 2)这里“student.学号=score.学号”是连接条件。两个表能够进行连接查询的前提是两个 表一定要有相同的字段名。当 FROM 短语之后的多个表中含有相同的字段名时,必须用表名 (关系名)前缀直接指明字段名,格式如下: 表名 1.字段名=表名 2.字段名 3)SELECT 短语中的检索项如果不唯一,需要指明该检索项来自哪个表。例如,在例 4.9 中检索项学号在 student 表和 score 表中都出现了,所以要指明该学号到底来自哪个表。 例 4.10 检索选修课的课程编号、课程名称、学分和考核方式。 第 4 章 结构化查询语言 SQL 125 SELECT DISTINCT score.课程编号, score.课程名称,学分,考核方式; FROM score,course; WHERE course.课程编号=score.课程编号 查询结果如图 4-14 所示。 (2)多表有条件连接查询。 格式:SELECT <检索项> FROM <表名> WHERE <连接条件> AND <查询条件> 例 4.11 检索出所有男同学的并且成绩大于 70 的学号、姓名、性别、课程名称和成绩信息。 SELECT student.学号, student.姓名,性别,课程名称,成绩; FROM student,score; WHERE student.学号=score.学号 AND (性别="男" AND 成绩>70) 查询结果如图 4-15 所示。 图 4-14 例 4.10 的查询结果 图 4-15 例 4.11 的查询结果 说明: 1)连接条件与查询条件同时放在 WHERE 短语中,“性别="男" and 成绩>70”为查询条 件,“student.学号=score.学号”为连接条件,两个条件用 AND 连接。 2)连接条件与查询条件无先后顺序。 例 4.12 检索所有女同学的学号、姓名、课程名称、所在院系、导师姓名、研究方向和 职称等信息。 SELECT student.学号, student.姓名, score.课程名称, student.所在院系; 导师姓名,研究方向,职称; FROM student,course,score,teacher; WHERE student.学号=score.学号 AND; course.课程编号=score.课程编号 AND; course. 教师编号=teacher.教师编号 AND; student.性别="女" 查询结果如图 4-16 所示。 图 4-16 例 4.12 的查询结果 Visual FoxPro 程序设计 126 4.1.2 排序查询 利用 SQL SELECT 查询语句进行查询时可以将查询的结果进行排序,排序的短语为 ORDER BY。 格式:SELECT <检索项> FROM <表名> [WHERE <连接条件> AND <查询条件>]; ORDER BY <字段名> [ASC | DESC] [,<字段名>[ ASC | DESC]…] 例 4.13 检索出所有成绩大于 80(含 80)分的学生成绩信息,查询结果按成绩降序排列。 SELECT * FROM score WHERE 成绩>=80 ORDER BY 成绩 DESC 查询结果如图 4-17 所示。 说明:ASC 表示升序,DESC 表示降序,默认的情况表示升序。 例 4.14 检索课程表中的课程编号、课程名称、课程类别、学时、学分,按学分的升序 排序,如果学分相同则按学时降序进行排序。 SELECT 课程编号,课程名称,课程类别,学时,学分 FROM course; ORDER BY 学分 ASC,学时 DESC 查询结果如图 4-18 所示。 图 4-17 例 4.13 的查询结果 图 4-18 例 4.14 的查询结果 例 4.15 检索所有女同学的学号,姓名,出生日期,课程编号、课程名称和成绩,并按 出生日期的升序排序,再按成绩的降序排序。 SELECT student.学号, student.姓名,出生日期; score.课程编号, score.课程名称,成绩 ; FROM student,score WHERE student.学号=score.学号 AND 性别="女" ; ORDER BY 出生日期 ASC,6 DESC 查询结果如图 4-19 所示。 说明: 1)在一个查询语句中,可以按一列或多列进行排序。需要注意排序关键字之间用逗号隔开。 2)ORDER BY 短语中的排序依据可以用列序号表示,如按成绩升序排序,可以表示为 “ORDER BY 4”,其中 4 为第四列。 第 4 章 结构化查询语言 SQL 127 例 4.16 检索所有女同学的学号、姓名、年龄并按年龄升序排序。 SELECT 学号,姓名,YEAR(DATE())-YEAR(出生日期) AS 年龄; FROM student WHERE 性别="女" ORDER BY 年龄 图 4-19 例 4.15 的查询结果 图 4-20 例 4.16 的查询结果 4.1.3 计算与分组查询 1.简单的计算查询 事实上,SQL 不仅具有一般的检索能力,而且还具有计算方式的检索能力。下面介绍常 用于计算检索的函数,如表 4-2 所示。 表 4-2 常用计算函数及其功能 函数名称 格式 功能 AVG AVG(字段名) 按列计算平均值 SUM SUM(字段名) 按列计算值的总和 COUNT COUNT(字段名) 按列值统计个数 MAX MAX(字段名) 求一列中的最大值 MIN MIN(字段名) 求一列中的最小值 这些函数可以用在 SELECT 短语中对查询结果进行计算。 例 4.17 统计 student 表中有多少个学生记录。 SELECT COUNT(*) AS 人数 FROM student 查询结果如图 4-21 所示。 说明: 1)如果要统计一个表中有多少元组(行)数,可以用 COUNT(*)格式。 2)表达式“COUNT(*) AS 人数”不仅统计出表中的记录个数,而且为函数表达式命别名。 例 4.18 在 score 表中统计选修了课程编号为“10002101”的记录个数。 SELECT COUNT(*) AS人数 FROM score WHERE 课程编号="10002101" 查询结果如图 4-22 所示。 Visual FoxPro 程序设计 128 例 4.19 统计有多少个学生选修了“文艺理论基础研究”这门课程。 SELECT COUNT(*) AS 人数 FROM score WHERE 课程名称="文艺理论基础研究" 查询结果如图 4-23 所示。 图 4-21 例 4.17 的查询结果 图 4-22 例 4.18 的查询结果 图 4-23 例 4.19 的查询结果 例 4.20 统计成绩表中学生选修了多少门课程。 SELECT COUNT(DISTINCT 课程编号) AS 人数 FROM score 查询结果如图 4-24 所示。 说明:在 SQL 查询语句中,除非对表中的元组个数进行统计,一般情况下 COUNT 函数 应该使用 DISTINCT 短语。 例 4.21 计算“外国语”这门课程的平均成绩。 SELECT AVG(成绩)AS 平均分 FROM score WHERE 课程名称="外国语" 查询结果如图 4-25 所示。 例 4.22 检索 score 表中选修了“文艺理论基础研究”这门课程的最高分和最低分。 SELECT 课程名称,MAX(成绩) AS 最高分,MIN(成绩) AS 最低分 FROM score; WHERE 课程名称="文艺理论基础研究" 查询结果如图 4-26 所示。 图 4-24 例 4.20 的查询结果 图 4-25 例 4.21 的查询结果 图 4-26 例 4.22 的查询结果 例 4.23 检索 course 表中所有学位公共课的学时总和。 SELECT SUM(学时) AS 学时总和 FROM course WHERE 课程类别="学位公共课" 查询结果如图 4-27 所示。 2.分组与计算查询 GROUP BY 短语用来对查询结果进行分组,把某一列的值相 同的记录分在一组,通过计算每组产生一个结果。 格式:SELECT…FROM…[WHERE 连接条件 AND 查询条件]GROUP BY <字段名 >[HAVING <分组条件表达式>] 说明: 1)GROUP BY 短语后面可以有多个字段名,分组时把在这些字段上值相同的记录分在一组。 2)HAVING 子句总是跟在 GROUP BY 子句之后,用来限定分组必须满足的条件,不可 以单独使用。 3)与连接条件表达式并不矛盾,当一个查询命令中既有 WHERE 短语同时又有 HAVING 短语时,是先用 WHERE 子句限定元组,然后进行分组,最后再用 HAVING 子句限定分组。 例 4.24 检索成绩表中每个学生的平均成绩。 SELECT 学号,AVG(成绩)AS 平均分 FROM score GROUP BY 学号 查询结果如图 4-28 所示。 图 4-27 例 4.23 的查询结果 第 4 章 结构化查询语言 SQL 129 说明:在这个查询中,首先按学号进行分组,将学号相同的学生记录放在一起,然后再 计算每个学生所选修的所有课程的平均分。 例 4.25 检索出每个学生的学号、姓名、总分、平均分、最高分和最低分,并将结果按 总分降序排列。 SELECT score.学号,姓名, SUM(成绩) AS 总分, AVG(成绩) AS 平均分; MAX(成绩) AS 最高分,MIN(成绩) AS 最低分; FROM student,score; WHERE student.学号=score.学号; GROUP BY score.学号; ORDER BY 总分 DESC 查询结果如图 4-29 所示。 图 4-28 例 4.24 的查询结果 图 4-29 例 4.25 的查询结果 例 4.26 检索出平均分在 70 分以上的学生的学号、姓名和平均分,并将结果按平均分升 序排列。 SELECT score.学号,姓名,AVG(成绩) AS 平均分; FROM student,score; WHERE student.学号=score.学号; GROUP BY score.学号 HAVING AVG(成绩)>70; ORDER BY 平均分 查询结果如图 4-30 所示。 例 4.27 检索至少有两名学生选修的课程的平均分,检索项包含课程编号、课程名称和 平均分。 SELECT 课程编号,课程名称,AVG(成绩)AS 平均分 FROM score; GROUP BY 课程编号; HAVING COUNT(*)>=2 查询结果如图 4-31 所示。 说明: 1)ORDER BY 短语后面只能用字段名或别名,不可以用表达式。 2)“HAVING COUNT(*)>=2”表示:每一组的元组个数大于等于 2 时满足条件。 例 4.28 检索选修了两门或两门以上课程的学生的平均成绩,检索项包含学号、姓名、 平均分。 Visual FoxPro 程序设计 130 SELECT 学号,姓名,AVG(成绩) AS 平均分 FROM score; GROUP BY 学号 HAVING COUNT(*)>=2 查询结果如图 4-32 所示。 图 4-30 例 4.26 的查询结果 图 4-31 例 4.27 的查询结果 图 4-32 例 4.28 的查询结果 4.1.4 带特殊运算符的条件查询 在进行一些更复杂、涉及更多关系的检索时,往往会用到一些特殊运算符,在这里将介 绍一下可以在 SQL SELECT 查询中使用的几个特殊运算符。 1.确定范围 格式:BETWEEN…AND… 例 4.29 查询出生日期在 1980 年 1 月 1 日至 1984 年 12 月 31 日之间的学生的学号、姓 名、性别、出生日期。 SELECT学号,姓名,性别,出生日期 FROM student; WHERE 出生日期 BETWEEN {^1980-1-1} AND{^1984-12-31} 这个查询等价于: SELECT * FROM student; WHERE 出生日期>= {^1980-1-1} AND 出生日期<={^1984-12-31} 查询结果如图 4-33 所示。 说明: 1)表示“……和……之间”,显然使用它会使表达条件更清晰、更简洁。 2)BETWEEN…AND…查询的结果包括两边的界值。 例如:BETWEEN {^1980-1-1} AND{^1984-12-31} 等价于 出生日期>= {^1980-1-1} AND 出生日期<={^1984-12-31} 2.确定集合 利用 IN 操作可以查询字段值属于指定集合的记录。 格式:SELECT…FROM…; WHERE 字段名 [NOT]IN (集合) [AND 连接条件] 例 4.30 查询选修了课程编号为“10002101”或“10002107”或“10002120”,并且成绩 在 70 分以上的学生的学号、课程编号和成绩,并按成绩降序排序。 SELECT 学号,课程编号,成绩 FROM score; WHERE 课程编号 IN ("10002101","10002107","10002120") AND 成绩>70; ORDER BY 成绩 DESC 查询结果如图 4-34 所示。 第 4 章 结构化查询语言 SQL 131 例 4.31 查询没有选修课程编号为“10002101”或“10002107”或“10002120”,并且成 绩在 80 分以上的学生的学号、课程编号和成绩,并按成绩降序排序。 SELECT 学号,课程编号,成绩 FROM score ; WHERE 课程编号 NOT IN ("10002101","10002107","10002120") AND 成绩>70; ORDER BY 成绩 DESC 查询结果如图 4-35 所示。 图 4-33 例 4.29 的查询结果 图 4-34 例 4.30 的查询结果 图 4-35 例 4.31 的查询结果 说明:IN 表示在一定的范围,表示不在一定范围则在前面加 NOT,即 NOT IN。 3.部分匹配查询 以上例子均属于完全匹配查询,当不知道完全精确的値时,可以使用 LIKE 或 NOT LIKE 进行部分匹配查询(也称模糊查询)。在进行匹配运算时经常用到通配符“%”和“_”。“%” 表示 0 个或多个字符;“_”表示 1 个字符。 LIKE 的基本格式如下:SELECT…FROM…; WHERE <字段名> LIKE <字符串常量> [AND 连接条件] 例 4.32 查询所有姓“张”的学生的学号、姓名、性别、所在院系、专业名称。 SELECT 学号,姓名,性别,所在院系,专业名称; FROM student WHERE 姓名 LIKE "张%" 查询结果如图 4-36 所示。 图 4-36 例 4.32 的查询结果 图 4-37 例 4.33 的查询结果 例 4.33 查询第二个汉字是“春”的学生的学号、姓名、性别、所在院系、专业名称。 SELECT 学号,姓名,性别,所在院系,专业名称; FROM student WHERE 姓名 LIKE"_春%" 查询结果如图 4-37 所示。 4.不等于(!=) 例 4.34 查询家庭住址属于黑龙江省的并且语种 不属于俄语的学生的学号、姓名、性别、家庭住址。 SELECT 学号,姓名,性别,家庭住址 FROM student; WHERE 家庭住址 LIKE "黑龙江%" AND 语种!="俄语" 查询结果如图 4-38 所示。 图 4-38 例 4.34 的查询结果 Visual FoxPro 程序设计 132 4.1.5 利用空值查询 空值就是缺值或还没有确定值。比如表示价格的一个字段值,空值表示没有定价,而数 值 0 可能表示免费。空值与空(或空白)字符串、数值 0 等具有不同的含义。假设在 score 表 中有些学生某门课程还没有考试,则可以将成绩设为 NULL,表示成绩尚未确定,并不表示 0 分。在 SQL SELECT 查询中,空值的具体格式如下: SELECT… FROM … ; WHERE <字段名> IS [NOT]NULL [AND 连接条件] 说明: 1)<字段名>IS NULL(为空值)。 2)<字段名>IS NOT NULL(不为空值)。 3)在表达式中不能写成“=NULL”或“!=NULL” 例 4.35 检索出还没有确定授课教师的课程信息。 方法一:SELECT * FROM course WHERE 教师编号 IS NULL 方法二:SELECT * FROM course WHERE 教师姓名 IS NULL 查询结果如图 4-39 所示。 图 4-39 例 4.35 的查询结果 例 4.36 检索有哪些学院已经确定了开设哪些课程,检索内容包含课程编号、课程名称、 开课学院、课程类别。 SELECT 课程编号,课程名称,开课学院,课程类别; FROM course; WHERE 开课学院 IS NOT NULL 查询结果如图 4-40 所示。 图 4-40 例 4.36 的查询结果 第 4 章 结构化查询语言 SQL 133 4.1.6 嵌套查询 接下来讨论另一类基于多个关系的查询,这类查询所要求的结果出自一个关系,但相关 的条件却涉及多个关系。 格式:SELECT…FROM…WHERE…(SELECT…FROM…WHERE…) 说明: 1)在嵌套查询中有两层 SELECT…FROM…[WHERE…]查询块,即内层查询块和外层查 询块,内层查询(括号里的查询)也叫子查询,外层查询也叫主查询。 2)在进行查询时,先执行子查询,子查询形成一个结果作为主查询的条件,然后再进行 外层的主查询。 在嵌套查询中子查询的常用谓词和量词有以下几种。 1.带有 IN或 NOT IN运算符的嵌套查询 由于在嵌套查询中,子查询的结果往往是一个集合,所以运算符 IN 和 NOT IN 是嵌套查 询中最经常使用的谓词。带有 IN 或 NOT IN 运算符的嵌套查询是指主查询与子查询之间用 IN 或 NOT IN 连接,用来判断某个属性列值是否在子查询的结果中。 格式:SELECT…FROM…WHERE…IN(SELECT…FROM…WHERE…) 说明: 1)在子查询中 SELECT 后的字段名必须与主查询中 IN 短语前面的字段名相同。 2)子查询中不能有 ORDER BY 排序短语。 例 4.37 将所有选修了“英语文体学”这门课程并且成绩大于 70 分的学生的学号、姓名、 性别、所在院系、专业名称等信息检索出来。 SELECT 学号,姓名,性别, 所在院系,专业名称; FROM student; WHERE 学号 IN (SELECT 学号 FROM score; WHERE 课程名称="英语文体学" AND 成绩>70) 等价于: SELECT student.学号, student.姓名,性别, 所在院系,专业名称; FROM student,score; WHERE student.学号=score.学号 AND 成绩>70 AND 课程名称="英语文体学" 查询结果如图 4-41 所示。 例 4.38 检索没有被选修的课程的课程名称、课程类别、学时、学分、考核方式等信息。 SELECT 课程名称,课程类别,学时,学分,考核方式 FROM course; WHERE 课程编号 NOT IN (SELECT 课程编号 FROM score) 查询结果如图 4-42 所示。 图 4-41 例 4.37 的查询结果 图 4-42 例 4.38 的查询结果 Visual FoxPro 程序设计 134 例 4.39 检索没有确定授课的教师信息,查询内容包括教师姓名、出生日期、所在院系、 研究方向、职称、学位。 SELECT 教师姓名,出生日期,所在院系,研究方向,职称,学位 FROM teacher; WHERE 教师编号 NOT IN (SELECT 教师编号 FROM course) 查询结果如图 4-43 所示。 2.带有比较运算符的嵌套查询 带有比较运算符的子查询是指主查询与子查询之间用比较运算符进行连接。当能确切知 道内层查询返回的是单值时,可以用<、<=、>、>=、<>、!=等运算符。 格式:SELECT…FROM…WHERE…比较运算符(SELECT…FROM…WHERE…) 例 4.40 检索成绩高于平均分的学生的学号、姓名、课程名称、成绩,并按成绩降序排 序。 SELECT 学号,姓名,课程名称,成绩 FROM score; WHERE 成绩> (SELECT AVG(成绩) FROM score) ORDER BY 成绩 DESC 查询结果如图 4-44 所示。 图 4-43 例 4.39 的查询结果 图 4-44 例 4.40 的查询结果 3.带有 ANY、ALL、SOME量词的嵌套查询 ANY、ALL 和 SOME 为量词,ANY 和 SOME 是同义词,在进行比较运算时只要子查询 中有一个记录能使结果为真,则结果为真;ALL 则要求子查询中的所有记录都使结果为真时, 结果才为真。 格式:SELECT…FROM…; WHERE<表达式><比较运算符>[ANY|ALL|SOME](SELECT…FROM… [WHERE…]) 例 4.41 查询学分最高的课程信息。 方法一:SELECT * FROM course WHERE 学分>=ALL (SELECT 学分 FROM course) 方法二:SELECT * FROM course WHERE NOT 学分< ANY (SELECT 学分 FROM course) 方法三:SELECT * FROM course WHERE NOT 学分< SOME (SELECT 学分 FROM course) 方法四:SELECT * FROM course WHERE 学分= (SELECT MAX(学分) FROM course) 查询结果如图 4-45 所示。 第 4 章 结构化查询语言 SQL 135 图 4-45 例 4.41 的查询结果 例 4.42 查询学分不是最高的课程信息。 方法一:SELECT * FROM course; WHERE 学分 <别名> 例 4.45 查询学生的姓名,性别和所选修课程的课程名称、学分、学时和成绩信息,要 求成绩必须大于 80 分,且按成绩降序排列。 SELECT student.姓名,性别, score.课程名称,学分,学时,成绩; FROM student,course, score ; WHERE student.学号=score.学号 AND ; course.课程编号=score.课程编号 AND 成绩>80 ; ORDER BY 成绩 DESC 在上面的查询中,如果使用别名会简单一些。下面给出利用别名的查询语句,它与上面 查询是等价的。 SELECT S.姓名,性别, SC.课程名称,学分,学时,成绩; FROM student S,course C, score SC; WHERE S.学号=SC.学号 AND C.课程编号=SC.课程编号 AND 成绩>80; ORDER BY 成绩 DESC 查询结果如图 4-48 所示。 图 4-48 例 4.45 的查询结果 说明:在上面的例子中,别名并不是必需的,但是在关系的自连接操作中,别名则是必 不可少的。SQL 不仅可以对多个关系实行连接操作,也可将同一关系与其自身进行连接,这 种连接就称为自连接。在这种自连接操作关系上,本质上存在着一种特殊的递归联系,也就是 关系中的一些元组,根据出自同一值域的两个不同的属性,可以与另外一些元组有一种对应关 系(一对多的联系)。注:元组即记录。 下面以“先修课”表为例介绍自连接,在“先修课”关系中,“课程编号”与“先修课” 出自一个值域,一门课可以是多门课程的先修课。 例 4.46 试查询某门课程的先修课的课程名称。 分析 定性数据统计分析pdf销售业绩分析模板建筑结构震害分析销售进度分析表京东商城竞争战略分析 :需要利用自连接,首先将“先修课”表另起两个别名,分别为 XS1 和 XS2,代表 两个表(如图 4-49 所示),然后可以类似多表连接查询的操作进行查询即可。 图 4-49 “先修课”表 XS1 XS2 第 4 章 结构化查询语言 SQL 137 SELECT XS1.课程编号,XS2.课程名称; FROM 先修课 XS1,先修课 XS2; WHERE XS1.先修课=XS2.课程编号 查询结果如图 4-50 所示。 4.1.8 超连接查询 在 SQL 标准中还提供了一种新的连接运算:超连接运算。它与原来所了解的等值连接和 自然连接不同。原来的连接是只有满足连接条件,相应的结果才会出现在结果表中;而超连接 运算是,首先保证一个表中满足条件的元组都在结果中,然后将满足连接条件的元组与另一个 表中的元组进行连接,不满足连接条件的则应将来自另一表的属性置为空值。 在一般 SQL 中的超连接运算符是“* =”和“= *”。 “* =”也叫左连接:含义是在结果表中包含第一个表中满足条件的所有记录;如果有在 连接条件上匹配的元组,则第二个表返回相应值,否则第二个表返回空值。 “= *”也叫右连接:含义是在结果表中包含第二个表中满足条件的所有记录;如果有在 连接条件上匹配的元组,则第一个表返回相应值,否则第一个表返回空值。 在 Visual FoxPro 中不支持“* =”和“= *”这个超连接运算符,而对于 Visual FoxPro 有 专门的连接运算格式,它们支持超连接查询。 格式:SELECT <检索项>; FROM <表名 1>INNER|LEFT|RIGHT|FULL JOIN <表名 2>; ON <连接条件>; WHERE <查询条件> 说明: 1)INNER JOIN 短语:等价于 JOIN 为普通连接。在 Visual FoxPro 中称为内部连接。 2)LEFT JOIN 短语:为左连接。 3)RIGHT JOIN 短语:为右连接。 4)FULL JOIN 短语:为全连接。即两个表中的记录不管是否满足连接条件将都在目标表 或查询结果中出现,不满足连接条件的记录对应部分为 NULL。 5)ON 短语:用于指定连接条件。 6)在超连接查询中,连接条件与查询条件要分开并且放在不同的命令短语后面。 7)4 种超连接类型:在查询过程中,超连接类型在 FROM 短语中给出。 下面通过例题来观察超连接运算。用到 score 表和 student 表,如图 4-51 和图 4-52 所示。 图 4-51 score 表 图 4-52 student 表 例 4.47 内部连接。即只有满足连接条件的记录才出现在查询结果中。 图 4-50 例 4.46 查询结果 Visual FoxPro 程序设计 138 SELECT student.姓名, 成绩; FROM student INNER JOIN score; ON student.学号 = score.学号 等价于 SELECT student.姓名, 成绩; FROM student, score; WHERE student.学号 = score.学号 查询结果如图 4-53 所示。 例 4.48 左连接。即除满足连接条件的记录出现在查询结果中外,第一个表中不满足连 接条件的记录也出现在查询结果中。 SELECT student.姓名, 成绩; FROM student LEFT JOIN score; ON student.学号 = score.学号 查询结果如图 4-54 所示。 例 4.49 右连接。即除满足连接条件的记录出现在查询结果中外,第二个表中不满足连 接条件的记录也出现在查询结果中。 SELECT student.姓名, 成绩; FROM student RIGHT JOIN score; ON student.学号 = score.学号 查询结果如图 4-55 所示。 图 4-53 例 4.47 的查询结果 图 4-54 例 4.48 的查询结果 图 4-55 例 4.49 的查询结果 例 4.50 全连接。即除满足连接条件的记录出现在查询结果中外,两个表中不满足连接 条件的记录也出现在查询结果中 SELECT student.姓名, 成绩; FROM student FULL JOIN score; ON student.学号 = score.学号 查询结果如图 4-56 所示。 例4.51 用SQL语句性别为“男”且考试成绩在85分以上(含85分)的学生的全部信息, 并将结果按学号升序存入自由表nine.dbf文件中(结构同student,并在其后加入成绩字段)。 SELECT student.*,score.成绩; FROM course INNER JOIN score; INNER JOIN student
本文档为【结构化查询语言】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
下载需要: 免费 已有0 人下载
最新资料
资料动态
专题动态
is_177753
暂无简介~
格式:pdf
大小:1MB
软件:PDF阅读器
页数:36
分类:其他高等教育
上传时间:2013-07-13
浏览量:94