数据库实验1.2数据查询 实验1.2.4

(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');

 

  • 4
    点赞
  • 50
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值