数据库中SQL查询语句习题含答案
个属性,分别存放在S 和C 表中,但S 和C 表没有直接联系,必须通过SC 表建立它们二者
的联系。 C → SC → S 基本思路:
查询问题:设教学数据库Education 有三个关系: 学生关系S (SNO ,SNAME ,AGE ,
(1)首先在C 表中找出“DS ”课程的课程号Cno ; (2)然后在SC 表中找出Cno 等
SEX ,SDEPT );学习关系SC (SNO ,CNO ,GRADE );课程关系C (CNO ,CNAME ,CDEPT ,
于第一步给出的Cno 集合中的某个元素Cno ;
TNAME )
(3)最后在S 关系中选出Sno 等于第二步中Sno 集合中某个元素的元组,取出Sno 和
(1)检索计算机系的全体学生的学号,姓名和性别; (2)检索学习课程号为C2的学
Sname 送入结果表列。 SELECT Sno ,Sname FROM S
生学号与姓名; (3)检索选修课程名为“DS ”的学生学号与姓名; (4)检索选修课程号
WHERE Sno IN (SELECT Sno FROM SC
为C2或C4的学生学号; (5)检索至少选修课程号为C2和C4的学生学号; (6)检索不
WHERE Cno IN (SELECT Cno FROM C
学C2课的学生姓名和年龄; (7)检索学习全部课程的学生姓名;
WHERE Cname=‘DS ’));
(8)查询所学课程包含学生S3所学课程的学生学号。
(4)检索选修课程号为C2或C4的学生学号; SELECT Sno FROM SC
(1)检索计算机系的全体学生的学号,姓名和性别; SELECT Sno ,Sname ,Sex FROM
WHERE Cno=‘C2’ OR Cno=‘C4’;
S
WHERE Sdept =’CS ’;
(5)检索至少选修课程号为C2和C4的学生学号; SELECT Sno
(2)检索学习课程号为C2的学生学号与姓名;
FROM SC X ,SC Y
(3)检索选修课程名为“DS ”的学生学号与姓名 本查询涉及到学号、姓名和课程名三
第 1 页 共 10 页
WHERE X.Sno=Y.Sno AND SELECT DISTINCT Sno FROM SC AS X WHERE NOT EXISTS (SELECT *
http://.docsj.com/doc/d33e82944b7302768e9951e79b89680202d86b33.html o=‘C2’ AND FROM SC AS Y
http://.docsj.com/doc/d33e82944b7302768e9951e79b89680202d86b33.html o=‘C4’ ; WHERE Y.Sno=‘S3’ AND NOT EXISTS (SELECT *
(6)检索不学C2课的学生姓名和年龄; FROM SC AS Z
WHERE Z.Sno=X.Sno AND
(7)检索学习全部课程的学生姓名; 在表S 中找学生,要求这个学生学了全部课程。http://.docsj.com/doc/d33e82944b7302768e9951e79b89680202d86b33.html
换言之,在S 表中找学生,在C 中不存在一门课程,这个学生没有学。 o=http://.docsj.com/doc/d33e82944b7302768e9951e79b89680202d86b33.html o ));
SELECT Sname FROM S 2.SELECT S.Sno ,Sname
WHERE NOT EXISTS (SELECT * FROM C FROM S ,SC WHERE S.Sno=SC.Sno AND
WHERE NOT EXISTS (SELECT * FROM SC WHERE SC.Sno=S.Sno AND http://.docsj.com/doc/d33e82944b7302768e9951e79b89680202d86b33.html o=‘C2’;
http://.docsj.com/doc/d33e82944b7302768e9951e79b89680202d86b33.html 1.SELECT Sno ,Sname FROM S WHERE Sno IN
o=http://.docsj.com/doc/d33e82944b7302768e9951e79b89680202d86b33.html o )); ( SELECT Sno
(8)查询所学课程包含学生S3所学课程的学生学号。 分析:不存在这样的课程Y ,学 FROM SC
生S3选了Y ,而其他学生没有选。 WHERE Cno=‘C2’) 1.SELECT Sname FROM S WHERE Sno NOT IN ( SELECT Sno FROM SC
第 2 页 共 10 页
WHERE Cno=‘C2’); 2.SELECT Sname FROM S WHERE NOT EXISTS ( SELECT * FROM SC WHERE 8:查所有不姓“张”的学生的姓名。
SC.Sno=S.Sno AND Cno=‘C2’); 9:查DB_Design课程的课程号。
设教学数据库Education有三个关系: 10:查缺考的学生的学号和课程号。
学生关系S(SNO,SNAME,AGE,SEX,SDEPT); 11:查年龄为空值的学生的学号和姓名。
学习关系SC(SNO,CNO,GRADE); 12:查计算机系20岁以下的学生的学号和姓名。
课程关系C(CNO,CNAME,CDEPT,TNAME) 13:查计算机系、数学系、信息系的学生姓名、性别。14:查询选修了C3课程的学生的
查询问题: 学号和成绩,其结果按分数的降序排列。
1:查所有年龄在20岁以下的学生姓名及年龄。 15:查询全体学生的情况,查询结果按所在系升序排列,对同一系中的学生按年龄降序
2:查考试成绩有不及格的学生的学号 排列。
3:查所年龄在20至23岁之间的学生姓名、系别及年龄。 16:查询学生总人数。
4:查计算机系、数学系、信息系的学生姓名、性别。5:查既不是计算机系、数学系、 17:查询选修了课程的学生人数。
又不是信息系的学生姓名、性别 18:计算选修了C1课程的学生平均成绩。
6:查所有姓“刘”的学生的姓名、学号和性别。 19:查询学习C3课程的学生最高分数。
7:查姓“上官”且全名为3个汉字的学生姓名。 20:查询各个课程号与相应的选课人数。
第 3 页 共 10 页
21:查询计算机系选修了3门以上课程的学生的学号。22:求基本表S中男同学的每一 35:查询选修了全部课程的学生姓名。
年龄组(超过50人)有多少人?要求查询结果按人数升序排列,人数相同按年龄降序排列。 36:查询所学课程包含学生S3所学课程的学生学号(1)比较
23:查询每个学生及其选修课程的情况。 例1:查所有年龄在20岁以下的学生姓名及年龄。
24:查询选修了C2课程且成绩在90分以上的所有学生。25:查询每个学生选修的课程 SELECT Sname,Sage
名及其成绩。 FROM S
26:统计每一年龄选修课程的学生人数。 WHERE Sage=20)
27:查询选修了C2课程的学生姓名。 例2:查考试成绩有不及格的学生的学号
28:查询与“张三”在同一个系学习的学生学号、姓名和系别。 SELECT DISTINCT Sno
29:查询选修课程名为“数据库”的学生学号和姓名。30:查询与“张三”在同一个系 FROM SC
学习的学生学号、姓名和系别。 WHERE grade3;
31:查询选修课程名为“数据库”的学生学号和姓名。32:查询选修了C2课程的学生姓 WHERE子句与HAVING短语的根本区别在于作用对象不同。WHERE子句作用于基本表或视
名。 图,从中选择满足条件的元组。HAVING短语作用于组,从中选择满足条件的组。
33:查询所有未选修C2课程的学生姓名。 例22:求基本表S中男同学的每一年龄组(超过50人)有多少人?要求查询结果按人数
34:查询与“张三”在同一个系学习的学生学号、姓名和系别。 升序排列,人数相同按年龄降序排列。
第 4 页 共 10 页
SELECT Sage,COUNT(Sno) FROM S WHERE Ssex='M' GROUP BY Sage HAVING COUNT(*)> 50 ORDER BY 2,Sage DESC; 二、多表查询 1、联接查询 例23:查询每个学生及其选修课程的情况。 SELECT S.Sno,Sname,Sage,Ssex,Sdept,Cno,Grade FROM S, SC WHERE S.Sno=SC.Sno; 例24:查询选修了C2课程且成绩在90分以上的所有学生。 SELECT S.Sno,Sname
FROM S,SC
WHERE S.Sno=SC.Sno
AND http://.docsj.com/doc/d33e82944b7302768e9951e79b89680202d86b33.html o=‘C2’ AND SC.Grade > 90;
例25:查询每个学生选修的课程名及其成绩。
SELECT S.Sno,Sname,Cname,SC.Grade
FROM S,SC,C
WHERE S.Sno=SC.Sno AND
http://.docsj.com/doc/d33e82944b7302768e9951e79b89680202d86b33.html
o=http://.docsj.com/doc/d33e82944b7302768e9951e79b89680202d86b33.html o
例26:统计每一年龄选修课程的学生人数。
SELECT Sage,COUNT(DISTINCT S.Sno)
FROM S,SC
第 5 页 共 10 页
WHERE S.Sno=SC.Sno WHERE Cno=‘C2’);
GROUP BY S; 例28:查询与“张三”在同一个系学习的学生学号、姓名和系别。
由于要统计每一个年龄的学生人数,因此要把满足WHERE子句中条件的查询结果按年龄 分析:
分组,在每一组中的学生年龄相同。此时的SELECT子句应对每一组分开进行操作,在每一组 中,年龄只有一个值,统计的人数是这一组中的学生人数。 1、嵌套查询 SELECT Sdept
(1)带有IN谓词的子查询 FROM S
指父查询与子查询之间用IN进行联接,判断某个属性列值是否在子查询的结果中。 WHERE Sname= 例27:查询选修了C2课程的学生姓名。 SELECT Sno SELECT Sname FROM S
FROM S WHERE Sdept= WHERE Sno IN ( SELECT Sno SELECT Sno FROM SC FROM S
第 6 页 共 10 页(1)确定“张三”所在的系;
(2)查找所有在X系学习的学生。
‘张三’;
,Sname,Sdept
‘X’
把第一步查询嵌入到第二步查询中,用以构造第二步查询的条件。
,Sname,Sdept
WHERE Sdept IN (SELECT Sno
(SELECT Sdept FROM SC
FROM S WHERE Cno IN
WHERE Sname=‘张三’); 例29:查询选修课程名为“数据库”的学生学号和姓名。 FROM C
本查询涉及到学号、姓名和课程名三个属性,分别存放在S和C表中,但S和C表没有 WHERE Cname=直接联系,必须通过SC表建立它们二者的联系。 C → SC → S (2) 基本思路: (1)首先在C表中找出“DB”课程的课程号Cno;(2)然后在SC表中找出Cno等于第 一步给出的Cno 集合中的某个元素Cno; SELECT Sno (3)最后在S关系中选出Sno等于第二步中Sno 集合中某个元素的元组,取出Sno 和 FROM S
Sname送入结果表列。 SELECT Sno,Sname WHERE Sdept =
FROM S WHERE Sno IN FROM S
第 7 页 共 10 页(SELECT Cno
‘DB’));联接查询方式
带有比较运算符的子查询
例30:查询与“张三”在同一个系学习的学生学号、姓名和系别。
,Sname,Sdept
(SELECT Sdept
WHERE Sname=‘张三’); 1.SELECT Sname
例31:查询选修课程名为“数据库”的学生学号和姓名。 SELECT Sno,Sname FROM S
FROM S WHERE Sno IN
WHERE Sno IN (SELECT Sno FROM SC WHERE Cno = (SELECT Cno FROM C WHERE Cname=‘DB’)); FROM S AS S1, S AS S2 (3)带有EXISTS谓词的子查询 (1)带有EXISTS谓词的子查询不返回任何实际数据,它只产生逻辑值。 例32:查询选修了C2课程的学生姓名。 FROM SC
WHERE Cno= 2.SELECT Sname
FROM S
WHERE EXISTS
FROM SC
WHERE SC.Sno=S.Sno AND Cno= SELECT Sname
第 8 页 共 10 页( SELECT Sno
‘C2’);
( SELECT *
‘C2’);
例33:查询所有未选修C2课程的学生姓名。
FROM S 相关子查询
WHERE NOT EXISTS 例35:查询选修了全部课程的学生姓名。
( SELECT * 在表S中找学生,要求这个学生学了全部课程。换言之,在S表中找学生,在C中不存
FROM SC 在一门课程,这个学生没有学。
WHERE SC.Sno=S.Sno AND Cno=‘C2’); SELECT Sname
[NOT]EXISTS 实际上是一种内、外层互相关的嵌套查询,只有当内层引用了外层的值, FROM S
这种查询才有意义。 WHERE NOT EXISTS
例34:查询与“张三”在同一个系学习的学生学号、姓名和系别。 (SELECT *
SELECT Sno,Sname,Sdept FROM C
FROM S AS S1 WHERE NOT EXISTS
WHERE EXISTS (SELECT *
(SELECT * FROM SC
FROM S AS S2 WHERE SC.Sno=S.Sno AND
WHERE S2.Sdept=S1. Sdept AND S2.Sname=‘张三’); http://.docsj.com/doc/d33e82944b7302768e9951e79b89680202d86b33.html
第 9 页 共 10 页
o=http://.docsj.com/doc/d33e82944b7302768e9951e79b89680202d86b33.html o)); 单纯的课本内容,并不能满足学生的需要,通过补充,达到内容的完善
例36:查询所学课程包含学生S3所学课程的学生学号分析:不存在这样的课程Y,学生 教育之通病是教用脑的人不用手,不教用手的人用脑,所以一无所能。教育革命的对策
S3选了Y,而其他学生没有选。 SELECT DISTINCT Sno FROM SC AS X WHERE NOT EXISTS
(SELECT *
FROM SC AS Y
WHERE Y.Sno=‘S3’ AND NOT EXISTS
(SELECT *
FROM SC AS Z
WHERE Z.Sno=X.Sno AND
http://.docsj.com/doc/d33e82944b7302768e9951e79b89680202d86b33.html
o=http://.docsj.com/doc/d33e82944b7302768e9951e79b89680202d86b33.html o));是手脑联盟,结果是手与脑的力量都可以大到不可思议。
第 10 页 共 10 页
因篇幅问题不能全部显示,请点此查看更多更全内容