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班 折挺