第 3 章 结构化查询语言
本实训的目的是掌握 Visual FoxPro 所支持的 SQL 语言,主要包括数据定义功能、数据操 纵功能和数据查询功能。 一、知识体系 本章重点:数据查询。 本章难点:分组统计查询、联接查询、嵌套查询。 二、实训环节 实训供选用的表参见主教材中的表 2.1 至表 2.3。实训 3.1 数据定义功能
任务目标 掌握表的创建(CREATE TABLE)、修改(ALTER TABLE)和撤消(DROP TABLE)的 SQL 命令。 实训内容与步骤 【例 3.1】创建表结构,利用 SQL 语言创建如表 3.1 所示的院系表。 表 3.1 院系表结构 字段名 类型 宽度 院系代号 C 18 院系名称 C 20 SQL 数据定义功能 数据操纵功能 数据查询功能 表创建 CREATE TABLE 表修改 ALTER TABLE 表撤消 DROP TABLE 数据添加 INSERT 数据修改 UPDATE 数据删除 DELETE 简单查询 联接查询 分组统计查询 嵌套查询 查询去向设置打开主教材第 2 章所建的“学生管理”数据库,在命令窗口中输入: CREATE TABLE 院系表(院系代号 C(18), 院系名称 C(20) ) 上述命令运行后,可以在相应的文件目录下找到新建的院系表。 【例 3.2】修改表结构:向院系表中添加一个新字段“系主任” ,字符型,宽度为 10。 在命令窗口中输入: ALTER TABLE 院系表 ADD 系主任 C(10) 命令执行后,在“表设计器”对话框中可以看到院系表结构。 【例 3.3】撤消表结构:创建一个新表 TABLE1,包含 ID1 C(10)和 ID2 C(20)两个字段, 然后再撤消该表。 步骤 1:创建新表 TABLE1,在“浏览”窗口中输入如下命令:CREATE TABLE TABLE1 (ID1 C(10),ID2 C(20)),命令执行后,在“表设计器”对话框中可以看到表 TABLE1 的结构, 如图 31 所示。 图 31 TABLE1 表结构 步骤 2:撤消表 TABLE1,在“浏览”窗口中输入如下命令:DROP TABLE TABLE1,命 令执行后,在表文件存储目录下新建的 TABLE1 表被删除。 【关键知识点】 SQL 语言数据定义功能:CREATE TABLE、ALTER TABLE、DROP TABLE。 【拓展与思考】 利用 SQL 语句实现表定义与 Visual FoxPro 自身的表定义实现方式有什么不同?
实训 3.2 数据操纵功能
任务目标 掌握数据添加(INSERT)、数据修改(UPDATE)和数据删除(DELETE)的 SQL 命令。 实训内容与步骤 1.添加记录。 【例 3.4】利用 SQL 语句向院系表中添加 10 条记录。在命令窗口中输入: INSERT INTO 院系表 VALUES('A','中医临床学院','张义') INSERT INTO 院系表 VALUES('B','针灸骨伤临床学院','张亮') INSERT INTO 院系表 VALUES('C','药学院','李宁') INSERT INTO 院系表 VALUES('D','中西医结合临床学院','李一山') INSERT INTO 院系表 VALUES('E','医药信息管理学院','王宁') INSERT INTO 院系表 VALUES('F','护理学院','李娜') INSERT INTO 院系表 VALUES('G','人文学院','谷凡') INSERT INTO 院系表 VALUES('H','医药信息工程学院','吴西') INSERT INTO 院系表 VALUES('I','国际交流学院','刘义阳') INSERT INTO 院系表 VALUES('J','体育学院','刘敏珊') 命令执行完成后,浏览院系表查看结果。 【例 3.5】利用 SQL 语句向课程表(KC.DBF)中添加一条记录。 在命令窗口中输入: INSERT INTO KC VALUES('1009','计算机编程基础',36) 命令执行完成后,浏览 KC 表可以在表尾看到新添加的数据记录,如图 32 所示。 图 32 在 KC 表中添加记录 【例 3.6】利用 SQL 语句向成绩表(CJ.DBF)中添加一条记录。 在命令窗口中输入: INSERT INTO CJ VALUES('10431075','1002',87) 命令执行完成后,浏览 CJ 表可以在表尾看到新添加的数据记录。 2.修改记录。 【例 3.7】将 CJ 表中学号为 10431075 的学生 1002 号课程的成绩加 2 分。 在命令窗口中输入:
UPDATE CJ SET 成绩=成绩+2 WHERE 课程号='1002' AND 学号='10431075' 命令执行完成后,浏览 CJ 表可以看到修改后 CJ 表的内容。
【例 3.8】修改 KC 表中“计算机编程基础”的学时数为 54。 在命令窗口中输入:
UPDATE KC SET 学时数=54 WHERE 课程名='计算机编程基础' 命令执行完成后,浏览 KC 表,数据记录如图 33 所示。
图 33 KC 表数据修改
【例 3.9】修改院系表中“人文学院”的系主任为“吴歌” 。
在命令窗口中输入:
UPDATE 院系表 SET 系主任='吴歌' WHERE 院系名称='人文学院' 命令执行完成后,浏览院系表,如图 34 所示。 图 34 院系表数据修改 3.删除记录。 【例 3.10】逻辑删除 CJ 表中学号为 10431075 的学生的成绩记录。 在命令窗口中输入: DELETE FROM CJ WHERE 学号='10431075' 命令执行完成后,浏览 CJ 表,可以看到学号为 10431075 的学生的成绩记录打上了删除 标记。 【例 3.11】逻辑删除院系表中“体育学院”的相应记录。 在命令窗口中输入: DELETE FROM 院系表 WHERE 院系名称='体育学院' 命令执行完成后,使用“浏览”菜单可以看到院系表中“体育学院”的相应记录打上了 删除标记。 【关键知识点】 SQL 语言的数据操纵功能:INSERT、UPDATE、DELETE。 【拓展与思考】 利用 SQL 语句实现表数据的添加、修改和删除操作的方式与 Visual FoxPro 自身的相关实 现方式有什么不同?
实训 3.3 数据查询功能
任务目标 1.掌握 SQL 语言的数据查询命令,主要包括简单查询、联接查询(内联接、左联接、右 联接、全联接)、嵌套查询、分组查询。 2.掌握 SQL 查询的 SELECT、FROM、WHERE、GROUP BY、ORDER BY 等短语的 使用。 实训内容与步骤 1.简单查询。 【例 3.12】查询 KC 表中的所有信息。 在命令窗口中输入: SELECT * FROM KC 【例 3.13】查询 2009 药学 1 班所有学生的学号、姓名和专业。 在命令窗口中输入: SELECT 学号,姓名,专业 FROM XS WHERE 班级='2009 药学 1' 查询结果如图 35 所示。 图 35 指定班级学生查询结果 【例 3.14】查询所有非汉族的女生学号、姓名、专业、民族和班级信息。 在命令窗口中输入:SELECT 学号,姓名,专业,民族,班级 FROM XS WHERE 民族!='汉' AND 性别='女' 查询结果如图 36 所示。 图 36 少数民族女生信息查询结果 【例 3.15】查询 CJ 表中所有考试学生的学号(不过滤重复记录)。 在命令窗口中输入: SELECT ALL 学号 FROM CJ 查询结果如图 37 所示。
【例 3.16】查询 CJ 表中所有考试学生的学号(过滤重复记录)。 在命令窗口中输入: SELECT DISTINCT 学号 FROM CJ 查询结果如图 38 所示。 图 37 所有考试学号 图 38 考试学号(过滤重复) 【例 3.17】查询课程号为 1004 的课程成绩在 60~70 分之间的记录。 在命令窗口中输入:
SELECT * FROM CJ WHERE 成绩 BETWEEN 60 AND 70 AND 课程号='1004' 查询结果如图 39 所示。
图 39 成绩查询 本例命令也可以写成:
SELECT * FROM CJ WHERE 成绩>=60 AND 成绩<=70 【例 3.18】查询所有姓李的学生信息。
在命令窗口中输入:
SELECT * FROM XS WHERE 姓名 LIKE '李%' 查询结果如图 310 所示。
【例 3.19】查询所有 1003 号课程成绩信息,并按成绩降序显示前 3 名的成绩。 在命令窗口中输入:
SELECT * FROM CJ WHERE 课程号='1003' ORDER BY 成绩 DESC TOP 3 查询结果如图 311 所示。 图 311 成绩降序排列查询结果 2.联接查询。 【例 3.20】查询参加 1004 号课程考试的学生的学号、姓名、班级、课程号和成绩(内 联接) 。 在命令窗口中输入: SELECT XS.学号,姓名,班级,课程号,成绩; FROM CJ JOIN XS ON CJ.学号=XS.学号 WHERE 课程号='1004' 查询结果如图 312 所示。 图 312 内联接查询结果 【例 3.21】查询所有院系的学生情况,要求查询结果显示院系代号、院系名称、学号、 姓名、专业和班级信息(外联接) 。 在命令窗口中输入(左外联接) : SELECT 院系表.院系代号,院系名称,学号,姓名,专业,班级;
FROM 院系表 LEFT JOIN XS ON 院系表.院系代号=XS.院系代号 查询结果如图 313 所示。
本例命令也可以写成(右外联接):
SELECT 院系表.院系代号,院系名称,学号,姓名,专业,班级;
图 313 左外联接查询结果 3.分组与统计查询。 【例 3.22】统计 XS 表中“中医”专业的学生人数。 在命令窗口中输入: SELECT COUNT(学号) FROM XS WHERE 专业='中医' 查询结果如图 314 所示。 图 314 中医专业人数统计结果 【例 3.23】统计 1004 号课程的总成绩和平均成绩。 在命令窗口中输入: SELECT SUM(成绩),AVG(成绩) FROM CJ WHERE 课程号='1004' 查询结果如图 315 所示。 图 315 课程总成绩和平均成绩查询结果 【例 3.24】查询 CJ 表中 1003 号课程成绩的最高分和最低分。 在命令窗口中输入: SELECT MAX(成绩),MIN(成绩) FROM CJ WHERE 课程号='1003'
查询结果如图 316 所示。 图 316 课程成绩最高分与最低分查询结果 【例 3.25】分组统计 XS 表中每个院系的学生人数。 在命令窗口中输入: SELECT 院系代号,COUNT(*) FROM XS GROUP BY 院系代号 查询结果如图 317 所示。 图 317 各院系人数分组统计查询结果 【例 3.26】统计每位学生的考试总成绩和考试科目数。 在命令窗口中输入: SELECT 学号,SUM(成绩),COUNT(*) FROM CJ GROUP BY 学号 查询结果如图 318 所示。 图 318 学生总分与科目数分组统计结果
【例 3.27】统计查询考试科目在 2 门以上的学生的平均成绩和考试科目数。 在命令窗口中输入: SELECT 学号,AVG(成绩),COUNT(*) FROM CJ; GROUP BY 学号 HAVING COUNT(*)>=2 查询结果如图 319 所示。 图 319 分组统计查询结果 4.嵌套查询。 【例 3.28】查询护理学院的学生的学号、姓名和籍贯。 在命令窗口中输入: SELECT 学号,姓名,籍贯 FROM XS WHERE 院系代号 =;
(SELECT 院系代号 FROM 院系表 WHERE 院系名称='护理学院') 查询结果如图 320 所示。 图 320 学生信息嵌套查询结果 【例 3.29】查询课程“计算机基础”的所有考试成绩信息。 在命令窗口中输入: SELECT * FROM CJ WHERE 课程号=; (SELECT 课程号 FROM KC WHERE 课程名='计算机基础') 查询结果如图 321 所示。 图 321 课程成绩信息嵌套查询结果
5.查询结果去向设置。 【例 3.30】查询所有 1002 号课程成绩,并将查询结果保存到新表“大学英语成绩”中。 在命令窗口中输入: SELECT * FROM CJ WHERE 课程号='1002' INTO DBF 大学英语成绩 USE 大学英语成绩 BROW 命令执行结果如图 322 所示。 图 322 查询结果去向设置 【关键知识点】 1.简单查询:SELECT、FROM、WHERE、ORDER BY、TOP n。 2.联接查询:INNER JOIN、LEFT OUTER JOIN、RIGHT OUTER JOIN、FULL JOIN。 3.分组统计查询:COUNT、SUM、AVG、MAX、MIN、GROUP BY、HAVING。 4.嵌套查询:内查询、外查询。 5. 查询去向设置: TO SCREEN、 TO FILE、 TO PRINTER、 INTO CURSOR、 INTO TALBE、 INTO ARRAY。 【拓展与思考】 利用 SQL 语句实现数据查询与 Visual FoxPro 的数据查询有什么不同? 三、常见错误和难点分析 1.简单查询中,多重条件表达 AND、OR 连接符号的使用。 2.多表联接查询,容易遗漏联接条件。 3.分组统计查询,分组依据列容易判断错误,并且分组统计查询 SELECT 短语中只能是 分组依据列或统计函数,不可以是其他列。 4.嵌套查询使用过程中,内外层嵌套之间的衔接,关键谓词如 IN、=等的使用,需要多 加注意。