学号 AND 课号=“1” SELECT * FROM 学生情况 AS S, 选课表 AS C WHERE S.学号=C.学号 AND 课号="1"; ? 临时定义表的别名S和C可以减少书写长的表名 分组查询:GROUP BY ? 例18. 列出各门课的平均成绩、最高成绩、最低成绩和 选课人数。 ? SELECT 学生成绩表2.课程号, Avg(学生成绩表2.成绩) AS 成绩之平均值, Max(学生 成绩表2.成绩) AS 成绩之最大值, Min(学生成绩表2.成绩) AS 成绩之最小值, Count(学生成绩表2.学号) AS 学号之计数 FROM 学生成绩表2 GROUP BY 学生成绩表2.课程号; ? ? ? ? ? SELECT 学生成绩表2.课程号, ROUND(Avg(学生成绩表2.成绩),2) AS 平 均分, Max(学生成绩表2.成绩) AS 最高分, Min(学生成绩表2.成绩) AS 最低分, Count(学生成绩表2.学号) AS 选课计数 FROM 学生成绩表2 GROUP BY 学生成绩表2.课程号; ROUND(X,N) :N给出小数位数 HAVING 子句(函数) ? HAVING函数与GROUP BY子句联合使用,可以对分组后的 结果作进一步的限制. ? 例18a. 列出选课人数超过3人的各门课的平均成绩、 最高成绩、最低成绩和选课人数。 ? SELECT 学生成绩表2.课程号, Round(Avg(学生成绩表2.成绩),2) AS 平均分, Max(学生成绩表2.成绩) AS 最高分, Min(学生成绩 表2.成绩) AS 最低分, Count(学生成绩表2.学号) AS 选课计数 ? FROM 学生成绩表2 ? GROUP BY 学生成绩表2.课程号 ? HAVING Count(学生成绩表2.学号)>3 ? 计算: ? SELECT 学生信息表2.姓名, 学生信息表2.性别, Year(Date())-Year(学生信息表2!出生日期) AS 年龄 ? FROM 学生信息表2; WHERE Year(Date())-Year(学生信息表2!出生日期)=20 SQL嵌套查询 ? 一个SELECT-FROM-WHERE语句中嵌套进另外一个 SELECT-FROM-WHERE称为嵌套查询。上层查询称为外 层查询或父查询,下层查询被称为内层查询或子查 询。 ? 子查询中不能使用ORDER BY语句,因为该语句是对 最终结果进行排序。 ? 嵌套查询的运行方式是由里向外,也就是说,每个 子查询都先于它的父查询执行,而子查询的结果作 为其父查询的条件。 嵌套查询 如果查询所要求的结果出自一个关系,而相关的条件却涉及多 个关系,则可以利用嵌套查询来完成。 ? 嵌套查询一般有2种形式: ? <表达式> <比较运算符> [ANY|ALL|SOME] (<子查询>) ? [NOT] EXISTS (<子查询>) ? 说明: (1)其中比较运算符可以为 [NOT]IN/[NOT]BETWEEN?AND?/[NOT]LIKE (2)ANY和SOME是同义词,在进行比较运算时,只要子查询中 有一条为真,则结果为真;而ALL则要求子查询中全部记录 都为真,结果才为真。 (3)EXISTS是谓词,检查子查询中是否有结果返回。 ? 【例】查询哪些专业至少有一学生成绩等于100分 ? SELECT DISTINCT 专业代号 FROM 学生 WHERE 学生.学号 IN (SELECT 学号 FROM 成绩表 WHERE 成绩表.成绩=100) ? 注意: ? (1)这里所要查询的结果是“学生表”的专业信息,而相关的条件却是 “成绩表”的成绩字段的值,因此使用嵌套查询; ? (2) “SELECT 学号 FROM 成绩表 WHERE 成绩表.成绩=100) ”是子 查询,且用括号包含。 学号:10002 专业代号: 10005 10234 10567 学号:10002 10005 成绩:100 100 先找出成绩为100的学号,再找出这些学号所对应的专业代码 【例】查询与“张三”专业相同的学生姓名 ? SELECT 姓名 FROM 学生; WHERE 学生.专业代码= (SELECT 专业代码 FROM 学生 WHERE 姓名 in (“张 三”)) 【例】在成绩表中检索选修2号课程的学生中比选修4号课程的最低分数 要高的学生学号和成绩。 ? SELECT 学号,成绩 FROM 成绩 ; WHERE 课程代号=”2” AND 成绩>ANY ; (SELECT 成绩 FROM 成绩 WHERE 课程代号=”4”) 【例】在成绩表中检索选修2号课程的学生中成绩比选修4号课程的所有 学生成绩都要高的学生学号和成绩。 ? SELECT学号,成绩 FROM 成绩 WHERE课程代号=”2” AND 成 绩> ALL ; (SELECT成绩 FROM 成绩 WHERE 课程代号=”4”) ? any表示任意一个,all表示所有的。 如果有张学生记录表student 中有一个属性组为age 现在要查找年龄在某个区间上的学生记录就 有如下操作 ? 1、查找年龄比15、16、22、21、17、18、19中任意一个都小 的学生记录就有如下代码: ? select * ? from student ? where ageany(15,16,22,21,17,18,19) 这里用any 和all是等效的 用all是大于所有的意思 用all就改为: where age>all(15,16,22,21,17,18,19) 这里=3) 在分组中统计满 足条件,此处不 能用Where ? 例:查询所有选修了2号课程的学生姓名 SELECT 姓名 ? ? ? ? FROM 学生信息表 WHERE EXISTS (SELECT * FROM 学生成绩表 cj,学生信息表 st WHERE cj.学号=st.学号 AND 课程号=”2”) EXISTS的意思是存在,带有EXISTS谓词的子查询 不返回数据,只产生逻辑真“TRUE”或逻辑假“FALSE”.