--[3_8] 某些学生选修课程后没有参加考试,所以有选课记录,但没有考试成绩。 --查询缺少成绩的学生的学号和相应的课程号。
SELECT sno,cno FROM sc WHERE grade IS NULL;
运行结果:
sno cno --------- ----
--[3_9] 查询计算机系年龄在20岁以下的学生姓名。
SELECT sname FROM student
WHERE sdept='cs' AND sage<20;
运行结果:
sname -------- 刘晨
--[3_10] 查询选修了3号课程的学生的学号及其成绩,查询结果按分数降序排列。
SELECT sno,grade FROM sc WHERE cno='3' ORDER BY grade DESC;
运行结果:
sno grade
--------- --------------------------------------- 201313101 88.0 201313102 50.0
--[3_11] 查询全体学生情况,查询结果按所在系升序排列,同一系中的学生按性别降序排列。
SELECT * FROM student
ORDER BY sdept,sage DESC;
运行结果:
sno sname ssex sage sdept --------- -------- ---- ------ --------------------
201313101 李勇 男 20 CS 201313102 刘晨 女 19 CS 201313104 张立 男 19 IS 201313103 王敏 女 18 MA
--使用集函数
--[3_12] 查询学生总人数。
SELECT COUNT(*) 学生总人数 FROM student;
运行结果:
6
学生总人数 ----------- 4
--[3_13] 查询选修了课程的学生人数。
SELECT COUNT(DISTINCT sno) 选课人数 --注:用DISTINCT以避免重复计算学生人数 FROM sc;
运行结果:
选课人数 ----------- 2
--[3_14] 计算1号课程的最高、最低及平均成绩。
SELECT MAX(grade) '1号课程最高分', MAX(grade) '1号课程最低分', AVG(grade) '1号课程平均成绩' FROM sc WHERE cno='1'
运行结果:
1号课程最高分 1号课程最低分 1号课程平均成绩 --------------------------------------- --------------------------------------- --------------------------------------- 92.0 92.0 92.000000
--[3_15] 查询学生201313101选修课程的平均成绩。
运行结果:
学生平均成绩
--------------------------------------- 71.666666
--[3_16] 查询学生201313102选修课程的总学分数。
SELECT SUM(ccredit) 学生学分 FROM sc,course
WHERE sc.cno=course.cno AND sno='201313102';
运行结果:
学生学分 ------------- 6
--使用GROUP BY子句分组
--[3_17] 求各个课程号及相应的选课人数。
SELECT cno 课程号,COUNT(sno) 选课人数 FROM sc GROUP BY cno;
运行结果:
课程号 选课人数 ---- ----------- 1 1
7
2 2 3 2
--使用HAVING短语筛选最终分组结果
--[3_18] 查询选修了3门以上课程的学生学号。
SELECT sno FROM sc GROUP BY sno
HAVING COUNT(*)>=3
运行结果:
sno --------- 201313101
--[3_19] 查询有2门以上课程是90分以上的学生的学号及(90分以上的)课程数SELECT sno 学号,COUNT(*) '90分以上的课程数' FROM sc WHERE grade>=90
GROUP BY sno HAVING COUNT(*)>=2
运行结果:
学号 90分以上的课程数 --------- -----------
2. 连接查询 --自然连接
--[3_20] 查询每个学生及其选修课程的情况。
SELECT sname,cno,grade FROM student,sc
WHERE student.sno = sc.sno
运行结果:
sname cno grade
-------- ---- --------------------------------------- 李勇 1 92.0 李勇 2 35.0 李勇 3 88.0 刘晨 2 90.0 刘晨 3 50.0
--左外连接
--[3_21] 查询每个学生及其选修课程的情况(包括没有选修课程的学生)。
SELECT student.sno,sname,cno,grade
FROM student LEFT JOIN sc ON student.sno = sc.sno
运行结果:
sno sname cno grade
--------- -------- ---- ---------------------------------------
8
201313101 李勇 1 92.0 201313101 李勇 2 35.0 201313101 李勇 3 88.0 201313102 刘晨 2 90.0 201313102 刘晨 3 50.0 201313103 王敏 NULL NULL 201313104 张立 NULL NULL
--自身连接: 一个表与其自己进行连接,称为表的自身连接 --[3_22] 查询每一门课的间接先修课(即先修课的先修课)
SELECT FIRST.cno 课号,SECOND.cpno 间接先修课 FROM course FIRST,course SECOND WHERE FIRST.cpno = SECOND.cno
运行结果:
课号 间接先修课 ---- ----- 1 7 3 5 4 NULL 5 6 7 NULL
--复合条件连接
--[3_23] 查询选修2号课程且成绩在90分以上的所有学生的学号、姓名。SELECT student.sno, sname FROM student,sc WHERE student.sno = sc.sno AND sc.cno='2' AND sc.grade >=90
运行结果:
sno sname --------- -------- 201313102 刘晨
--多表连接
--[3_24] 查询每个学生的学号、姓名、选修的课程名及成绩。
SELECT student.sno,sname,cname,grade FROM student,sc,course
WHERE student.sno = sc.sno and sc.cno = course.cno
运行结果:
sno sname cname grade
--------- -------- ---------------- --------------------------------------- 201313101 李勇 数据库 92.0 201313101 李勇 数学 35.0 201313101 李勇 信息系统 88.0 201313102 刘晨 数学 90.0 201313102 刘晨 信息系统 50.0
3. 嵌套查询
9
--[3_25] 查询与“刘晨”在一个系学习的学生。
select sno,sname,sdept from student
where sdept in --当内查询结果最多只有一个值时可用=代替in (select sdept from student where sname='刘晨')
运行结果:
sno sname sdept --------- -------- --------------------
201313101 李勇 CS 201313102 刘晨 CS
--[3_26] 查询所有姓名相同的学生
select * from student where sname in (select sname from student
group by sname having count(*)>1) order by sname,sno
运行结果:
sno sname ssex sage sdept --------- -------- ---- ------ --------------------
--[3_27] 查询选修了课程名为“信息系统”的学生学号和姓名。
SELECT sno,sname --③最后在sudent关系中取出Sno和Sname FROM student WHERE sno IN
(SELECT sno --②然后在sc中找出选修了“信息系统”所在课号的学生学号 FROM sc WHERE cno IN
(SELECT cno --①首先在curse关系中找出“信息系统”的课程号 FROM course WHERE cname='信息系统'))
运行结果:
sno sname --------- -------- 201313101 李勇 201313102 刘晨
--[3_28] 找出每个学生超过他选修课程平均成绩的学号、课号及成绩。
SELECT x.* FROM sc x
WHERE grade>=(SELECT AVG(grade)
10