數據庫原理 西安電子科技大學(第三版) 付婷婷 第三章 課後習題答案

CREATE TABLE student_t(

       sno Char(7) PRIMARY KEY,--學號

       sname Varchar(20) NOT NULL,--姓名

       ssex CHAR(2) NOT NULL, --性別

       sage Smallint, --年齡

       CLON CHAR(5) --學生所在班級的編號 

);


CREATE TABLE course_t(

       cno CHAR(1) PRIMARY KEY, --課程編號

       cname Varchar(20) NOT NULL, --課程名稱

       credit SMALLINT -- 學分

);


CREATE TABLE CLASS_t(

       clno CHAR(5) PRIMARY KEY, --班級號

       speciality VARCHAR(20) NOT NULL, --編輯所在專業

       inyear CHAR(4) NOT NULL, --入校年份

       cNUM INTEGER, -- 班級人數

       MONITOR_no CHAR(7) -- 班長學號 

);


CREATE TABLE grade_t(

       sno char(7), --學號

       cno CHAR(1) NOT NULL, --課程號

       gmark NUMERIC(4,1) --成績

);


INSERT INTO student_t (sno,sname,ssex,sage, CLON) VALUES ('2000101','李勇',  '男', 20,'00311');

INSERT INTO student_t (sno,sname,ssex,sage, CLON) VALUES ('2000102','劉詩晨','女', 19,'00311');

INSERT INTO student_t (sno,sname,ssex,sage, CLON) VALUES ('2000103','王一鳴','男', 20,'00312');

INSERT INTO student_t (sno,sname,ssex,sage, CLON) VALUES ('2000104','張婷婷','女', 21,'00312');

INSERT INTO student_t (sno,sname,ssex,sage, CLON) VALUES ('2001101','李勇敏','女', 19,'01311');

INSERT INTO student_t (sno,sname,ssex,sage, CLON) VALUES ('2001102','賈向東','男', 22,'01311');

INSERT INTO student_t (sno,sname,ssex,sage, CLON) VALUES ('2001103','陳寶玉','男', 20,'01311');

INSERT INTO student_t (sno,sname,ssex,sage, CLON) VALUES ('2001104','張逸凡','男', 21,'01311');

--增加以下這條數據目的是爲了12.9查詢到數據

INSERT INTO student_t (sno,sname,ssex,sage, CLON) VALUES ('2000105','折挺',  '男', 20,'00311');


INSERT INTO course_t ( cno,cname,credit) VALUES ('1','數據庫',      4);

INSERT INTO course_t ( cno,cname,credit) VALUES ('2','離散數學',    3);

INSERT INTO course_t ( cno,cname,credit) VALUES ('3','管理信息系統',2);

INSERT INTO course_t ( cno,cname,credit) VALUES ('4','操作系統',    4);

INSERT INTO course_t ( cno,cname,credit) VALUES ('5','數據結構',    4);

INSERT INTO course_t ( cno,cname,credit) VALUES ('6','數據處理',    2);

INSERT INTO course_t ( cno,cname,credit) VALUES ('7','C語言',       4);


INSERT INTO CLASS_t (clno, speciality,inyear,cNUM,MONITOR_no) VALUES ('00311','計算機軟件', '2000',120, '2000101');

INSERT INTO CLASS_t (clno, speciality,inyear,cNUM,MONITOR_no) VALUES ('00312','計算機應用', '2000',140, '2000103');

INSERT INTO CLASS_t (clno, speciality,inyear,cNUM,MONITOR_no) VALUES ('01311','計算機軟件', '2001',220, '2001103');


INSERT INTO grade_t (sno, cno,gmark) VALUES ('2000101','1', 92);

INSERT INTO grade_t (sno, cno,gmark) VALUES ('2000101','3', 88);

INSERT INTO grade_t (sno, cno,gmark) VALUES ('2000101','5', 86);

INSERT INTO grade_t (sno, cno,gmark) VALUES ('2000102','1', 78);

INSERT INTO grade_t (sno, cno,gmark) VALUES ('2000102','6', 55);

INSERT INTO grade_t (sno, cno,gmark) VALUES ('2000103','3', 65);

INSERT INTO grade_t (sno, cno,gmark) VALUES ('2000103','6', 78);

INSERT INTO grade_t (sno, cno,gmark) VALUES ('2000103','5', 66);

INSERT INTO grade_t (sno, cno,gmark) VALUES ('2000104','1', 54);

INSERT INTO grade_t (sno, cno,gmark) VALUES ('2000104','6', 83);

INSERT INTO grade_t (sno, cno,gmark) VALUES ('2001101','2', 70);

INSERT INTO grade_t (sno, cno,gmark) VALUES ('2001101','4', 65);

INSERT INTO grade_t (sno, cno,gmark) VALUES ('2001102','2', 80);

INSERT INTO grade_t (sno, cno,gmark) VALUES ('2001102','4', 90);

INSERT INTO grade_t (sno, cno,gmark) VALUES ('2000103','1', 83);

INSERT INTO grade_t (sno, cno,gmark) VALUES ('2000103','2', 76);

INSERT INTO grade_t (sno, cno,gmark) VALUES ('2000103','4', 56);

INSERT INTO grade_t (sno, cno,gmark) VALUES ('2000103','7', 88);



--12.1 找出所有被學生選修了的課程號

