《10 第5章 关系数据库标准语言SQL2》由会员分享,可在线阅读,更多相关《10 第5章 关系数据库标准语言SQL2(49页珍藏版)》请在金锄头文库上搜索。
1、1,第5章,关系数据库标准语言SQL,2,主 要 内 容,5.1 SQL的功能及特点5.2 数据定义语句5.3 数据查询语句5.4 数据更新语句5.6 数据控制语句,3,5.3.1 查询语句语法,SELECT ALL|DCSTINCT FROM WHERE GROUP BY HAVING ORDER BY ASC|DESC ;,4,SELECT子句:指定要显示的属性列;FROM子句:指定查询对象(基本表或视图);WHERE子句:指定查询条件;GROUP BY子句:对查询结果按指定列的值分组,该属性列值相等的元组为一个组。通常会在每组中使用聚集函数。HAVING短语:筛选出只有满足指定条件的组;
2、ORDER BY子句:对查询结果表按指定列值的升序或降序排序;,5.3.1 查询语句语法,5,5.3.2 简单查询,指FROM子句中仅涉及一个表的查询,是一种最简单的查询操作。 一、选择表中的若干列 二、选择表中的若干元组 三、对查询结果排序 四、使用聚集函数 五、对查询结果分组,6,示例数据库,学生课程库,包含3个基本表,结构为:Student(Sno,Sname,Ssex,Sage,Sdept)Course(Cno,Cname,Cpno,Ccredit)SC(Sno,Cno,Grade),7,1.查询指定列,例1 查询全体学生的学号与姓名。,SELECT Sname,Sno,SdeptFR
3、OM Student;,例2 查询全体学生的姓名、学号、所在系。,SELECT Sno,SnameFROM Student;,8,2.查询全部列,例3 查询全体学生的详细记录。,SELECT Sno,Sname,Ssex,Sage,Sdept FROM Student; 或SELECT *FROM Student;,9,3. 查询经过计算的值,SELECT子句的为表达式算术表达式字符串常量函数列别名等,10,例4 查全体学生的姓名及其出生年份。SELECT Sname,2007-SageFROM Student;输出结果: Sname 2007-Sage - - 王林 1989 张大民 198
4、8 顾芳 1988 姜凡 1989 葛波 1988,算术表达式,可以给列或表达式起别名:SELECT Sname,2007-Sage AS BirthYearFROM Student;保留字AS可以省略,11,4. 消除取值重复的行,在SELECT子句中使用DISTINCT短语假设SC表中有下列数据 Sno Cno Grade - - - 2007001 1 92 2007001 2 85 2007001 3 88 2007002 2 90 2007002 3 80,12,ALL 与 DISTINCT,例5 查询选修了课程的学生学号。 SELECT Sno FROM SC;或(默认 ALL)
5、SELECT ALL Sno FROM SC;结果: Sno - 2007001 2007001 2007001 2007002 2007002,13,例 题,(2) SELECT DISTINCT Sno FROM SC;该语句则去掉了重复元组结果: Sno - 2007001 2007002,14,例题(续),注意 DISTINCT短语的作用范围是所有目标列例:查询选修课程的各种成绩错误的写法SELECT DISTINCT Cno,DISTINCT GradeFROM SC;正确的写法 SELECT DISTINCT Cno,Grade FROM SC;,15,5.WHERE子句,常用的运
6、算符,16,(1) 比较大小,例1 查询所有年龄在20岁以下的学生姓名及其年龄。 SELECT Sname,Sage FROM Student WHERE Sage = 20;,17,(2) 确定范围,使用谓词 BETWEEN AND NOT BETWEEN AND 例2 查询年龄在2023岁(包括20岁和23岁)之间的学生的姓名、系别和年龄。,SELECT Sname,Sdept,SageFROM StudentWHERE Sage BETWEEN 20 AND 23;,18,例题(续),例3 查询年龄不在2023岁之间的学生姓名、系别和年龄。SELECT Sname,Sdept,SageF
7、ROM StudentWHERE Sage NOT BETWEEN 20 AND 23;,19,使用谓词 IN , NOT IN 例4查询计算机系(CS)、数学系(MA)学生的姓名和性别。SELECT Sname,SsexFROM StudentWHERE Sdept IN ( CS,MA);,(3) 确定集合,20,(3) 确定集合,例5查询不是计算机系、数学系的学生的姓名和性别。SELECT Sname,SsexFROM Student WHERE Sdept NOT IN ( CS,MA);,21,(4) 涉及空值的查询,使用谓词 IS NULL 或 IS NOT NULL “IS NU
8、LL” 不能用 “= NULL” 代替例13 某些学生选修课程后没有参加考试,所以有选课记录,但没有考试成绩。查询缺少成绩的学生的学号和相应的课程号。 SELECT Sno,Cno FROM SC WHERE Grade IS NULL;,22,例题(续),例14 查所有有成绩的学生学号和课程号。 SELECT Sno,Cno FROM SC WHERE Grade IS NOT NULL;,23,(6) 多重条件查询,用逻辑运算符AND和 OR来联结多个查询条件 AND的优先级高于OR 可以用括号改变优先级可用来实现多种其他谓词 NOT IN NOT BETWEEN AND ,24,例题,例
9、15 查询计算机系年龄在20岁以下的学生姓名。 SELECT Sname FROM Student WHERE Sdept= CS AND Sage=20 AND Sage=23;,27,6.聚集函数,5类主要集函数(P137 表5-10)计数COUNT(DISTINCT|ALL *)COUNT(DISTINCT|ALL )计算总和SUM(DISTINCT|ALL ) 计算平均值AVG(DISTINCT|ALL ),28,聚集函数(续),求最大值MAX(DISTINCT|ALL )求最小值MIN(DISTINCT|ALL )DISTINCT短语:在计算时要取消指定列中的重复值ALL短语:不取消
10、重复值ALL为缺省值,29,例1 查询学生总人数。 SELECT COUNT(*) FROM Student;例2 查询选修了课程的学生人数。 SELECT COUNT(DISTINCT Sno) FROM SC;注:用DISTINCT以避免重复计算学生人数,30,例3 计算1号课程的学生平均成绩。 SELECT AVG(Grade) FROM SC WHERE Cno= 1 ;例4 查询选修1号课程的学生最高分数。 SELECT MAX(Grade) FROM SC WHER Cno= 1 ;,31,7.GROUP BY子句分组,使用GROUP BY子句分组,细化聚集函数的作用对象 未对查询
11、结果分组,聚集函数将作用于整个查询结果; 对查询结果分组后,聚集函数将分别作用于每个组;,32,使用GROUP BY子句分组,例1求各个课程号及相应的选课人数。 SELECT Cno, COUNT(Sno) FROM SC GROUP BY Cno;,33,使用GROUP BY子句分组(续),注意:GROUP BY子句的作用对象是查询的中间结果表分组方法:按指定的一列或多列值分组,值相等的为一组使用GROUP BY子句后,SELECT子句的列名列表中只能出现分组属性和聚集函数,34,使用HAVING短语筛选最终输出结果,例2 查询选修了3门以上课程的学生学号。 SELECT Sno FROM SC GROUP BY Sno HAVING COUNT(*) 3;,