(1)查询年级为2001的所有学生的名称,按编号升序排列。
需要用ORDER BY子句对学号SID进行升序排列。
SELECT SNAME
FROM STUDENTS
WHERE GRADE='2001'
ORDER BY SID;
(2)查询学生的选课成绩合格的课程成绩,并把成绩换算为积点(60分对应积点为1,
每增加1分,积点增加0.1)。
把满足条件的学生选出后,用算术表达式计算出积点。
SELECT TID,CID,SCORE,'POINT OF SCORE',(SCORE-60)*0.1+1
FROM CHOICES
WHERE SCORE>60;
(3)查询课时是48或64的课程的名称。
考虑使用IN运算符,匹配的集合是(‘48’,‘64’)。
SELECT CNAME
FROM COURSES
WHERE HOUR IN('48','64');
(4)查询所有课程名称中含有data的课程编号。
使用模糊匹配的符号LIKE。
SELECT CNAME
FROM COURSES
WHERE CNAME LIKE '%DATA%';
(5)查询所有选课记录的课程号(不重复显示)。
使用关键字DISTINCT去掉重复的行。
SELECT CNAME
FROM COURSES
WHERE CNAME LIKE '%DATA%';
(6)统计所有老师的平均工资。
用聚集函数AVG()求平均工资。
SELECT AVG(SALARY)
FROM TEACHERS;
(7)查询所有学生的编号,姓名和平均成绩,按总平均成绩降序排列。
平均成绩用AVG函数求,用GROUP BY子句对sid分组,用ORDER BY按总平均成绩降序排列。
SELECT STUDENTS.SID,SNAME,AVG(SCORE)
FROM STUDENTS,CHOICES
WHERE STUDENTS.SID=CHOICES.SID
GROUP BY STUDENTS.SID,SNAME
ORDER BY AVG(SCORE) DESC;
(8)统计各个课程的选课人数和平均成绩。
聚集函数COUNT()和AVG()来统计各个课程的选课人数和平均成绩,用GROUP BY子句对cid分组。
SELECT CID,COUNT(NO),AVG(SCORE)
FROM CHOICES
GROUP BY CID;
(9)查询至少选修了三门课程的学生编号。
考虑按学生编号进行分组,只要一个组中包含有3个以上元祖,这个组名就是满足查询条件的。
SELECT SID
FROM CHOICES
GROUP BY SID
HAVING COUNT(*)>3;
(10)查询编号800009026的学生所选的全部课程的课程名和成绩。
可以将两个表连接起来,用WHERE语句选择符合条件的列。
SELECT CNAME,CHOICES.SCORE
FROM COURSES,CHOICES
WHERE CHOICES.SID='800009026'AND COURSES.CID=CHOICES.CID;
(11)查询所有选了database的学生的编号。
需对CHOICES,COURSES两个表进行连接。
SELECT CHOICES.SID
FROM CHOICES,COURSES
WHERE CHOICES.CID=COURSES.CID AND COURSES.CNAME='DATABASE';
(12)求出选择了同一个课程的学生对。
对CHOICES进行自身的连接并进行查询,需要两个不同的名称来标识同一个表CHOICES。
SELECT X.SID,Y.SID
FROM CHOICES X,CHOICES Y
WHERE X.CID=Y.CID AND X.NO<Y.NO;
(13)求出至少被两名学生选修的课程编号。
可以按课程编号进行分组,只要一个组中包含有2个及以上元组,那么这个组名就满足查询条件。
SELECT CID
FROM CHOICES
GROUP BY CID
HAVING COUNT(*)>=2;
(14)查询选修了编号800009026的学生所选的某个课程的学生编号。
将CHOICES表进行自身连接,用WHERE语句选择符合条件的列。
SELECT Y.SID
FROM CHOICES X,CHOICES Y
WHERE X.CID=Y.CID AND X.SID='800009026';
(15)查询学生的基本信息及选修课程编号和成绩。
以Student表为主体列出每个学生的基本情况及其选课情况,若某个学生没有选课,则只输出其基本情况信息,选课信息则为空值,此时需要用到外连接(OUTER JOIN)。
SELECT STUDENTS.SID,SNAME,GRADE,CID,SCORE
FROM STUDENTS JOIN CHOICES ON STUDENTS.SID=CHOICES.SID;
(16)查询学号850955252的学生的姓名和选修的课程名称及成绩。
对Student、Courses、Choices三个表进行连接。
SELECT STUDENTS.SNAME,COURSES.CNAME,CHOICES.SCORE
FROM STUDENTS,COURSES,CHOICES
WHERE STUDENTS.SID=CHOICES.SID AND COURSES.CID=CHOICES.CID
AND STUDENTS.SID='850955252';
(17)查询学号850955252的学生同年级的所有学生资料。
可使用嵌套查询,子查询中查询850955252学生的年级,外层查询查询这些学生的资料。
SELECT *
FROM STUDENTS
WHERE GRADE=(
SELECT GRADE
FROM STUDENTS
WHERE SID='850955252'
);
(18)查询所有的有选课的学生的详细信息。
采用嵌套查询,子查询中查询所有选课的学生学号,构成一个集合。外层查询中,查询学生表中的所有学号属于这个集合的元组信息。
SELECT *
FROM STUDENTS
WHERE SID IN
(
SELECT SID
FROM CHOICES
);
(19)查询没有学生选的课程的编号。
采用嵌套查询,使用NOT IN操作符来实现。
SELECT CNAME
FROM COURSES
WHERE CID NOT IN
(
SELECT CID
FROM CHOICES
);
(20)查询选修了课程名为C++的学生学号和姓名。
采用多重嵌套子查询来实现,最里层从COURSES中找出C++的课程编号,第二层子查询从CHOICES表中找到上个查询得到的课程号的学生编号,最外层查询在STUDENTS中取出编号为上个查询得到的学生编号的学生编号和姓名。
SELECT SID,SNAME
FROM STUDENTS
WHERE SID IN
(
SELECT SID
FROM CHOICES
WHERE CID IN
(
SELECT CID
FROM COURSES
WHERE CNAME='C++'
)
);
(21)找出选修课程成绩最差的选课记录。
使用嵌套查询和聚集函数MIN()来实现。
SELECT *
FROM CHOICES
WHERE SCORE IN
(
SELECT MIN(SCORE)
FROM CHOICES
);
(22)找出和课程UML或课程C++的课时一样的课程名称。
使用比较运算符和谓词的结合=ANY来实现。
SELECT CNAME
FROM COURSES
WHERE HOUR = ANY
(
SELECT HOUR
FROM COURSES
WHERE CNAME = 'UML' OR CNAME = 'C++'
);
(23)查询所有选修编号10001的课程的学生的姓名。
用谓词EXISTS来实现。
SELECT SNAME
FROM STUDENTS
WHERE EXISTS
(
SELECT *
FROM CHOICES X
WHERE X.CID = '10001' AND X.SID = STUDENTS.SID
);
(24)查询选修了所有课程的学生姓名。
用谓词NOT EXISTS来实现。
SELECT SNAME
FROM STUDENTS
WHERE NOT EXISTS
(
SELECT *
FROM COURSES X
WHERE NOT EXISTS
(
SELECT *
FROM CHOICES Y
WHERE Y.SID=STUDENTS.SID AND Y.CID=X.CID
)
);
(25)利用集合运算,查询选修课程C++或课程Java的学生的编号。
用集合运算符UNION来实现或运算。
SELECT SID
FROM CHOICES
WHERE CID=(SELECT CID
FROM COURSES
WHERE CNAME='C++')
UNION
SELECT SID
FROM CHOICES
WHERE CID=(SELECT CID
FROM COURSES
WHERE CNAME='Java');
(26)实现集合交运算,查询既选修课程C++又选修课程Java的学生的编号。
使用保留字INTERSECT来实现交运算。
SELECT SID
FROM CHOICES
WHERE CID=(SELECT CID
FROM COURSES
WHERE CNAME='C++')
INTERSECT
SELECT SID
FROM CHOICES
WHERE CID=(SELECT CID
FROM COURSES
WHERE CNAME='Java');
(27)实现集合减运算,查询选修课程C++而没有选修课程Java的学生的编号。
用保留字EXCEPT来实现补运算。
SELECT SID
FROM CHOICES
WHERE CID=(SELECT CID
FROM COURSES
WHERE CNAME='C++')
EXCEPT
SELECT SID
FROM CHOICES
WHERE CID=(SELECT CID
FROM COURSES
WHERE CNAME='Java');