SELECT DISTINCT cno FROM  grade_t gt ORDER BY gt.cno;


--12.2 找出01311班女學生的個人信息

SELECT * FROM student_t stu WHERE stu.clon = '01311' AND stu.ssex = '女';


--12.3 找出01311班和01312班的學生姓名、性別、出生年份

SELECT STU.SNAME,

       STU.SSEX,

       (TO_DATE(TO_CHAR(SYSDATE, 'YYYY/MM/DD'), 'YYYY/MM/DD') - STU.SAGE) AS 出生年份

  FROM STUDENT_T STU

 WHERE STU.CLON IN ('01311', '01312');

 

--12.4 找出所有姓李的學生的個人信息

SELECT * FROM student_t stu WHERE stu.sname LIKE '李%';


--12.5 找出學生李勇所在班級的學生人數

SELECT ct.cnum FROM student_t stu JOIN class_t ct ON stu.clon = ct.clno WHERE stu.sname = '李勇';

--或者是子查詢(首先查詢出李勇所在的班級號,注意要用distinct,防止有多個李勇報錯)

SELECT  ct.cnum FROM class_t ct WHERE ct.clno = (SELECT DISTINCT stu.clon FROM student_t stu WHERE stu.sname = '李勇');


--12.6 找出課程名爲操作系統的平均成績、最高分、最低分

SELECT to_char(AVG(GT.GMARK),'99999999999999.99') AS 平均成績,

       MAX(GT.GMARK) AS 最高分,

       MIN(GT.GMARK) AS 最低分

  FROM COURSE_T COU JOIN GRADE_T GT ON COU.CNO = GT.CNO

 WHERE COU.CNAME = '操作系統';

 

--12.7 找出選修了課程的學生人數

SELECT COUNT(1) FROM (SELECT DISTINCT gt.sno FROM grade_t gt);

--或者

SELECT count(1) FROM (SELECT gt.sno, COUNT(gt.sno) FROM grade_t gt GROUP BY gt.sno);


--12.8 找出選修了課程爲操作系統的學生人數

SELECT COUNT(1) FROM course_t ct JOIN grade_t gt ON ct.cno = gt.cno WHERE ct.cname = '操作系統';


--12.9 找出2000級計算機軟件班的成績爲空的學生姓名

SELECT STU.SNAME

  FROM STUDENT_T STU

  LEFT JOIN CLASS_T CT ON STU.CLON = CT.CLNO

  LEFT JOIN grade_t gt ON gt.sno = stu.sno

 WHERE CT.INYEAR = '2000'

   AND CT.SPECIALITY = '計算機軟件'

   AND gt.gmark IS NULL;

   

--13.1 找出與李勇在同一個班級的學生信息

SELECT * FROM student_t stu WHERE stu.clon = (SELECT clon  FROM student_t WHERE sname = '李勇');


--13.2 找出所有與學生李勇有相同選修課程的學生信息

SELECT DISTINCT stu.*

   FROM STUDENT_T STU

   JOIN GRADE_T GT

     ON STU.SNO = GT.SNO

  WHERE GT.CNO IN

        (SELECT GT.CNO

           FROM GRADE_T

          WHERE SNO =

                (SELECT SNO FROM STUDENT_T WHERE SNAME = '李勇'));


--13.3 找出年齡介於學生李勇和25歲之間的學生的信息

SELECT * FROM student_t stu WHERE stu.sage BETWEEN (SELECT sage FROM student_t WHERE sname = '李勇') AND 25;


--13.4 找出選修了課程操作系統的學生的學號和姓名

SELECT stu.sno,stu.sname

  FROM STUDENT_T STU

  JOIN GRADE_T GT

    ON STU.SNO = GT.SNO

  JOIN COURSE_T COU

    ON COU.CNO = GT.CNO

 WHERE COU.CNAME = '操作系統';

 

--13.5 找出沒有選修1號課程的所有學生姓名

SELECT stu.sname FROM student_t stu WHERE stu.sno NOT IN(SELECT gt.sno FROM grade_t gt WHERE gt.cno = 1);


--13.6 找出選修了全部課程的學生的姓名

SELECT stu.sname

  FROM STUDENT_T STU

  JOIN GRADE_T GT

    ON STU.SNO = GT.SNO

 GROUP BY STU.SNO,STU.SNAME

HAVING COUNT(1) = (SELECT COUNT(1) FROM COURSE_T);


--14.1 查詢選修了3號課程的學生學號及其成績,並按照成績的降序排列

SELECT stu.sno,gt.gmark FROM STUDENT_T STU JOIN GRADE_T GT ON STU.SNO = GT.SNO WHERE gt.cno = 3 ORDER BY gt.gmark;


--14.2 查詢全體學生信息,要求查詢結果按班級號升序排列,同一班級學生按年齡降序排列

SELECT * FROM student_t stu ORDER BY stu.clon,stu.sage DESC;


--14.3 求每個課程號及相應的選課人數

SELECT cou.cno,COUNT(1) FROM course_t cou LEFT JOIN grade_t gt ON cou.cno = gt.cno GROUP BY cou.cno ORDER BY cou.cno;


--14.4 找出選修了3門以上課程的學生學號

SELECT gt.sno FROM grade_t gt GROUP BY gt.sno HAVING count(1)>3;


                                                       西安科技大學高新學院 計科1001班 折挺

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章