WHEREcnameLIKEDBL%iESCAPE'(5)空值比较■使用谓词ISNULL或ISNOTNULL■“ISNULL”不能用“=NULL”代替[例21]某些学生选修课程后没有参加考试,所以有选课记录,但没有考试成绩。查询缺少成绩的学生的学号和相应的课程号。SELECTsno,CnoFROM scoreWHEREdegreeISNULL[例22]查所有有成绩的学生学号和课程号。SELECT sno,cnoFROMscoreWHEREdegreeISNOTNULL(6)多重条件查询用逻辑运算符AND和OR来联结多个查询条件-AND的优先级高于OR-可以用括号改变优先级[例23]查询95033班且在1975-01-01"后出生的学生姓名。SELECT snameFROMstudentWHERE class=95033'AND sbirthday>'1975-01-01改写[例10]【例10】查询成绩在60~80(包括60分和80分)之间的所有记录。SELECT*FROMscoreWHEREdegreeBETWEEN60AND80可改写为:SELECT*FROM scoreWHEREdegree>=60AND degree<=80改写[例12][例12]查询成绩为85、86或88的记录。SELECT*FROM scoreWHERE degree IN(85,86,88)可改写为:
WHERE cname LIKE 'DB\_%i_ _' ESCAPE ' \ ' (5) 空值比较 ◼ 使用谓词 IS NULL 或 IS NOT NULL ◼ “IS NULL” 不能用 “= NULL” 代替 [例 21] 某些学生选修课程后没有参加考试,所以有选课记录,但没有考试成绩。查询 缺少成绩的学生的学号和相应的课程号。 SELECT sno,Cno FROM score WHERE degree IS NULL [例 22] 查所有有成绩的学生学号和课程号。 SELECT sno,cno FROM score WHERE degree IS NOT NULL (6) 多重条件查询 用逻辑运算符 AND 和 OR 来联结多个查询条件 ◼ AND 的优先级高于 OR ◼ 可以用括号改变优先级 [例 23] 查询 95033 班且在’1975-01-01’后出生的学生姓名。 SELECT sname FROM student WHERE class= '95033' AND sbirthday>'1975-01-01' 改写[例 10] [例 10] 查询成绩在 60~80(包括 60 分和 80 分)之间的所有记录。 SELECT * FROM score WHERE degree BETWEEN 60 AND 80 可改写为: SELECT * FROM score WHERE degree>=60 AND degree<=80 改写[例 12] [例 12]查询成绩为 85、86 或 88 的记录。 SELECT * FROM score WHERE degree IN(85,86,88) 可改写为:
SELECT*FROM scoreWHERE degree=85OR degree=86 OR degree=88三、对查询结果排序使用ORDERBY子句■可以按一个或多个属性列排序商升序:ASC降序:DESC缺省值为升序当排序列含空值时■ASC:排序列为空值的元组最先显示■DESC:排序列为空值的元组最后显示[例24]查询选修了3-105号课程的学生的学号及其成绩,查询结果按分数降序排列。SELECT sno,degreeFROMscoreWHEREcno='3-105'ORDERBYdegreeDESC[例25]查询全体学生情况,查询结果按所在班的班号升序排列,同一班中的学生按出生先后顺序排列。SELECT*FROMstudentORDERBYclass,sbirthday四、使用集函数5类主要集函数■计数COUNT ([DISTINCT|ALL]*)COUNT ([DISTINCT|ALL]<列名>)■计算总和SUM ([DISTINCTALL] <列名>)■计算平均值AVG([DISTINCT|ALL]<列名>)求最大值MAX([DISTINCTALL)<列名>)求最小值MIN([DISTINCTALL]<列名>)DISTINCT短语:在计算时要取消指定列中的重复值一ALL短语:不取消重复值ALL为缺省值[例26]查询学生总人数。SELECTCOUNT(*)FROMstudent【例27]查询选修了课程的学生人数。SELECTCOUNT(DISTINCT Sno)
SELECT * FROM score WHERE degree=85 OR degree=86 OR degree=88 三、对查询结果排序 使用 ORDER BY 子句 ◼ 可以按一个或多个属性列排序 ◼ 升序:ASC 降序:DESC 缺省值为升序 当排序列含空值时 ◼ ASC:排序列为空值的元组最先显示 ◼ DESC:排序列为空值的元组最后显示 [例 24] 查询选修了 3-105 号课程的学生的学号及其成绩,查询结果按分数降序排列。 SELECT sno,degree FROM score WHERE cno= '3-105' ORDER BY degree DESC [例 25] 查询全体学生情况,查询结果按所在班的班号升序排列,同一班中的学生按出生先 后顺序排列。 SELECT * FROM student ORDER BY class,sbirthday 四、使用集函数 5 类主要集函数 ◼ 计数 COUNT([DISTINCT|ALL] *) COUNT([DISTINCT|ALL] <列名>) ◼ 计算总和 SUM([DISTINCT|ALL] <列名>) ◼ 计算平均值 AVG([DISTINCT|ALL] <列名>) 求最大值 MAX([DISTINCT|ALL] <列名>) 求最小值 MIN([DISTINCT|ALL] <列名>) – DISTINCT 短语:在计算时要取消指定列中的重复值 – ALL 短语:不取消重复值 – ALL 为缺省值 [例 26] 查询学生总人数。 SELECT COUNT(*) FROM student [例 27] 查询选修了课程的学生人数。 SELECT COUNT(DISTINCT sno)
FROM score注:用DISTINCT以避免重复计算学生人数[例28]计算3-105号课程的学生平均成绩。SELECT AVG(degree)FROM scoreWHERECn0='3-105[例29]查询选修3-105号课程的学生最高分数。SELECTMAX(degree)FROM scoreWHERcno=3-105五、对查询结果分组使用GROUPBY子句分组细化集函数的作用对象■未对查询结果分组,集函数将作用于整个查询结果■对查询结果分组后,集函数将分别作用于每个组[例30]求各个课程号及相应的选课人数。SELECTcnO.COUNT(*)选课人数FROMscoreGROUPBYcno结果选课人数cno3-105633-24536-166■GROUPBY子句的作用对象是查询的中间结果分组方法:按指定的一列或多列值分组,值相等的为一组■使用GROUPBY子句后,SELECT子句的列名列表中只能出现分组属性和集函数使用HAVING短语筛选最终输出结果【例31]查询选修了2门或2门以上课程的学生学号。SELECT snoFROM scoreGROUPBYsnoHAVINGCOUNT(*)>=2[例32]】查询有2门或2门以上课程都至少为85分的学生的学号及其课程数。SELECT sno, COUNT(*)FROMscoreWHERE degree>=85GROUPBYSnOHAVING COUNT(*)>=2■此语句执行过程如下:1.(FROM)取出整个score2.(WHERE)筛选Grade>=85的元组3.(GROUPBY)将选出的元组按sno分组
FROM score 注:用 DISTINCT 以避免重复计算学生人数 [例 28] 计算 3-105 号课程的学生平均成绩。 SELECT AVG(degree) FROM score WHERE Cno= '3-105' [例 29] 查询选修 3-105 号课程的学生最高分数。 SELECT MAX(degree) FROM score WHER cno= '3-105' 五、对查询结果分组 使用 GROUP BY 子句分组 细化集函数的作用对象 ◼ 未对查询结果分组,集函数将作用于整个查询结果 ◼ 对查询结果分组后,集函数将分别作用于每个组 [例 30] 求各个课程号及相应的选课人数。 SELECT cno,COUNT(*) '选课人数' FROM score GROUP BY cno 结果 cno 选课人数 3-105 6 3-245 3 6-166 3 ◼ GROUP BY 子句的作用对象是查询的中间结果分组方法:按指定的一列或多列值分 组,值相等的为一组 ◼ 使用 GROUP BY 子句后,SELECT 子句的列名列表中只能出现分组属性和集函数 使用 HAVING 短语筛选最终输出结果 [例 31] 查询选修了 2 门或 2 门以上课程的学生学号。 SELECT sno FROM score GROUP BY sno HAVING COUNT(*) >=2 [例 32] 查询有 2 门或 2 门以上课程都至少为 85 分的学生的学号及其课程数。 SELECT sno, COUNT(*) FROM score WHERE degree>=85 GROUP BY sno HAVING COUNT(*)>=2 ◼ 此语句执行过程如下: 1.(FROM)取出整个 score 2.(WHERE)筛选 Grade>=85 的元组 3.(GROUP BY)将选出的元组按 sno 分组