《Visual FoxPro数据库技术及应用第7章SQL结构化查询语言》由会员分享,可在线阅读,更多相关《Visual FoxPro数据库技术及应用第7章SQL结构化查询语言(78页珍藏版)》请在金锄头文库上搜索。
1、Visual FoxPro数据库技术及应用第第 7 章章SQL结构化查询语言结构化查询语言1返回返回第 7 章 SQL结构化查询语言结构化查询语言7.0 简介7.1 SQL的数据定义功能7.2 SQL的数据操作功能7.3 SQL的数据查询功能2返回返回简介SQL是结构化查询语言,SQL语言已成为关系型数据库的标准查询语言SQL语句的功能分类 数据定义:DDL CREATE、ALTER 数据操纵:DML UPDATE、DELETE和INSERT 数据控制(应用于网络数据库):DCL GRANT(授权)和REVOKE(收回授权) 数据查询(SQL的核心):DSL SELECT3返回返回简介SQL语
2、言的主要特点是 (1)SQL语言是一种一体化的语言,提供了完整的数据定义和操纵功能。 (2)SQL语言具有完备的查询功能。 (3)SQL语言非常简洁,易学易用。 (4)SQL语言是一种高度非过程化的语言。 (5)SQL语言的执行方式多样。 (6)SQL语言不仅能对数据表进行各种操作,也可对视图进行操作。 4返回返回简介1、数据定义语句(一)创建 CREATE TABLE 创建数据表 CREATE VIEW 创建视图 CREATE DADABASE创建数据库 (二)删除 DELETE DATABASE 删除数据库(三)修改 ALTER TABLE修改数据表结构5返回返回简介2、数据操纵语句(一)
3、修改数据表记录UPDATE UPDATE SET =表达式;WHERE (二)删除数据表记录DELETE DELETE FROM WHERE (三)插入数据表记录 INSERT INTO ; (字段名列表) VALUES() INSERT INTO ; FROM ARRAY INSERT INTO ; FROM MEMVAR6返回返回简介 3、数据控制语句有GRANT和REVOKE两个语句。命令对运行于网络上的数据库进行操作。 GRANT用来授予用户对数据库的操作权限REVOKE用来收回用户对数据库的操作权限7返回返回7.1 SQL的数据定义功能7.1.1 创建和删除数据库表7.1.2 创建和
4、删除视图7.1.3 修改数据库表8返回返回7.1.1创建和删除数据库表7.1.1 创建和删除数据库表1、创建数据库表CREATE TABLE | DBF 表名1 ( 字段名1 字段类型 (字段宽度,小数位) NULL | NOT NULL CHECK 逻辑表达式1 ERROR 文本信息1 DEFAULT 表达式1 PRIMARY KEY | UNIQUE REFEENCES 表名2 TAG 标识名1 ,字段名2 ) ,PRIMARY KEY 表达式2 TAG 标识2 |,UNIQUE 表达式3 TAG 标识3 ,FOREIGN KEY 表达式4 TAG 标识4 NODUP REFERENCES
5、 表名3 TAG 标识5 ,CHECK 逻辑表达式2 ERROR 文本信息2 )9返回返回7.1.1创建和删除数据库表【例7.2】 在stu1数据库中,建立学生信息表 OPEN DATABASE STU1 CREATE TABLE 学生信息(学号 C(6) PRIMARY KEY, 姓名 C(8) NOT NULL,性别 C(2), 年龄 N(3) CHECK 年龄10 AND 年龄20 AND 年龄18 AND 年龄45ALTER TABLE 研究生 ALTER 入学日期 SET DEFAULT CTOD(09/01/2007)【例7.14】 删除例7.13“研究生”表中对“年龄”字段的CH
6、ECK约束。ALTER TABLE 研究生 ALTER 年龄 DROP CHECK26返回返回7.1.3 修改数据库表3、语句格式3(删除指定表中的指定字段、修改字段名、修(删除指定表中的指定字段、修改字段名、修改指定表的完整性规则,包括主索引、外索引、候选索引改指定表的完整性规则,包括主索引、外索引、候选索引及表的合法值限定的添加或删除及表的合法值限定的添加或删除 )ALTER TABLE 表名1 DROP COLUMN 字段名3 SET CHECK 逻辑表达式3 ERROR 文本信息3 DROP CHECK ADD PRIMARY KEY 表达式3 TAG 标识2 DROP PRIMARY
7、 KEY ADD UNIQUE 表达式4 TAG 标识3 DROP UNIQUE TAG 标识4 ADD FOREIGN KEY 表达式5 TAG 标识4 REFERENCES表名2 TAG 标识5 DROP FOREIGN KEY TAG 标识6 SAVE RENAME COLUMN 字段名4 TO字段名5 NOVALIDATE 27返回返回7.1.3 修改数据库表【例7.15】 删除例7.2中建立的“学生信息”表的主索引。ALTER TABLE 学生信息 DROP PRIMARY KEY【例7.16】 用ALTER TABLE语句重新建立例7.15中被删除的“学生信息”表主索引。ALTER
8、 TABLE 学生信息 ADD PRIMARY KEY 学号 TAG 学号【例7.17】 删除例7.4中建立的“选课信息”表的外索引“学号”。ALTER TABLE 选课信息 DROP FOREIGN KEY TAG 学号28返回返回7.1.3 修改数据库表【例7-18】 用ALTER TABLE语句重新建立例7.17中被删除的“选课信息”表外索引“学号”。ALTER TABLE 选课信息 ADD FOREIGN KEY 学号 TAG 学号 REFERENCES 学生信息 TAG 学号【例7.19】将“学生信息”表中的“入学年月”字段名修改为“入学日期”。ALTER TABLE 学生信息 RE
9、NAME COLUMN 入学年月 TO 入学日期29返回返回7.2 SQL的数据操作功能7.2.1记录的插入7.2.2记录的修改7.2.3记录的删除30返回返回7.2.1记录的插入1、语句格式1INSERT INTO 表名字段名1,字段名2, VALUES(表达式1表达式2,)在指定表的表尾添加一条新记录,其值为VALUES后面的值。当需要插入表所有字段的数据时,表名后面的字段可以缺省,但插入数据的格式必须与表的结构完全吻合。若只需要插入表中某些字段的数据,那么就需要列出插入数据的字段名,且位置应与表对应。 31返回返回7.2.1记录的插入【例7.20】向“学生信息”表插入数据。INSERT
10、INTO 学生信息 VALUES(081001,张小四,男, 20,.T., CTOD(09/01/2007)如果只想插入部分数据,则SQL语句为:INSERT INTO 学生信息(学号,姓名,性别,年龄); VALUES(081002,周倩雯,女,21)32返回返回7.2.1记录的插入2、语句格式2INSERT INTO 表名 FROM ARRAY 数组名添加一条新记录到指定的表中。数组中元素与表中各字段顺序对应。如果数组中元素的数据类型与其对应的字段类型不一致,则新记录对应的字段为空值。如果表中字段个数大于数组元素的个数,则多出的字段为空值。33返回返回7.2.1记录的插入【例7.21】先
11、定义一个数组A(6),并赋予一组合适的值。再利用SQL命令将此数组的值作为新记录插入到“学生信息”表中。DIMENSION A(6)A(1)=081003A(2)=张华A(3)=女A(4)=19A(5)=.F.A(6)=CTOD(09/01/2008)INSERT INTO 学生信息学生信息 FROM ARRAY A34返回返回7.2.2记录的修改语句格式为:UPDATE 数据库名!表名 SET 列名1 = 表达式1 ,列名2 = 表达式2 WHERE 条件表达式1AND|OR条件表达式2UPDATE 指明将要修改的记录所在的表名和数据名。SET 指明被修改的字段及该字段的新值。如果省略WHE
12、RE子句,则该字段每一行都用同样的值来更新。WHERE指明将要修改的记录,即表中符合条件表达式的记录。35返回返回7.2.2记录的修改【例7.23】 将“选课信息”表中的所有课程号为“1001”成绩都分别提高5分,课程号为“1006”成绩置为空值。UPDATE 选课信息SET 成绩=成绩+5WHERE 课程号 = ”1001”UPDATE 选课信息SET 成绩=NULLWHERE 课程号 = 100636返回返回7.2.3记录的删除语句格式为:DELETE FROM 数据库名!表名WHERE 条件表达式1AND | OR 条件表达式2 WHERE指明VFP只对满足条件的记录加删除标记。 置了删
13、除标记的记录并没有从物理上删除,只有执行了PACK命令,才能真正从物理上删除。置了删除标记的记录可以用RECALL命令取消删除标记。 37返回返回7.2.3记录的删除【例7.24】 将“选课信息”表中的学号为“081004”的记录全部逻辑删除,然后彻底删除。DELETE FROM 选课信息;WHERE 学号 = 081004PACK 38返回返回7.3 SQL的数据查询功能7.3.1简单查询7.3.2嵌套查询7.3.3连接查询7.3.4分组及使用库函数查询7.3.5查询结果的合并39返回返回7.3 SQL的数据查询功能SELECT-SQL语句格式 :SELECT ALL | DISTINCT
14、TOP 数值表达式 PERCENT 表别名. 检索项 AS 列名 , 表别名. 检索项 AS列名 .FROM 数据库名!表名AS 逻辑别名INTO 目标 | TO FILE 文件名 | TO PRINTER | TO SCREENWHERE 连接条件 AND连接条件. AND | OR 条件表达式 AND | OR 条件表达式 .GROUP BY 列名 , 列名 .HAVING 条件表达式UNION ALL SELECT语句ORDER BY 排序项 ASC | DESC ,排序项ASC | DESC .40返回返回7.3 SQL的数据查询功能整个语句的含义为:根据WHERE子句子句中的条件表达
15、式条件表达式,从一个或多个表中找出满足条件的记录,按SELECT子句子句中的目标列目标列,选出记录中的分量形成结果表。如果有ORDER子句子句,则结果表要根据指定的表达式按升序(ASC)或降序(DESC)排序排序。如果有GROUP子句子句,则将结果按列名分组分组,根据HAVING指出的条件,选取满足该条件的选取满足该条件的组组予以输出。 41返回返回实例如:SELECT * FROM STUDENT 该语句将查询输出数据表STUDENT的所有记录如:SELECT 学号,姓名学号,姓名 FROM 学生;学生; WHERE 性别性别=男男 该语句将查询输出学生表所有男生的学号和姓名如:SELECT
16、 * FROM 学生选课学生选课; ORDER BY 学号学号; GROUP BY 学号学号 该语句将根据学生选课表查询输出已选了课的学生的信息42返回返回7.3.1简单查询格式:格式:Select Select All|DistinctAll|Distinct | From AS 别名 Where AND连接条件.示例:示例:SELECT * FROM 学生SELECT 姓名姓名,年龄年龄, 性别性别 FROM 学生表SELECT avg(年龄年龄) as 平均年龄 FROM 学生表SELECT 学号,姓名,数学数学+英语英语+政治政治+计算机计算机 as 总分 FROM 成绩表43返回返回
17、7.3.1简单查询使用谓词筛选记录使用谓词筛选记录1.ALL ALL 全部记录SELECT ALL * FROM 学生选课2.DISTINCT DISTINCT 过滤重复记录列出所有有选修课的学号SELECT DISTINCT 学号 FROM 学生选课3.TOP TOP 仅取前N 条列出学生表前3个学生的全部信息SELECT TOP 3 * FROM 学生 ORDER BY 学号注意:注意:1) TOP是指逻辑头,若存在排序,则是排序后的TOP2)使用TOP短语时,要求同时带有ORDER BY短语。44返回返回7.3.1简单查询【例7.26】 列出计算机专业学生的学号和姓名。SELECT 学号
18、学号,姓名姓名;FROM 学生学生;WHERE 专业专业 = “计算机计算机”使用WHERE子句作为查询的限制条件,只选择出满足条件的那些行中的相应数据。 【例7.27】 在“学生选课”表中列出所有选课的所有选课的学生学生学号。SELECT DISTINCT 学号学号;FROM 学生选课学生选课“学生选课”表中存储着选课学生的学号,有些学生同时选了几门课,如果直接用SELECT选取就会出现重复记录。因此,加DISTINCT可去掉重复行。 45返回返回7.3.1简单查询【例7.28】 根据“学生”表查询所有入学成绩大于500分的女生的姓名、性别、专业和入学成绩,并按入学成绩升序排列记录。SELE
19、CT 学号学号,性别性别,专业专业,入学成绩入学成绩 FROM 学生学生;WHERE 性别性别 = 女女 AND 入学成绩入学成绩 500;ORDER BY 入学成绩入学成绩 ASCORDER BY子句中的ASC是用来指明显示结果的顺序,在此处可以不加,因为ORDER BY默认为升序排序。此外,多个查询条件可以用逻多个查询条件可以用逻多个查询条件可以用逻多个查询条件可以用逻辑运算符辑运算符辑运算符辑运算符ANDAND、OROR、NOTNOT连接连接连接连接。 46返回返回7.3.1简单查询【例7.29】 在“学生”表中列出非非计算计算机机专业学生的学号、姓名及专业。SELECT 学号学号,姓名
20、姓名,专业专业 FROM 学生学生;WHERE 专业专业 计算机计算机或SELECT 学号学号,姓名姓名,专业专业 FROM 学生学生;WHERE 专业专业 != 计算机计算机或SELECT 学号学号,姓名姓名,专业专业 FROM 学生学生;WHERE NOT(专业专业 = 计算机计算机)47返回返回7.3.1简单查询SELECT-SQL语句的查询方式很丰富,在WHERE子句中可以用关系运算符关系运算符、逻辑逻辑运算符运算符及特殊运算符特殊运算符构成较复杂的条件表达式。关系运算符:关系运算符:关系运算符:关系运算符: = 80 AND 成绩=90 若要查找成绩不在不在不在不在80分到90分之间
21、的学生选课情况,则:SELECT * FROM 学生选课;WHERE 成绩 NOT BETWEEN 80 AND 90 注意:注意:BETWEEN包括边界值,而包括边界值,而NOT BETWEEN不包括边界值不包括边界值49返回返回7.3.1简单查询(2 2)ININ运算符运算符运算符运算符在查找中,经常会遇到要求表的列值是某几个值中的一个。此时,用IN运算符。【例7.31】 列出选修了课程号为“2001”和“2053”的学生的学号和成绩。SELECT SELECT 学号学号学号学号, ,成绩成绩成绩成绩 FROM FROM 学生选课学生选课学生选课学生选课; ;WHERE WHERE 课程I
22、D IN(2001,2053)IN(2001,2053)它等价于:SELECT SELECT 学号学号学号学号, ,成绩成绩成绩成绩 FROM FROM 学生选课学生选课学生选课学生选课; ;WHERE WHERE 课程ID=2001 OR课程ID=2053 可以用NOT IN来表示与IN相反相反相反相反的含义 50返回返回7.3.1简单查询(3)IS NULL运算符运算符IS NULL的功能是测试属性值是否为空值。在查询时用“列名 IS NOT NULL”的形式。【例7.32】 先将学号为“1161009”课程号为“2009”的课程成绩置为NULL,然后查找成绩为空的学生的学号和课程号。 U
23、PDATE UPDATE 学生选课学生选课学生选课学生选课; ;SET SET 成绩=NULL;WHERE WHERE 学号=1161009 AND 课程ID=2009 SELECT SELECT 学号学号学号学号, ,课程课程课程课程ID FROM ID FROM 学生选课学生选课学生选课学生选课; ;WHERE WHERE 成绩成绩成绩成绩 IS NULLIS NULL注意注意注意注意WHEREWHERE不要写成不要写成不要写成不要写成“ “WHERE WHERE 成绩成绩成绩成绩 = NULL”= NULL” 51返回返回7.3.1简单查询(4)LIKE运算符运算符语法格式: 字符串表达
24、式字符串表达式字符串表达式字符串表达式 NOT LIKE NOT LIKE 2种通配符:通配符通配符含义含义例例% %任意类型和长度的字符串任意类型和长度的字符串 周周% % 姓周的姓周的_ _(下划线)(下划线)任何单个字符任何单个字符_ _文文% % 第第2 2个个字字为为文文52返回返回7.3.1简单查询【例例7.33】从从学学生生表表中中查查找找姓姓名名中中第第2个个字字是是“文文”的学生的学生.SELECT * FROM 学生 WHERE 姓名 LIKE _文% 【例例7.34】 从从“学学生生”表表中中查查找找姓姓“李李”的的学学生。生。 SELECT * FROM 学生 WHER
25、E (姓名 LIKE 李%)或: WHERE (姓名 LIKE 李_)53返回返回7.3.2嵌套查询在一个SELECT-SQL语句中又出现了另一个SELECT语句的情形,我们称之为SELECT嵌套。对于嵌套的查询,通常利用用用用一个SELECT查询(内层查内层查内层查内层查询询询询)的结果来筑构筑构筑构筑构另一个SELECT查询(外层查询外层查询外层查询外层查询)的筛选条件筛选条件筛选条件筛选条件。在嵌套查询中,内层的内层的SELECT语句称为子查询语句称为子查询,而把包含有子查询的SELECT语句称为双亲语句。用简单的SELECT语句实现不了查询时用嵌套查询。 VFPVFP只支持单层嵌套查询
26、只支持单层嵌套查询只支持单层嵌套查询只支持单层嵌套查询 54返回返回7.3.2嵌套查询1、返回单值的子查询、返回单值的子查询返回单值的子查询,即为子查询的结果只返回一个值子查询的结果只返回一个值子查询的结果只返回一个值子查询的结果只返回一个值,如:查询学号为“1161001”的同学的性别,只有一个值;【例7.35】 列出选修了生活英语的所有学生的学号。SELECT SELECT 学号学号学号学号 FROM FROM 学生选课学生选课学生选课学生选课 WHERE WHERE 课程课程课程课程ID ID = = ; ; (SELECT (SELECT 课程课程课程课程ID FROM ID FROM
27、 课程课程课程课程; ; WHERE WHERE 课程名课程名课程名课程名 = = 生活英语生活英语生活英语生活英语)由于生活英语的“课程ID”只有一个只有一个只有一个只有一个(返回结果不只一个(返回结果不只一个(返回结果不只一个(返回结果不只一个时,不能用时,不能用时,不能用时,不能用 “ “=”=”号)号)号)号)55返回返回7.3.2嵌套查询【例】在数据表“学生”中查询与陈静同乡的学生情况SELECT * FROM SELECT * FROM 学生学生学生学生; ; WHERE WHERE 籍贯籍贯籍贯籍贯=(SELECT =(SELECT 籍贯籍贯籍贯籍贯 FROM FROM 学生学生
28、学生学生; ; WHERE WHERE 姓名姓名姓名姓名= “= “陈静陈静陈静陈静 ” ”) )【例】列出学生选课中2009号课程成绩高于该课程平均成绩的学生信息SELECT SELECT 学号学号学号学号, ,成绩成绩成绩成绩 FROM FROM 学生选课学生选课学生选课学生选课; ; WHERE WHERE 课程课程课程课程ID=2009 AND ID=2009 AND 成绩成绩成绩成绩 ; (SELECT AVG( (SELECT AVG(成绩成绩成绩成绩) ;) ; FROM FROM 学生选课学生选课学生选课学生选课; ; WHERE WHERE 课程课程课程课程ID=2009 )
29、ID=2009 )子查询中,计算出2009号课程的平均成绩,作为主查询的比较条件56返回返回7.3.2嵌套查询【例例】根据学生表查询入学成绩小于600但最接近600的学生情况,包括姓名、入学日期和入学成绩。SELECT SELECT 姓名姓名姓名姓名, ,出生日期出生日期出生日期出生日期, ,入学成绩入学成绩入学成绩入学成绩; ; FROM FROM 学生学生学生学生 WHERE WHERE 入学成绩入学成绩入学成绩入学成绩 =;=; (SELECT MAX( (SELECT MAX(入学成绩入学成绩入学成绩入学成绩); ); FROM FROM 学生学生学生学生; ; WHERE WHERE
30、 入学成绩入学成绩入学成绩入学成绩600) ANY ; ANY ; (SELECT (SELECT 成绩成绩成绩成绩 FROM FROM 学生选课学生选课学生选课学生选课 ; ; WHERE WHERE 课程课程课程课程ID = 2053)ID = 2053)58返回返回7.3.2嵌套查询(2 2)ALLALL谓词的用法。谓词的用法。谓词的用法。谓词的用法。使用ALL谓词表示查询结果中的查询结果中的查询结果中的查询结果中的所有值或每一个值所有值或每一个值所有值或每一个值所有值或每一个值。【例7.37】 在“学生”表中查询出生年份最早的学生情况。SELECT * FROMSELECT * FRO
31、M学生学生学生学生; ; WHERE YEAR( WHERE YEAR(出生日期出生日期出生日期出生日期) = ALL;) = ALL; (SELECT YEAR( (SELECT YEAR(出生日期出生日期出生日期出生日期) FROM ) FROM 学生学生学生学生) )出生年份最早的学生一定比其他年份出生的学生都要小,所以,该查询首先找出所有学生的出生年份,。然后在全部记录中找出生年份小于等于前面所有年份的记录。 59返回返回7.3.2嵌套查询(3)IN谓词的用法。谓词的用法。使用IN谓词表示包含于查询结果中。IN谓词前面已有介绍,这里再举一例。【例7.38】 列出“学生”表中“计算机”专
32、业未选课的学生。SELECT * FROM SELECT * FROM 学生学生学生学生; ; WHERE WHERE 专业专业专业专业=计算机计算机计算机计算机 and and 学号学号学号学号 NOT NOT IN ;IN ; (SELECT (SELECT 学号学号学号学号 FROM FROM 学生选课学生选课学生选课学生选课) )60返回返回7.3.2嵌套查询【例】列出“土木工程”专业学生的选课情况SELECT * FROM SELECT * FROM 学生选课学生选课学生选课学生选课; ; WHERE WHERE 学号学号学号学号 IN IN ; ; (SELECT (SELECT
33、学号学号学号学号 FROM FROM 学生学生学生学生 ; ; WHERE WHERE 专业专业专业专业=土木工程土木工程土木工程土木工程) )【例】列出学生表中“计算机”专业选课的学生SELECT * FROM SELECT * FROM 学生学生学生学生; ; WHERE WHERE 专业专业专业专业=计算机计算机计算机计算机 and and 学号学号学号学号 IN IN ; ; (SELECT (SELECT 学号学号学号学号 FROM FROM 学生选课学生选课学生选课学生选课) )使用IN运算符时,子查询字段表中只能指定一个表达式61返回返回7.3.2嵌套查询【例】使用滤波条件字构造
34、SELECT语句,根据课程和学生选课表,查询选修了“孙子兵法”的学生的学号、课程名、成绩,SELECT b.SELECT b.学号学号学号学号, ,课程名课程名课程名课程名, ,成绩成绩成绩成绩; ; FROM FROM 课程课程课程课程 a ,a ,学生选课学生选课学生选课学生选课 b;b; WHERE a. WHERE a.课程课程课程课程ID=b.ID=b.课程课程课程课程ID and ID and 课程名课程名课程名课程名 IN IN ; ; (SELE (SELE 课程名课程名课程名课程名 FROM FROM 课程课程课程课程 ; ; WHERE WHERE 课程名课程名课程名课程名
35、=孙子兵法孙子兵法孙子兵法孙子兵法)62返回返回7.3.2嵌套查询【例】在学生表中查询出生年份最早的学生情况。SELE * FROM SELE * FROM 学生学生学生学生; ; WHERE YEAR( WHERE YEAR(出生日期出生日期出生日期出生日期)=) Y.成绩成绩也可以以如下嵌套查询的方式实现:SELECT 学号学号,成绩成绩 FROM 学生选课学生选课; WHERE 课程课程ID = 2053 AND 成绩成绩; (SELECT 成绩成绩 FROM 学生选课学生选课;WHERE 学号学号 = 1161004) 66返回返回7.3.3连接查询3、超连接查询超连接查询也是一种将多
36、表进行连接的查询,其格式为:FROM 表名1 INNERINNER | LEFT | RIGHT | FULL| LEFT | RIGHT | FULL JOINJOIN 表名2 ON 连接条件其中: INNER JOININNER JOIN 等价于 JOIN,为普通连接普通连接普通连接普通连接,亦称内部连接。 LEFT JOINLEFT JOIN为左左左左连接,RIGHT JOINRIGHT JOIN 为右右右右连接,FULL FULL JOINJOIN 为全全全全连接,这几种连接不太常用。 ON ON 连接条件连接条件连接条件连接条件:用来指定连接条件。由于此子句已经给出连接条件,所以不再
37、在WHERE子句中给出。67返回返回7.3.3连接查询【例7.42】 列出“马大大”同学所选修的课程ID和成绩。SELECT 课程课程ID,成绩成绩; FROM 学生学生 S JOIN 学生选课学生选课 SC ON S.学号学号 = SC.学号学号; WHERE S.姓名姓名 = 马大大马大大它等价于:SELECT 课程课程ID,成绩成绩; FROM 学生学生 S,学生选课学生选课 SC; WHERE S.姓名姓名 = 马大大马大大 AND S.学号学号 = SC.学号学号 68返回返回7.3.3连接查询【例7.43】 根据“学生”、“课程”和“学生选课”表,查询选修成绩不低于85分的学生的学
38、号、姓名、所选课程的课程名、成绩,并按成绩降序排列记录SELECT b.学号学号,姓名姓名,课程名课程名,成绩成绩; FROM 课程课程 a INNER JOIN 学生选课学生选课 b ON a.课程课程ID=b.课程课程ID; INNER JOIN 学生学生 c ON b.学号学号=c.学号学号; WHERE 成绩成绩=85; ORDER BY 成绩成绩 DESCJOIN可以进行多个表的连接。在连接时,JOIN的顺序和ON的顺序(相应的连接条件)正好相反:SELECT b.学号学号,姓名姓名,课程名课程名,成绩成绩; FROM 课程课程 a JOIN 学生选课学生选课 b JOIN 学生学生
39、 c; ON b.学号学号=c.学号学号 ON a.课程课程ID=b.课程课程ID; WHERE 成绩成绩=85; ORDER BY 成绩成绩 desc 注意书写顺序,先为后连注意书写顺序,先为后连注意书写顺序,先为后连注意书写顺序,先为后连接的表指定连接条件接的表指定连接条件接的表指定连接条件接的表指定连接条件69返回返回7.3.4分组及使用库函数查询可以通过库函数对满足条件的记录进行最大值、最小值、平均值、总和、计数等运算。常用库函数有:(1)MIN( )MIN( ):求(字符、日期、数值等)最小值。(2)MAX( )MAX( ) :求(字符、日期、数值等)最大值。(3)COUNT( )C
40、OUNT( ):计算所选数据的行数。(4)SUM( )SUM( ):计算数值列的总和。(5)AVG( )AVG( ) :计算数值列的平均值。这些库函数一般是从一组值中计算出一个汇总信息。用GROUP BYGROUP BY子句子句子句子句来定义或划分字段的值成为多个组多个组多个组多个组,它能控制和影响查询的结果。可以用上述的库函数来对分组后分组后分组后分组后的数据进行各种运算进行各种运算进行各种运算进行各种运算。 70返回返回7.3.4分组及使用库函数查询【例7.44】 列出各门课的平均成绩、最高成绩、最低成绩、选课人数。SELECT 课程课程ID,AVG(成绩成绩) AS 平均分平均分,; M
41、AX(成绩成绩) AS 最高分最高分,; MIN(成绩成绩) AS 最低分最低分,COUNT(学号学号) AS 人数人数; FROM 学生选课学生选课; GROUP BY 课程课程ID 【例7.45】 查询计算机专业的学生人数。SELECT COUNT(*) FROM 学生学生;WHERE 专业专业 = 计算机计算机COUNT的特殊形式是COUNT(*),统计满足WHERE子句中逻辑表达式的记录的行数。71返回返回7.3.4分组及使用库函数查询【例7.46】 列出至少选修了两门课程的学生的学号。SELECT 学号学号 FROM 学生选课学生选课 GROUP BY 学号学号 HAVING COU
42、NT(*)=2 先先在“学生选课”表中按学号进行分组进行分组,然后,对每个分分组检测组检测其元组个数是否大于等于2,如果满足条件满足条件,则显则显示示其学号,否则不显示。HAVING子句和WHERE子句的区别:WHERE子句是用来指定表中各行所应满足的条件,而HAVING子句是用来指定每一分组所应满足的条件,只有满足HAVING条件的那些组才能在结果中被显示。 72返回返回7.3.5查询结果的合并 使用UNION可以把两个SELECT查询结果合并合并起来,形成一个新的查询结果。 要求参与UNION合并的两个查询结果必必须具有相同的输出项须具有相同的输出项。 除非UNION后带有ALL,否则合并
43、结果将不会有重复的记录。73返回返回7.3.5查询结果的合并【例7.48】 列出单科成绩最高和最低的学生的选课情况。SELECT * FROM 学生选课学生选课;WHERE 成绩成绩 = (SELECT MAX(成绩成绩) FROM 学学生选课生选课);UNION;SELECT * FROM 学生选课学生选课;WHERE 成绩成绩 = (SELECT MIN(成绩成绩) FROM 学生学生选课选课) 74返回返回单科成绩最高和最低的学生75返回返回7.3.5查询结果的合并【例】将学生和教师信息表合并,列出姓名, 性别, 出生日期,和身份。SELECT 姓名姓名, 性别性别, 出生日期出生日期,学生学生 AS 身身份份;FROM 学生学生 ; UNION;SELECT 姓名姓名, 性别性别, 出生日期出生日期,教师教师 AS 身身份份;FROM 教师信息表教师信息表76返回返回查询结果合并的后的效果77返回返回78